Compare commits

...

312 Commits

Author SHA1 Message Date
Ed
98d904d75f Merge branch 'master' into ed-cla-test2 2025-01-26 16:14:54 +03:00
Ed
00eedea77e Update cla.yml 2025-01-26 16:14:12 +03:00
Ed
13a6bc2920 Update ContentLocalizationManager.cs 2025-01-26 16:12:50 +03:00
Ed
58bb5ce26f Merge branch 'ed-cla-test2' of https://github.com/crystallpunk-14/crystall-punk-14 into ed-cla-test2 2025-01-26 16:11:30 +03:00
Ed
cf24ec8375 Revert "touch c#"
This reverts commit ca288f1288.
2025-01-26 16:10:44 +03:00
Ed
1d1133c6d4 Merge branch 'master' into ed-cla-test2 2025-01-26 16:10:12 +03:00
Ed
a9a2372ba8 Update cla.json 2025-01-26 16:09:39 +03:00
Ed
ca288f1288 touch c# 2025-01-26 16:08:10 +03:00
Ed
0afd87163c Update guildmaster.yml 2025-01-26 16:06:21 +03:00
Ed
14930094d7 Merge branch 'master' of https://github.com/crystallpunk-14/crystall-punk-14 2025-01-26 16:05:23 +03:00
Ed
b0189002e8 Update cla.yml 2025-01-26 16:04:48 +03:00
Ed
c670b79fd0 Update guildmaster.yml (#810) 2025-01-26 15:57:44 +03:00
github-actions[bot]
d43b67c6d4 @TheShuEd has signed the CLA in crystallpunk-14/crystall-punk-14#810 2025-01-26 12:54:43 +00:00
github-actions[bot]
58db8c4699 Creating file for storing CLA Signatures 2025-01-26 12:53:32 +00:00
Ed
12edd8f023 Create cla.yml 2025-01-26 15:49:12 +03:00
Ed
852e19601a license part 2 2025-01-26 15:34:52 +03:00
Ed
e5c8256cfa license part 1 2025-01-26 15:33:18 +03:00
Ed
2201bb70dd end OBT 2025-01-26 00:10:08 +03:00
Ed
72279cee6b english OBT 2025-01-25 19:51:24 +03:00
Ed
f2bfeefcae Guildmaster + Comoss update (#808)
* setup guildmaster job

* divide artisans and adventurer departments

* comoss tavern update

* Update comoss.yml
2025-01-25 17:47:17 +03:00
Nim
918c7d1e3b Pies (#794)
* pie

* qwe

* recipe

* Solution

* dough

* some tweaks

* fix crafting bugs

---------

Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>
Co-authored-by: Ed <edwardxperia2000@gmail.com>
2025-01-25 14:40:16 +03:00
Ed
65faa9ae63 fix ice wall sprite 2025-01-25 02:43:16 +03:00
Ed
62658f5017 ice block window 2025-01-25 01:40:05 +03:00
Ed
2de94ea8b2 Update SharedProjectileSystem.cs 2025-01-24 23:18:26 +03:00
Ed
2ee1716a85 fix role restriction 2025-01-24 22:43:04 +03:00
Ed
fb604d1e08 fix CLA licensing 2025-01-24 22:02:46 +03:00
Ed
403344fd46 Ice spectre mob + jobs playtime requirement increase (#806)
* increase roles playtime requirements

* ice spectre
2025-01-24 21:56:30 +03:00
Ed
fdca66be06 update species guidebook 2025-01-24 09:58:16 +03:00
Ed
cc924a2478 Fix some bugs (#805)
* fix buckling from fences

* fix #804
2025-01-23 22:47:49 +03:00
Ed
3f84a19ff0 Elf mana spell rework + magic damage popups (#802)
* fix #793

* safe elf mana. Fix #728
2025-01-23 17:20:03 +03:00
Ed
a91f3c8793 safe zones 2025-01-23 12:17:17 +03:00
Ed
86811a93b2 healing staff remove from loadouts 2025-01-23 00:10:30 +03:00
Ed
cc7fadf45f fix 2025-01-23 00:05:21 +03:00
Ed
2962085b9a Modular hammers (#792)
* modular hammer

* QoL modular assemble

* remove gattle big hammer

* crossbow crafting
2025-01-22 23:53:36 +03:00
Ed
fc14c111aa Update demiplane.yml 2025-01-22 17:53:47 +03:00
Ed
e08705535f Update iron_grille.yml 2025-01-22 16:44:39 +03:00
Ed
12225eb37b comoss update, quiver in loadouts 2025-01-22 16:34:35 +03:00
Ed
1bffc4b6aa Merge pull request #784 from Nimfar11/bow-and-quiver
Bow and sprite quiver
2025-01-22 14:31:42 +03:00
Nimfar11
19d23e26ba craft 2025-01-22 13:21:52 +02:00
Ed
4e62349c0d Update anvil.yml 2025-01-22 13:54:52 +03:00
Ed
4aebd6ff98 Merge pull request #789 from crystallpunk-14/ed-22-01-2025-workbench-many
Workbench support multiple result
2025-01-22 13:53:03 +03:00
Ed
37ad1ee518 Merge pull request #790 from crystallpunk-14/ed-22-01-2025-double-upstream
Fix upstream
2025-01-22 13:52:46 +03:00
Ed
7d26a26547 Merge remote-tracking branch 'upstream/stable' into ed-22-01-2025-double-upstream
# Conflicts:
#	Content.IntegrationTests/Tests/PostMapInitTest.cs
#	Content.Server/Administration/Systems/AdminSystem.cs
#	Content.Server/GameTicking/GameTicker.Spawning.cs
#	Content.Shared/Preferences/HumanoidCharacterProfile.cs
#	LICENSE.TXT
#	Resources/Locale/ru-RU/administration/commands/babyjail.ftl
#	Resources/Maps/Shuttles/emergency_elkridge.yml
#	Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml
#	Resources/Prototypes/Maps/Pools/default.yml
2025-01-22 13:46:46 +03:00
Ed
32e00d38a1 Update workbenchs.yml 2025-01-22 13:22:56 +03:00
Ed
84edd8ea03 multiple workbench results 2025-01-22 13:14:47 +03:00
Errant
ae213066b1 HOTFIX Admin playerlist character update fix (#34560)
fix IdentityChangedEvent subscription
2025-01-21 23:48:07 +01:00
Nim
988ab82208 Apple (#787)
* bread

* apple

* sprite

* no bread

* eee
2025-01-22 00:06:31 +03:00
Ed
ca1281fcb3 Merge branch 'master' into bow-and-quiver 2025-01-22 00:01:44 +03:00
Ed
f298396fe4 Upstream sync (#786)
* Box Station - Dechristmassified (#34135)

* dechrismassified

* removed camera from shower

* Marathon Station - Dechristmassified (#34136)

* dechristmassified

* further dechristmassified

* Loop Station Decal and maints additions (#34103)

* many changes

* contentingregrationtests

* serialized invalid removed

* blank

* "Changes and fixes as suggested"

* blank

* blank

* added desk bells

* engi rework rework rework

* added gate to content integration

* tweaks

* aaa

* bbb

* added holopads

* ccc

* Update default.yml

* hotfix

* aaa

* bbb

* many many tweaks and fixes

* aaa

* decals and maints

* aaa

* bbb

* ccc

---------

Co-authored-by: Emisse <99158783+Emisse@users.noreply.github.com>

* Rename cryobed yml file (#34134)

renamed cryopod.yml to cryogenic_sleep_unit.yml

* Cog update (not very merry) (#34144)

removed christmas merry

* bagel update (#34145)

* Add hair pulato (#34117)

* add sprite pulato

* update

* add pulato hair

* add pulato hair

* add pulato hair

* update meta "pulato"

* Automatic changelog update

* Holopad UI tweak for incoming calls (#34137)

* Initial commit

* Update

* Comment correction

* Minor margin increase

* Holopads no longer log broadcasted speech and emotes in the chat (#34114)

Initial commit

* Automatic changelog update

* Fixes borgs not being able to check their laws in crit (#34133)

* fix

* fix2

* Add contraband parent to laser gun safe (#34132)

* Automatic changelog update

* Add Holopad Circuit Board to A/V Communication Technology (#34150)

Added the holopad circuit board to the AV Communication technology and circuit imprinter lathe.

* Automatic changelog update

* Fix disposal signal routers sprites (#34139)

* Fix disposal signal routers sprites

* Remove old shitcode

* Automatic changelog update

* Meta station overhaul (#33506)

* added mail, moved some things around, and fixed a lot of APCs

* fixed my mistakes

* Fixed a few mistakes and AI camera names

* Redid south medbay and more wiring

* Finished sci overhaul, and fixed all issues that I could find.

* rebuilt botany, removed vox box, fixed all known issues.

* Overhauled security

* Minor commit as I prepare to update my copy

* Rebalanced role counts

* Final changes, ready for review!

* Emisse and other people fixed issues with the station

* Finalized changes (for real this time)!

* Standardize shotgun ammo in storagefills (#34156)

shotgun ammo changes

* Automatic changelog update

* meta update (#34158)

* Amber Station Adjustments (#34126)

* Made a couple fixes to various decals, cleaned up some entities, gave the clown their bag and the bartender a handlabeler

* Several changes, more cameras, lighting fixes, adjusted hydro a bit, gave sec a bunch of shutters

* Added new random spawners for science and added them to Amber

* fixed the science spawners and modified amber slightly

* Fixed the random instrument entry

* Fix friendly vent spiders (#34153)

Swapped order of parents for MobGiantSpiderAngry

* Removed UseDelay component from RCD (#34149)

* Automatic changelog update

* Decrease hp for rusted walls (#34043)

* Automatic changelog update

* FIX: Thief beacon doubled steal targets (#33750)

* Automatic changelog update

* remove nukemass song (#34066)

* Automatic changelog update

* Corrected all ghost role names to title case. (#34155)

* Corrected all ghost role names to title case.

* Removes full stop from Hamlet's title.

* Updated ghost role names not in the main ghost roles .ftl

* Two capitals corrections

* Packed Update (Remove Christmas & New Evac) (#34168)

* Packed update (remove christmas, new shuttle)

* Fix invalid

* the voices

* Omega Update (Remove Christmas) (#34174)

omega soap

* Renamed "Irish Car Bomb" drink to "Irish Slammer" (#34107)

* Renamed "Irish Car Bomb" drink to "Irish Slammer", due to concerns over insensitivity.

* Fixing some missed references

* Added prototype id changes to migration.yml. Removed any reference to the troubles (and corrected ale to stout for flavour text).

* Corrected description back to "Irish Cream"

* Removed non-entities from migration.yml

* Automatic changelog update

* Bugfix for the AI player's eye getting stuck when their broadcast is interrupted (#34093)

Initial commit

* Speech is relayed by holopad holograms (#33978)

* Initial commit

* Corrected a field attribute

* Make JPEG a PNG (#34176)

Make 3.png a PNG

* Removed Undesirable Ion Storm Verbs (#34175)

* Remove Undesirable Laws

* empty

* added basic admin logs for PDA notekeeper notes (#34118)

* added basic admin logs for PDA notekeeper notes

* formatting

* added new LogType 'PdaInteract' and changed PDA notekeeper logs to it

---------

Co-authored-by: dylanhunter <dylan2.whittingham@live.uwe.ac.uk>

* Automatic changelog update

* Sprites defined for all non-generic computer boards. Added new syndicate computer board sprite. (#34104)

* Defined sprites for non-generic computer boards. Added new syndicate computer board sprite.

* Added new sprite to meta.json and updated attribution.

* Reformatted module.rsi meta.json to match other meta file styles.

* Syndicate board sprite made less yellow/gold, changed outer chips to black. Using grey/silver for CPU centre, akin to syndie agent PDA theme, and to keep distinctive from security board.

* Corrected indentation spacing for currently edited entities.

* Update Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml

* add pr link to attribution

---------

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

* Added pricegun sound (#34119)

added pricegun sound

Co-authored-by: dylanhunter <dylan2.whittingham@live.uwe.ac.uk>

* Automatic changelog update

* Separate Tables n' Counters  (#32673)

* Update tables.yml

* Remove Extra base: state_

* Update tables.yml

* Automatic changelog update

* Add Chameleon PDA (#30514)

* V1 commit

* Remove PDA name and unnecessary pda state

* Adds PDA to Chameleon backpack & thief toolbox

* Change to use AppearanceDataInit

* Add basic PDA state to ensure there's always a sprite before AppearanceData can be applied

* Revert PDA name (this will be changed to another way later)

* Update PDA name updating to new system

* Fix yaml, and fix Agent ID chameleon

* Updated based on review

* Automatic changelog update

* Add some ion storm actions to replace removed ones (#34180)

* Add some ion storm actions to replace removed ones

* Remove other country references, replace

* Some more tuning of the storm values, removing real-world countries

* boldy basics

* Automatic changelog update

* Amber Station and Science Spawner Tweaks (#34187)

* Modified science spawners a bit since I realized including maints loot was undesireable

* Linked Medical doors to buttons, redesigned the floor of the dining area a bit, placed more science spawners

* Somehow I overlooked that I was importing the maints loot table instead of the sci loot table

* Gave sci an EOD closet

* named the evac shuttle

* Core update (#34201)

add

* Elkridge Depot (The station formerly known as Cell) (#34085)

* named apcs, doors, air alarms, cameras, fire alarms, substations, SMESs

* updated PostMapInitTest.cs to include Cell

* added psychologist spawn

* fixed scanner console link, fixed disposals conveyors, and more

* added janitor service lights, maints firelocks, and more

* added more fun maint rooms

* improved head offices, kitchen, psych. added maints between science and arrivals

* fixed spawners placed over solid objects

* added unique evac shuttle, the Cilium

* evac shuttle is now orientated correctly

* added unique cargo shuttle

* updated kitchen area

* renamed Cell Station to Elkridge Depot, removed most main hall airlocks for smoother travel

* general last-minute touch-ups around the bridge and sec

* changed station name in PostMapInitTest.cs

* Add Elkridge Depot into Map Rotation (#34206)

* named apcs, doors, air alarms, cameras, fire alarms, substations, SMESs

* updated PostMapInitTest.cs to include Cell

* added psychologist spawn

* fixed scanner console link, fixed disposals conveyors, and more

* added janitor service lights, maints firelocks, and more

* added more fun maint rooms

* improved head offices, kitchen, psych. added maints between science and arrivals

* fixed spawners placed over solid objects

* added unique evac shuttle, the Cilium

* evac shuttle is now orientated correctly

* added unique cargo shuttle

* updated kitchen area

* renamed Cell Station to Elkridge Depot, removed most main hall airlocks for smoother travel

* general last-minute touch-ups around the bridge and sec

* changed station name in PostMapInitTest.cs

* added Elkridge to default map pool

* added myself to map_attribution.yml credits

* Automatic changelog update

* Packed Update (#34208)

Packed Update (decals mostly)

* Apply forensics when loading with an ammo box (#32280)

* Automatic changelog update

* Update Credits (#34220)

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

* Fix rainbow lizard plushie inhands (#34128)

* fix rainbow plushie inhands

* address requested changes

* attribute sprites

* wielding refactor/fixes (#32188)

* refactor wieldable events

* fix inconsitency with wielding and use updated events

* wieldable cosmetic refactoring

* Update Content.Shared/Wieldable/Events.cs

Co-authored-by: Centronias <charlie.t.santos@gmail.com>

* real

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

---------

Co-authored-by: deltanedas <@deltanedas:kde.org>
Co-authored-by: Centronias <charlie.t.santos@gmail.com>
Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>

* Automatic changelog update

* Lobby chat width and custom lobby titles (#33783)

* lobby name cvar

* panel width

* skrek

* server name localization fix

* comment format fix

Co-authored-by: Thomas <87614336+Aeshus@users.noreply.github.com>

* remove redundant newline

Co-authored-by: Thomas <87614336+Aeshus@users.noreply.github.com>

* string.empty

Co-authored-by: Thomas <87614336+Aeshus@users.noreply.github.com>

* use SetWidth

* Update Resources/Locale/en-US/lobby/lobby-gui.ftl

---------

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

* Automatic changelog update

* Adds bullet collision to station lights (#34070)

Adds collision with bullets to lights

* Automatic changelog update

* Oasis Update (#34245)

santa is keel.

* Amber Station - Minor Fixes (#34246)

* Moved the stand clear decal in front of the janitor's shutters up two pixels

* added tech maints under most maints doors, fixed power issues in cargo, and fixed a couple minor issues

* Make station anchor hitbox less insufferable (#34217)

* Automatic changelog update

* Remove kessler and zombeteors gamemodes from the secret pool (#34051)

* Remove kessler, zombeteors gameodes

* Probably should keep the protos in case an admin wants to torture players secretly

* address slart review

* Automatic changelog update

* Added distinct ad and bye chatter to Dr. Gibb vending (#34182)

* Added distinct ad and bye chatter to Dr. Gibb vending

* Correcting revert mistake

* Changed ad pack names to better match naming convention

* Implement approved rule changes (#34233)

* Special reagents now appear in the guidebook (#34265)

* Special reagents now appear in the guidebook

* Improved guidebook wording for reagent category

* Automatic changelog update

* Implement approved rule changes (#34233)

* Fix compilation errors in tests from update (#34272)

Required for https://github.com/space-wizards/RobustToolbox/pull/5590 to not cause compile fails, but can be merged on its own

* Fix portable scrubber appearing powered on spawn (#34274)

* [HOTFIX] Fix chameleon PDAs renaming IDs (#34249)

Fix chameleon PDA

* [HOTFIX] Fix Meta station power (#34256)

* hotfix meta power

* fixed AME

* add missing cargo shuttle pilot console to cargo

* Update vessel_warning.ogg (#34263)

* Update vessel_warning.ogg

Remove DC offset and apply short fade out.

* Update attributions.yml

* Update attributions.yml

* Add bleating accent to goats (#34273)

* Automatic changelog update

* Happy New Year (#34288)

happy new year

* Amber Station - Balance Improvements (#34294)

changed the center area in med bay to a garden, weakened meteor shielding in some areas, also general touch ups around the station

* Fixed Loop Station's southern solar array unlinked airlocks  (#34296)

Fixed Southern solar external airlock door bolts

* Fix empty lines in adminwho with stealthmins. (#34122)

Don't print newline if admin is hidden.

* Automatic changelog update

* Added missing cameras to Loop Station (#34308)

* Added missing cameras

* Added missing cameras

* Amber Station - Fixes and Warm Lights (#34324)

* Added warm lights, placed them around the map, also fixed an issue with the MV wire in the cafeteria

* Fixed lv wiring in caf, and adjusted a couple things

* Empty commit to force checks to rerun

* Automatic changelog update

* change locking to use ComplexInteraction (#34326)

Co-authored-by: deltanedas <@deltanedas:kde.org>

* Automatic changelog update

* Drink titles and soda vendor consistency (#34178)

* Made capitalisation of proper names consistent.

* Roy Rogers is presumably a proper name.

* Second pass at distinguishing proper names only.

* Two nitpicking/minor changes

* Fixed some overlooked can brand names. Matched case with descriptions.

* Switched generic sodas with brands for SodaInventory

* Removed commonly available branded cans

* Matched case consistency used elsewhere. Minor SPAG corrections.

* Added "nothing" and some missing alcohol bottles to RandomSpawner

* Added distinct ad and bye chatter to Dr. Gibb machines.

* Revert "Added distinct ad and bye chatter to Dr. Gibb machines."

This reverts commit f90b8a470556de05aca81255db8b6b03596ae944.

* Revert "Removed commonly available branded cans"

This reverts commit 43b82168dac1f73b187b7677f34ecdd33b6bb81a.

* Revert "Switched generic sodas with brands for SodaInventory"

This reverts commit f1790f0ce61ef135c79068de6a741e8bb50d85d3.

* Lowercased DrinkGlass suffix. Moved alcoholic drinks from drinks to alcohol.

* Renamed energy drink to Red Bool. Corrected and added some jug descriptions.

* Added reagent names for all bottles except poison-wine

* Revision of title case for cocktails

* SPAG and fixed the only brand reagen with unbranded name.

* Possibly controversial, shortened some bran names to better fit the UI.

* Fixed some inconsistencies in naming

* Matched brand localisation change

* Two name style edits

* Fixed Smite bottle name

* Minor, punctuation

* Blank line to end of file

* Upgraded descriptive names to title case

* Banana Mama

* reverts change, moved to another PR to avoid conflict.

* Removed caffeine reference.

* Minor, corrected some more inconsistencies

* Removed Bottle of Nothing from random spawner.

* Automatic changelog update

* Fix access configurator debug assert (#34330)

* fix

* greytide fix

* fix admin log

* Dirty

* Renamed water melon juice to watermelon juice (#34341)

* Fix battery charging stopping just short of being full (#34028)

* Add copy threshold button to air alarms (#34346)

* Automatic changelog update

* Oasis updoot the dimmining (#34347)

updooty

* Fland Station - Dirt Fix (#34352)

Fland

* Omega Station - Dirt Fix (#34353)

omega

* Marathon Station - Dirt Fix (#34354)

* Marathon

* Rerunning tests

* Cog Station - Dirt Fix (#34355)

Cog

* Box Station - Dirt Fix (#34356)

Box

* Bagel Station - Dirt Fix (#34357)

Bagel

* Packed Station - Dirt Fix (#34351)

* packed

* Rerunning tests

* Replace some sound PlayEntity with PlayPvs (#34317)

* Fixed Forensic Gloves to be Security Contraband  (#34193)

* added BaseRestrictedContraband to forensic gloves

* moved from id to parent

* Automatic changelog update

* add large instruments to the cargo request computer (#34240)

* added the church organ to the cargo console (will add more in this PR, assuming i did this right (HOW DO YOU BUY CARGO ORDERS IN DEV ENVIROMENT???? *sobs))

* added other structure instruments to cargo Catalog

* fixed an epic copy/paste fail

* changed prices

* fixed epic copy/paste fail #2

---------

Co-authored-by: TeenSarlacc <baddiepro123@gmail.com>

* Automatic changelog update

* Fix crayon losing durability on stamped paper (#34202)

* Automatic changelog update

* Adds a border to Oppenhopper poster (#34219)

* border

* Update meta.json

* Update Resources/Textures/Structures/Wallmounts/posters.rsi/meta.json

---------

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

* Trim trailing newlines from examine messages (#33381)

* Trim trailing newlines from examine messages

* TrimTrailingNewlines -> TrimEnd

* Add a popup message when ghost Boo action does nothing (#34369)

* fix ghost_component.ftl locale grammar (#34372)

fix ghost component locale grammar

* Let ghosts sometimes make certain devices say creepy things (#34368)

* Add SpookySpeaker component/system

* Shuffle Boo action targets before trying to activate them

* Add SpookySpeaker to vending machines

* Fix chatcode eating messages starting with "..."

* Add SpookySpeaker to recycler

* Oops

* Decrease speak probability for vending machines

* Add spooky speaker to arcade machines

* Automatic changelog update

* Add directional escape pod sign (#34367)

* Make indestructible tiles not breakable by explosions (#34339)

* No more Ai Spacing

* Move guard into earlier guard statement

* Automatic changelog update

* Arachnid stomach organ yaml fix (#34298)

Arachnid stomach yaml fix

Arachnids had their stomach `updateInterval` set to 1.5, 50% slower than
normal. But this doesn't actually slow down the speed that the stomach
digests things, only the rate at which it updates to check if enough
time has passed. (See 23f0b304f2/Content.Server/Body/Systems/StomachSystem.cs (L57) )

This PR changes arachnid stomachs to have a `digestionDelay` of 30 (20
is default) to achive the desired effect.

Stasis beds are also bugged in a similar manner. They are intended to
slow down the digestion speed, but similarly all they do is change the
update rate. But fixing that requires actual code changes and is out of
scope for this commit.

* Automatic changelog update

* Bended radiator (#34251)

* Automatic changelog update

* Remove Entity<T> data-fields (#34083)

* Update submodule, .NET 9 (#34320)

* Role Types (#33420)

* mindcomponent namespace

* wip MindRole stuff

* admin player tab

* mindroletype comment

* mindRolePrototype redesign

* broken param

* wip RoleType implementation

* basic role type switching for antags

* traitor fix

* fix AdminPanel update

* the renameningTM

* cleanup

* feature uncreeping

* roletypes on mind roles

* update MindComponent.RoleType when MindRoles change

* ghostrole configuration

* ghostrole config improvements

* live update of roleType on the character window

* logging stuff and notes

* remove thing no one asked for

* weh

* Mind Role Entities wip

* headrev count fix

* silicon stuff, cleanup

* exclusive antag config, cleanup

* jobroleadd overwerite

* logging stuff

* MindHasRole cleanup, admin log stuff

* last second cleanup

* ocd

* move roletypeprototype to its own file, minor note stuff

* remove Roletype.Created

* log stuff

* roletype setup for ghostroles and autotraitor reinforcements

* ghostrole type configs

* adjustable admin overlay

* cleanup

* fix this in its own PR

* silicon antagonist

* borg stuff

* mmi roletype handling

* spawnable borg roletype handling

* weh

* ghost role cleanup

* weh

* RoleEvent update

* polish

* log stuff

* admin overlay config

* ghostrolecomponent cleanup

* weh

* admin overlay code cleanup

* minor cleanup

* Obsolete MindRoleAddedEvent

* comment

* minor code cleanup

* MindOnDoGreeting fix

* Role update message

* fix duplicate job greeting for cyborgs

* fix emag job message dupe

* nicer-looking role type update

* crew aligned

* syndicate assault borg role fix

* fix test fail

* fix a merge mistake

* fix LoneOp role type

* Update Content.Client/Administration/AdminNameOverlay.cs

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

* Update Content.Shared/Roles/SharedRoleSystem.cs

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

* comment formatting

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

* change logging category

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

* fix a space

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

* use MindAddRoles

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

* get MindComponent from TryGetMind

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

* move var declaration outside loop

* remove TryComp

* take RoleEnum behind the barn

* don't use ensurecomp unnecessarily

* cvar comments

* toggleableghostrolecomponent documentation

* skrek

* use EntProtoId

* mindrole config

* merge baserolecomponent into basemindrolecomponent

* ai and borg silicon role tweaks

* formatting

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

* I will end you (the color)

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

* use LocId type for a locale id

* update RoleEvent documentation

* update RoleEvent documentation

* remove obsolete MindRoleAddedEvent

* refine MindRolesUpdate()

* use dependency

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

* inject dependency

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

* roleType.Name no longer required

* reformatted draw code logic

* GhostRoleMarkerRoleComponent comment

* minor SharedRoleSystem cleanup

* StartingMindRoleComponent, unhardcode roundstart silicon

* Update Content.Shared/Roles/SharedRoleSystem.cs

* remove a whitespace

---------

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

* Automatic changelog update

* Update Credits (#34389)

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

* Elkridge Depot Improvements (#34377)

* updates decals

* more decal work, more dinginess in certain areas

* added decals under doors

* Fix force-feeding Loc strings not using target's gender (#34276)

* HOTFIX Tweaked air alarm default settings for nitrogen breathing crew (#34198)

air alarm default settings modified for anaerobic crew

* #33571 Bomb defusal lockers always should have tools (#34394)

* Automatic changelog update

* [HOTFIX] fix holopads with multiple ai cores dying (#34289)

change return to continue

Co-authored-by: deltanedas <@deltanedas:kde.org>

* Reduce Panic Bunker Minimum Playtime to 2 hours (#34401)

* Add IPIntel API support. (#33339)

Co-authored-by: PJB3005 <pieterjan.briers+git@gmail.com>

* Automatic changelog update

* Fland Reporters Room (#34408)

changed the command checkpoint to a reporters room.

* Automatic changelog update

* Add a high-capacity water tank to the janitor's closet of Oasis (#34366)

added high capacity water tank

* Darkened Service job interface icons for better contrast (#34270)

* Darkened Service job interface icons for better contrast

* Fixed Botanist job interface icon dark handle hole

* Change to new, darker, service color in all resource yml files

* Revert Map file service color changes

* Use new darker service color on id cards

* Revert Service color change in mapping_actions.yml

* Revert salvage difficulties service color

* Redo service ID and job colors to match advanced palette

* Revert all service color yml file changes

* Switch icons to use existing service pallete colors from advanced pallete

* Update meta.json for darkened service icons

---------

Co-authored-by: Erskin Cherry <frobnic8@gmail.com>

* Amber Station - Moved Vents Around (#34410)

* Moved all vents around, made some small changes

* Finished work

* Removed insuls spawner since they're not merged yet

* Insuls Spawner (#34407)

* Added insuls spawner, time to test

* adjusted whitespace since that was causing issues

* Update Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml

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

---------

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

* Manual Valves Resprite (#34378)

* resprited manual valves to be colourblind friendly

* Update Resources/Textures/Structures/Piping/Atmospherics/pump.rsi/meta.json

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

---------

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

* Automatic changelog update

* loop station door access fixes and air sink (#34414)

small fixes

* Raise syndicate kobold reinforcement HP crit threshold from 75 to 100 to match monkey. (#34409)

kobold ops have 100 health

* Anomaly dragging exploit fix and QOL changes (#34280)

* Wood wall is now built from barricade congraph and on top of a barricade instead of using rods

* APE dragging exploit fix

* Fixed doors being blocked with mousetraps, and other Collidable items (#34045)

* Changed SharedDoorSystem.GetColliding() to allow non-LowImpassible mask entities to stay in the door while it closes

* Update Content.Shared/Doors/Systems/SharedDoorSystem.cs

Clarifies comment of how the mask is used

Co-authored-by: Centronias <charlie.t.santos@gmail.com>

---------

Co-authored-by: Centronias <charlie.t.santos@gmail.com>

* Fixed Jazz Instrument for Electric Guitars (#33363)

* fixed jazz midi program byte

* swapped around jazz and clean in instrumentList

* Automatic changelog update

* Porting Pride-O-Mat to Upstream (#34412)

* Pride-O-Mat (#1322)

* Added Pride-O-Mat

* Yep

* Updated license to the correct one

* Added more lines, reconfigured settings a bit, also added cloaks to inventory, set coder socks to emag inventory

* Removed bunny ears, fixed typo

* Made requested changes 

Webedit lmao

---------

Co-authored-by: Dorragon <101672978+Dorragon@users.noreply.github.com>

* Automatic changelog update

* Oasis Power Rebalance + Misc fixes (#34425)

* balance oasis power as a stopgap

* change waste color to proper waste color

* Fix IPIntel causing frequent errors with the cleanup job. (#34428)

Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>

* craftable pet carrier (#34431)

* craftable pet carrier

* epic integration test fail

* Update Resources/Prototypes/Recipes/Crafting/improvised.yml

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

* Update Resources/Prototypes/Recipes/Crafting/Graphs/storage/pet_carrier.yml

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

* Update Resources/Prototypes/Recipes/Crafting/Graphs/storage/pet_carrier.yml

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

* Update Resources/Prototypes/Entities/Objects/Misc/pet_carrier.yml

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

* extra tab begone

* epic linter fail

* how did linter not see this???

---------

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

* Automatic changelog update

* Adds omnisexual pin (#34439)

* Make important change (#7)

This is to help julian test his bot

* Omnibus

* Remove random test file from testing a gh bot

* Add pin to vendor, spawners and loadout

---------

Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com>

* Fix bad Rider analysis error in AccessOverriderWindow.xaml.cs (#34213)

* Disable meta-atlas for big rare RSIs (#33643)

* Persist deadmin to database, add admin suspension system (#34048)

* Automatic changelog update

* STAThread client content start (#34212)

* Minor client packaging changes (#33787)

* Fix muzzle accent (#34419)

* Automatic changelog update

* Add Discord webhook on watchlist connection (#33483)

* Automatic changelog update

* Fixed Thief starting gear failing on specific bag inventories. (#34430)

Fixed it yayyy

* Added missing details from worn capes to head of department beadsheets (#34396)

* Added key and missing details from worn cape to HOP bedsheet

* Corrected canvas size for sprite

* Subtle tweak to shading to reduce color blurring at pillow edge

* Matched Hue and tone to cape

* Tweak chekered pattern marks for gold trim

* Removed accidental palette inclusion

* Clearer wording and corrected attribution name.

* Tweaked shading on key image to fit in better with bed aesthetics

* Added CE cape icon to bedsheet

* Added cape image to HOP bedsheet. Made gold trim better match cape visuals

* RD cape icon added. Colour tweaked to better match cape.

* Updates json

* Tweaks to gold trim shading to match bed aesthetics

* Added better shading for HOP sheet side. Halved file size.

* Optimised HOS RD and CE sheet sprites

* Corrected sprite title in attribution

* Replace ERT Medic's Advanced Medkits with 2 Combat Medkits (#34380)

Replaced Adv kits with 2 combat kits

* Fix nonsensical RegEx for name restriction (#34375)

* Fixed nonsense RegEx

"-" character is a range, caused an error.
No need for "," to repeat so much, it's not a separator.
"\\" - just why?

* Further optimized RegEx structure

Added:
"@" delimiter for consistency
"/" to escape "-" for good and to avoid further problems

* Remove the ability to print the station anchor circuit board (#34358)

remove the ability to print the station anchor circuit board

* Automatic changelog update

* Meta hotfix (#34306)

* Fixed major issues with power, cargo shuttle docking, etc.

* remove serialized invalids

* Finished fixing the critical issues, ready for merge?

* Empty commit

* Added new break room to sci (they deserve it)

* Fixed up other minor issues

* if this map isnt PERFECT Emisse has permission to gib me and turn me into a cyborg

* added Roomba's changes

---------

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

* Make Mime PDA interactions silent (#34426)

* make insert and eject datafields in ItemSlotsComponent.cs nullable, make mime PDA silent

* make it so that you can't fit wirecutters into the slots, among other various things

* Automatic changelog update

* Smite vending machine (#34420)

* Added smite machine to YAML

* Added smite ads and inventory

* Added smite vendor sprites

* Changed the description of the machine to not repeat and ad line.

* Added newline to end of inventory .yml

* Corrected erroneous edit.

* Tweaked all sprites

* Added tesla toy to contraband. Reduced number of drinks available

* Reduced soda varieties but increased can numbers.

* Removed tesla toy from contraband inventory

* Removed speech component from vending machines that already inherit it

* Moved Sprite component to top of list

* Added Smite vendors to random spanwers

* Alphabetised spawn prototypes, commented where name is unclear

* Automatic changelog update

* Printable bedsheets (#34034)

* Bedsheets

* that one fixes yellow bedsheet and delete american bedsheet

* Automatic changelog update

* Update RT to v239.0.1 (#34454)

* Remove christmas anomaly spawn (#34053)

Update anomaly.yml

* Automatic changelog update

* Remove baby jail (#34443)

* Remove baby jail

Closes #33893

* Test fail fix.

* Add a CCVar to allow from hiding admins in the reported player count. (#34406)

Good for:
- Keeping admins hidden
- Not confuse players seeing 84/80 players

Nicely pairs up with the ``admin.admins_count_for_max_players`` ccvar

* Automatic changelog update

* Fix Mixed puddles not updating slips when evap (#34303)

* Fix Mixed puddles not updating slips when evap

* Remove Comment that isn't needed

Co-authored-by: Centronias <charlie.t.santos@gmail.com>

* CR - use SolutionContainerSystem.UpdateChemicals

* CR - cleanup unused imports

---------

Co-authored-by: Centronias <charlie.t.santos@gmail.com>

* Automatic changelog update

* WizDen config update for IPIntel (#34457)

* Fix DNA scrambler updating station record (#34091)

* Fix DNA scrambler updating station record

* Update Content.Server/Implants/SubdermalImplantSystem.cs

---------

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

* Automatic changelog update

* New and Modified Map Spawners (#34424)

* Added spanwers and modified others

* adjusted values to be more in line with what I want

* this comment may have caused that test fail

* oh my god another typo

* Modified door crate to be engineering flavored

* reduced the pride vendor odds

Webedit lmao

* Elkridge Depot Fixes Again (#34461)

fixes evac shuttle, fix north solars, fix vents and scrubbers

* Space Ruins Variant (#34445)

* Space Ruins Variant

* Updated File

* Added Goliaths/Removed some mobs

* Plasma Station (#33991)

* Plasma Station initial commit

* Map fixes 1

Expanded science's SMES array
Added advanced SMES
Redone stamped documents with custom stamps
Expanded atmospherics with more storage tanks
Added status displays
Add missing beacons to solars
Replaced the passive gates in science with valves
Removed protolathe in engineering
Added guitar to CE office
Replaced throngler plushie with weh cloak
Add a lattice tile outside the atmos burn chamber and storange tanks
Added atmos network monitor in bridge

* Add cargo and emergency shuttle

* Updated maps

* Add plasma to map testing list

* Map fixes 2

Reworked pipenets to not go under walls
Redid salvage and disposals
Reworked the bar to include a new bar extension facing the pool
Replaced arrivals cryo with an arcade
Replaced the toilets in the service plaza with cryo
Removed the cryo in dorms
Added more details to hallways
Redid tools room to include a front desk for the janitor closet
Reconnected sci to power roundstart
Removed some unideal spawns
Expanded the TEG airlock to be 2x3 instead of 1x3
Reduced the size of the SMES bank from 10 to 6
Disabled the plasma miners (downstreams or admins can re-enable them)
Replaced illegal maint items

* Fixes a 6 pack destroying the universe

Ok maybe cracking a cold one with the boys wasn't a great idea.

* Map fixes 3

* Quick research assistant fix

* Map fixes 4

* Map fixes 5

* webedit go brrrt

* Map fixes 6

* Map fixes 7

* Map fixes 8

* Fixes non-existent object

It's amazing this game runs at all

* Map fixes 9

* update pools

* Map fixes 10

* forgot to clear my multitool

I love mapping I love mapping I love mapping I love mapping I love mapping

---------

Co-authored-by: Emisse <99158783+Emisse@users.noreply.github.com>

* Automatic changelog update

* Plasma station population tweak (#34462)

* Plasma Station initial commit

* Map fixes 1

Expanded science's SMES array
Added advanced SMES
Redone stamped documents with custom stamps
Expanded atmospherics with more storage tanks
Added status displays
Add missing beacons to solars
Replaced the passive gates in science with valves
Removed protolathe in engineering
Added guitar to CE office
Replaced throngler plushie with weh cloak
Add a lattice tile outside the atmos burn chamber and storange tanks
Added atmos network monitor in bridge

* Add cargo and emergency shuttle

* Updated maps

* Add plasma to map testing list

* Map fixes 2

Reworked pipenets to not go under walls
Redid salvage and disposals
Reworked the bar to include a new bar extension facing the pool
Replaced arrivals cryo with an arcade
Replaced the toilets in the service plaza with cryo
Removed the cryo in dorms
Added more details to hallways
Redid tools room to include a front desk for the janitor closet
Reconnected sci to power roundstart
Removed some unideal spawns
Expanded the TEG airlock to be 2x3 instead of 1x3
Reduced the size of the SMES bank from 10 to 6
Disabled the plasma miners (downstreams or admins can re-enable them)
Replaced illegal maint items

* Fixes a 6 pack destroying the universe

Ok maybe cracking a cold one with the boys wasn't a great idea.

* Map fixes 3

* Quick research assistant fix

* Map fixes 4

* Map fixes 5

* webedit go brrrt

* Map fixes 6

* Map fixes 7

* Map fixes 8

* Fixes non-existent object

It's amazing this game runs at all

* Map fixes 9

* update pools

* Map fixes 10

* forgot to clear my multitool

I love mapping I love mapping I love mapping I love mapping I love mapping

* Tweaked player counts

---------

Co-authored-by: Emisse <99158783+Emisse@users.noreply.github.com>

* Automatic changelog update

* Fix inconsistent borg flashlight state (#33027)

* Fix borg light being stuck on if no cell is inserted

* Fix HandheldLightComponent.Activted becoming out of sync with SharedPointLightComponent.Enabled

* Fix for entities which don't have a handheld light component

* FIX: Uranium, Cak, and BreadDog are not garbage! (#34192)

* FIX: Uranium, Cak, and BreadDog are not garbage!

* Fixed bread typo for spacegarbage change.

* Style: moved ediblebase

* Update Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml

* Update Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml

---------

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

* Automatic changelog update

* Fix the HoS mantle metashield break (#33831)

Changes 'nukies' to 'syndicate agents' in the HoS mantle's description.

* fix for climbable pianos (#33690)

fix for climable pianos

Co-authored-by: aa5g21 <aa5g21@soton.ac.uk>

* Automatic changelog update

* BorgChassis transfer their mind to a dropped BorgBrain fix (#34464)

Fix

* Staging: Add taped logo back for 10th anniversary (#34486)

* Update engine to v240.0.1 (#34497)

* mind roles

* partial ritual serialization fix

* Update CP14RoundEndSystem.cs

* delete worldEdge system

* Delete StencilOverlay.WorldEdge.cs

* Update CP14MagicEffectComponent.cs

* delete rituals system

* fix demiplane serialization

* mapdamage fix serialization

* common objectives fix

* remove failed personal goals endscreen

* fix special selling, fix serialization

* more fixes

* more fixes x2

* final bruh

* fix

---------

Co-authored-by: Southbridge <7013162+southbridge-fur@users.noreply.github.com>
Co-authored-by: TytosB <54259736+TytosB@users.noreply.github.com>
Co-authored-by: Emisse <99158783+Emisse@users.noreply.github.com>
Co-authored-by: Booblesnoot42 <108703193+Booblesnoot42@users.noreply.github.com>
Co-authored-by: Spessmann <156740760+Spessmann@users.noreply.github.com>
Co-authored-by: ~DreamlyJack~ <148849095+DreamlyJack@users.noreply.github.com>
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
Co-authored-by: chromiumboy <50505512+chromiumboy@users.noreply.github.com>
Co-authored-by: PopGamer46 <yt1popgamer@gmail.com>
Co-authored-by: crazybrain23 <44417085+crazybrain23@users.noreply.github.com>
Co-authored-by: amatwiedle <amatwiedle@gmail.com>
Co-authored-by: justdie12 <125140938+justdie12@users.noreply.github.com>
Co-authored-by: Nox <nebulousnox38@gmail.com>
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com>
Co-authored-by: ReeZer2 <63300653+ReeZer2@users.noreply.github.com>
Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com>
Co-authored-by: Alpaccalypse <21291379+Alpaccalypse@users.noreply.github.com>
Co-authored-by: Spanky <scott@wearejacob.com>
Co-authored-by: Thomas <87614336+Aeshus@users.noreply.github.com>
Co-authored-by: Dylan Hunter Whittingham <45404433+DylanWhittingham@users.noreply.github.com>
Co-authored-by: dylanhunter <dylan2.whittingham@live.uwe.ac.uk>
Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
Co-authored-by: Ps3Moira <113228053+ps3moira@users.noreply.github.com>
Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com>
Co-authored-by: Hannah Giovanna Dawson <karakkaraz@gmail.com>
Co-authored-by: Ubaser <134914314+UbaserB@users.noreply.github.com>
Co-authored-by: Deerstop <edainturner@gmail.com>
Co-authored-by: themias <89101928+themias@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com>
Co-authored-by: Centronias <charlie.t.santos@gmail.com>
Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>
Co-authored-by: SpaceRox1244 <138547931+SpaceRox1244@users.noreply.github.com>
Co-authored-by: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com>
Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
Co-authored-by: Tayrtahn <tayrtahn@gmail.com>
Co-authored-by: Pancake <Pangogie@users.noreply.github.com>
Co-authored-by: Piras314 <p1r4s@proton.me>
Co-authored-by: flymo5678 <86871317+flymo5678@users.noreply.github.com>
Co-authored-by: c4llv07e <igor@c4llv07e.xyz>
Co-authored-by: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Co-authored-by: Coolsurf6 <coolsurf24@yahoo.com.au>
Co-authored-by: TeenSarlacc <46608342+TeenSarlacc@users.noreply.github.com>
Co-authored-by: TeenSarlacc <baddiepro123@gmail.com>
Co-authored-by: SpaceManiac <tad@platymuus.com>
Co-authored-by: War Pigeon <54217755+minus1over12@users.noreply.github.com>
Co-authored-by: Zachary Higgs <compgeek223@gmail.com>
Co-authored-by: 0x6273 <0x40@keemail.me>
Co-authored-by: Floxington <florian.decker@mailbox.org>
Co-authored-by: Myra <vasilis@pikachu.systems>
Co-authored-by: SlimSlam <73899110+Stewie523@users.noreply.github.com>
Co-authored-by: frobnic8 <erskin@eldritch.org>
Co-authored-by: Erskin Cherry <frobnic8@gmail.com>
Co-authored-by: hyperDelegate <zachary1064@gmail.com>
Co-authored-by: JustinWinningham <justinmwinningham@gmail.com>
Co-authored-by: zHonys <69396539+zHonys@users.noreply.github.com>
Co-authored-by: Dorragon <101672978+Dorragon@users.noreply.github.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
Co-authored-by: Killerqu00 <47712032+Killerqu00@users.noreply.github.com>
Co-authored-by: Julian Giebel <juliangiebel@live.de>
Co-authored-by: Palladinium <patrick.chieppe@hotmail.com>
Co-authored-by: Alpha-Two <92269094+Alpha-Two@users.noreply.github.com>
Co-authored-by: Hyper B <137433177+HyperB1@users.noreply.github.com>
Co-authored-by: kosticia <kosticia46@gmail.com>
Co-authored-by: compilatron <40789662+jbox144@users.noreply.github.com>
Co-authored-by: eoineoineoin <github@eoinrul.es>
Co-authored-by: Patrik Caes-Sayrs <heartofgoldfish@gmail.com>
Co-authored-by: ApolloVector <149586366+ApolloVector@users.noreply.github.com>
Co-authored-by: Gansu <68031780+GansuLalan@users.noreply.github.com>
Co-authored-by: aa5g21 <aa5g21@soton.ac.uk>
2025-01-21 23:57:12 +03:00
Ed
312f2ae14c Великая жарка мяса (#788)
* temperature transform

* Update CP14TemperatureSystem.cs

* fix heating entities

* cooking!

* fix cooking

* aaa

* foodsequence remove

* fix

* fix
2025-01-21 23:03:50 +03:00
Nimfar11
258cb7bd4e fix sprite 2025-01-21 18:08:37 +02:00
ArtisticRoomba
9950648bba [HOTFIX] Fix MRP whitelist auto denying people with any medium severity notes in 14 days (#34532)
* fix mrp whitelist auto denying people with warning

* make headmin requested changes

* godo
2025-01-21 11:24:50 +01:00
Errant
671ab10be2 [HOTFIX] Admin Menu player jobs (#34545)
update job info on spawn
2025-01-20 23:30:00 +01:00
Errant
60ed142c3c Cherry-pick to stable: Fix emergency_elkridge being saved as a map (#34496) (#34526) 2025-01-20 21:35:30 +01:00
Ed
5aeae56092 Update T1_resurrection.yml 2025-01-20 21:07:45 +03:00
Ed
8699a6843b Update CP14RoundEndSystem.cs 2025-01-20 20:24:03 +03:00
Ed
9615798d7b Update CP14RoundEndSystem.cs 2025-01-20 16:48:30 +03:00
Ed
d7733cab56 fix round end 2025-01-20 16:36:42 +03:00
Nimfar11
b19b5c9bb6 bow and quiver 2025-01-20 03:45:37 +02:00
Leon Friedrich
64689b4cc8 Fix emergency_elkridge being saved as a map (#34496)
Save `emergency_elkridge` as a grid

(cherry picked from commit ef50219455)
2025-01-19 16:51:19 -08:00
Ed
9ef68fccf9 Update Dev.toml 2025-01-19 21:07:44 +03:00
Ed
6a82d72e0c eeee 2025-01-19 21:05:49 +03:00
Ed
2544315427 Update Dev.toml 2025-01-19 14:29:01 +03:00
Ed
94ab0fc94b Bugfixes (#783)
* fix force evaporation

* knowledge book in bank

* music in loadouts

* Update general.yml

* localization sync

* fix round leave and manifest

* ship sound replacement

* fix traveling ship gravity

* forgot this role knowledge
2025-01-19 14:23:53 +03:00
Ed
090c4d5eb0 Update demiplane.yml 2025-01-19 11:28:23 +03:00
Ed
6bef560e85 Merge branch 'master' of https://github.com/crystallpunk-14/crystall-punk-14 2025-01-19 00:43:07 +03:00
Ed
4e59cff88e Update ContentLocalizationManager.cs 2025-01-19 00:41:26 +03:00
Ed
3221056384 fix eng loc 2025-01-19 00:40:54 +03:00
Nim
f7c7c54a7e More harvest and other little things (#780)
* harvest

* fix potato
2025-01-19 00:12:13 +03:00
Nim
2dd5c48c75 cut clothes (#781)
Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>
2025-01-19 00:10:56 +03:00
Ed
85793e181e Bank Special sell positions (bounty system?) (#782)
* fix round end

* remove closet skeleton event

* special positions
2025-01-19 00:09:30 +03:00
Leon Friedrich
f3324b458c Update engine to v240.0.1 (#34497) 2025-01-18 16:11:53 +01:00
Ed
4979b0a5d0 Simple round end redesign (#723)
* round end monolith system

* disable default evac

* auto close demiplanes, and block its opening when no monolith mana

* Update CP14RoundEndSystem.cs

* enable default evac code (its disabled viaa cvar)

* apply brainstorm monolith changes

* comoss update
2025-01-18 17:55:41 +03:00
Ed
68ab77d4d4 Knowledge UI (#779)
* knowledge button in HUD

* ui controller

* bugfixes

* finish

* all-knowing ghosts

* Create knowledge-ui.ftl
2025-01-18 14:43:11 +03:00
Ed
734d12cfac Slots separate (#778)
* fix #67

* more all armor to new slot

* smart skeletons
2025-01-17 22:15:54 +03:00
Pieter-Jan Briers
b07fe8ee10 Staging: Add taped logo back for 10th anniversary (#34486) 2025-01-17 18:22:42 +01:00
Ed
bccd4c19be Water lilies, Air lily alchemy reagent (#771)
* water lilies

* air lily

* air lily achemy expand

* Update air_lily.yml

* water spawners

* swamp biome

* add air lilies into demiplanes, nerf mobs, remove xeno

* fix

* t1 swamps
2025-01-17 17:41:49 +03:00
Nim
ca23fddd8a Lyre and flute (#759)
* music

* fix desc

* Update T1_fire_rune.yml

---------

Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>
Co-authored-by: Ed <edwardxperia2000@gmail.com>
2025-01-17 01:26:39 +03:00
Ed
50c502f598 AOE Spells (#758)
* AoE gameplay

* Update T1_fire_rune.yml

* test

* add cool AoE visual
2025-01-17 01:01:44 +03:00
Ed
0783eb1380 Knowledge system (#770)
* remove all requirements

* clean up and renaming to knowledge

* update code

* add admin knowledge verbs

* move shoes under pants

* knowledge based recipes

* clean up

* sewing knowledges

* knowledge dependencies

* knowledge learning objects

* more knowledge

* metallforging skill

* knowledge books

* start knowledges, T1 and T2 books in demiplanes

* remove coins from demiplanes

* roundstart knowledge
2025-01-17 00:08:13 +03:00
ScarKy0
cec5816acf BorgChassis transfer their mind to a dropped BorgBrain fix (#34464)
Fix
2025-01-16 15:08:08 +01:00
PJBot
4e7c21fba3 Automatic changelog update 2025-01-16 12:26:14 +00:00
Gansu
3b39439945 fix for climbable pianos (#33690)
fix for climable pianos

Co-authored-by: aa5g21 <aa5g21@soton.ac.uk>
2025-01-16 13:25:07 +01:00
ApolloVector
1e35cfb11e Fix the HoS mantle metashield break (#33831)
Changes 'nukies' to 'syndicate agents' in the HoS mantle's description.
2025-01-16 13:04:22 +01:00
PJBot
b32c07c5d8 Automatic changelog update 2025-01-16 11:41:28 +00:00
Patrik Caes-Sayrs
de8a2775ec FIX: Uranium, Cak, and BreadDog are not garbage! (#34192)
* FIX: Uranium, Cak, and BreadDog are not garbage!

* Fixed bread typo for spacegarbage change.

* Style: moved ediblebase

* Update Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml

* Update Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-01-16 12:40:21 +01:00
eoineoineoin
820517eb38 Fix inconsistent borg flashlight state (#33027)
* Fix borg light being stuck on if no cell is inserted

* Fix HandheldLightComponent.Activted becoming out of sync with SharedPointLightComponent.Enabled

* Fix for entities which don't have a handheld light component
2025-01-16 11:34:11 +01:00
PJBot
85b9f919af Automatic changelog update 2025-01-16 08:52:23 +00:00
compilatron
83eb5dc34b Plasma station population tweak (#34462)
* Plasma Station initial commit

* Map fixes 1

Expanded science's SMES array
Added advanced SMES
Redone stamped documents with custom stamps
Expanded atmospherics with more storage tanks
Added status displays
Add missing beacons to solars
Replaced the passive gates in science with valves
Removed protolathe in engineering
Added guitar to CE office
Replaced throngler plushie with weh cloak
Add a lattice tile outside the atmos burn chamber and storange tanks
Added atmos network monitor in bridge

* Add cargo and emergency shuttle

* Updated maps

* Add plasma to map testing list

* Map fixes 2

Reworked pipenets to not go under walls
Redid salvage and disposals
Reworked the bar to include a new bar extension facing the pool
Replaced arrivals cryo with an arcade
Replaced the toilets in the service plaza with cryo
Removed the cryo in dorms
Added more details to hallways
Redid tools room to include a front desk for the janitor closet
Reconnected sci to power roundstart
Removed some unideal spawns
Expanded the TEG airlock to be 2x3 instead of 1x3
Reduced the size of the SMES bank from 10 to 6
Disabled the plasma miners (downstreams or admins can re-enable them)
Replaced illegal maint items

* Fixes a 6 pack destroying the universe

Ok maybe cracking a cold one with the boys wasn't a great idea.

* Map fixes 3

* Quick research assistant fix

* Map fixes 4

* Map fixes 5

* webedit go brrrt

* Map fixes 6

* Map fixes 7

* Map fixes 8

* Fixes non-existent object

It's amazing this game runs at all

* Map fixes 9

* update pools

* Map fixes 10

* forgot to clear my multitool

I love mapping I love mapping I love mapping I love mapping I love mapping

* Tweaked player counts

---------

Co-authored-by: Emisse <99158783+Emisse@users.noreply.github.com>
2025-01-16 01:51:17 -07:00
PJBot
37bde33691 Automatic changelog update 2025-01-16 07:03:21 +00:00
compilatron
d0b2e46c7c Plasma Station (#33991)
* Plasma Station initial commit

* Map fixes 1

Expanded science's SMES array
Added advanced SMES
Redone stamped documents with custom stamps
Expanded atmospherics with more storage tanks
Added status displays
Add missing beacons to solars
Replaced the passive gates in science with valves
Removed protolathe in engineering
Added guitar to CE office
Replaced throngler plushie with weh cloak
Add a lattice tile outside the atmos burn chamber and storange tanks
Added atmos network monitor in bridge

* Add cargo and emergency shuttle

* Updated maps

* Add plasma to map testing list

* Map fixes 2

Reworked pipenets to not go under walls
Redid salvage and disposals
Reworked the bar to include a new bar extension facing the pool
Replaced arrivals cryo with an arcade
Replaced the toilets in the service plaza with cryo
Removed the cryo in dorms
Added more details to hallways
Redid tools room to include a front desk for the janitor closet
Reconnected sci to power roundstart
Removed some unideal spawns
Expanded the TEG airlock to be 2x3 instead of 1x3
Reduced the size of the SMES bank from 10 to 6
Disabled the plasma miners (downstreams or admins can re-enable them)
Replaced illegal maint items

* Fixes a 6 pack destroying the universe

Ok maybe cracking a cold one with the boys wasn't a great idea.

* Map fixes 3

* Quick research assistant fix

* Map fixes 4

* Map fixes 5

* webedit go brrrt

* Map fixes 6

* Map fixes 7

* Map fixes 8

* Fixes non-existent object

It's amazing this game runs at all

* Map fixes 9

* update pools

* Map fixes 10

* forgot to clear my multitool

I love mapping I love mapping I love mapping I love mapping I love mapping

---------

Co-authored-by: Emisse <99158783+Emisse@users.noreply.github.com>
2025-01-16 00:02:14 -07:00
SlimSlam
0c1608d2f0 Space Ruins Variant (#34445)
* Space Ruins Variant

* Updated File

* Added Goliaths/Removed some mobs
2025-01-15 23:14:40 -07:00
Deerstop
d0a2d7b232 Elkridge Depot Fixes Again (#34461)
fixes evac shuttle, fix north solars, fix vents and scrubbers
2025-01-15 21:48:54 -07:00
Southbridge
87ff3a2421 New and Modified Map Spawners (#34424)
* Added spanwers and modified others

* adjusted values to be more in line with what I want

* this comment may have caused that test fail

* oh my god another typo

* Modified door crate to be engineering flavored

* reduced the pride vendor odds

Webedit lmao
2025-01-16 01:56:12 +01:00
PJBot
e094b79ee4 Automatic changelog update 2025-01-15 22:50:59 +00:00
themias
6d218f2ad5 Fix DNA scrambler updating station record (#34091)
* Fix DNA scrambler updating station record

* Update Content.Server/Implants/SubdermalImplantSystem.cs

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-01-15 23:49:51 +01:00
Nim
5af56d4655 fiiiiiix (#766) 2025-01-16 01:42:20 +03:00
Pieter-Jan Briers
59a14b5329 WizDen config update for IPIntel (#34457) 2025-01-15 23:14:27 +01:00
PJBot
f01db3f276 Automatic changelog update 2025-01-15 21:22:27 +00:00
Zachary Higgs
c92c52fded Fix Mixed puddles not updating slips when evap (#34303)
* Fix Mixed puddles not updating slips when evap

* Remove Comment that isn't needed

Co-authored-by: Centronias <charlie.t.santos@gmail.com>

* CR - use SolutionContainerSystem.UpdateChemicals

* CR - cleanup unused imports

---------

Co-authored-by: Centronias <charlie.t.santos@gmail.com>
2025-01-15 22:21:20 +01:00
PJBot
a7d5c8ff43 Automatic changelog update 2025-01-15 21:12:01 +00:00
Myra
40fc4992e5 Add a CCVar to allow from hiding admins in the reported player count. (#34406)
Good for:
- Keeping admins hidden
- Not confuse players seeing 84/80 players

Nicely pairs up with the ``admin.admins_count_for_max_players`` ccvar
2025-01-15 22:10:54 +01:00
Myra
6041c828de Remove baby jail (#34443)
* Remove baby jail

Closes #33893

* Test fail fix.
2025-01-15 22:08:15 +01:00
PJBot
c6dbdc921a Automatic changelog update 2025-01-15 20:23:38 +00:00
Ed
484af256cd Remove christmas anomaly spawn (#34053)
Update anomaly.yml
2025-01-15 21:22:31 +01:00
Pieter-Jan Briers
fdb2f16701 Update RT to v239.0.1 (#34454) 2025-01-15 20:51:36 +01:00
PJBot
9ede1f3278 Automatic changelog update 2025-01-15 19:37:05 +00:00
kosticia
3dd9307cb7 Printable bedsheets (#34034)
* Bedsheets

* that one fixes yellow bedsheet and delete american bedsheet
2025-01-15 20:35:58 +01:00
PJBot
26910719f1 Automatic changelog update 2025-01-15 18:21:07 +00:00
Alpaccalypse
3cac75f117 Smite vending machine (#34420)
* Added smite machine to YAML

* Added smite ads and inventory

* Added smite vendor sprites

* Changed the description of the machine to not repeat and ad line.

* Added newline to end of inventory .yml

* Corrected erroneous edit.

* Tweaked all sprites

* Added tesla toy to contraband. Reduced number of drinks available

* Reduced soda varieties but increased can numbers.

* Removed tesla toy from contraband inventory

* Removed speech component from vending machines that already inherit it

* Moved Sprite component to top of list

* Added Smite vendors to random spanwers

* Alphabetised spawn prototypes, commented where name is unclear
2025-01-15 19:20:01 +01:00
PJBot
c4c00cdc7c Automatic changelog update 2025-01-15 18:04:57 +00:00
ArtisticRoomba
d6e55edb4a Make Mime PDA interactions silent (#34426)
* make insert and eject datafields in ItemSlotsComponent.cs nullable, make mime PDA silent

* make it so that you can't fit wirecutters into the slots, among other various things
2025-01-15 19:03:49 +01:00
ScarKy0
33c421bd6b Merge Meta hotfix (#34306) into master (#34451) 2025-01-15 18:43:57 +01:00
Nox
d86bf0652a Meta hotfix (#34306)
* Fixed major issues with power, cargo shuttle docking, etc.

* remove serialized invalids

* Finished fixing the critical issues, ready for merge?

* Empty commit

* Added new break room to sci (they deserve it)

* Fixed up other minor issues

* if this map isnt PERFECT Emisse has permission to gib me and turn me into a cyborg

* added Roomba's changes

---------

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2025-01-15 18:24:34 +01:00
MetalSage
6e77b82da7 fix (#763)
Co-authored-by: MetalSage <metalsage.official@gmail.com>
2025-01-15 20:14:50 +03:00
PJBot
4d1581d377 Automatic changelog update 2025-01-15 16:27:26 +00:00
ArtisticRoomba
922251ad66 Remove the ability to print the station anchor circuit board (#34358)
remove the ability to print the station anchor circuit board
2025-01-15 17:26:19 +01:00
Hyper B
e752561d20 Fix nonsensical RegEx for name restriction (#34375)
* Fixed nonsense RegEx

"-" character is a range, caused an error.
No need for "," to repeat so much, it's not a separator.
"\\" - just why?

* Further optimized RegEx structure

Added:
"@" delimiter for consistency
"/" to escape "-" for good and to avoid further problems
2025-01-15 16:59:04 +01:00
Alpha-Two
d83b5acb22 Replace ERT Medic's Advanced Medkits with 2 Combat Medkits (#34380)
Replaced Adv kits with 2 combat kits
2025-01-15 16:49:55 +01:00
Alpaccalypse
e446889315 Added missing details from worn capes to head of department beadsheets (#34396)
* Added key and missing details from worn cape to HOP bedsheet

* Corrected canvas size for sprite

* Subtle tweak to shading to reduce color blurring at pillow edge

* Matched Hue and tone to cape

* Tweak chekered pattern marks for gold trim

* Removed accidental palette inclusion

* Clearer wording and corrected attribution name.

* Tweaked shading on key image to fit in better with bed aesthetics

* Added CE cape icon to bedsheet

* Added cape image to HOP bedsheet. Made gold trim better match cape visuals

* RD cape icon added. Colour tweaked to better match cape.

* Updates json

* Tweaks to gold trim shading to match bed aesthetics

* Added better shading for HOP sheet side. Halved file size.

* Optimised HOS RD and CE sheet sprites

* Corrected sprite title in attribution
2025-01-15 16:15:56 +01:00
Nim
02cfcd620c Inter-Monster tolerance (#761)
* Insects ai

* monster
2025-01-15 17:34:38 +03:00
Alpha-Two
332fc18aa5 Fixed Thief starting gear failing on specific bag inventories. (#34430)
Fixed it yayyy
2025-01-14 22:51:08 -08:00
PJBot
9d5ef57df8 Automatic changelog update 2025-01-15 00:33:30 +00:00
Palladinium
87779250ee Add Discord webhook on watchlist connection (#33483) 2025-01-15 01:32:24 +01:00
PJBot
bb1a3c42ed Automatic changelog update 2025-01-15 00:11:46 +00:00
themias
771278df54 Fix muzzle accent (#34419) 2025-01-15 01:10:39 +01:00
Pieter-Jan Briers
e885a8f1ce Minor client packaging changes (#33787) 2025-01-15 01:08:06 +01:00
Pieter-Jan Briers
2dead48280 STAThread client content start (#34212) 2025-01-15 01:07:24 +01:00
PJBot
99580e0118 Automatic changelog update 2025-01-14 23:47:51 +00:00
Pieter-Jan Briers
c2e050ced0 Persist deadmin to database, add admin suspension system (#34048) 2025-01-15 00:46:45 +01:00
Pieter-Jan Briers
47042cc8dd Disable meta-atlas for big rare RSIs (#33643) 2025-01-15 00:43:48 +01:00
Pieter-Jan Briers
ca96aeb0ec Fix bad Rider analysis error in AccessOverriderWindow.xaml.cs (#34213) 2025-01-15 00:31:50 +01:00
Julian Giebel
a967fc7486 Adds omnisexual pin (#34439)
* Make important change (#7)

This is to help julian test his bot

* Omnibus

* Remove random test file from testing a gh bot

* Add pin to vendor, spawners and loadout

---------

Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com>
2025-01-14 23:41:04 +01:00
PJBot
198dd820f1 Automatic changelog update 2025-01-14 22:35:12 +00:00
Killerqu00
786d4d5557 craftable pet carrier (#34431)
* craftable pet carrier

* epic integration test fail

* Update Resources/Prototypes/Recipes/Crafting/improvised.yml

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

* Update Resources/Prototypes/Recipes/Crafting/Graphs/storage/pet_carrier.yml

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

* Update Resources/Prototypes/Recipes/Crafting/Graphs/storage/pet_carrier.yml

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

* Update Resources/Prototypes/Entities/Objects/Misc/pet_carrier.yml

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

* extra tab begone

* epic linter fail

* how did linter not see this???

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-01-14 23:34:04 +01:00
Ed
e6097da7cc Update CP14MagicEnergyPhotosynthesisComponent.cs 2025-01-15 01:05:28 +03:00
Ed
925738afc2 Workbench update (#760)
* fix workbench icons

* workbench search

* fix 1

* UI finalize

* fix material localization

* restore shard sprite

* Update sewing_table.yml
2025-01-15 00:34:08 +03:00
Myra
13edd308bf Fix IPIntel causing frequent errors with the cleanup job. (#34428)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
2025-01-14 21:38:26 +01:00
Ed
cf41cabcea Remove OP (#757)
* remove outdated content

* Update migration.yml

* Update twoHandedStaffs.yml
2025-01-14 14:36:10 +03:00
Ed
87d57df0e6 Omsoyk epic clothing pack (#756)
* new shirts

* pants and dresses

* blue cloak
2025-01-14 12:03:10 +03:00
ArtisticRoomba
8e7f440243 Oasis Power Rebalance + Misc fixes (#34425)
* balance oasis power as a stopgap

* change waste color to proper waste color
2025-01-14 00:59:15 -07:00
Ed
51a47eaffc Bunch of gameplay issues (#754)
* fix demiplane contetn filtering

* fix day demiplanes

* remove filled crystals from demiplanes

* remove armored zombies

* added candles in town crates

* remove 20% unefficient of mana moving spells

* fix #622

* revert random Viator commit

* Update demiplane_rifts.yml
2025-01-14 01:41:11 +03:00
Nim
c7c5b4dc4c bench fix (#755) 2025-01-13 23:24:33 +03:00
Nim
2644fe26ea Ashes and Russian translation edits with a couple of minor fixes (#735)
* ash++++

* fix

* по запросу
2025-01-13 23:01:34 +03:00
Nim
732bc267f7 Bench (#751)
* bench

* anchored
2025-01-13 22:59:57 +03:00
PJBot
2bebaa753a Automatic changelog update 2025-01-13 18:50:09 +00:00
Southbridge
6c41d967e5 Porting Pride-O-Mat to Upstream (#34412)
* Pride-O-Mat (#1322)

* Added Pride-O-Mat

* Yep

* Updated license to the correct one

* Added more lines, reconfigured settings a bit, also added cloaks to inventory, set coder socks to emag inventory

* Removed bunny ears, fixed typo

* Made requested changes 

Webedit lmao

---------

Co-authored-by: Dorragon <101672978+Dorragon@users.noreply.github.com>
2025-01-13 19:49:02 +01:00
Viator-MV
ddd61df7b8 изменение текстуры книги законов
текстура книги законов изменена на подходящую к новым книгам
2025-01-13 21:37:30 +03:00
Ed
025753e689 revert 2025-01-13 18:09:40 +03:00
PJBot
b308589428 Automatic changelog update 2025-01-13 10:08:40 +00:00
Coolsurf6
de78bedc5f Fixed Jazz Instrument for Electric Guitars (#33363)
* fixed jazz midi program byte

* swapped around jazz and clean in instrumentList
2025-01-13 13:07:33 +03:00
zHonys
25a01b00b6 Fixed doors being blocked with mousetraps, and other Collidable items (#34045)
* Changed SharedDoorSystem.GetColliding() to allow non-LowImpassible mask entities to stay in the door while it closes

* Update Content.Shared/Doors/Systems/SharedDoorSystem.cs

Clarifies comment of how the mask is used

Co-authored-by: Centronias <charlie.t.santos@gmail.com>

---------

Co-authored-by: Centronias <charlie.t.santos@gmail.com>
2025-01-13 13:07:18 +03:00
JustinWinningham
423e48a9f2 Anomaly dragging exploit fix and QOL changes (#34280)
* Wood wall is now built from barricade congraph and on top of a barricade instead of using rods

* APE dragging exploit fix
2025-01-13 13:06:57 +03:00
hyperDelegate
182f0c0bce Raise syndicate kobold reinforcement HP crit threshold from 75 to 100 to match monkey. (#34409)
kobold ops have 100 health
2025-01-13 13:06:30 +03:00
Ed
368839dd68 Bugixes (#750)
* fix #746

* fix #745

* fix #747

* fix #744

* fix #743

* fix #741

* fix #722
2025-01-13 12:54:46 +03:00
TytosB
9cf4cba346 loop station door access fixes and air sink (#34414)
small fixes
2025-01-13 00:17:08 -07:00
PJBot
f2cd615512 Automatic changelog update 2025-01-13 07:08:37 +00:00
Deerstop
ac0a8d1f60 Manual Valves Resprite (#34378)
* resprited manual valves to be colourblind friendly

* Update Resources/Textures/Structures/Piping/Atmospherics/pump.rsi/meta.json

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

---------

Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com>
2025-01-13 08:07:29 +01:00
Southbridge
b00bf40e64 Insuls Spawner (#34407)
* Added insuls spawner, time to test

* adjusted whitespace since that was causing issues

* Update Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml

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

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-01-13 05:28:20 +01:00
Southbridge
5fff6bb1d2 Amber Station - Moved Vents Around (#34410)
* Moved all vents around, made some small changes

* Finished work

* Removed insuls spawner since they're not merged yet
2025-01-12 17:49:44 -07:00
frobnic8
91bc1f8cac Darkened Service job interface icons for better contrast (#34270)
* Darkened Service job interface icons for better contrast

* Fixed Botanist job interface icon dark handle hole

* Change to new, darker, service color in all resource yml files

* Revert Map file service color changes

* Use new darker service color on id cards

* Revert Service color change in mapping_actions.yml

* Revert salvage difficulties service color

* Redo service ID and job colors to match advanced palette

* Revert all service color yml file changes

* Switch icons to use existing service pallete colors from advanced pallete

* Update meta.json for darkened service icons

---------

Co-authored-by: Erskin Cherry <frobnic8@gmail.com>
2025-01-13 01:24:58 +01:00
Booblesnoot42
606e452433 Add a high-capacity water tank to the janitor's closet of Oasis (#34366)
added high capacity water tank
2025-01-12 16:40:22 -07:00
PJBot
8bc4c35aae Automatic changelog update 2025-01-12 23:33:58 +00:00
SlimSlam
72ddc50142 Fland Reporters Room (#34408)
changed the command checkpoint to a reporters room.
2025-01-12 16:32:50 -07:00
PJBot
9cc76d93bf Automatic changelog update 2025-01-12 19:42:35 +00:00
Myra
96d913b147 Add IPIntel API support. (#33339)
Co-authored-by: PJB3005 <pieterjan.briers+git@gmail.com>
2025-01-12 20:41:26 +01:00
Myra
57442fc336 (Stable -> Master) Reduce Panic Bunker Minimum Playtime to 2 hours (#34401) (#34402) 2025-01-12 19:53:10 +01:00
crazybrain23
f85f80e093 Reduce Panic Bunker Minimum Playtime to 2 hours (#34401) 2025-01-12 19:51:25 +01:00
slarticodefast
e830ccebe5 merge stable into master (#34398) 2025-01-12 18:49:02 +01:00
deltanedas
ccff52a72f [HOTFIX] fix holopads with multiple ai cores dying (#34289)
change return to continue

Co-authored-by: deltanedas <@deltanedas:kde.org>
2025-01-12 11:19:58 -06:00
PJBot
7b8d51ceb4 Automatic changelog update 2025-01-12 16:39:49 +00:00
Floxington
83ce982f04 #33571 Bomb defusal lockers always should have tools (#34394) 2025-01-12 11:38:41 -05:00
Errant
8f4c49a41a HOTFIX Tweaked air alarm default settings for nitrogen breathing crew (#34198)
air alarm default settings modified for anaerobic crew
2025-01-12 16:46:36 +01:00
Tayrtahn
924f64e979 Fix force-feeding Loc strings not using target's gender (#34276) 2025-01-12 15:33:53 +01:00
Deerstop
d9e4ed2056 Elkridge Depot Improvements (#34377)
* updates decals

* more decal work, more dinginess in certain areas

* added decals under doors
2025-01-11 23:34:52 -07:00
github-actions[bot]
ea0b04a663 Update Credits (#34389)
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
2025-01-12 01:57:36 +01:00
PJBot
e271a5a598 Automatic changelog update 2025-01-11 21:18:33 +00:00
Errant
46d58bf22a Role Types (#33420)
* mindcomponent namespace

* wip MindRole stuff

* admin player tab

* mindroletype comment

* mindRolePrototype redesign

* broken param

* wip RoleType implementation

* basic role type switching for antags

* traitor fix

* fix AdminPanel update

* the renameningTM

* cleanup

* feature uncreeping

* roletypes on mind roles

* update MindComponent.RoleType when MindRoles change

* ghostrole configuration

* ghostrole config improvements

* live update of roleType on the character window

* logging stuff and notes

* remove thing no one asked for

* weh

* Mind Role Entities wip

* headrev count fix

* silicon stuff, cleanup

* exclusive antag config, cleanup

* jobroleadd overwerite

* logging stuff

* MindHasRole cleanup, admin log stuff

* last second cleanup

* ocd

* move roletypeprototype to its own file, minor note stuff

* remove Roletype.Created

* log stuff

* roletype setup for ghostroles and autotraitor reinforcements

* ghostrole type configs

* adjustable admin overlay

* cleanup

* fix this in its own PR

* silicon antagonist

* borg stuff

* mmi roletype handling

* spawnable borg roletype handling

* weh

* ghost role cleanup

* weh

* RoleEvent update

* polish

* log stuff

* admin overlay config

* ghostrolecomponent cleanup

* weh

* admin overlay code cleanup

* minor cleanup

* Obsolete MindRoleAddedEvent

* comment

* minor code cleanup

* MindOnDoGreeting fix

* Role update message

* fix duplicate job greeting for cyborgs

* fix emag job message dupe

* nicer-looking role type update

* crew aligned

* syndicate assault borg role fix

* fix test fail

* fix a merge mistake

* fix LoneOp role type

* Update Content.Client/Administration/AdminNameOverlay.cs

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

* Update Content.Shared/Roles/SharedRoleSystem.cs

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

* comment formatting

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

* change logging category

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

* fix a space

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

* use MindAddRoles

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

* get MindComponent from TryGetMind

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

* move var declaration outside loop

* remove TryComp

* take RoleEnum behind the barn

* don't use ensurecomp unnecessarily

* cvar comments

* toggleableghostrolecomponent documentation

* skrek

* use EntProtoId

* mindrole config

* merge baserolecomponent into basemindrolecomponent

* ai and borg silicon role tweaks

* formatting

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

* I will end you (the color)

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

* use LocId type for a locale id

* update RoleEvent documentation

* update RoleEvent documentation

* remove obsolete MindRoleAddedEvent

* refine MindRolesUpdate()

* use dependency

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

* inject dependency

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

* roleType.Name no longer required

* reformatted draw code logic

* GhostRoleMarkerRoleComponent comment

* minor SharedRoleSystem cleanup

* StartingMindRoleComponent, unhardcode roundstart silicon

* Update Content.Shared/Roles/SharedRoleSystem.cs

* remove a whitespace

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-01-11 22:17:26 +01:00
Pieter-Jan Briers
3da354304d Update submodule, .NET 9 (#34320) 2025-01-11 21:22:47 +01:00
Leon Friedrich
1c315ba033 Remove Entity<T> data-fields (#34083) 2025-01-11 21:22:29 +01:00
PJBot
6be4fba792 Automatic changelog update 2025-01-11 20:04:10 +00:00
justdie12
afd5ce39ed Bended radiator (#34251) 2025-01-11 21:03:04 +01:00
PJBot
d5ce3e85fb Automatic changelog update 2025-01-11 19:31:01 +00:00
0x6273
2fcfc824b4 Arachnid stomach organ yaml fix (#34298)
Arachnid stomach yaml fix

Arachnids had their stomach `updateInterval` set to 1.5, 50% slower than
normal. But this doesn't actually slow down the speed that the stomach
digests things, only the rate at which it updates to check if enough
time has passed. (See 23f0b304f2/Content.Server/Body/Systems/StomachSystem.cs (L57) )

This PR changes arachnid stomachs to have a `digestionDelay` of 30 (20
is default) to achive the desired effect.

Stasis beds are also bugged in a similar manner. They are intended to
slow down the digestion speed, but similarly all they do is change the
update rate. But fixing that requires actual code changes and is out of
scope for this commit.
2025-01-11 20:29:54 +01:00
PJBot
458d3ffccb Automatic changelog update 2025-01-11 17:28:18 +00:00
Zachary Higgs
cfb23174ed Make indestructible tiles not breakable by explosions (#34339)
* No more Ai Spacing

* Move guard into earlier guard statement
2025-01-11 18:27:08 +01:00
War Pigeon
3439b77023 Add directional escape pod sign (#34367) 2025-01-11 11:19:59 +03:00
PJBot
10b778fc8f Automatic changelog update 2025-01-11 02:49:21 +00:00
Tayrtahn
c6e4d19883 Let ghosts sometimes make certain devices say creepy things (#34368)
* Add SpookySpeaker component/system

* Shuffle Boo action targets before trying to activate them

* Add SpookySpeaker to vending machines

* Fix chatcode eating messages starting with "..."

* Add SpookySpeaker to recycler

* Oops

* Decrease speak probability for vending machines

* Add spooky speaker to arcade machines
2025-01-11 03:48:13 +01:00
ArtisticRoomba
5deab7d41f fix ghost_component.ftl locale grammar (#34372)
fix ghost component locale grammar
2025-01-11 01:17:12 +01:00
Tayrtahn
fdc0853053 Add a popup message when ghost Boo action does nothing (#34369) 2025-01-10 23:57:46 +01:00
SpaceManiac
bbb551a01b Trim trailing newlines from examine messages (#33381)
* Trim trailing newlines from examine messages

* TrimTrailingNewlines -> TrimEnd
2025-01-10 15:40:31 -05:00
Spessmann
f06ea5d0f3 Adds a border to Oppenhopper poster (#34219)
* border

* Update meta.json

* Update Resources/Textures/Structures/Wallmounts/posters.rsi/meta.json

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-01-10 15:26:31 -05:00
PJBot
45d47da584 Automatic changelog update 2025-01-10 15:38:18 +00:00
themias
fbe6168291 Fix crayon losing durability on stamped paper (#34202) 2025-01-10 16:37:11 +01:00
PJBot
0cd2d827ad Automatic changelog update 2025-01-10 15:14:30 +00:00
TeenSarlacc
d1f6531722 add large instruments to the cargo request computer (#34240)
* added the church organ to the cargo console (will add more in this PR, assuming i did this right (HOW DO YOU BUY CARGO ORDERS IN DEV ENVIROMENT???? *sobs))

* added other structure instruments to cargo Catalog

* fixed an epic copy/paste fail

* changed prices

* fixed epic copy/paste fail #2

---------

Co-authored-by: TeenSarlacc <baddiepro123@gmail.com>
2025-01-10 16:13:23 +01:00
PJBot
fa720a05ce Automatic changelog update 2025-01-10 15:02:11 +00:00
Coolsurf6
87e18b9d3a Fixed Forensic Gloves to be Security Contraband (#34193)
* added BaseRestrictedContraband to forensic gloves

* moved from id to parent
2025-01-10 16:00:59 +01:00
Leon Friedrich
7ae7821213 Replace some sound PlayEntity with PlayPvs (#34317) 2025-01-11 01:44:30 +11:00
Southbridge
dff9abfe74 Packed Station - Dirt Fix (#34351)
* packed

* Rerunning tests
2025-01-10 02:07:53 -07:00
Southbridge
1c2fcf0e26 Bagel Station - Dirt Fix (#34357)
Bagel
2025-01-10 01:35:26 -07:00
Southbridge
65655e7eff Box Station - Dirt Fix (#34356)
Box
2025-01-10 01:35:17 -07:00
Southbridge
915234a043 Cog Station - Dirt Fix (#34355)
Cog
2025-01-10 01:35:09 -07:00
Southbridge
ad59eea64e Marathon Station - Dirt Fix (#34354)
* Marathon

* Rerunning tests
2025-01-10 01:35:00 -07:00
Southbridge
4b1b4c0114 Omega Station - Dirt Fix (#34353)
omega
2025-01-10 01:34:53 -07:00
Southbridge
869ecb2923 Fland Station - Dirt Fix (#34352)
Fland
2025-01-10 01:34:43 -07:00
IProduceWidgets
0bc17159ae Oasis updoot the dimmining (#34347)
updooty
2025-01-09 23:57:39 -07:00
PJBot
ac2eb887dc Automatic changelog update 2025-01-10 06:56:12 +00:00
Southbridge
edbc861c78 Add copy threshold button to air alarms (#34346) 2025-01-09 22:55:05 -08:00
Errant
0b1ed3ec7e Fix battery charging stopping just short of being full (#34028) 2025-01-10 17:54:55 +11:00
Alpaccalypse
b42a01580c Renamed water melon juice to watermelon juice (#34341) 2025-01-09 19:28:03 -05:00
ScarKy0
dd28f17b9a Fix access configurator debug assert (#34330)
* fix

* greytide fix

* fix admin log

* Dirty
2025-01-09 19:22:28 -05:00
PJBot
abf7f62e6f Automatic changelog update 2025-01-09 20:25:38 +00:00
Alpaccalypse
36cbd07c07 Drink titles and soda vendor consistency (#34178)
* Made capitalisation of proper names consistent.

* Roy Rogers is presumably a proper name.

* Second pass at distinguishing proper names only.

* Two nitpicking/minor changes

* Fixed some overlooked can brand names. Matched case with descriptions.

* Switched generic sodas with brands for SodaInventory

* Removed commonly available branded cans

* Matched case consistency used elsewhere. Minor SPAG corrections.

* Added "nothing" and some missing alcohol bottles to RandomSpawner

* Added distinct ad and bye chatter to Dr. Gibb machines.

* Revert "Added distinct ad and bye chatter to Dr. Gibb machines."

This reverts commit f90b8a470556de05aca81255db8b6b03596ae944.

* Revert "Removed commonly available branded cans"

This reverts commit 43b82168dac1f73b187b7677f34ecdd33b6bb81a.

* Revert "Switched generic sodas with brands for SodaInventory"

This reverts commit f1790f0ce61ef135c79068de6a741e8bb50d85d3.

* Lowercased DrinkGlass suffix. Moved alcoholic drinks from drinks to alcohol.

* Renamed energy drink to Red Bool. Corrected and added some jug descriptions.

* Added reagent names for all bottles except poison-wine

* Revision of title case for cocktails

* SPAG and fixed the only brand reagen with unbranded name.

* Possibly controversial, shortened some bran names to better fit the UI.

* Fixed some inconsistencies in naming

* Matched brand localisation change

* Two name style edits

* Fixed Smite bottle name

* Minor, punctuation

* Blank line to end of file

* Upgraded descriptive names to title case

* Banana Mama

* reverts change, moved to another PR to avoid conflict.

* Removed caffeine reference.

* Minor, corrected some more inconsistencies

* Removed Bottle of Nothing from random spawner.
2025-01-09 21:24:31 +01:00
PJBot
66810ef257 Automatic changelog update 2025-01-09 11:24:44 +00:00
deltanedas
04984984fe change locking to use ComplexInteraction (#34326)
Co-authored-by: deltanedas <@deltanedas:kde.org>
2025-01-09 12:23:37 +01:00
PJBot
fdbb3c8f39 Automatic changelog update 2025-01-09 08:55:16 +00:00
Southbridge
e0b2d000ef Amber Station - Fixes and Warm Lights (#34324)
* Added warm lights, placed them around the map, also fixed an issue with the MV wire in the cafeteria

* Fixed lv wiring in caf, and adjusted a couple things

* Empty commit to force checks to rerun
2025-01-09 09:54:04 +01:00
flymo5678
ba9eed7670 Added missing cameras to Loop Station (#34308)
* Added missing cameras

* Added missing cameras
2025-01-08 16:38:13 -07:00
PJBot
60e1c6f515 Automatic changelog update 2025-01-08 15:24:42 +00:00
c4llv07e
904d75c8a9 Fix empty lines in adminwho with stealthmins. (#34122)
Don't print newline if admin is hidden.
2025-01-08 10:23:33 -05:00
flymo5678
c1aaf64521 Fixed Loop Station's southern solar array unlinked airlocks (#34296)
Fixed Southern solar external airlock door bolts
2025-01-08 04:10:50 -07:00
Southbridge
8945ac3560 Amber Station - Balance Improvements (#34294)
changed the center area in med bay to a garden, weakened meteor shielding in some areas, also general touch ups around the station
2025-01-08 02:13:39 -07:00
Piras314
010924611d Happy New Year (#34288)
happy new year
2025-01-08 03:50:46 +01:00
PJBot
4d26ea619e Automatic changelog update 2025-01-08 01:01:30 +00:00
Tayrtahn
23f0b304f2 Add bleating accent to goats (#34273) 2025-01-08 02:00:20 +01:00
Pancake
90b46699f6 Update vessel_warning.ogg (#34263)
* Update vessel_warning.ogg

Remove DC offset and apply short fade out.

* Update attributions.yml

* Update attributions.yml
2025-01-08 03:51:53 +03:00
slarticodefast
45e0b9eb92 merge stable to master (#34279) 2025-01-08 00:22:02 +01:00
ArtisticRoomba
e0163fb022 [HOTFIX] Fix Meta station power (#34256)
* hotfix meta power

* fixed AME

* add missing cargo shuttle pilot console to cargo
2025-01-07 16:03:10 -07:00
SlamBamActionman
3238c2e144 [HOTFIX] Fix chameleon PDAs renaming IDs (#34249)
Fix chameleon PDA
2025-01-07 20:31:54 +01:00
Tayrtahn
483ac50f5f Fix portable scrubber appearing powered on spawn (#34274) 2025-01-07 19:48:32 +01:00
Pieter-Jan Briers
af75c1a92b Fix compilation errors in tests from update (#34272)
Required for https://github.com/space-wizards/RobustToolbox/pull/5590 to not cause compile fails, but can be merged on its own
2025-01-07 19:27:54 +01:00
nikthechampiongr
4a3d3efd62 Implement approved rule changes (#34233) 2025-01-07 19:04:42 +01:00
PJBot
aa458a24ca Automatic changelog update 2025-01-07 17:46:10 +00:00
Alpaccalypse
b4e2a3693f Special reagents now appear in the guidebook (#34265)
* Special reagents now appear in the guidebook

* Improved guidebook wording for reagent category
2025-01-07 18:45:02 +01:00
nikthechampiongr
2d78b6c930 Implement approved rule changes (#34233) 2025-01-07 17:58:28 +01:00
Alpaccalypse
43db40c487 Added distinct ad and bye chatter to Dr. Gibb vending (#34182)
* Added distinct ad and bye chatter to Dr. Gibb vending

* Correcting revert mistake

* Changed ad pack names to better match naming convention
2025-01-07 09:10:16 -05:00
PJBot
02d89d9c5c Automatic changelog update 2025-01-07 00:20:04 +00:00
ArtisticRoomba
b6599d3844 Remove kessler and zombeteors gamemodes from the secret pool (#34051)
* Remove kessler, zombeteors gameodes

* Probably should keep the protos in case an admin wants to torture players secretly

* address slart review
2025-01-07 01:18:56 +01:00
PJBot
4882ba2274 Automatic changelog update 2025-01-06 12:33:49 +00:00
ArtisticRoomba
ea9954221c Make station anchor hitbox less insufferable (#34217) 2025-01-06 23:32:42 +11:00
Southbridge
8083f88f4b Amber Station - Minor Fixes (#34246)
* Moved the stand clear decal in front of the janitor's shutters up two pixels

* added tech maints under most maints doors, fixed power issues in cargo, and fixed a couple minor issues
2025-01-06 00:41:26 -07:00
IProduceWidgets
87d1ed9258 Oasis Update (#34245)
santa is keel.
2025-01-06 00:24:12 -07:00
PJBot
eecdd82779 Automatic changelog update 2025-01-05 22:12:07 +00:00
SpaceRox1244
6b674e73d6 Adds bullet collision to station lights (#34070)
Adds collision with bullets to lights
2025-01-05 23:11:01 +01:00
PJBot
c536094c17 Automatic changelog update 2025-01-05 20:57:09 +00:00
Errant
a55dc4d3bb Lobby chat width and custom lobby titles (#33783)
* lobby name cvar

* panel width

* skrek

* server name localization fix

* comment format fix

Co-authored-by: Thomas <87614336+Aeshus@users.noreply.github.com>

* remove redundant newline

Co-authored-by: Thomas <87614336+Aeshus@users.noreply.github.com>

* string.empty

Co-authored-by: Thomas <87614336+Aeshus@users.noreply.github.com>

* use SetWidth

* Update Resources/Locale/en-US/lobby/lobby-gui.ftl

---------

Co-authored-by: Thomas <87614336+Aeshus@users.noreply.github.com>
Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-01-05 21:56:01 +01:00
PJBot
6f16291557 Automatic changelog update 2025-01-05 19:07:19 +00:00
deltanedas
0aebc76feb wielding refactor/fixes (#32188)
* refactor wieldable events

* fix inconsitency with wielding and use updated events

* wieldable cosmetic refactoring

* Update Content.Shared/Wieldable/Events.cs

Co-authored-by: Centronias <charlie.t.santos@gmail.com>

* real

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

---------

Co-authored-by: deltanedas <@deltanedas:kde.org>
Co-authored-by: Centronias <charlie.t.santos@gmail.com>
Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>
2025-01-05 20:06:10 +01:00
ArtisticRoomba
0639a49390 Fix rainbow lizard plushie inhands (#34128)
* fix rainbow plushie inhands

* address requested changes

* attribute sprites
2025-01-05 02:34:51 +01:00
github-actions[bot]
9532b613e0 Update Credits (#34220)
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
2025-01-05 01:32:19 +01:00
PJBot
41bcdd7c36 Automatic changelog update 2025-01-04 13:42:52 +00:00
themias
b2b3b22a04 Apply forensics when loading with an ammo box (#32280) 2025-01-04 14:41:45 +01:00
Spanky
357d365724 Packed Update (#34208)
Packed Update (decals mostly)
2025-01-04 01:05:20 -07:00
PJBot
983cfa8f48 Automatic changelog update 2025-01-04 00:42:03 +00:00
Deerstop
53a9e0997e Add Elkridge Depot into Map Rotation (#34206)
* named apcs, doors, air alarms, cameras, fire alarms, substations, SMESs

* updated PostMapInitTest.cs to include Cell

* added psychologist spawn

* fixed scanner console link, fixed disposals conveyors, and more

* added janitor service lights, maints firelocks, and more

* added more fun maint rooms

* improved head offices, kitchen, psych. added maints between science and arrivals

* fixed spawners placed over solid objects

* added unique evac shuttle, the Cilium

* evac shuttle is now orientated correctly

* added unique cargo shuttle

* updated kitchen area

* renamed Cell Station to Elkridge Depot, removed most main hall airlocks for smoother travel

* general last-minute touch-ups around the bridge and sec

* changed station name in PostMapInitTest.cs

* added Elkridge to default map pool

* added myself to map_attribution.yml credits
2025-01-03 17:40:54 -07:00
Deerstop
03b34f06cc Elkridge Depot (The station formerly known as Cell) (#34085)
* named apcs, doors, air alarms, cameras, fire alarms, substations, SMESs

* updated PostMapInitTest.cs to include Cell

* added psychologist spawn

* fixed scanner console link, fixed disposals conveyors, and more

* added janitor service lights, maints firelocks, and more

* added more fun maint rooms

* improved head offices, kitchen, psych. added maints between science and arrivals

* fixed spawners placed over solid objects

* added unique evac shuttle, the Cilium

* evac shuttle is now orientated correctly

* added unique cargo shuttle

* updated kitchen area

* renamed Cell Station to Elkridge Depot, removed most main hall airlocks for smoother travel

* general last-minute touch-ups around the bridge and sec

* changed station name in PostMapInitTest.cs
2025-01-03 12:32:46 -07:00
Ubaser
55ad6a74ee Core update (#34201)
add
2025-01-03 12:30:25 -07:00
Southbridge
a033abbfbe Amber Station and Science Spawner Tweaks (#34187)
* Modified science spawners a bit since I realized including maints loot was undesireable

* Linked Medical doors to buttons, redesigned the floor of the dining area a bit, placed more science spawners

* Somehow I overlooked that I was importing the maints loot table instead of the sci loot table

* Gave sci an EOD closet

* named the evac shuttle
2025-01-03 02:31:58 -07:00
PJBot
a13076bdc3 Automatic changelog update 2025-01-02 18:57:04 +00:00
Hannah Giovanna Dawson
edaf0a3820 Add some ion storm actions to replace removed ones (#34180)
* Add some ion storm actions to replace removed ones

* Remove other country references, replace

* Some more tuning of the storm values, removing real-world countries

* boldy basics
2025-01-02 19:55:57 +01:00
PJBot
c98a4b9607 Automatic changelog update 2025-01-02 18:24:35 +00:00
SlamBamActionman
21351df03a Add Chameleon PDA (#30514)
* V1 commit

* Remove PDA name and unnecessary pda state

* Adds PDA to Chameleon backpack & thief toolbox

* Change to use AppearanceDataInit

* Add basic PDA state to ensure there's always a sprite before AppearanceData can be applied

* Revert PDA name (this will be changed to another way later)

* Update PDA name updating to new system

* Fix yaml, and fix Agent ID chameleon

* Updated based on review
2025-01-02 19:23:28 +01:00
PJBot
34960c53cb Automatic changelog update 2025-01-02 16:50:36 +00:00
Ps3Moira
ecdcc9f6b3 Separate Tables n' Counters (#32673)
* Update tables.yml

* Remove Extra base: state_

* Update tables.yml
2025-01-02 17:49:30 +01:00
PJBot
65a463e666 Automatic changelog update 2025-01-02 16:47:21 +00:00
Dylan Hunter Whittingham
39ee853801 Added pricegun sound (#34119)
added pricegun sound

Co-authored-by: dylanhunter <dylan2.whittingham@live.uwe.ac.uk>
2025-01-02 17:46:13 +01:00
Alpaccalypse
1a5be80d04 Sprites defined for all non-generic computer boards. Added new syndicate computer board sprite. (#34104)
* Defined sprites for non-generic computer boards. Added new syndicate computer board sprite.

* Added new sprite to meta.json and updated attribution.

* Reformatted module.rsi meta.json to match other meta file styles.

* Syndicate board sprite made less yellow/gold, changed outer chips to black. Using grey/silver for CPU centre, akin to syndie agent PDA theme, and to keep distinctive from security board.

* Corrected indentation spacing for currently edited entities.

* Update Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml

* add pr link to attribution

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com>
2025-01-02 17:39:12 +01:00
PJBot
64a5473d53 Automatic changelog update 2025-01-02 16:17:51 +00:00
Dylan Hunter Whittingham
9af4e63a3b added basic admin logs for PDA notekeeper notes (#34118)
* added basic admin logs for PDA notekeeper notes

* formatting

* added new LogType 'PdaInteract' and changed PDA notekeeper logs to it

---------

Co-authored-by: dylanhunter <dylan2.whittingham@live.uwe.ac.uk>
2025-01-02 17:16:44 +01:00
Thomas
083d812e69 Removed Undesirable Ion Storm Verbs (#34175)
* Remove Undesirable Laws

* empty
2025-01-02 17:06:45 +01:00
Thomas
6f9d61f20d Make JPEG a PNG (#34176)
Make 3.png a PNG
2025-01-02 14:45:44 +01:00
chromiumboy
59a87ef2c8 Speech is relayed by holopad holograms (#33978)
* Initial commit

* Corrected a field attribute
2025-01-02 12:41:12 +01:00
chromiumboy
df487ea4fe Bugfix for the AI player's eye getting stuck when their broadcast is interrupted (#34093)
Initial commit
2025-01-02 12:27:18 +01:00
PJBot
13914497f2 Automatic changelog update 2025-01-02 09:47:37 +00:00
Alpaccalypse
f4e60ff96e Renamed "Irish Car Bomb" drink to "Irish Slammer" (#34107)
* Renamed "Irish Car Bomb" drink to "Irish Slammer", due to concerns over insensitivity.

* Fixing some missed references

* Added prototype id changes to migration.yml. Removed any reference to the troubles (and corrected ale to stout for flavour text).

* Corrected description back to "Irish Cream"

* Removed non-entities from migration.yml
2025-01-02 10:46:30 +01:00
Spanky
1bda7393ee Omega Update (Remove Christmas) (#34174)
omega soap
2025-01-01 21:03:53 -07:00
Spanky
2e888c2fe9 Packed Update (Remove Christmas & New Evac) (#34168)
* Packed update (remove christmas, new shuttle)

* Fix invalid

* the voices
2025-01-01 16:50:35 -07:00
Alpaccalypse
1a632b2689 Corrected all ghost role names to title case. (#34155)
* Corrected all ghost role names to title case.

* Removes full stop from Hamlet's title.

* Updated ghost role names not in the main ghost roles .ftl

* Two capitals corrections
2025-01-01 21:43:46 +01:00
PJBot
7261b868d7 Automatic changelog update 2025-01-01 16:28:56 +00:00
Errant
b5f8343797 remove nukemass song (#34066) 2025-01-01 17:27:50 +01:00
PJBot
863dfcd369 Automatic changelog update 2025-01-01 16:26:54 +00:00
ReeZer2
4f2d609890 FIX: Thief beacon doubled steal targets (#33750) 2025-01-01 17:25:48 +01:00
PJBot
5afa96140c Automatic changelog update 2025-01-01 16:24:08 +00:00
lzk
28284415ea Decrease hp for rusted walls (#34043) 2025-01-01 17:23:01 +01:00
PJBot
88d13048d5 Automatic changelog update 2025-01-01 16:20:39 +00:00
Booblesnoot42
6b95494426 Removed UseDelay component from RCD (#34149) 2025-01-01 17:19:30 +01:00
Booblesnoot42
588e8c1919 Fix friendly vent spiders (#34153)
Swapped order of parents for MobGiantSpiderAngry
2025-01-01 17:18:52 +01:00
Southbridge
10d94ad336 Amber Station Adjustments (#34126)
* Made a couple fixes to various decals, cleaned up some entities, gave the clown their bag and the bartender a handlabeler

* Several changes, more cameras, lighting fixes, adjusted hydro a bit, gave sec a bunch of shutters

* Added new random spawners for science and added them to Amber

* fixed the science spawners and modified amber slightly

* Fixed the random instrument entry
2025-01-01 01:32:27 -07:00
Emisse
fe8eee6b92 meta update (#34158) 2024-12-31 17:49:49 -07:00
PJBot
c5e3f8644d Automatic changelog update 2024-12-31 23:09:32 +00:00
ArtisticRoomba
ed2d784655 Standardize shotgun ammo in storagefills (#34156)
shotgun ammo changes
2024-12-31 16:08:26 -07:00
Nox
b080c6f900 Meta station overhaul (#33506)
* added mail, moved some things around, and fixed a lot of APCs

* fixed my mistakes

* Fixed a few mistakes and AI camera names

* Redid south medbay and more wiring

* Finished sci overhaul, and fixed all issues that I could find.

* rebuilt botany, removed vox box, fixed all known issues.

* Overhauled security

* Minor commit as I prepare to update my copy

* Rebalanced role counts

* Final changes, ready for review!

* Emisse and other people fixed issues with the station

* Finalized changes (for real this time)!
2024-12-31 15:54:57 -07:00
PJBot
59b86d41c7 Automatic changelog update 2024-12-31 13:26:12 +00:00
justdie12
ad0d790f1f Fix disposal signal routers sprites (#34139)
* Fix disposal signal routers sprites

* Remove old shitcode
2024-12-31 08:25:06 -05:00
PJBot
cba500c9d4 Automatic changelog update 2024-12-31 13:21:14 +00:00
amatwiedle
adaa584720 Add Holopad Circuit Board to A/V Communication Technology (#34150)
Added the holopad circuit board to the AV Communication technology and circuit imprinter lathe.
2024-12-31 08:20:07 -05:00
PJBot
bdea33d866 Automatic changelog update 2024-12-31 11:11:56 +00:00
crazybrain23
b69212b49a Add contraband parent to laser gun safe (#34132) 2024-12-31 12:11:51 +01:00
PopGamer46
9158d76fc1 Fixes borgs not being able to check their laws in crit (#34133)
* fix

* fix2
2024-12-31 12:10:46 +01:00
PJBot
dc90fab006 Automatic changelog update 2024-12-31 10:53:15 +00:00
chromiumboy
8545c3a70e Holopads no longer log broadcasted speech and emotes in the chat (#34114)
Initial commit
2024-12-31 11:52:08 +01:00
chromiumboy
c1c4b1c9a4 Holopad UI tweak for incoming calls (#34137)
* Initial commit

* Update

* Comment correction

* Minor margin increase
2024-12-31 11:37:28 +01:00
PJBot
b51f750035 Automatic changelog update 2024-12-31 10:30:50 +00:00
~DreamlyJack~
94422e299b Add hair pulato (#34117)
* add sprite pulato

* update

* add pulato hair

* add pulato hair

* add pulato hair

* update meta "pulato"
2024-12-31 11:29:39 +01:00
Emisse
494cb1822b bagel update (#34145) 2024-12-30 22:07:43 -07:00
Spessmann
b31a183324 Cog update (not very merry) (#34144)
removed christmas merry
2024-12-30 21:49:09 -07:00
Booblesnoot42
ff08fb3160 Rename cryobed yml file (#34134)
renamed cryopod.yml to cryogenic_sleep_unit.yml
2024-12-31 02:46:01 +03:00
TytosB
a1c8ac3301 Loop Station Decal and maints additions (#34103)
* many changes

* contentingregrationtests

* serialized invalid removed

* blank

* "Changes and fixes as suggested"

* blank

* blank

* added desk bells

* engi rework rework rework

* added gate to content integration

* tweaks

* aaa

* bbb

* added holopads

* ccc

* Update default.yml

* hotfix

* aaa

* bbb

* many many tweaks and fixes

* aaa

* decals and maints

* aaa

* bbb

* ccc

---------

Co-authored-by: Emisse <99158783+Emisse@users.noreply.github.com>
2024-12-30 13:07:00 -07:00
Southbridge
def73da9f3 Marathon Station - Dechristmassified (#34136)
* dechristmassified

* further dechristmassified
2024-12-30 13:06:04 -07:00
Southbridge
3fb7ee4068 Box Station - Dechristmassified (#34135)
* dechrismassified

* removed camera from shower
2024-12-30 12:48:37 -07:00
1467 changed files with 435392 additions and 98747 deletions

View File

@@ -21,7 +21,7 @@ jobs:
- name: Setup .NET Core
uses: actions/setup-dotnet@v3.2.0
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x
- name: Install dependencies
run: dotnet restore

View File

@@ -36,7 +36,7 @@ jobs:
- name: Setup .NET Core
uses: actions/setup-dotnet@v3.2.0
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x
- name: Install dependencies
run: dotnet restore

View File

@@ -36,7 +36,7 @@ jobs:
- name: Setup .NET Core
uses: actions/setup-dotnet@v3.2.0
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x
- name: Install dependencies
run: dotnet restore

38
.github/workflows/cla.yml vendored Normal file
View File

@@ -0,0 +1,38 @@
name: "CLA Assistant"
on:
issue_comment:
types: [created]
pull_request_target:
types: [opened,closed,synchronize]
paths:
- '**/*.cs' # Указываем, что триггер срабатывает только при изменении .cs файлов
# explicitly configure permissions, in case your GITHUB_TOKEN workflow permissions are set to read-only in repository settings
permissions:
actions: write
contents: write # this can be 'read' if the signatures are in remote repository
pull-requests: write
statuses: write
jobs:
CLAAssistant:
runs-on: ubuntu-latest
steps:
- name: "CLA Assistant"
if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target'
uses: contributor-assistant/github-action@v2.6.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# the below token should have repo scope and must be manually added by you in the repository's secret
# This token is required only if you have configured to store the signatures in a remote repository/organization
# PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
with:
path-to-signatures: 'signatures/version1/cla.json'
path-to-document: 'https://github.com/crystallpunk-14/crystall-punk-14/blob/master/CLA.md' # e.g. a CLA or a DCO document
# branch should not be protected
branch: 'master'
allowlist: TheShuEd,bot*
# the followings are the optional inputs - If the optional inputs are not given, then default values will be taken
#custom-pr-sign-comment: 'The signature to be committed in order to sign the CLA'
#custom-allsigned-prcomment: 'pull request comment when all contributors has signed, defaults to **CLA Assistant Lite bot** All Contributors have signed the CLA.'

View File

@@ -22,7 +22,7 @@ jobs:
- name: Setup .NET Core
uses: actions/setup-dotnet@v3.2.0
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x
- name: Get Engine Tag
run: |

View File

@@ -51,7 +51,7 @@ jobs:
- name: Setup .NET Core
uses: actions/setup-dotnet@v3.2.0
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x
- name: Install dependencies
run: dotnet restore

View File

@@ -26,7 +26,7 @@ jobs:
- name: Setup .NET Core
uses: actions/setup-dotnet@v3.2.0
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x
- name: Install dependencies
run: dotnet restore
- name: Build

80
CLA.md Normal file
View File

@@ -0,0 +1,80 @@
# CrystallEdge Contributor License Agreement
### Version 1.0
##### Thank you for your interest in contributing to CrystallEdge ("We" or "Us").
##### The purpose of this contributor agreement ("Agreement") is for Your protection as a Contributor in addition to the protection of our community.
##### If you wish to contact us regarding licensing matters we can be reached at crystalledge14@gmail.com
## How to use this Contributor Agreement
##### If You are an employee and have created the Contribution as part of your employment, You need to have Your employer approve this Agreement or sign the Entity version of this document as well.
## 1. Definitions
- _**"You"**_ means the individual Copyright owner who Submits a Contribution to Us.
- _**"Contribution(s)"**_ means any work(s) of authorship, including any original modifications or additions to an existing work of authorships, Submitted by You to Us, where You are the author, holder of copyright, or Licensee under an Approved License specified by Us.
- _**"Copyright"**_ means all rights protecting works of authorship, including copyright, moral and neighboring rights, as appropriate, for the full term of their existence.
- **_"Material"_** means the software or documentation made available by Us to third parties. When this Agreement covers more than one software project, the Material means the software or documentation to which the Contributions were Submitted. After You Submit the Contributions, theymay be included in the Material.
- **_"Submit"_** means any act by which Contributions are transferred to Us by You by means of tangible or intangible media, including but not limited to electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, Us, but excluding any transfer that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution."
- **_"Documentation"_** means any non-software portion of Contributions.
- **_"Approved License"_** means any License specified by CrystallEdge to be Approved or “Compatible” with the Project the Contributions are Submitted to.
## 2. Representations
### 2.1 Representation of legal age
##### You represent that you are older than 16 years of age, and if required by law, have authorization by a legal guardian to enter this agreement.
### 2.2 Assurance of legal rights
##### You represent and assure that You have sufficient rights to your Contribution and are legally entitled to enter this Agreement and grant the licenses specified below or an Approved license if Your Contribution or portions thereof are provided to You under one of the Approved Licenses.
### 2.3 Third Party Contributions
##### If You act on behalf of Your employer or other third party You represent that You are authorized and have the right to Submit the Contribution on behalf of Your employer or the mentioned third party.
### 2.4 Compliance and Non-infringement
##### You represent and warrant that each of your Contributions:
- Is and will remain an original work of authorship;
- to the best of Your knowledge, does not and will not infringe any third partys copyright, trademark, patent, or other intellectual property rights;
- In part or in whole, is licensed under one of the Approved Licenses or is an original work you have the rights to.
- includes the complete and correct details of any license, third-party license, patent, trademark, necessary attributions or other restriction associated with all or any part of Your Contribution in a conspicuous location;
- complies and will continue to comply with all applicable laws, including export control laws and regulations;
### 2.5 Mixed license Contributions
##### Subject to the terms and conditions of this agreement, specifically section 2, if there is a conflict between the grants in section 3, 4 and a Contribution under an Approved License, the terms of the Approved License supersede.
## 2.6 Employee or Representative Submissions
##### If You Submit as a company, You agree that a) Your employees, contractors, and representatives may Submit Contributions on Your behalf; and b) the individual signing this Agreement on Your behalf has the necessary authority including the authority to bind You to the Agreement.
## 3. License grant
### 3.1 Copyright license to Us
##### Subject to the terms and conditions of this Agreement, You hereby grant to Us a worldwide, royalty-free, NON-exclusive, perpetual and irrevocable (except as stated in Sections 2.4 and 8.2) license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, under the Copyright covering the Contributions to use the Contributions by all means, including, but not limited to:
- publish the Contributions,
- modify the Contributions,
- prepare derivative works based upon or containing the Contributions and/or to combine the Contributions with other Materials,
- reproduce the Contributions in original or modified form,
- distribute, to make the Contributions available to the public, display and publicly perform the Contributions in original or modified form.
## 3.2 Moral rights
##### Moral Rights remain unaffected to the extent they are recognized and not waivable by applicable law. Notwithstanding, You may add your name to the attribution mechanism customary used in the Materials you Contribute to, such as the header of the source code files of Your Contributions, and We will respect this attribution when using Your Contributions.
## 4. Patents
### 4.1 Patent license
##### Subject to the terms and conditions of this Agreement You hereby grant to Us and to recipients of Materials distributed by Us a worldwide, royalty-free, non-exclusive, perpetual and irrevocable (except as stated in Section 3.2) patent license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, to make, have made, use, sell, offer for sale, import and otherwise transfer the Contributions and the Contributions in combination with any Material (and portions of such combination). This license applies to all patents owned or controlled by You, whether already acquired or hereafter acquired, that would be infringed by making, having made, using, selling, offering for sale, importing or otherwise transferring of Your Contribution(s) alone or by combination of Your Contribution(s) with any Material.
### 4.2 Revocation of patent license
##### You reserve the right to revoke the patent license stated in section 3.1 if We make any infringement claim that is targeted at your Contribution(s) and not asserted for a Defensive Purpose. An assertion of claims of the Patents shall be considered for a "Defensive Purpose" if the claims are asserted against an entity that has filed, maintained, threatened, or voluntarily participated in a patent infringement lawsuit against Us or any of Our licensees.
## 5. Disclaimer
#### CONTRIBUTIONS ARE PROVIDED "AS IS". MORE PARTICULARLY, ALL EXPRESS OR IMPLIED WARRANTIES INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTY OF SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE EXPRESSLY DISCLAIMED BY YOU TO US AND BY US TO YOU. TO THE EXTENT THAT ANY SUCH WARRANTIES CANNOT BE DISCLAIMED, SUCH WARRANTY IS LIMITED IN DURATION AND EXTENT TO THE MINIMUM PERIOD AND EXTENT PERMITTED BY LAW.
## 6. Consequential damage waiver
#### TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL YOU OR WE BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF ANTICIPATED SAVINGS, LOSS OF DATA, INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL AND EXEMPLARY DAMAGES ARISING OUT OF THIS AGREEMENT REGARDLESS OF THE LEGAL OR EQUITABLE THEORY (CONTRACT, TORT OR OTHERWISE) UPON WHICH THE CLAIM IS BASED.
## 7. Approximation of disclaimer and damage waiver
#### IF THE DISCLAIMER AND DAMAGE WAIVER MENTIONED IN SECTION 4. AND SECTION 5. CANNOT BE GIVEN LEGAL EFFECT UNDER APPLICABLE LOCAL LAW, REVIEWING COURTS SHALL APPLY LOCAL LAW THAT MOST CLOSELY APPROXIMATES AN ABSOLUTE WAIVER OF ALL CIVIL OR CONTRACTUAL LIABILITY IN CONNECTION WITH THE CONTRIBUTION.
## 8. Term
##### 8.1 This Agreement shall come into effect upon Your acceptance of the terms and conditions, either by replying to the CLA Bot or by sending a signed copy to crystalledge14@gmail.com with the subject: "\<your name\> CLA"
##### 8.2 In the event of a termination of this Agreement Sections 4, 5, 6, 7 and 8 shall survive such termination and shall remain in full force thereafter. For the avoidance of doubt, Approved (sub)licenses that have already been granted for Contributions at the date of the termination shall remain in full force after the termination of this Agreement.
## 9. Miscellaneous
##### 9.1 This Agreement and all disputes, claims, actions, suits or other proceedings arising out of this agreement or relating in any way to it shall be governed by the laws of Russia excluding its private international law provisions.
##### 9.2 This Agreement sets out the entire agreement between You and Us for Your Contributions to Us and overrides all other agreements or understandings.
##### 9.3 In case of Your death, this agreement shall continue with Your heirs. In case of more than one heir, all heirs must exercise their rights through a commonly authorized person.
##### 9.4 If any provision of this Agreement is found void and unenforceable, such provision will be replaced to the extent possible with a provision that comes closest to the meaning of the original provision and that is enforceable. The terms and conditions set forth in this Agreement shall apply notwithstanding any failure of essential purpose of this Agreement or any limited remedy to the maximum extent possible under law.
##### 9.5 You agree to notify Us of any facts or circumstances of which you become aware that would make this Agreement inaccurate in any respect.
##### 9.6 Any Substantive modifications to this Agreement will result in a new version being created, to continue Contributing you must agree to the latest version of the Agreement, which supersedes any previous versions.
##### 9.7 CrystallEdge will provide notification of any new version of this agreement being created, if you do not agree to the new version of the Agreement the previous Agreement remains binding.

View File

@@ -88,8 +88,9 @@ namespace Content.Client.Access.UI
button.Disabled = !interfaceEnabled;
if (interfaceEnabled)
{
button.Pressed = state.TargetAccessReaderIdAccessList?.Contains(accessName) ?? false;
button.Disabled = (!state.AllowedModifyAccessList?.Contains(accessName)) ?? true;
// Explicit cast because Rider gives a false error otherwise.
button.Pressed = state.TargetAccessReaderIdAccessList?.Contains((ProtoId<AccessLevelPrototype>) accessName) ?? false;
button.Disabled = (!state.AllowedModifyAccessList?.Contains((ProtoId<AccessLevelPrototype>) accessName)) ?? true;
}
}
}

View File

@@ -1,16 +1,21 @@
using System.Linq;
using System.Numerics;
using Content.Client.Administration.Systems;
using Content.Shared.CCVar;
using Content.Shared.Mind;
using Robust.Client.Graphics;
using Robust.Client.ResourceManagement;
using Robust.Client.UserInterface;
using Robust.Shared;
using Robust.Shared.Enums;
using Robust.Shared.Configuration;
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
namespace Content.Client.Administration;
internal sealed class AdminNameOverlay : Overlay
{
[Dependency] private readonly IConfigurationManager _config = default!;
private readonly AdminSystem _system;
private readonly IEntityManager _entityManager;
private readonly IEyeManager _eyeManager;
@@ -18,8 +23,16 @@ internal sealed class AdminNameOverlay : Overlay
private readonly IUserInterfaceManager _userInterfaceManager;
private readonly Font _font;
//TODO make this adjustable via GUI
private readonly ProtoId<RoleTypePrototype>[] _filter =
["SoloAntagonist", "TeamAntagonist", "SiliconAntagonist", "FreeAgent"];
private readonly string _antagLabelClassic = Loc.GetString("admin-overlay-antag-classic");
private readonly Color _antagColorClassic = Color.OrangeRed;
public AdminNameOverlay(AdminSystem system, IEntityManager entityManager, IEyeManager eyeManager, IResourceCache resourceCache, EntityLookupSystem entityLookup, IUserInterfaceManager userInterfaceManager)
{
IoCManager.InjectDependencies(this);
_system = system;
_entityManager = entityManager;
_eyeManager = eyeManager;
@@ -35,6 +48,9 @@ internal sealed class AdminNameOverlay : Overlay
{
var viewport = args.WorldAABB;
//TODO make this adjustable via GUI
var classic = _config.GetCVar(CCVars.AdminOverlayClassic);
foreach (var playerInfo in _system.PlayerList)
{
var entity = _entityManager.GetEntity(playerInfo.NetEntity);
@@ -64,12 +80,20 @@ internal sealed class AdminNameOverlay : Overlay
var screenCoordinates = _eyeManager.WorldToScreen(aabb.Center +
new Angle(-_eyeManager.CurrentEye.Rotation).RotateVec(
aabb.TopRight - aabb.Center)) + new Vector2(1f, 7f);
if (playerInfo.Antag)
if (classic && playerInfo.Antag)
{
args.ScreenHandle.DrawString(_font, screenCoordinates + (lineoffset * 2), "ANTAG", uiScale, Color.OrangeRed);
;
args.ScreenHandle.DrawString(_font, screenCoordinates + (lineoffset * 2), _antagLabelClassic, uiScale, _antagColorClassic);
}
args.ScreenHandle.DrawString(_font, screenCoordinates+lineoffset, playerInfo.Username, uiScale, playerInfo.Connected ? Color.Yellow : Color.White);
else if (!classic && _filter.Contains(playerInfo.RoleProto.ID))
{
var label = Loc.GetString(playerInfo.RoleProto.Name).ToUpper();
var color = playerInfo.RoleProto.Color;
args.ScreenHandle.DrawString(_font, screenCoordinates + (lineoffset * 2), label, uiScale, color);
}
args.ScreenHandle.DrawString(_font, screenCoordinates + lineoffset, playerInfo.Username, uiScale, playerInfo.Connected ? Color.Yellow : Color.White);
args.ScreenHandle.DrawString(_font, screenCoordinates, playerInfo.CharacterName, uiScale, playerInfo.Connected ? Color.Aquamarine : Color.White);
}
}

View File

@@ -6,8 +6,7 @@
xmlns:tabs="clr-namespace:Content.Client.Administration.UI.Tabs"
xmlns:playerTab="clr-namespace:Content.Client.Administration.UI.Tabs.PlayerTab"
xmlns:objectsTab="clr-namespace:Content.Client.Administration.UI.Tabs.ObjectsTab"
xmlns:panic="clr-namespace:Content.Client.Administration.UI.Tabs.PanicBunkerTab"
xmlns:baby="clr-namespace:Content.Client.Administration.UI.Tabs.BabyJailTab">
xmlns:panic="clr-namespace:Content.Client.Administration.UI.Tabs.PanicBunkerTab">
<TabContainer Name="MasterTabContainer">
<adminTab:AdminTab />
<adminbusTab:AdminbusTab />
@@ -15,7 +14,6 @@
<tabs:RoundTab />
<tabs:ServerTab />
<panic:PanicBunkerTab Name="PanicBunkerControl" Access="Public" />
<baby:BabyJailTab Name="BabyJailControl" Access="Public" />
<playerTab:PlayerTab Name="PlayerTabControl" Access="Public" />
<objectsTab:ObjectsTab Name="ObjectsTabControl" Access="Public" />
</TabContainer>

View File

@@ -21,10 +21,6 @@ public sealed partial class AdminMenuWindow : DefaultWindow
MasterTabContainer.SetTabTitle((int) TabIndex.Round, Loc.GetString("admin-menu-round-tab"));
MasterTabContainer.SetTabTitle((int) TabIndex.Server, Loc.GetString("admin-menu-server-tab"));
MasterTabContainer.SetTabTitle((int) TabIndex.PanicBunker, Loc.GetString("admin-menu-panic-bunker-tab"));
/*
* TODO: Remove baby jail code once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
MasterTabContainer.SetTabTitle((int) TabIndex.BabyJail, Loc.GetString("admin-menu-baby-jail-tab"));
MasterTabContainer.SetTabTitle((int) TabIndex.Players, Loc.GetString("admin-menu-players-tab"));
MasterTabContainer.SetTabTitle((int) TabIndex.Objects, Loc.GetString("admin-menu-objects-tab"));
MasterTabContainer.OnTabChanged += OnTabChanged;
@@ -52,7 +48,6 @@ public sealed partial class AdminMenuWindow : DefaultWindow
Round,
Server,
PanicBunker,
BabyJail,
Players,
Objects,
}

View File

@@ -130,6 +130,7 @@ namespace Content.Client.Administration.UI
}
var title = string.IsNullOrWhiteSpace(popup.TitleEdit.Text) ? null : popup.TitleEdit.Text;
var suspended = popup.SuspendedCheckbox.Pressed;
if (popup.SourceData is { } src)
{
@@ -139,7 +140,8 @@ namespace Content.Client.Administration.UI
Title = title,
PosFlags = pos,
NegFlags = neg,
RankId = rank
RankId = rank,
Suspended = suspended,
});
}
else
@@ -152,7 +154,8 @@ namespace Content.Client.Administration.UI
Title = title,
PosFlags = pos,
NegFlags = neg,
RankId = rank
RankId = rank,
Suspended = suspended,
});
}
@@ -171,7 +174,7 @@ namespace Content.Client.Administration.UI
{
Id = src,
Flags = flags,
Name = name
Name = name,
});
}
else
@@ -351,6 +354,7 @@ namespace Content.Client.Administration.UI
public readonly OptionButton RankButton;
public readonly Button SaveButton;
public readonly Button? RemoveButton;
public readonly CheckBox SuspendedCheckbox;
public readonly Dictionary<AdminFlags, (Button inherit, Button sub, Button plus)> FlagButtons
= new();
@@ -381,6 +385,12 @@ namespace Content.Client.Administration.UI
RankButton = new OptionButton();
SaveButton = new Button { Text = Loc.GetString("permissions-eui-edit-admin-window-save-button"), HorizontalAlignment = HAlignment.Right };
SuspendedCheckbox = new CheckBox
{
Text = Loc.GetString("permissions-eui-edit-admin-window-suspended"),
Pressed = data?.Suspended ?? false,
};
RankButton.AddItem(Loc.GetString("permissions-eui-edit-admin-window-no-rank-button"), NoRank);
foreach (var (rId, rank) in ui._ranks)
{
@@ -488,7 +498,8 @@ namespace Content.Client.Administration.UI
{
nameControl,
TitleEdit,
RankButton
RankButton,
SuspendedCheckbox,
}
},
permGrid

View File

@@ -1,6 +0,0 @@
<controls:BabyJailStatusWindow
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.Administration.UI.Tabs.BabyJailTab"
Title="{Loc admin-ui-baby-jail-window-title}">
<RichTextLabel Name="MessageLabel" Access="Public" />
</controls:BabyJailStatusWindow>

View File

@@ -1,21 +0,0 @@
using Content.Client.Message;
using Content.Client.UserInterface.Controls;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client.Administration.UI.Tabs.BabyJailTab;
/*
* TODO: Remove me once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
[GenerateTypedNameReferences]
public sealed partial class BabyJailStatusWindow : FancyWindow
{
public BabyJailStatusWindow()
{
RobustXamlLoader.Load(this);
MessageLabel.SetMarkup(Loc.GetString("admin-ui-baby-jail-is-enabled"));
}
}

View File

@@ -1,26 +0,0 @@
<controls:BabyJailTab
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.Administration.UI.Tabs.BabyJailTab"
xmlns:cc="clr-namespace:Content.Client.Administration.UI.CustomControls"
Margin="4">
<BoxContainer Orientation="Vertical">
<cc:CommandButton Name="EnabledButton" Command="babyjail" ToggleMode="True"
Text="{Loc admin-ui-baby-jail-disabled}"
ToolTip="{Loc admin-ui-baby-jail-tooltip}" />
<cc:CommandButton Name="ShowReasonButton" Command="babyjail_show_reason"
ToggleMode="True" Text="{Loc admin-ui-baby-jail-show-reason}"
ToolTip="{Loc admin-ui-baby-jail-show-reason-tooltip}" />
<BoxContainer Orientation="Vertical" Margin="0 10 0 0">
<BoxContainer Orientation="Horizontal" Margin="2">
<Label Text="{Loc admin-ui-baby-jail-max-account-age}" MinWidth="175" />
<LineEdit Name="MaxAccountAge" MinWidth="50" Margin="0 0 5 0" />
<Label Text="{Loc generic-minutes}" />
</BoxContainer>
<BoxContainer Orientation="Horizontal" Margin="2">
<Label Text="{Loc admin-ui-baby-jail-max-overall-minutes}" MinWidth="175" />
<LineEdit Name="MaxOverallMinutes" MinWidth="50" Margin="0 0 5 0" />
<Label Text="{Loc generic-minutes}" />
</BoxContainer>
</BoxContainer>
</BoxContainer>
</controls:BabyJailTab>

View File

@@ -1,75 +0,0 @@
using Content.Shared.Administration.Events;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Console;
/*
* TODO: Remove me once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
namespace Content.Client.Administration.UI.Tabs.BabyJailTab;
[GenerateTypedNameReferences]
public sealed partial class BabyJailTab : Control
{
[Dependency] private readonly IConsoleHost _console = default!;
private string _maxAccountAge;
private string _maxOverallMinutes;
public BabyJailTab()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
MaxAccountAge.OnTextEntered += args => SendMaxAccountAge(args.Text);
MaxAccountAge.OnFocusExit += args => SendMaxAccountAge(args.Text);
_maxAccountAge = MaxAccountAge.Text;
MaxOverallMinutes.OnTextEntered += args => SendMaxOverallMinutes(args.Text);
MaxOverallMinutes.OnFocusExit += args => SendMaxOverallMinutes(args.Text);
_maxOverallMinutes = MaxOverallMinutes.Text;
}
private void SendMaxAccountAge(string text)
{
if (string.IsNullOrWhiteSpace(text) ||
text == _maxAccountAge ||
!int.TryParse(text, out var minutes))
{
return;
}
_console.ExecuteCommand($"babyjail_max_account_age {minutes}");
}
private void SendMaxOverallMinutes(string text)
{
if (string.IsNullOrWhiteSpace(text) ||
text == _maxOverallMinutes ||
!int.TryParse(text, out var minutes))
{
return;
}
_console.ExecuteCommand($"babyjail_max_overall_minutes {minutes}");
}
public void UpdateStatus(BabyJailStatus status)
{
EnabledButton.Pressed = status.Enabled;
EnabledButton.Text = Loc.GetString(status.Enabled
? "admin-ui-baby-jail-enabled"
: "admin-ui-baby-jail-disabled"
);
EnabledButton.ModulateSelfOverride = status.Enabled ? Color.Red : null;
ShowReasonButton.Pressed = status.ShowReason;
MaxAccountAge.Text = status.MaxAccountAgeMinutes.ToString();
_maxAccountAge = MaxAccountAge.Text;
MaxOverallMinutes.Text = status.MaxOverallMinutes.ToString();
_maxOverallMinutes = MaxOverallMinutes.Text;
}
}

View File

@@ -197,6 +197,7 @@ public sealed partial class PlayerTab : Control
Header.Character => Compare(x.CharacterName, y.CharacterName),
Header.Job => Compare(x.StartingJob, y.StartingJob),
Header.Antagonist => x.Antag.CompareTo(y.Antag),
Header.RoleType => Compare(x.RoleProto.Name , y.RoleProto.Name),
Header.Playtime => TimeSpan.Compare(x.OverallPlaytime ?? default, y.OverallPlaytime ?? default),
_ => 1
};

View File

@@ -24,6 +24,11 @@
HorizontalExpand="True"
ClipText="True"/>
<customControls:VSeparator/>
<Label Name="RoleTypeLabel"
SizeFlagsStretchRatio="2"
HorizontalExpand="True"
ClipText="True"/>
<customControls:VSeparator/>
<Label Name="OverallPlaytimeLabel"
SizeFlagsStretchRatio="1"
HorizontalExpand="True"

View File

@@ -23,6 +23,8 @@ public sealed partial class PlayerTabEntry : PanelContainer
if (player.IdentityName != player.CharacterName)
CharacterLabel.Text += $" [{player.IdentityName}]";
AntagonistLabel.Text = Loc.GetString(player.Antag ? "player-tab-is-antag-yes" : "player-tab-is-antag-no");
RoleTypeLabel.Text = Loc.GetString(player.RoleProto.Name);
RoleTypeLabel.FontColorOverride = player.RoleProto.Color;
BackgroundColorPanel.PanelOverride = styleBoxFlat;
OverallPlaytimeLabel.Text = player.PlaytimeString;
PlayerEntity = player.NetEntity;

View File

@@ -32,6 +32,13 @@
Text="{Loc player-tab-antagonist}"
MouseFilter="Pass"/>
<cc:VSeparator/>
<Label Name="RoleTypeLabel"
SizeFlagsStretchRatio="2"
HorizontalExpand="True"
ClipText="True"
Text="{Loc player-tab-roletype}"
MouseFilter="Pass"/>
<cc:VSeparator/>
<Label Name="PlaytimeLabel"
SizeFlagsStretchRatio="1"
HorizontalExpand="True"

View File

@@ -19,6 +19,7 @@ public sealed partial class PlayerTabHeader : Control
CharacterLabel.OnKeyBindDown += CharacterClicked;
JobLabel.OnKeyBindDown += JobClicked;
AntagonistLabel.OnKeyBindDown += AntagonistClicked;
RoleTypeLabel.OnKeyBindDown += RoleTypeClicked;
PlaytimeLabel.OnKeyBindDown += PlaytimeClicked;
}
@@ -30,6 +31,7 @@ public sealed partial class PlayerTabHeader : Control
Header.Character => CharacterLabel,
Header.Job => JobLabel,
Header.Antagonist => AntagonistLabel,
Header.RoleType => RoleTypeLabel,
Header.Playtime => PlaytimeLabel,
_ => throw new ArgumentOutOfRangeException(nameof(header), header, null)
};
@@ -41,6 +43,7 @@ public sealed partial class PlayerTabHeader : Control
CharacterLabel.Text = Loc.GetString("player-tab-character");
JobLabel.Text = Loc.GetString("player-tab-job");
AntagonistLabel.Text = Loc.GetString("player-tab-antagonist");
RoleTypeLabel.Text = Loc.GetString("player-tab-roletype");
PlaytimeLabel.Text = Loc.GetString("player-tab-playtime");
}
@@ -75,6 +78,11 @@ public sealed partial class PlayerTabHeader : Control
HeaderClicked(args, Header.Antagonist);
}
private void RoleTypeClicked(GUIBoundKeyEventArgs args)
{
HeaderClicked(args, Header.RoleType);
}
private void PlaytimeClicked(GUIBoundKeyEventArgs args)
{
HeaderClicked(args, Header.Playtime);
@@ -90,6 +98,7 @@ public sealed partial class PlayerTabHeader : Control
CharacterLabel.OnKeyBindDown -= CharacterClicked;
JobLabel.OnKeyBindDown -= JobClicked;
AntagonistLabel.OnKeyBindDown -= AntagonistClicked;
RoleTypeLabel.OnKeyBindDown -= RoleTypeClicked;
PlaytimeLabel.OnKeyBindDown -= PlaytimeClicked;
}
}
@@ -100,6 +109,7 @@ public sealed partial class PlayerTabHeader : Control
Character,
Job,
Antagonist,
RoleType,
Playtime
}
}

View File

@@ -130,8 +130,8 @@ public sealed partial class AirAlarmWindow : FancyWindow
if (!_pumps.TryGetValue(addr, out var pumpControl))
{
var control= new PumpControl(pump, addr);
control.PumpDataChanged += AtmosDeviceDataChanged!.Invoke;
control.PumpDataCopied += AtmosDeviceDataCopied!.Invoke;
control.PumpDataChanged += AtmosDeviceDataChanged;
control.PumpDataCopied += AtmosDeviceDataCopied;
_pumps.Add(addr, control);
CVentContainer.AddChild(control);
}
@@ -145,8 +145,8 @@ public sealed partial class AirAlarmWindow : FancyWindow
if (!_scrubbers.TryGetValue(addr, out var scrubberControl))
{
var control = new ScrubberControl(scrubber, addr);
control.ScrubberDataChanged += AtmosDeviceDataChanged!.Invoke;
control.ScrubberDataCopied += AtmosDeviceDataCopied!.Invoke;
control.ScrubberDataChanged += AtmosDeviceDataChanged;
control.ScrubberDataCopied += AtmosDeviceDataCopied;
_scrubbers.Add(addr, control);
CScrubberContainer.AddChild(control);
}
@@ -161,6 +161,7 @@ public sealed partial class AirAlarmWindow : FancyWindow
{
var control = new SensorInfo(sensor, addr);
control.OnThresholdUpdate += AtmosAlarmThresholdChanged;
control.SensorDataCopied += AtmosDeviceDataCopied;
_sensors.Add(addr, control);
CSensorContainer.AddChild(control);
}

View File

@@ -83,10 +83,10 @@ public sealed partial class PumpControl : BoxContainer
PumpDataChanged?.Invoke(_address, _data);
};
_copySettings.OnPressed += _ =>
{
PumpDataCopied?.Invoke(_data);
};
_copySettings.OnPressed += _ =>
{
PumpDataCopied?.Invoke(_data);
};
}
public void ChangeData(GasVentPumpData data)

View File

@@ -72,10 +72,10 @@ public sealed partial class ScrubberControl : BoxContainer
ScrubberDataChanged?.Invoke(_address, _data);
};
_copySettings.OnPressed += _ =>
{
ScrubberDataCopied?.Invoke(_data);
};
_copySettings.OnPressed += _ =>
{
ScrubberDataCopied?.Invoke(_data);
};
foreach (var value in Enum.GetValues<Gas>())
{

View File

@@ -3,6 +3,9 @@
<CollapsibleHeading Name="SensorAddress" />
<CollapsibleBody Margin="20 2 2 2">
<BoxContainer Orientation="Vertical" HorizontalExpand="True">
<BoxContainer Orientation="Horizontal" Margin ="0 0 0 2">
<Button Name="CCopySettings" Text="{Loc 'air-alarm-ui-thresholds-copy'}" ToolTip="{Loc 'air-alarm-ui-thresholds-copy-tooltip'}" />
</BoxContainer>
<BoxContainer Orientation="Vertical" Margin="0 0 2 0" HorizontalExpand="True">
<RichTextLabel Name="AlarmStateLabel" />
<RichTextLabel Name="PressureLabel" />

View File

@@ -12,12 +12,14 @@ namespace Content.Client.Atmos.Monitor.UI.Widgets;
public sealed partial class SensorInfo : BoxContainer
{
public Action<string, AtmosMonitorThresholdType, AtmosAlarmThreshold, Gas?>? OnThresholdUpdate;
public event Action<AtmosSensorData>? SensorDataCopied;
private string _address;
private ThresholdControl _pressureThreshold;
private ThresholdControl _temperatureThreshold;
private Dictionary<Gas, ThresholdControl> _gasThresholds = new();
private Dictionary<Gas, RichTextLabel> _gasLabels = new();
private Button _copySettings => CCopySettings;
public SensorInfo(AtmosSensorData data, string address)
{
@@ -56,7 +58,7 @@ public sealed partial class SensorInfo : BoxContainer
gasThresholdControl.Margin = new Thickness(20, 2, 2, 2);
gasThresholdControl.ThresholdDataChanged += (type, alarmThreshold, arg3) =>
{
OnThresholdUpdate!(_address, type, alarmThreshold, arg3);
OnThresholdUpdate?.Invoke(_address, type, alarmThreshold, arg3);
};
_gasThresholds.Add(gas, gasThresholdControl);
@@ -72,12 +74,17 @@ public sealed partial class SensorInfo : BoxContainer
_pressureThreshold.ThresholdDataChanged += (type, threshold, arg3) =>
{
OnThresholdUpdate!(_address, type, threshold, arg3);
OnThresholdUpdate?.Invoke(_address, type, threshold, arg3);
};
_temperatureThreshold.ThresholdDataChanged += (type, threshold, arg3) =>
{
OnThresholdUpdate!(_address, type, threshold, arg3);
OnThresholdUpdate?.Invoke(_address, type, threshold, arg3);
};
_copySettings.OnPressed += _ =>
{
SensorDataCopied?.Invoke(data);
};
}

View File

@@ -1,3 +1,4 @@
using Content.Shared.Cargo.Components;
using Content.Shared.Timing;
using Content.Shared.Cargo.Systems;
@@ -10,9 +11,9 @@ public sealed class ClientPriceGunSystem : SharedPriceGunSystem
{
[Dependency] private readonly UseDelaySystem _useDelay = default!;
protected override bool GetPriceOrBounty(EntityUid priceGunUid, EntityUid target, EntityUid user)
protected override bool GetPriceOrBounty(Entity<PriceGunComponent> entity, EntityUid target, EntityUid user)
{
if (!TryComp(priceGunUid, out UseDelayComponent? useDelay) || _useDelay.IsDelayed((priceGunUid, useDelay)))
if (!TryComp(entity, out UseDelayComponent? useDelay) || _useDelay.IsDelayed((entity, useDelay)))
return false;
// It feels worse if the cooldown is predicted but the popup isn't! So only do the cooldown reset on the server.

View File

@@ -1,4 +1,5 @@
using System.Linq;
using Content.Client.PDA;
using Content.Shared.Clothing.Components;
using Content.Shared.Clothing.EntitySystems;
using Content.Shared.Inventory;
@@ -51,6 +52,15 @@ public sealed class ChameleonClothingSystem : SharedChameleonClothingSystem
{
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))
{
borderColor.BorderColor = otherBorderColor.BorderColor;
borderColor.AccentHColor = otherBorderColor.AccentHColor;
borderColor.AccentVColor = otherBorderColor.AccentVColor;
}
}
/// <summary>

View File

@@ -1,15 +1,21 @@
using Content.Client.Clothing.Systems;
using Content.Client.Clothing.Systems;
using Content.Shared.Clothing.Components;
using Content.Shared.Tag;
using Content.Shared.Prototypes;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Client.UserInterface;
using Robust.Shared.Prototypes;
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;
[ViewVariables]
private ChameleonMenu? _menu;
@@ -17,6 +23,7 @@ public sealed class ChameleonBoundUserInterface : BoundUserInterface
public ChameleonBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
_chameleon = EntMan.System<ChameleonClothingSystem>();
_tag = EntMan.System<TagSystem>();
}
protected override void Open()
@@ -34,7 +41,24 @@ public sealed class ChameleonBoundUserInterface : BoundUserInterface
return;
var targets = _chameleon.GetValidTargets(st.Slot);
_menu?.UpdateState(targets, st.SelectedId);
if (st.RequiredTag != null)
{
var newTargets = new List<string>();
foreach (var target in targets)
{
if (string.IsNullOrEmpty(target) || !_proto.TryIndex(target, out EntityPrototype? proto))
continue;
if (!proto.TryGetComponent(out TagComponent? tag, _factory) || !_tag.HasTag(tag, st.RequiredTag))
continue;
newTargets.Add(target);
}
_menu?.UpdateState(newTargets, st.SelectedId);
} else
{
_menu?.UpdateState(targets, st.SelectedId);
}
}
private void OnIdSelected(string selectedId)

View File

@@ -29,7 +29,7 @@
<Label Name="CallStatusText" Margin="10 5 10 0" ReservesSpace="False"/>
<BoxContainer Name="CallerIdContainer" Orientation="Vertical" ReservesSpace="False">
<RichTextLabel Name="CallerIdText" HorizontalAlignment="Center" Margin="0 0 0 0"/>
<Label Text="{Loc 'holopad-window-relay-label'}" Margin="10 5 10 0" ReservesSpace="False"/>
<Label Text="{Loc 'holopad-window-relay-label'}" Margin="10 10 10 0" ReservesSpace="False"/>
<RichTextLabel Name="HolopadIdText" HorizontalAlignment="Center" Margin="0 0 0 10"/>
</BoxContainer>
</BoxContainer>

View File

@@ -123,6 +123,10 @@ namespace Content.Client.Input
common.AddFunction(ContentKeyFunctions.OpenDecalSpawnWindow);
common.AddFunction(ContentKeyFunctions.OpenAdminMenu);
common.AddFunction(ContentKeyFunctions.OpenGuidebook);
//CP14 Keys
human.AddFunction(ContentKeyFunctions.CP14OpenKnowledgeMenu);
//CP14 Keys end
}
}
}

View File

@@ -5,19 +5,21 @@ using Content.Client.Lobby.UI;
using Content.Client.Message;
using Content.Client.UserInterface.Systems.Chat;
using Content.Client.Voting;
using Content.Shared.CCVar;
using Robust.Client;
using Robust.Client.Console;
using Robust.Client.ResourceManagement;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Shared.Configuration;
using Robust.Shared.Timing;
namespace Content.Client.Lobby
{
public sealed class LobbyState : Robust.Client.State.State
{
[Dependency] private readonly IBaseClient _baseClient = default!;
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private readonly IClientConsoleHost _consoleHost = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly IResourceCache _resourceCache = default!;
@@ -49,7 +51,17 @@ namespace Content.Client.Lobby
_voteManager.SetPopupContainer(Lobby.VoteContainer);
LayoutContainer.SetAnchorPreset(Lobby, LayoutContainer.LayoutPreset.Wide);
Lobby.ServerName.Text = _baseClient.GameInfo?.ServerName; //The eye of refactor gazes upon you...
var lobbyNameCvar = _cfg.GetCVar(CCVars.ServerLobbyName);
var serverName = _baseClient.GameInfo?.ServerName ?? string.Empty;
Lobby.ServerName.Text = string.IsNullOrEmpty(lobbyNameCvar)
? Loc.GetString("ui-lobby-title", ("serverName", serverName))
: lobbyNameCvar;
var width = _cfg.GetCVar(CCVars.ServerLobbyRightPanelWidth);
Lobby.RightSide.SetWidth = width;
UpdateLobbyUi();
Lobby.CharacterPreview.CharacterSetupButton.OnPressed += OnSetupPressed;

View File

@@ -62,14 +62,12 @@
<Control Access="Public" Visible="False" Name="CharacterSetupState" VerticalExpand="True" />
</BoxContainer>
<!-- Right Panel -->
<PanelContainer Name="RightSide" StyleClasses="AngleRect" HorizontalAlignment="Right" VerticalExpand="True"
<PanelContainer Name="RightSide" Access="Public" StyleClasses="AngleRect" HorizontalAlignment="Right" VerticalExpand="True"
VerticalAlignment="Stretch">
<BoxContainer Orientation="Vertical" HorizontalExpand="True">
<!-- Top row -->
<BoxContainer Orientation="Horizontal" MinSize="0 40" Name="HeaderContainer" Access="Public"
SeparationOverride="4">
<Label Margin="8 0 0 0" StyleClasses="LabelHeadingBigger" VAlign="Center"
Text="{Loc 'ui-lobby-title'}" />
<Label Name="ServerName" Access="Public" StyleClasses="LabelHeadingBigger" VAlign="Center"
HorizontalExpand="True" HorizontalAlignment="Center" />
</BoxContainer>

View File

@@ -265,6 +265,11 @@ namespace Content.Client.Options.UI.Tabs
AddButton(EngineKeyFunctions.HideUI);
AddButton(ContentKeyFunctions.InspectEntity);
//CP14
AddHeader("ui-options-header-cp14");
AddButton(ContentKeyFunctions.CP14OpenKnowledgeMenu);
//CP14 end
foreach (var control in _keyControls.Values)
{
UpdateKeyControl(control);

View File

@@ -2,7 +2,6 @@ using System.Numerics;
using Content.Client.Parallax;
using Content.Client.Weather;
using Content.Shared._CP14.DayCycle.Components;
using Content.Shared._CP14.WorldEdge;
using Content.Shared.Salvage;
using Content.Shared.Weather;
using Robust.Client.GameObjects;
@@ -84,13 +83,6 @@ public sealed partial class StencilOverlay : Overlay
}
//CP14 Overlays end
//CP14 Overlays
if (_entManager.TryGetComponent<CP14WorldEdgeComponent>(mapUid, out var worldEdge))
{
DrawWorldEdge(args, worldEdge, invMatrix);
}
//CP14 Overlays end
args.WorldHandle.UseShader(null);
args.WorldHandle.SetTransform(Matrix3x2.Identity);
}

View File

@@ -141,6 +141,11 @@ namespace Content.Client.PDA
_pdaOwner = state.PdaOwnerInfo.ActualOwnerName;
PdaOwnerLabel.SetMarkup(Loc.GetString("comp-pda-ui-owner",
("actualOwnerName", _pdaOwner)));
PdaOwnerLabel.Visible = true;
}
else
{
PdaOwnerLabel.Visible = false;
}

View File

@@ -1,48 +1,8 @@
using Content.Shared.PDA;
using Content.Shared.Light;
using Robust.Client.GameObjects;
namespace Content.Client.PDA;
public sealed class PdaSystem : SharedPdaSystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PdaComponent, AppearanceChangeEvent>(OnAppearanceChange);
}
private void OnAppearanceChange(EntityUid uid, PdaComponent component, ref AppearanceChangeEvent args)
{
if (args.Sprite == null)
return;
if (Appearance.TryGetData<bool>(uid, UnpoweredFlashlightVisuals.LightOn, out var isFlashlightOn, args.Component))
args.Sprite.LayerSetVisible(PdaVisualLayers.Flashlight, isFlashlightOn);
if (Appearance.TryGetData<bool>(uid, PdaVisuals.IdCardInserted, out var isCardInserted, args.Component))
args.Sprite.LayerSetVisible(PdaVisualLayers.IdLight, isCardInserted);
}
protected override void OnComponentInit(EntityUid uid, PdaComponent component, ComponentInit args)
{
base.OnComponentInit(uid, component, args);
if (!TryComp<SpriteComponent>(uid, out var sprite))
return;
if (component.State != null)
sprite.LayerSetState(PdaVisualLayers.Base, component.State);
sprite.LayerSetVisible(PdaVisualLayers.Flashlight, component.FlashlightOn);
sprite.LayerSetVisible(PdaVisualLayers.IdLight, component.IdSlot.StartingItem != null);
}
public enum PdaVisualLayers : byte
{
Base,
Flashlight,
IdLight
}
}

View File

@@ -0,0 +1,30 @@
using Content.Shared.Light;
using Content.Shared.PDA;
using Robust.Client.GameObjects;
namespace Content.Client.PDA;
public sealed class PdaVisualizerSystem : VisualizerSystem<PdaVisualsComponent>
{
protected override void OnAppearanceChange(EntityUid uid, PdaVisualsComponent comp, ref AppearanceChangeEvent args)
{
if (args.Sprite == null)
return;
if (AppearanceSystem.TryGetData<string>(uid, PdaVisuals.PdaType, out var pdaType, args.Component))
args.Sprite.LayerSetState(PdaVisualLayers.Base, pdaType);
if (AppearanceSystem.TryGetData<bool>(uid, UnpoweredFlashlightVisuals.LightOn, out var isFlashlightOn, args.Component))
args.Sprite.LayerSetVisible(PdaVisualLayers.Flashlight, isFlashlightOn);
if (AppearanceSystem.TryGetData<bool>(uid, PdaVisuals.IdCardInserted, out var isCardInserted, args.Component))
args.Sprite.LayerSetVisible(PdaVisualLayers.IdLight, isCardInserted);
}
public enum PdaVisualLayers : byte
{
Base,
Flashlight,
IdLight
}
}

View File

@@ -0,0 +1,14 @@
namespace Content.Client.PDA;
/// <summary>
/// Used for visualizing PDA visuals.
/// </summary>
[RegisterComponent]
public sealed partial class PdaVisualsComponent : Component
{
public string? BorderColor;
public string? AccentHColor;
public string? AccentVColor;
}

View File

@@ -4,6 +4,7 @@ namespace Content.Client
{
internal static class Program
{
[STAThread]
public static void Main(string[] args)
{
ContentStart.Start(args);

View File

@@ -3,7 +3,6 @@ using Content.Client.Administration.Systems;
using Content.Client.Administration.UI;
using Content.Client.Administration.UI.Tabs.ObjectsTab;
using Content.Client.Administration.UI.Tabs.PanicBunkerTab;
using Content.Client.Administration.UI.Tabs.BabyJailTab;
using Content.Client.Administration.UI.Tabs.PlayerTab;
using Content.Client.Gameplay;
using Content.Client.Lobby;
@@ -38,13 +37,11 @@ public sealed class AdminUIController : UIController,
private AdminMenuWindow? _window;
private MenuButton? AdminButton => UIManager.GetActiveUIWidgetOrNull<MenuBar.Widgets.GameTopMenuBar>()?.AdminButton;
private PanicBunkerStatus? _panicBunker;
private BabyJailStatus? _babyJail;
public override void Initialize()
{
base.Initialize();
SubscribeNetworkEvent<PanicBunkerChangedEvent>(OnPanicBunkerUpdated);
SubscribeNetworkEvent<BabyJailChangedEvent>(OnBabyJailUpdated);
}
private void OnPanicBunkerUpdated(PanicBunkerChangedEvent msg, EntitySessionEventArgs args)
@@ -59,18 +56,6 @@ public sealed class AdminUIController : UIController,
}
}
private void OnBabyJailUpdated(BabyJailChangedEvent msg, EntitySessionEventArgs args)
{
var showDialog = _babyJail == null && msg.Status.Enabled;
_babyJail = msg.Status;
_window?.BabyJailControl.UpdateStatus(msg.Status);
if (showDialog)
{
UIManager.CreateWindow<BabyJailStatusWindow>().OpenCentered();
}
}
public void OnStateEntered(GameplayState state)
{
EnsureWindow();
@@ -116,13 +101,6 @@ public sealed class AdminUIController : UIController,
if (_panicBunker != null)
_window.PanicBunkerControl.UpdateStatus(_panicBunker);
/*
* TODO: Remove baby jail code once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
if (_babyJail != null)
_window.BabyJailControl.UpdateStatus(_babyJail);
_window.PlayerTabControl.OnEntryKeyBindDown += PlayerTabEntryKeyBindDown;
_window.ObjectsTabControl.OnEntryKeyBindDown += ObjectsTabEntryKeyBindDown;
_window.OnOpen += OnWindowOpen;

View File

@@ -7,7 +7,9 @@ using Content.Client.UserInterface.Systems.Character.Controls;
using Content.Client.UserInterface.Systems.Character.Windows;
using Content.Client.UserInterface.Systems.Objectives.Controls;
using Content.Shared.Input;
using Content.Shared.Objectives.Systems;
using Content.Shared.Mind;
using Content.Shared.Mind.Components;
using Content.Shared.Roles;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Client.Player;
@@ -15,6 +17,7 @@ using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controllers;
using Robust.Client.UserInterface.Controls;
using Robust.Shared.Input.Binding;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
using static Content.Client.CharacterInfo.CharacterInfoSystem;
using static Robust.Client.UserInterface.Controls.BaseButton;
@@ -24,10 +27,25 @@ namespace Content.Client.UserInterface.Systems.Character;
[UsedImplicitly]
public sealed class CharacterUIController : UIController, IOnStateEntered<GameplayState>, IOnStateExited<GameplayState>, IOnSystemChanged<CharacterInfoSystem>
{
[Dependency] private readonly IEntityManager _ent = default!;
[Dependency] private readonly ILogManager _logMan = default!;
[Dependency] private readonly IPlayerManager _player = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[UISystemDependency] private readonly CharacterInfoSystem _characterInfo = default!;
[UISystemDependency] private readonly SpriteSystem _sprite = default!;
private ISawmill _sawmill = default!;
public override void Initialize()
{
base.Initialize();
_sawmill = _logMan.GetSawmill("character");
SubscribeNetworkEvent<MindRoleTypeChangedEvent>(OnRoleTypeChanged);
}
private CharacterWindow? _window;
private MenuButton? CharacterButton => UIManager.GetActiveUIWidgetOrNull<MenuBar.Widgets.GameTopMenuBar>()?.CharacterButton;
@@ -110,6 +128,9 @@ public sealed class CharacterUIController : UIController, IOnStateEntered<Gamepl
var (entity, job, objectives, briefing, entityName) = data;
_window.SpriteView.SetEntity(entity);
UpdateRoleType();
_window.NameLabel.Text = entityName;
_window.SubText.Text = job;
_window.Objectives.RemoveAllChildren();
@@ -173,6 +194,37 @@ public sealed class CharacterUIController : UIController, IOnStateEntered<Gamepl
_window.RolePlaceholder.Visible = briefing == null && !controls.Any() && !objectives.Any();
}
private void OnRoleTypeChanged(MindRoleTypeChangedEvent ev, EntitySessionEventArgs _)
{
UpdateRoleType();
}
private void UpdateRoleType()
{
if (_window == null || !_window.IsOpen)
return;
if (!_ent.TryGetComponent<MindContainerComponent>(_player.LocalEntity, out var container)
|| container.Mind is null)
return;
if (!_ent.TryGetComponent<MindComponent>(container.Mind.Value, out var mind))
return;
var roleText = Loc.GetString("role-type-crew-aligned-name");
var color = Color.White;
if (_prototypeManager.TryIndex(mind.RoleType, out var proto))
{
roleText = Loc.GetString(proto.Name);
color = proto.Color;
}
else
_sawmill.Error($"{_player.LocalEntity} has invalid Role Type '{mind.RoleType}'. Displaying '{roleText}' instead");
_window.RoleType.Text = roleText;
_window.RoleType.FontColorOverride = color;
}
private void CharacterDetached(EntityUid uid)
{
CloseWindow();

View File

@@ -7,6 +7,7 @@
MinHeight="545">
<ScrollContainer>
<BoxContainer Orientation="Vertical">
<Label Name="RoleType" VerticalAlignment="Top" Margin="0 6 0 10" HorizontalAlignment="Center" StyleClasses="LabelHeading" Access="Public"/>
<BoxContainer Orientation="Horizontal">
<SpriteView OverrideDirection="South" Scale="2 2" Name="SpriteView" Access="Public" SetSize="64 64"/>
<BoxContainer Orientation="Vertical" VerticalAlignment="Top">

View File

@@ -24,6 +24,7 @@ public sealed class GameTopMenuBarUIController : UIController
[Dependency] private readonly SandboxUIController _sandbox = default!;
[Dependency] private readonly GuidebookUIController _guidebook = default!;
[Dependency] private readonly EmotesUIController _emotes = default!;
[Dependency] private readonly CP14KnowledgeUIController _knowledge = default!; //CP14
private GameTopMenuBar? GameTopMenuBar => UIManager.GetActiveUIWidgetOrNull<GameTopMenuBar>();
@@ -47,6 +48,7 @@ public sealed class GameTopMenuBarUIController : UIController
_action.UnloadButton();
_sandbox.UnloadButton();
_emotes.UnloadButton();
_knowledge.UnloadButton(); //CP14
}
public void LoadButtons()
@@ -60,5 +62,6 @@ public sealed class GameTopMenuBarUIController : UIController
_action.LoadButton();
_sandbox.LoadButton();
_emotes.LoadButton();
_knowledge.LoadButton(); //CP14
}
}

View File

@@ -33,6 +33,18 @@
HorizontalExpand="True"
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
/>
<!-- CP14 UI part -->
<ui:MenuButton
Name="CP14KnowledgeButton"
Access="Internal"
Icon="{xe:Tex '/Textures/Interface/students-cap.svg.192dpi.png'}"
ToolTip="{Loc 'cp14-game-hud-open-knowledge-menu-button-tooltip'}"
BoundKey = "{x:Static is:ContentKeyFunctions.CP14OpenKnowledgeMenu}"
MinSize="42 64"
HorizontalExpand="True"
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
/>
<!-- CP14 UI part end -->
<ui:MenuButton
Name="CharacterButton"
Access="Internal"

View File

@@ -0,0 +1,42 @@
using Content.Shared._CP14.Knowledge;
using Content.Shared._CP14.Knowledge.Prototypes;
using Robust.Client.Player;
using Robust.Shared.Prototypes;
namespace Content.Client._CP14.Knowledge;
public sealed partial class ClientCP14KnowledgeSystem : SharedCP14KnowledgeSystem
{
[Dependency] private readonly IPlayerManager _players = default!;
public event Action<KnowledgeData>? OnKnowledgeUpdate;
public override void Initialize()
{
base.Initialize();
SubscribeNetworkEvent<CP14KnowledgeInfoEvent>(OnCharacterKnowledgeEvent);
}
public void RequestKnowledgeInfo()
{
var entity = _players.LocalEntity;
if (entity is null)
return;
RaiseNetworkEvent(new RequestKnowledgeInfoEvent(GetNetEntity(entity.Value)));
}
private void OnCharacterKnowledgeEvent(CP14KnowledgeInfoEvent msg, EntitySessionEventArgs args)
{
var entity = GetEntity(msg.NetEntity);
var data = new KnowledgeData(entity, msg.AllKnowledge);
OnKnowledgeUpdate?.Invoke(data);
}
public readonly record struct KnowledgeData(
EntityUid Entity,
HashSet<ProtoId<CP14KnowledgePrototype>> AllKnowledges
);
}

View File

@@ -41,7 +41,7 @@ public sealed class CP14BasePostProcessOverlay : Overlay
if (args.Viewport.Eye != eyeComp.Eye)
return false;
if (!_lightManager.Enabled || !eyeComp.Eye.DrawLight)
if (!_lightManager.Enabled || !eyeComp.Eye.DrawLight || !eyeComp.Eye.DrawFov)
return false;
var playerEntity = _playerManager.LocalSession?.AttachedEntity;

View File

@@ -1,57 +0,0 @@
using System.Numerics;
using Content.Shared._CP14.WorldEdge;
using Robust.Client.Graphics;
using Robust.Shared.Utility;
namespace Content.Client.Overlays;
public sealed partial class StencilOverlay
{
private void DrawWorldEdge(in OverlayDrawArgs args, CP14WorldEdgeComponent rangeComp, Matrix3x2 invMatrix)
{
var worldHandle = args.WorldHandle;
var renderScale = args.Viewport.RenderScale.X;
// TODO: This won't handle non-standard zooms so uhh yeah, not sure how to structure it on the shader side.
var zoom = args.Viewport.Eye?.Zoom ?? Vector2.One;
var length = zoom.X;
var bufferRange = MathF.Min(10f, rangeComp.Range);
var pixelCenter = Vector2.Transform(rangeComp.Origin, invMatrix);
// Something something offset?
var vertical = args.Viewport.Size.Y;
var pixelMaxRange = rangeComp.Range * renderScale / length * EyeManager.PixelsPerMeter;
var pixelBufferRange = bufferRange * renderScale / length * EyeManager.PixelsPerMeter;
var pixelMinRange = pixelMaxRange - pixelBufferRange;
_shader.SetParameter("position", new Vector2(pixelCenter.X, vertical - pixelCenter.Y));
_shader.SetParameter("maxRange", pixelMaxRange);
_shader.SetParameter("minRange", pixelMinRange);
_shader.SetParameter("bufferRange", pixelBufferRange);
_shader.SetParameter("gradient", 0.80f);
var worldAABB = args.WorldAABB;
var worldBounds = args.WorldBounds;
var position = args.Viewport.Eye?.Position.Position ?? Vector2.Zero;
var localAABB = invMatrix.TransformBox(worldAABB);
// Cut out the irrelevant bits via stencil
// This is why we don't just use parallax; we might want specific tiles to get drawn over
// particularly for planet maps or stations.
worldHandle.RenderInRenderTarget(_blep!, () =>
{
worldHandle.UseShader(_shader);
worldHandle.DrawRect(localAABB, Color.White);
}, Color.Transparent);
worldHandle.SetTransform(Matrix3x2.Identity);
worldHandle.UseShader(_protoManager.Index<ShaderPrototype>("StencilMask").Instance());
worldHandle.DrawTextureRect(_blep!.Texture, worldBounds);
var curTime = _timing.RealTime;
var sprite = _sprite.GetFrame(new SpriteSpecifier.Texture(new ResPath("/Textures/Parallaxes/noise.png")), curTime);
// Draw the rain
worldHandle.UseShader(_protoManager.Index<ShaderPrototype>("StencilDraw").Instance());
_parallax.DrawParallax(worldHandle, worldAABB, sprite, curTime, position, new Vector2(0.2f, 0.1f));
}
}

View File

@@ -1,15 +1,16 @@
<Control xmlns="https://spacestation14.io">
<Button Name="ProductButton" Access="Public">
<BoxContainer Orientation="Vertical">
<BoxContainer Orientation="Horizontal">
<TextureRect Name="View"
MinSize="48 48"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Stretch="KeepAspectCentered"/>
<RichTextLabel Name="ProductName" VerticalAlignment="Center" Access="Public"/>
<BoxContainer Name="PriceHolder" VerticalAlignment="Center" HorizontalExpand="True" HorizontalAlignment="Right"/>
<BoxContainer Orientation="Horizontal">
<TextureRect Name="View"
MinSize="48 48"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Stretch="KeepAspectCentered" />
<BoxContainer Orientation="Vertical">
<RichTextLabel Name="SpecialLabel" Text="{Loc 'cp14-store-ui-tab-special'}" VerticalAlignment="Center" Access="Public" Visible="False" />
<RichTextLabel Name="ProductName" VerticalAlignment="Center" Access="Public" />
</BoxContainer>
<BoxContainer Name="PriceHolder" VerticalAlignment="Center" HorizontalExpand="True" HorizontalAlignment="Right" />
</BoxContainer>
</Button>
</Control>

View File

@@ -21,24 +21,15 @@ public sealed partial class CP14StoreProductControl : Control
_sprite = _entity.System<SpriteSystem>();
UpdateName(entry.Name);
UpdateView(entry.Icon);
UpdatePrice(entry.Price);
}
private void UpdatePrice(int price)
{
PriceHolder.RemoveAllChildren();
PriceHolder.AddChild(new CP14PriceControl(price));
}
PriceHolder.AddChild(new CP14PriceControl(entry.Price));
ProductName.Text = $"[bold]{entry.Name}[/bold]";
private void UpdateName(string name)
{
ProductName.Text = $"[bold]{name}[/bold]";
SpecialLabel.Visible = entry.Special;
View.Texture = _sprite.Frame0(entry.Icon);
}
private void UpdateView(SpriteSpecifier spriteSpecifier)
{
View.Texture = _sprite.Frame0(spriteSpecifier);
}
}

View File

@@ -0,0 +1,158 @@
using Content.Client._CP14.Knowledge;
using Content.Client._CP14.UserInterface.Systems.Knowledge.Windows;
using Content.Client.Gameplay;
using Content.Client.UserInterface.Controls;
using Content.Shared.Input;
using JetBrains.Annotations;
using Robust.Client.Player;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controllers;
using Robust.Client.UserInterface.Controls;
using Robust.Shared.Input.Binding;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
namespace Content.Client.UserInterface.Systems.Character;
[UsedImplicitly]
public sealed class CP14KnowledgeUIController : UIController, IOnStateEntered<GameplayState>, IOnStateExited<GameplayState>,
IOnSystemChanged<ClientCP14KnowledgeSystem>
{
[Dependency] private readonly IPlayerManager _player = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
[UISystemDependency] private readonly ClientCP14KnowledgeSystem _knowledge = default!;
private CP14KnowledgeWindow? _window;
private MenuButton? KnowledgeButton => UIManager.GetActiveUIWidgetOrNull<MenuBar.Widgets.GameTopMenuBar>()?.CP14KnowledgeButton;
public void OnStateEntered(GameplayState state)
{
DebugTools.Assert(_window == null);
_window = UIManager.CreateWindow<CP14KnowledgeWindow>();
LayoutContainer.SetAnchorPreset(_window, LayoutContainer.LayoutPreset.CenterTop);
CommandBinds.Builder
.Bind(ContentKeyFunctions.CP14OpenKnowledgeMenu,
InputCmdHandler.FromDelegate(_ => ToggleWindow()))
.Register<CP14KnowledgeUIController>();
}
public void OnStateExited(GameplayState state)
{
if (_window != null)
{
_window.Dispose();
_window = null;
}
CommandBinds.Unregister<CP14KnowledgeUIController>();
}
public void OnSystemLoaded(ClientCP14KnowledgeSystem system)
{
system.OnKnowledgeUpdate += KnowledgeUpdated;
_player.LocalPlayerDetached += CharacterDetached;
}
public void OnSystemUnloaded(ClientCP14KnowledgeSystem system)
{
system.OnKnowledgeUpdate -= KnowledgeUpdated;
_player.LocalPlayerDetached -= CharacterDetached;
}
public void UnloadButton()
{
if (KnowledgeButton is null)
return;
KnowledgeButton.OnPressed -= KnowledgeButtonPressed;
}
public void LoadButton()
{
if (KnowledgeButton is null)
return;
KnowledgeButton.OnPressed += KnowledgeButtonPressed;
if (_window is null)
return;
_window.OnClose += DeactivateButton;
_window.OnOpen += ActivateButton;
}
private void DeactivateButton()
{
KnowledgeButton!.Pressed = false;
}
private void ActivateButton()
{
KnowledgeButton!.Pressed = true;
}
private void KnowledgeUpdated(ClientCP14KnowledgeSystem.KnowledgeData data)
{
if (_window is null)
return;
_window.KnowledgeContent.RemoveAllChildren();
var (entity, allKnowledge) = data;
foreach (var knowledge in allKnowledge)
{
if (!_proto.TryIndex(knowledge, out var indexedKnowledge))
continue;
var knowledgeButton = new Button()
{
Access = AccessLevel.Public,
Text = Loc.GetString(indexedKnowledge.Name),
ToolTip = Loc.GetString(indexedKnowledge.Desc),
TextAlign = Label.AlignMode.Center,
};
_window.KnowledgeContent.AddChild(knowledgeButton);
}
}
private void CharacterDetached(EntityUid uid)
{
CloseWindow();
}
private void KnowledgeButtonPressed(BaseButton.ButtonEventArgs args)
{
ToggleWindow();
}
private void CloseWindow()
{
_window?.Close();
}
private void ToggleWindow()
{
if (_window == null)
return;
if (KnowledgeButton != null)
{
KnowledgeButton.SetClickPressed(!_window.IsOpen);
}
if (_window.IsOpen)
{
CloseWindow();
}
else
{
_knowledge.RequestKnowledgeInfo();
_window.Open();
}
}
}

View File

@@ -0,0 +1,13 @@
<windows:CP14KnowledgeWindow
xmlns="https://spacestation14.io"
xmlns:cc="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:windows="clr-namespace:Content.Client._CP14.UserInterface.Systems.Knowledge.Windows"
Title="{Loc 'cp14-knowledge-info-title'}"
MinWidth="400"
MinHeight="200">
<ScrollContainer>
<BoxContainer Name="KnowledgeContent" Margin="5" Access="Public" Orientation="Vertical">
</BoxContainer>
</ScrollContainer>
</windows:CP14KnowledgeWindow>

View File

@@ -0,0 +1,14 @@
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client._CP14.UserInterface.Systems.Knowledge.Windows;
[GenerateTypedNameReferences]
public sealed partial class CP14KnowledgeWindow : DefaultWindow
{
public CP14KnowledgeWindow()
{
RobustXamlLoader.Load(this);
}
}

View File

@@ -12,6 +12,9 @@ public sealed class CP14WorkbenchBoundUserInterface : BoundUserInterface
{
private CP14WorkbenchWindow? _window;
[ViewVariables]
private string _search = string.Empty;
public CP14WorkbenchBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
}
@@ -23,6 +26,12 @@ public sealed class CP14WorkbenchBoundUserInterface : BoundUserInterface
_window = this.CreateWindow<CP14WorkbenchWindow>();
_window.OnCraft += entry => SendMessage(new CP14WorkbenchUiCraftMessage(entry.ProtoId));
_window.OnTextUpdated += search =>
{
_search = search.Trim().ToLowerInvariant();
_window.UpdateFilter(_search);
};
}
protected override void UpdateState(BoundUserInterfaceState state)
@@ -32,7 +41,7 @@ public sealed class CP14WorkbenchBoundUserInterface : BoundUserInterface
switch (state)
{
case CP14WorkbenchUiRecipesState recipesState:
_window?.UpdateRecipes(recipesState);
_window?.UpdateRecipes(recipesState, _search);
break;
}
}

View File

@@ -1,10 +1,20 @@
<Control xmlns="https://spacestation14.io">
<GridContainer Columns="2">
<TextureRect Name="View"
Margin="0,0,4,0"
MinSize="48 48"
HorizontalAlignment="Left"
Stretch="KeepAspectCentered"/>
<Label Name="Name"/>
<EntityPrototypeView
Name="EntityView"
Margin="0,0,4,0"
MinSize="48 48"
MaxSize="48 48"
Scale="2,2"
HorizontalAlignment="Left"
VerticalExpand="True" />
<TextureRect
Name="View"
Margin="0,0,4,0"
MinSize="48 48"
MaxSize="48 48"
HorizontalAlignment="Left"
Stretch="KeepAspectCentered" />
<Label Name="Name" />
</GridContainer>
</Control>

View File

@@ -31,7 +31,9 @@ public sealed partial class CP14WorkbenchRecipeControl : Control
{
var entityName = prototype.Name;
Name.Text = count <= 1 ? entityName : $"{entityName} x{count}";
View.Texture = _sprite.GetPrototypeIcon(prototype).Default;
View.Visible = false;
EntityView.SetPrototype(prototype);
}
public CP14WorkbenchRecipeControl(StackPrototype prototype, int count) : this()
@@ -43,6 +45,7 @@ public sealed partial class CP14WorkbenchRecipeControl : Control
if (icon is null)
return;
EntityView.Visible = false;
View.Texture = _sprite.Frame0(icon);
}
}

View File

@@ -1,11 +1,13 @@
<Control xmlns="https://spacestation14.io">
<Button Name="Button">
<GridContainer Columns="2">
<TextureRect Name="View"
Margin="0,0,4,0"
MinSize="48 48"
HorizontalAlignment="Left"
Stretch="KeepAspectCentered"/>
<EntityPrototypeView Name="View"
Margin="0,0,4,0"
MinSize="48 48"
MaxSize="48 48"
Scale="2,2"
HorizontalAlignment="Center"
VerticalExpand="True"/>
<Label Name="Name"/>
</GridContainer>
</Button>

View File

@@ -54,11 +54,12 @@ public sealed partial class CP14WorkbenchRequirementControl : Control
private void UpdateName()
{
var result = _prototype.Index(_recipePrototype.Result);
Name.Text = Loc.GetString(result.Name);
var counter = _recipePrototype.ResultCount > 1 ? $" x{_recipePrototype.ResultCount}" : "";
Name.Text = $"{Loc.GetString(result.Name)} {counter}" ;
}
private void UpdateView()
{
View.Texture = _sprite.GetPrototypeIcon(_recipePrototype.Result).Default;
View.SetPrototype(_recipePrototype.Result);
}
}

View File

@@ -2,59 +2,68 @@
xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
Title="{Loc 'cp14-workbench-ui-title'}"
MinSize="700 600">
<BoxContainer Orientation="Vertical">
SetSize="700 500"
MinSize="700 300">
<BoxContainer Orientation="Horizontal">
<!-- Main -->
<BoxContainer HorizontalExpand="True" VerticalExpand="True" Orientation="Horizontal">
<GridContainer HorizontalExpand="True" VerticalExpand="True" Columns="2">
<!-- Product list (left side UI) -->
<BoxContainer SizeFlagsStretchRatio="0.5" HorizontalExpand="True" Orientation="Vertical" Margin="0 0 10 0">
<!-- Search Bar -->
<LineEdit Name="SearchBar" Margin="4" PlaceHolder="Search" HorizontalExpand="True" />
<!-- Crafts container -->
<ScrollContainer HorizontalExpand="True" VerticalExpand="True" MinSize="0 200">
<BoxContainer Name="CraftsContainer" Orientation="Vertical" HorizontalExpand="True"/>
<BoxContainer Name="CraftsContainer" Orientation="Vertical" HorizontalExpand="True" />
</ScrollContainer>
</BoxContainer>
<!-- Craft view -->
<BoxContainer HorizontalExpand="True" VerticalExpand="True" Orientation="Vertical">
<PanelContainer HorizontalExpand="True" VerticalExpand="True">
<!-- Background -->
<PanelContainer.PanelOverride>
<graphics:StyleBoxFlat BackgroundColor="#41332f"/>
</PanelContainer.PanelOverride>
<!-- Craft view (right side UI) -->
<BoxContainer SizeFlagsStretchRatio="0.5" Orientation="Vertical" HorizontalExpand="True"
VerticalExpand="True">
<PanelContainer HorizontalExpand="True" VerticalExpand="True">
<!-- Background -->
<PanelContainer.PanelOverride>
<graphics:StyleBoxFlat BackgroundColor="#41332f" />
</PanelContainer.PanelOverride>
<!-- Content -->
<BoxContainer HorizontalExpand="True" VerticalExpand="True" Orientation="Vertical">
<!-- Item info -->
<GridContainer HorizontalExpand="True" Columns="2">
<!-- Left panel - icon -->
<TextureRect Name="ItemView"
<!-- Content -->
<BoxContainer HorizontalExpand="True" VerticalExpand="True" Orientation="Vertical">
<!-- Item info -->
<!-- icon -->
<EntityPrototypeView Name="ItemView"
Scale="2,2"
Margin="0,0,4,0"
MinSize="64 64"
HorizontalAlignment="Left"
Stretch="KeepAspectCentered"/>
MaxSize="64 64"
HorizontalAlignment="Left" />
<!-- Right panel - name & description -->
<BoxContainer HorizontalExpand="True" VerticalExpand="True" Orientation="Vertical">
<Label Name="ItemName" Text="Name"/>
<Label Name="ItemDescription" Text="Description" ClipText="True"/>
</BoxContainer>
</GridContainer>
<controls:HLine Color="#404040" Thickness="2" Margin="0 5"/>
<!-- Required title -->
<Label Text="{Loc 'cp14-workbench-recipe-list'}"/>
<!-- Craft requirements content -->
<!-- Added by code -->
<BoxContainer Name="ItemRequirements" Orientation="Vertical" VerticalExpand="True" HorizontalExpand="True"/>
<controls:HLine Color="#404040" Thickness="2" Margin="0 5"/>
<!-- Craft button -->
<Button Name="CraftButton" Text="{Loc 'cp14-workbench-craft'}"/>
<!-- name & description -->
<BoxContainer Margin="5 0 0 0" HorizontalExpand="True" VerticalExpand="True"
Orientation="Vertical">
<RichTextLabel Name="ItemName" Margin="5" />
<RichTextLabel Name="ItemDescription" Margin="5" />
</BoxContainer>
</PanelContainer>
</BoxContainer>
</GridContainer>
<controls:HLine Color="#404040" Thickness="2" Margin="0 5" />
<!-- Required title -->
<Label Margin="5 0 0 0" Text="{Loc 'cp14-workbench-recipe-list'}" />
<!-- Craft requirements content -->
<!-- Added by code -->
<BoxContainer
Margin="5 0 0 0"
Name="ItemRequirements"
Orientation="Vertical" VerticalExpand="True"
HorizontalExpand="True" />
<controls:HLine Color="#404040" Thickness="5" Margin="0 5" />
<!-- Craft button -->
<Button Name="CraftButton" Text="{Loc 'cp14-workbench-craft'}" />
</BoxContainer>
</PanelContainer>
</BoxContainer>
</BoxContainer>
</BoxContainer>
</DefaultWindow>

View File

@@ -19,19 +19,22 @@ public sealed partial class CP14WorkbenchWindow : DefaultWindow
[Dependency] private readonly IEntityManager _entity = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
private CP14WorkbenchUiRecipesState? _cachedState;
public event Action<CP14WorkbenchUiRecipesEntry>? OnCraft;
public event Action<string>? OnTextUpdated;
private readonly SpriteSystem _sprite;
private CP14WorkbenchUiRecipesEntry? _selectedEntry ;
private CP14WorkbenchUiRecipesEntry? _selectedEntry;
public CP14WorkbenchWindow()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
_sprite = _entity.System<SpriteSystem>();
SearchBar.OnTextChanged += _ =>
{
OnTextUpdated?.Invoke(SearchBar.Text);
};
CraftButton.OnPressed += _ =>
{
if (_selectedEntry is null)
@@ -41,13 +44,34 @@ public sealed partial class CP14WorkbenchWindow : DefaultWindow
};
}
public void UpdateRecipes(CP14WorkbenchUiRecipesState recipesState)
public void UpdateFilter(string? search)
{
if (_cachedState is null)
return;
UpdateRecipes(_cachedState, search);
}
public void UpdateRecipes(CP14WorkbenchUiRecipesState recipesState, string? search = null)
{
_cachedState = recipesState;
CraftsContainer.RemoveAllChildren();
List<CP14WorkbenchUiRecipesEntry> uncraftableList = new();
foreach (var entry in recipesState.Recipes)
{
if (search is not null && search != "")
{
if (!_prototype.TryIndex(entry.ProtoId, out var indexedEntry))
continue;
if (!_prototype.TryIndex(indexedEntry.Result, out var indexedResult))
continue;
if (!indexedResult.Name.Contains(search))
continue;
}
if (entry.Craftable)
{
var control = new CP14WorkbenchRequirementControl(entry);
@@ -89,8 +113,9 @@ public sealed partial class CP14WorkbenchWindow : DefaultWindow
var result = _prototype.Index(recipe.Result);
ItemView.Texture = _sprite.GetPrototypeIcon(recipe.Result).Default;
ItemName.Text = result.Name;
ItemView.SetPrototype(recipe.Result);
var counter = recipe.ResultCount > 1 ? $" x{recipe.ResultCount}" : "";
ItemName.Text = result.Name + counter;
ItemDescription.Text = result.Description;
ItemRequirements.RemoveAllChildren();

View File

@@ -92,7 +92,7 @@ public sealed class FluidSpill
#pragma warning disable NUnit2045 // Interdependent tests
Assert.That(puddle, Is.Not.Null);
Assert.That(puddleSystem.CurrentVolume(puddle!.Value.Owner, puddle), Is.EqualTo(FixedPoint2.New(100)));
//Assert.That(puddleSystem.CurrentVolume(puddle!.Value.Owner, puddle), Is.EqualTo(FixedPoint2.New(100))); //TOOD: CP14 fix failing test because force undersky evaporation :(
#pragma warning restore NUnit2045
for (var x = 0; x < 3; x++)

View File

@@ -35,7 +35,7 @@ namespace Content.IntegrationTests.Tests.GameObjects.Components.Mobs
{
playerUid = serverPlayerManager.Sessions.Single().AttachedEntity.GetValueOrDefault();
#pragma warning disable NUnit2045 // Interdependent assertions.
Assert.That(playerUid, Is.Not.EqualTo(default));
Assert.That(playerUid, Is.Not.EqualTo(default(EntityUid)));
// Making sure it exists
Assert.That(entManager.HasComponent<AlertsComponent>(playerUid));
#pragma warning restore NUnit2045

View File

@@ -17,7 +17,6 @@ using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Prototypes;
using Content.Shared.Station.Components;
using FastAccessors;
using Robust.Shared.Utility;
using YamlDotNet.RepresentationModel;

View File

@@ -61,7 +61,13 @@ public static class ClientPackaging
var graph = new RobustClientAssetGraph();
pass.Dependencies.Add(new AssetPassDependency(graph.Output.Name));
AssetGraph.CalculateGraph(graph.AllPasses.Append(pass).ToArray(), logger);
var dropSvgPass = new AssetPassFilterDrop(f => f.Path.EndsWith(".svg"))
{
Name = "DropSvgPass",
};
dropSvgPass.AddDependency(graph.Input).AddBefore(graph.PresetPasses);
AssetGraph.CalculateGraph([pass, dropSvgPass, ..graph.AllPasses], logger);
var inputPass = graph.Input;
@@ -72,7 +78,7 @@ public static class ClientPackaging
new[] { "Content.Client", "Content.Shared", "Content.Shared.Database" },
cancel: cancel);
await RobustClientPackaging.WriteClientResources(contentDir, pass, cancel);
await RobustClientPackaging.WriteClientResources(contentDir, inputPass, cancel);
inputPass.InjectFinished();
}

View File

@@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,41 @@
using System;
using System.Net;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace Content.Server.Database.Migrations.Postgres
{
/// <inheritdoc />
public partial class IPIntel : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "ipintel_cache",
columns: table => new
{
ipintel_cache_id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
address = table.Column<IPAddress>(type: "inet", nullable: false),
time = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
score = table.Column<float>(type: "real", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ipintel_cache", x => x.ipintel_cache_id);
});
migrationBuilder.Sql("CREATE UNIQUE INDEX idx_ipintel_cache_address ON ipintel_cache(address)");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "ipintel_cache");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,40 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Content.Server.Database.Migrations.Postgres
{
/// <inheritdoc />
public partial class AdminStatus : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<bool>(
name: "deadminned",
table: "admin",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "suspended",
table: "admin",
type: "boolean",
nullable: false,
defaultValue: false);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "deadminned",
table: "admin");
migrationBuilder.DropColumn(
name: "suspended",
table: "admin");
}
}
}

View File

@@ -36,6 +36,14 @@ namespace Content.Server.Database.Migrations.Postgres
.HasColumnType("integer")
.HasColumnName("admin_rank_id");
b.Property<bool>("Deadminned")
.HasColumnType("boolean")
.HasColumnName("deadminned");
b.Property<bool>("Suspended")
.HasColumnType("boolean")
.HasColumnName("suspended");
b.Property<string>("Title")
.HasColumnType("text")
.HasColumnName("title");
@@ -627,6 +635,34 @@ namespace Content.Server.Database.Migrations.Postgres
});
});
modelBuilder.Entity("Content.Server.Database.IPIntelCache", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("ipintel_cache_id");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<IPAddress>("Address")
.IsRequired()
.HasColumnType("inet")
.HasColumnName("address");
b.Property<float>("Score")
.HasColumnType("real")
.HasColumnName("score");
b.Property<DateTime>("Time")
.HasColumnType("timestamp with time zone")
.HasColumnName("time");
b.HasKey("Id")
.HasName("PK_ipintel_cache");
b.ToTable("ipintel_cache", (string)null);
});
modelBuilder.Entity("Content.Server.Database.Job", b =>
{
b.Property<int>("Id")

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,43 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Content.Server.Database.Migrations.Sqlite
{
/// <inheritdoc />
public partial class IPIntel : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "ipintel_cache",
columns: table => new
{
ipintel_cache_id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
address = table.Column<string>(type: "TEXT", nullable: false),
time = table.Column<DateTime>(type: "TEXT", nullable: false),
score = table.Column<float>(type: "REAL", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ipintel_cache", x => x.ipintel_cache_id);
});
migrationBuilder.CreateIndex(
name: "IX_ipintel_cache_address",
table: "ipintel_cache",
column: "address",
unique: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "ipintel_cache");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,40 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Content.Server.Database.Migrations.Sqlite
{
/// <inheritdoc />
public partial class AdminStatus : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<bool>(
name: "deadminned",
table: "admin",
type: "INTEGER",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "suspended",
table: "admin",
type: "INTEGER",
nullable: false,
defaultValue: false);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "deadminned",
table: "admin");
migrationBuilder.DropColumn(
name: "suspended",
table: "admin");
}
}
}

View File

@@ -28,6 +28,14 @@ namespace Content.Server.Database.Migrations.Sqlite
.HasColumnType("INTEGER")
.HasColumnName("admin_rank_id");
b.Property<bool>("Deadminned")
.HasColumnType("INTEGER")
.HasColumnName("deadminned");
b.Property<bool>("Suspended")
.HasColumnType("INTEGER")
.HasColumnName("suspended");
b.Property<string>("Title")
.HasColumnType("TEXT")
.HasColumnName("title");
@@ -591,6 +599,35 @@ namespace Content.Server.Database.Migrations.Sqlite
b.ToTable("connection_log", (string)null);
});
modelBuilder.Entity("Content.Server.Database.IPIntelCache", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("ipintel_cache_id");
b.Property<string>("Address")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("address");
b.Property<float>("Score")
.HasColumnType("REAL")
.HasColumnName("score");
b.Property<DateTime>("Time")
.HasColumnType("TEXT")
.HasColumnName("time");
b.HasKey("Id")
.HasName("PK_ipintel_cache");
b.HasIndex("Address")
.IsUnique();
b.ToTable("ipintel_cache", (string)null);
});
modelBuilder.Entity("Content.Server.Database.Job", b =>
{
b.Property<int>("Id")

View File

@@ -45,6 +45,7 @@ namespace Content.Server.Database
public DbSet<AdminMessage> AdminMessages { get; set; } = null!;
public DbSet<RoleWhitelist> RoleWhitelists { get; set; } = null!;
public DbSet<BanTemplate> BanTemplate { get; set; } = null!;
public DbSet<IPIntelCache> IPIntelCache { get; set; } = null!;
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
@@ -609,6 +610,16 @@ namespace Content.Server.Database
[Key] public Guid UserId { get; set; }
public string? Title { get; set; }
/// <summary>
/// If true, the admin is voluntarily deadminned. They can re-admin at any time.
/// </summary>
public bool Deadminned { get; set; }
/// <summary>
/// If true, the admin is suspended by an admin with <c>PERMISSIONS</c>. They will not have in-game permissions.
/// </summary>
public bool Suspended { get; set; }
public int? AdminRankId { get; set; }
public AdminRank? AdminRank { get; set; }
public List<AdminFlag> Flags { get; set; } = default!;
@@ -962,12 +973,14 @@ namespace Content.Server.Database
Full = 2,
Panic = 3,
/*
* TODO: Remove baby jail code once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*
* If baby jail is removed, please reserve this value for as long as can reasonably be done to prevent causing ambiguity in connection denial reasons.
* Reservation by commenting out the value is likely sufficient for this purpose, but may impact projects which depend on SS14 like SS14.Admin.
*
* Edit: It has
*/
BabyJail = 4,
/// Results from rejected connections with external API checking tools
IPChecks = 5,
}
public class ServerBanHit
@@ -1284,4 +1297,28 @@ namespace Content.Server.Database
return new ImmutableTypedHwid(hwid.Hwid.ToImmutableArray(), hwid.Type);
}
}
/// <summary>
/// Cache for the IPIntel system
/// </summary>
public class IPIntelCache
{
public int Id { get; set; }
/// <summary>
/// The IP address (duh). This is made unique manually for psql cause of ef core bug.
/// </summary>
public IPAddress Address { get; set; } = null!;
/// <summary>
/// Date this record was added. Used to check if our cache is out of date.
/// </summary>
public DateTime Time { get; set; }
/// <summary>
/// The score IPIntel returned
/// </summary>
public float Score { get; set; }
}
}

View File

@@ -81,6 +81,11 @@ namespace Content.Server.Database
modelBuilder.Entity<Profile>()
.Property(log => log.Markings)
.HasConversion(jsonByteArrayConverter);
// EF core can make this automatically unique on sqlite but not psql.
modelBuilder.Entity<IPIntelCache>()
.HasIndex(p => p.Address)
.IsUnique();
}
public override int CountAdminLogs()

View File

@@ -116,10 +116,10 @@ public sealed class AccessOverriderSystem : SharedAccessOverriderSystem
targetLabel = Loc.GetString("access-overrider-window-target-label") + " " + EntityManager.GetComponent<MetaDataComponent>(component.TargetAccessReaderId).EntityName;
targetLabelColor = Color.White;
if (!_accessReader.GetMainAccessReader(accessReader, out var accessReaderComponent))
if (!_accessReader.GetMainAccessReader(accessReader, out var accessReaderEnt))
return;
var currentAccessHashsets = accessReaderComponent.AccessLists;
var currentAccessHashsets = accessReaderEnt.Value.Comp.AccessLists;
currentAccess = ConvertAccessHashSetsToList(currentAccessHashsets).ToArray();
}
@@ -210,10 +210,10 @@ public sealed class AccessOverriderSystem : SharedAccessOverriderSystem
return;
}
if (!_accessReader.GetMainAccessReader(component.TargetAccessReaderId, out var accessReader))
if (!_accessReader.GetMainAccessReader(component.TargetAccessReaderId, out var accessReaderEnt))
return;
var oldTags = ConvertAccessHashSetsToList(accessReader.AccessLists);
var oldTags = ConvertAccessHashSetsToList(accessReaderEnt.Value.Comp.AccessLists);
var privilegedId = component.PrivilegedIdSlot.Item;
if (oldTags.SequenceEqual(newAccessList))
@@ -242,10 +242,10 @@ public sealed class AccessOverriderSystem : SharedAccessOverriderSystem
var removedTags = oldTags.Except(newAccessList).Select(tag => "-" + tag).ToList();
_adminLogger.Add(LogType.Action, LogImpact.Medium,
$"{ToPrettyString(player):player} has modified {ToPrettyString(component.TargetAccessReaderId):entity} with the following allowed access level holders: [{string.Join(", ", addedTags.Union(removedTags))}] [{string.Join(", ", newAccessList)}]");
$"{ToPrettyString(player):player} has modified {ToPrettyString(accessReaderEnt.Value):entity} with the following allowed access level holders: [{string.Join(", ", addedTags.Union(removedTags))}] [{string.Join(", ", newAccessList)}]");
accessReader.AccessLists = ConvertAccessListToHashSet(newAccessList);
Dirty(component.TargetAccessReaderId, accessReader);
accessReaderEnt.Value.Comp.AccessLists = ConvertAccessListToHashSet(newAccessList);
Dirty(accessReaderEnt.Value);
}
/// <summary>

View File

@@ -33,16 +33,16 @@ public sealed class AdminWhoCommand : IConsoleCommand
var first = true;
foreach (var admin in adminMgr.ActiveAdmins)
{
if (!first)
sb.Append('\n');
first = false;
var adminData = adminMgr.GetAdminData(admin)!;
DebugTools.AssertNotNull(adminData);
if (adminData.Stealth && !seeStealth)
continue;
if (!first)
sb.Append('\n');
first = false;
sb.Append(admin.Name);
if (adminData.Title is { } title)
sb.Append($": [{title}]");

View File

@@ -1,139 +0,0 @@
using Content.Shared.Administration;
using Content.Shared.CCVar;
using Robust.Shared.Configuration;
using Robust.Shared.Console;
/*
* TODO: Remove baby jail code once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
namespace Content.Server.Administration.Commands;
[AdminCommand(AdminFlags.Server)]
public sealed class BabyJailCommand : LocalizedCommands
{
[Dependency] private readonly IConfigurationManager _cfg = default!;
public override string Command => "babyjail";
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
var toggle = Toggle(CCVars.BabyJailEnabled, shell, args, _cfg);
if (toggle == null)
return;
shell.WriteLine(Loc.GetString(toggle.Value ? "babyjail-command-enabled" : "babyjail-command-disabled"));
}
public static bool? Toggle(CVarDef<bool> cvar, IConsoleShell shell, string[] args, IConfigurationManager config)
{
if (args.Length > 1)
{
shell.WriteError(Loc.GetString("shell-need-between-arguments",("lower", 0), ("upper", 1)));
return null;
}
var enabled = config.GetCVar(cvar);
switch (args.Length)
{
case 0:
enabled = !enabled;
break;
case 1 when !bool.TryParse(args[0], out enabled):
shell.WriteError(Loc.GetString("shell-argument-must-be-boolean"));
return null;
}
config.SetCVar(cvar, enabled);
return enabled;
}
}
[AdminCommand(AdminFlags.Server)]
public sealed class BabyJailShowReasonCommand : LocalizedCommands
{
[Dependency] private readonly IConfigurationManager _cfg = default!;
public override string Command => "babyjail_show_reason";
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
var toggle = BabyJailCommand.Toggle(CCVars.BabyJailShowReason, shell, args, _cfg);
if (toggle == null)
return;
shell.WriteLine(Loc.GetString(toggle.Value
? "babyjail-command-show-reason-enabled"
: "babyjail-command-show-reason-disabled"
));
}
}
[AdminCommand(AdminFlags.Server)]
public sealed class BabyJailMinAccountAgeCommand : LocalizedCommands
{
[Dependency] private readonly IConfigurationManager _cfg = default!;
public override string Command => "babyjail_max_account_age";
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
switch (args.Length)
{
case 0:
{
var current = _cfg.GetCVar(CCVars.BabyJailMaxAccountAge);
shell.WriteLine(Loc.GetString("babyjail-command-max-account-age-is", ("minutes", current)));
break;
}
case > 1:
shell.WriteError(Loc.GetString("shell-need-between-arguments",("lower", 0), ("upper", 1)));
return;
}
if (!int.TryParse(args[0], out var minutes))
{
shell.WriteError(Loc.GetString("shell-argument-must-be-number"));
return;
}
_cfg.SetCVar(CCVars.BabyJailMaxAccountAge, minutes);
shell.WriteLine(Loc.GetString("babyjail-command-max-account-age-set", ("minutes", minutes)));
}
}
[AdminCommand(AdminFlags.Server)]
public sealed class BabyJailMinOverallHoursCommand : LocalizedCommands
{
[Dependency] private readonly IConfigurationManager _cfg = default!;
public override string Command => "babyjail_max_overall_minutes";
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
switch (args.Length)
{
case 0:
{
var current = _cfg.GetCVar(CCVars.BabyJailMaxOverallMinutes);
shell.WriteLine(Loc.GetString("babyjail-command-max-overall-minutes-is", ("minutes", current)));
break;
}
case > 1:
shell.WriteError(Loc.GetString("shell-need-between-arguments",("lower", 0), ("upper", 1)));
return;
}
if (!int.TryParse(args[0], out var hours))
{
shell.WriteError(Loc.GetString("shell-argument-must-be-number"));
return;
}
_cfg.SetCVar(CCVars.BabyJailMaxOverallMinutes, hours);
shell.WriteLine(Loc.GetString("babyjail-command-overall-minutes-set", ("hours", hours)));
}
}

View File

@@ -91,14 +91,29 @@ namespace Content.Server.Administration.Managers
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-de-admin-message", ("exAdminName", session.Name)));
_chat.DispatchServerMessage(session, Loc.GetString("admin-manager-became-normal-player-message"));
var plyData = session.ContentData()!;
plyData.ExplicitlyDeadminned = true;
UpdateDatabaseDeadminnedState(session, true);
reg.Data.Active = false;
SendPermsChangedEvent(session);
UpdateAdminStatus(session);
}
private async void UpdateDatabaseDeadminnedState(ICommonSession player, bool newState)
{
try
{
// NOTE: This function gets called if you deadmin/readmin from a transient admin status.
// (e.g. loginlocal)
// In which case there may not be a database record.
// The DB function handles this scenario fine, but it's worth noting.
await _dbManager.UpdateAdminDeadminnedAsync(player.UserId, newState);
}
catch (Exception e)
{
_sawmill.Error("Failed to save deadmin state to database for {Admin}", player.UserId);
}
}
public void Stealth(ICommonSession session)
{
if (!_admins.TryGetValue(session, out var reg))
@@ -151,8 +166,7 @@ namespace Content.Server.Administration.Managers
_chat.DispatchServerMessage(session, Loc.GetString("admin-manager-became-admin-message"));
var plyData = session.ContentData()!;
plyData.ExplicitlyDeadminned = false;
UpdateDatabaseDeadminnedState(session, false);
reg.Data.Active = true;
if (!reg.Data.Stealth)
@@ -208,13 +222,13 @@ namespace Content.Server.Administration.Managers
curAdmin.IsSpecialLogin = special;
curAdmin.RankId = rankId;
curAdmin.Data = aData;
}
if (!player.ContentData()!.ExplicitlyDeadminned)
{
aData.Active = true;
if (curAdmin.Data.Active)
{
aData.Active = true;
_chat.DispatchServerMessage(player, Loc.GetString("admin-manager-admin-permissions-updated-message"));
_chat.DispatchServerMessage(player, Loc.GetString("admin-manager-admin-permissions-updated-message"));
}
}
if (player.ContentData()!.Stealthed)
@@ -381,10 +395,8 @@ namespace Content.Server.Administration.Managers
if (session.ContentData()!.Stealthed)
reg.Data.Stealth = true;
if (!session.ContentData()!.ExplicitlyDeadminned)
if (reg.Data.Active)
{
reg.Data.Active = true;
if (_cfg.GetCVar(CCVars.AdminAnnounceLogin))
{
if (reg.Data.Stealth)
@@ -430,6 +442,7 @@ namespace Content.Server.Administration.Managers
{
Title = Loc.GetString("admin-manager-admin-data-host-title"),
Flags = AdminFlagsHelper.Everything,
Active = true,
};
return (data, null, true);
@@ -444,6 +457,12 @@ namespace Content.Server.Administration.Managers
return null;
}
if (dbData.Suspended)
{
// Suspended admins don't count.
return null;
}
var flags = AdminFlags.None;
if (dbData.AdminRank != null)
@@ -466,7 +485,8 @@ namespace Content.Server.Administration.Managers
var data = new AdminData
{
Flags = flags
Flags = flags,
Active = !dbData.Deadminned,
};
if (dbData.Title != null && _cfg.GetCVar(CCVars.AdminUseCustomNamesAdminRank))

View File

@@ -0,0 +1,23 @@
using Content.Server.Administration.Notes;
using Content.Server.Database;
using Content.Server.Discord;
using Content.Shared.CCVar;
using Robust.Server;
using Robust.Server.Player;
using Robust.Shared.Enums;
using Robust.Shared.Configuration;
using Robust.Shared.Network;
using Robust.Shared.Player;
using System.Linq;
namespace Content.Server.Administration.Managers;
/// <summary>
/// This manager sends a webhook notification whenever a player with an active
/// watchlist joins the server.
/// </summary>
public interface IWatchlistWebhookManager
{
void Initialize();
void Update();
}

View File

@@ -0,0 +1,143 @@
using Content.Server.Administration.Notes;
using Content.Server.Database;
using Content.Server.Discord;
using Content.Shared.CCVar;
using Robust.Server;
using Robust.Server.Player;
using Robust.Shared.Enums;
using Robust.Shared.Configuration;
using Robust.Shared.Network;
using Robust.Shared.Player;
using Robust.Shared.Timing;
using System.Linq;
using System.Text;
namespace Content.Server.Administration.Managers;
/// <summary>
/// This manager sends a Discord webhook notification whenever a player with an active
/// watchlist joins the server.
/// </summary>
public sealed class WatchlistWebhookManager : IWatchlistWebhookManager
{
[Dependency] private readonly IAdminNotesManager _adminNotes = default!;
[Dependency] private readonly IBaseServer _baseServer = default!;
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private readonly DiscordWebhook _discord = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
private ISawmill _sawmill = default!;
private string _webhookUrl = default!;
private TimeSpan _bufferTime;
private List<WatchlistConnection> watchlistConnections = new();
private TimeSpan? _bufferStartTime;
public void Initialize()
{
_sawmill = Logger.GetSawmill("discord");
_cfg.OnValueChanged(CCVars.DiscordWatchlistConnectionBufferTime, SetBufferTime, true);
_cfg.OnValueChanged(CCVars.DiscordWatchlistConnectionWebhook, SetWebhookUrl, true);
_playerManager.PlayerStatusChanged += OnPlayerStatusChanged;
}
private void SetBufferTime(float bufferTimeSeconds)
{
_bufferTime = TimeSpan.FromSeconds(bufferTimeSeconds);
}
private void SetWebhookUrl(string webhookUrl)
{
_webhookUrl = webhookUrl;
}
private async void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e)
{
if (e.NewStatus != SessionStatus.Connected)
return;
var watchlists = await _adminNotes.GetActiveWatchlists(e.Session.UserId);
if (watchlists.Count == 0)
return;
watchlistConnections.Add(new WatchlistConnection(e.Session.Name, watchlists));
if (_bufferTime > TimeSpan.Zero)
{
if (_bufferStartTime == null)
_bufferStartTime = _gameTiming.RealTime;
}
else
{
SendDiscordMessage();
}
}
public void Update()
{
if (_bufferStartTime != null && _gameTiming.RealTime > (_bufferStartTime + _bufferTime))
{
SendDiscordMessage();
_bufferStartTime = null;
}
}
private async void SendDiscordMessage()
{
try
{
if (string.IsNullOrWhiteSpace(_webhookUrl))
return;
var webhookData = await _discord.GetWebhook(_webhookUrl);
if (webhookData == null)
return;
var webhookIdentifier = webhookData.Value.ToIdentifier();
var messageBuilder = new StringBuilder(Loc.GetString("discord-watchlist-connection-header",
("players", watchlistConnections.Count),
("serverName", _baseServer.ServerName)));
foreach (var connection in watchlistConnections)
{
messageBuilder.Append('\n');
var watchlist = connection.Watchlists.First();
var expiry = watchlist.ExpirationTime?.ToUnixTimeSeconds();
messageBuilder.Append(Loc.GetString("discord-watchlist-connection-entry",
("playerName", connection.PlayerName),
("message", watchlist.Message),
("expiry", expiry ?? 0),
("otherWatchlists", connection.Watchlists.Count - 1)));
}
var payload = new WebhookPayload { Content = messageBuilder.ToString() };
await _discord.CreateMessage(webhookIdentifier, payload);
}
catch (Exception e)
{
_sawmill.Error($"Error while sending discord watchlist connection message:\n{e}");
}
// Clear the buffered list regardless of whether the message is sent successfully
// This prevents infinitely buffering connections if we fail to send a message
watchlistConnections.Clear();
}
private sealed class WatchlistConnection
{
public string PlayerName;
public List<AdminWatchlistRecord> Watchlists;
public WatchlistConnection(string playerName, List<AdminWatchlistRecord> watchlists)
{
PlayerName = playerName;
Watchlists = watchlists;
}
}
}

View File

@@ -17,7 +17,6 @@ using Content.Shared.IdentityManagement;
using Content.Shared.Inventory;
using Content.Shared.Mind;
using Content.Shared.PDA;
using Content.Shared.Players;
using Content.Shared.Players.PlayTimeTracking;
using Content.Shared.Popups;
using Content.Shared.Roles;
@@ -32,6 +31,7 @@ using Robust.Shared.Configuration;
using Robust.Shared.Enums;
using Robust.Shared.Network;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
namespace Content.Server.Administration.Systems;
@@ -48,6 +48,7 @@ public sealed class AdminSystem : EntitySystem
[Dependency] private readonly PopupSystem _popup = default!;
[Dependency] private readonly PhysicsSystem _physics = default!;
[Dependency] private readonly PlayTimeTrackingManager _playTime = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly SharedRoleSystem _role = default!;
[Dependency] private readonly GameTicker _gameTicker = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
@@ -63,7 +64,6 @@ public sealed class AdminSystem : EntitySystem
private readonly HashSet<NetUserId> _roundActivePlayers = new();
public readonly PanicBunkerStatus PanicBunker = new();
public readonly BabyJailStatus BabyJail = new();
public override void Initialize()
{
@@ -82,23 +82,14 @@ public sealed class AdminSystem : EntitySystem
Subs.CVar(_config, CCVars.PanicBunkerMinAccountAge, OnPanicBunkerMinAccountAgeChanged, true);
Subs.CVar(_config, CCVars.PanicBunkerMinOverallMinutes, OnPanicBunkerMinOverallMinutesChanged, true);
/*
* TODO: Remove baby jail code once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
// Baby Jail Settings
Subs.CVar(_config, CCVars.BabyJailEnabled, OnBabyJailChanged, true);
Subs.CVar(_config, CCVars.BabyJailShowReason, OnBabyJailShowReasonChanged, true);
Subs.CVar(_config, CCVars.BabyJailMaxAccountAge, OnBabyJailMaxAccountAgeChanged, true);
Subs.CVar(_config, CCVars.BabyJailMaxOverallMinutes, OnBabyJailMaxOverallMinutesChanged, true);
SubscribeLocalEvent<IdentityChangedEvent>(OnIdentityChanged);
SubscribeLocalEvent<PlayerAttachedEvent>(OnPlayerAttached);
SubscribeLocalEvent<PlayerDetachedEvent>(OnPlayerDetached);
SubscribeLocalEvent<RoleAddedEvent>(OnRoleEvent);
SubscribeLocalEvent<RoleRemovedEvent>(OnRoleEvent);
SubscribeLocalEvent<RoundRestartCleanupEvent>(OnRoundRestartCleanup);
SubscribeLocalEvent<ActorComponent, EntityRenamedEvent>(OnPlayerRenamed);
SubscribeLocalEvent<ActorComponent, IdentityChangedEvent>(OnIdentityChanged);
}
private void OnRoundRestartCleanup(RoundRestartCleanupEvent ev)
@@ -154,18 +145,16 @@ public sealed class AdminSystem : EntitySystem
return value ?? null;
}
private void OnIdentityChanged(ref IdentityChangedEvent ev)
private void OnIdentityChanged(Entity<ActorComponent> ent, ref IdentityChangedEvent ev)
{
if (!TryComp<ActorComponent>(ev.CharacterEntity, out var actor))
return;
UpdatePlayerList(actor.PlayerSession);
UpdatePlayerList(ent.Comp.PlayerSession);
}
private void OnRoleEvent(RoleEvent ev)
{
var session = _minds.GetSession(ev.Mind);
if (!ev.Antagonist || session == null)
if (!ev.RoleTypeUpdate || session == null)
return;
UpdatePlayerList(session);
@@ -239,9 +228,16 @@ public sealed class AdminSystem : EntitySystem
}
var antag = false;
RoleTypePrototype roleType = new();
var startingRole = string.Empty;
if (_minds.TryGetMind(session, out var mindId, out _))
if (_minds.TryGetMind(session, out var mindId, out var mindComp))
{
if (_proto.TryIndex(mindComp.RoleType, out var role))
roleType = role;
else
Log.Error($"{ToPrettyString(mindId)} has invalid Role Type '{mindComp.RoleType}'. Displaying '{Loc.GetString(roleType.Name)}' instead");
antag = _role.MindIsAntagonist(mindId);
startingRole = _jobs.MindTryGetJobName(mindId);
}
@@ -255,7 +251,7 @@ public sealed class AdminSystem : EntitySystem
overallPlaytime = playTime;
}
return new PlayerInfo(name, entityName, identityName, startingRole, antag, GetNetEntity(session?.AttachedEntity), data.UserId,
return new PlayerInfo(name, entityName, identityName, startingRole, antag, roleType, GetNetEntity(session?.AttachedEntity), data.UserId,
connected, _roundActivePlayers.Contains(data.UserId), overallPlaytime);
}
@@ -270,17 +266,6 @@ public sealed class AdminSystem : EntitySystem
SendPanicBunkerStatusAll();
}
private void OnBabyJailChanged(bool enabled)
{
BabyJail.Enabled = enabled;
_chat.SendAdminAlert(Loc.GetString(enabled
? "admin-ui-baby-jail-enabled-admin-alert"
: "admin-ui-baby-jail-disabled-admin-alert"
));
SendBabyJailStatusAll();
}
private void OnPanicBunkerDisableWithAdminsChanged(bool enabled)
{
PanicBunker.DisableWithAdmins = enabled;
@@ -305,36 +290,18 @@ public sealed class AdminSystem : EntitySystem
SendPanicBunkerStatusAll();
}
private void OnBabyJailShowReasonChanged(bool enabled)
{
BabyJail.ShowReason = enabled;
SendBabyJailStatusAll();
}
private void OnPanicBunkerMinAccountAgeChanged(int minutes)
{
PanicBunker.MinAccountAgeMinutes = minutes;
SendPanicBunkerStatusAll();
}
private void OnBabyJailMaxAccountAgeChanged(int minutes)
{
BabyJail.MaxAccountAgeMinutes = minutes;
SendBabyJailStatusAll();
}
private void OnPanicBunkerMinOverallMinutesChanged(int minutes)
{
PanicBunker.MinOverallMinutes = minutes;
SendPanicBunkerStatusAll();
}
private void OnBabyJailMaxOverallMinutesChanged(int minutes)
{
BabyJail.MaxOverallMinutes = minutes;
SendBabyJailStatusAll();
}
private void UpdatePanicBunker()
{
var hasAdmins = false;
@@ -381,15 +348,6 @@ public sealed class AdminSystem : EntitySystem
}
}
private void SendBabyJailStatusAll()
{
var ev = new BabyJailChangedEvent(BabyJail);
foreach (var admin in _adminManager.AllAdmins)
{
RaiseNetworkEvent(ev, admin);
}
}
/// <summary>
/// Erases a player from the round.
/// This removes them and any trace of them from the round, deleting their

View File

@@ -76,7 +76,8 @@ namespace Content.Server.Administration.UI
Title = p.a.Title,
RankId = p.a.AdminRankId,
UserId = new NetUserId(p.a.UserId),
UserName = p.lastUserName
UserName = p.lastUserName,
Suspended = p.a.Suspended,
}).ToArray(),
AdminRanks = _adminRanks.ToDictionary(a => a.Id, a => new PermissionsEuiState.AdminRankData
@@ -255,6 +256,7 @@ namespace Content.Server.Administration.UI
admin.Title = ua.Title;
admin.AdminRankId = ua.RankId;
admin.Flags = GenAdminFlagList(ua.PosFlags, ua.NegFlags);
admin.Suspended = ua.Suspended;
await _db.UpdateAdminAsync(admin);
@@ -335,7 +337,8 @@ namespace Content.Server.Administration.UI
Flags = GenAdminFlagList(ca.PosFlags, ca.NegFlags),
AdminRankId = ca.RankId,
UserId = userId.UserId,
Title = ca.Title
Title = ca.Title,
Suspended = ca.Suspended,
};
await _db.AddAdminAsync(admin);

View File

@@ -97,6 +97,6 @@ public sealed partial class ReagentProducerAnomalyComponent : Component
/// <summary>
/// Solution where the substance is generated
/// </summary>
[DataField("solutionRef")]
[ViewVariables]
public Entity<SolutionComponent>? Solution = null;
}

View File

@@ -153,7 +153,7 @@ public partial struct AntagSelectionDefinition()
/// List of Mind Role Prototypes to be added to the player's mind.
/// </summary>
[DataField]
public List<ProtoId<EntityPrototype>>? MindRoles;
public List<EntProtoId>? MindRoles;
/// <summary>
/// A set of starting gear that's equipped to the player.

View File

@@ -131,6 +131,19 @@ public sealed class AirAlarmSystem : EntitySystem
SyncDevice(uid, address);
}
private void SetAllThresholds(EntityUid uid, string address, AtmosSensorData data)
{
var payload = new NetworkPayload
{
[DeviceNetworkConstants.Command] = AtmosMonitorSystem.AtmosMonitorSetAllThresholdsCmd,
[AtmosMonitorSystem.AtmosMonitorAllThresholdData] = data
};
_deviceNet.QueuePacket(uid, address, payload);
SyncDevice(uid, address);
}
/// <summary>
/// Sync this air alarm's mode with the rest of the network.
/// </summary>
@@ -341,6 +354,13 @@ public sealed class AirAlarmSystem : EntitySystem
SetData(uid, addr, args.Data);
}
break;
case AtmosSensorData sensorData:
foreach (string addr in component.SensorData.Keys)
{
SetAllThresholds(uid, addr, sensorData);
}
break;
}
}

View File

@@ -33,10 +33,11 @@ public sealed class AtmosMonitorSystem : EntitySystem
// Commands
public const string AtmosMonitorSetThresholdCmd = "atmos_monitor_set_threshold";
public const string AtmosMonitorSetAllThresholdsCmd = "atmos_monitor_set_all_thresholds";
// Packet data
public const string AtmosMonitorThresholdData = "atmos_monitor_threshold_data";
public const string AtmosMonitorAllThresholdData = "atmos_monitor_all_threshold_data";
public const string AtmosMonitorThresholdDataType = "atmos_monitor_threshold_type";
public const string AtmosMonitorThresholdGasType = "atmos_monitor_threshold_gas";
@@ -138,7 +139,12 @@ public sealed class AtmosMonitorSystem : EntitySystem
args.Data.TryGetValue(AtmosMonitorThresholdGasType, out Gas? gas);
SetThreshold(uid, thresholdType.Value, thresholdData, gas);
}
break;
case AtmosMonitorSetAllThresholdsCmd:
if (args.Data.TryGetValue(AtmosMonitorAllThresholdData, out AtmosSensorData? allThresholdData))
{
SetAllThresholds(uid, allThresholdData);
}
break;
case AtmosDeviceNetworkSystem.SyncData:
var payload = new NetworkPayload();
@@ -403,4 +409,20 @@ public sealed class AtmosMonitorSystem : EntitySystem
}
}
/// <summary>
/// Sets all of a monitor's thresholds at once according to the incoming
/// AtmosSensorData object's thresholds.
/// </summary>
/// <param name="uid">The entity's uid</param>
/// <param name="allThresholdData">An AtmosSensorData object from which the thresholds will be loaded.</param>
public void SetAllThresholds(EntityUid uid, AtmosSensorData allThresholdData)
{
SetThreshold(uid, AtmosMonitorThresholdType.Temperature, allThresholdData.TemperatureThreshold);
SetThreshold(uid, AtmosMonitorThresholdType.Pressure, allThresholdData.PressureThreshold);
foreach (var gas in Enum.GetValues<Gas>())
{
SetThreshold(uid, AtmosMonitorThresholdType.Gas, allThresholdData.GasThresholds[gas], gas);
}
}
}

View File

@@ -25,7 +25,7 @@ public sealed partial class GasCondenserComponent : Component
/// <summary>
/// The solution that gases are condensed into.
/// </summary>
[DataField]
[ViewVariables]
public Entity<SolutionComponent>? Solution = null;
/// <summary>

View File

@@ -157,22 +157,22 @@ namespace Content.Server.Body.Components
/// <summary>
/// Internal solution for blood storage
/// </summary>
[DataField]
public Entity<SolutionComponent>? BloodSolution = null;
[ViewVariables]
public Entity<SolutionComponent>? BloodSolution;
/// <summary>
/// Internal solution for reagent storage
/// </summary>
[DataField]
public Entity<SolutionComponent>? ChemicalSolution = null;
[ViewVariables]
public Entity<SolutionComponent>? ChemicalSolution;
/// <summary>
/// Temporary blood solution.
/// When blood is lost, it goes to this solution, and when this
/// solution hits a certain cap, the blood is actually spilled as a puddle.
/// </summary>
[DataField]
public Entity<SolutionComponent>? TemporarySolution = null;
[ViewVariables]
public Entity<SolutionComponent>? TemporarySolution;
/// <summary>
/// Variable that stores the amount of status time added by having a low blood level.

View File

@@ -26,7 +26,7 @@ public sealed partial class LungComponent : Component
/// <summary>
/// The solution on this entity that these lungs act on.
/// </summary>
[DataField]
[ViewVariables]
public Entity<SolutionComponent>? Solution = null;
/// <summary>

View File

@@ -25,8 +25,8 @@ namespace Content.Server.Body.Components
/// <summary>
/// The solution inside of this stomach this transfers reagents to the body.
/// </summary>
[DataField]
public Entity<SolutionComponent>? Solution = null;
[ViewVariables]
public Entity<SolutionComponent>? Solution;
/// <summary>
/// What solution should this stomach push reagents into, on the body?

View File

@@ -96,6 +96,6 @@ public sealed partial class PlantHolderComponent : Component
[DataField]
public string SoilSolutionName = "soil";
[DataField]
[ViewVariables]
public Entity<SolutionComponent>? SoilSolution = null;
}

View File

@@ -1,7 +1,9 @@
using Content.Server.Popups;
using Content.Shared.Cargo.Components;
using Content.Shared.IdentityManagement;
using Content.Shared.Timing;
using Content.Shared.Cargo.Systems;
using Robust.Shared.Audio.Systems;
namespace Content.Server.Cargo.Systems;
@@ -11,12 +13,12 @@ public sealed class PriceGunSystem : SharedPriceGunSystem
[Dependency] private readonly PricingSystem _pricingSystem = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly CargoSystem _bountySystem = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
protected override bool GetPriceOrBounty(EntityUid priceGunUid, EntityUid target, EntityUid user)
protected override bool GetPriceOrBounty(Entity<PriceGunComponent> entity, EntityUid target, EntityUid user)
{
if (!TryComp(priceGunUid, out UseDelayComponent? useDelay) || _useDelay.IsDelayed((priceGunUid, useDelay)))
if (!TryComp(entity.Owner, out UseDelayComponent? useDelay) || _useDelay.IsDelayed((entity.Owner, useDelay)))
return false;
// Check if we're scanning a bounty crate
if (_bountySystem.IsBountyComplete(target, out _))
{
@@ -25,10 +27,15 @@ public sealed class PriceGunSystem : SharedPriceGunSystem
else // Otherwise appraise the price
{
var price = _pricingSystem.GetPrice(target);
_popupSystem.PopupEntity(Loc.GetString("price-gun-pricing-result", ("object", Identity.Entity(target, EntityManager)), ("price", $"{price:F2}")), user, user);
_popupSystem.PopupEntity(Loc.GetString("price-gun-pricing-result",
("object", Identity.Entity(target, EntityManager)),
("price", $"{price:F2}")),
user,
user);
}
_useDelay.TryResetDelay((priceGunUid, useDelay));
_audio.PlayPvs(entity.Comp.AppraisalSound, entity.Owner);
_useDelay.TryResetDelay((entity.Owner, useDelay));
return true;
}
}

View File

@@ -1,11 +1,14 @@
using Content.Server.Administration.Logs;
using Content.Shared.CartridgeLoader;
using Content.Shared.CartridgeLoader.Cartridges;
using Content.Shared.Database;
namespace Content.Server.CartridgeLoader.Cartridges;
public sealed class NotekeeperCartridgeSystem : EntitySystem
{
[Dependency] private readonly CartridgeLoaderSystem? _cartridgeLoaderSystem = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
public override void Initialize()
{
@@ -36,16 +39,19 @@ public sealed class NotekeeperCartridgeSystem : EntitySystem
if (message.Action == NotekeeperUiAction.Add)
{
component.Notes.Add(message.Note);
_adminLogger.Add(LogType.PdaInteract, LogImpact.Low,
$"{ToPrettyString(args.Actor)} added a note to PDA: '{message.Note}' contained on: {ToPrettyString(uid)}");
}
else
{
component.Notes.Remove(message.Note);
_adminLogger.Add(LogType.PdaInteract, LogImpact.Low,
$"{ToPrettyString(args.Actor)} removed a note from PDA: '{message.Note}' was contained on: {ToPrettyString(uid)}");
}
UpdateUiState(uid, GetEntity(args.LoaderUid), component);
}
private void UpdateUiState(EntityUid uid, EntityUid loaderUid, NotekeeperCartridgeComponent? component)
{
if (!Resolve(uid, ref component))

View File

@@ -322,9 +322,9 @@ public sealed partial class ChatSystem : SharedChatSystem
Color? colorOverride = null
)
{
sender ??= Loc.GetString("chat-manager-sender-announcement");
sender ??= Loc.GetString("cp14-announcement-gamemaster"); //CP14 replaced
var wrappedMessage = Loc.GetString("chat-manager-sender-announcement-wrap-message", ("sender", sender), ("message", FormattedMessage.EscapeText(message)));
var wrappedMessage = Loc.GetString("cp14-announcement-wrapped", ("sender", sender), ("message", FormattedMessage.EscapeText(message))); //CP14 replaced
_chatManager.ChatMessageToAll(ChatChannel.Radio, message, wrappedMessage, default, false, true, colorOverride);
if (playSound)
{

View File

@@ -20,7 +20,7 @@ public sealed partial class SolutionRegenerationComponent : Component
/// <summary>
/// The solution to add reagents to.
/// </summary>
[DataField]
[ViewVariables]
public Entity<SolutionComponent>? SolutionRef = null;
/// <summary>

View File

@@ -1,7 +1,7 @@
using Content.Server.Body.Components;
using Content.Server.Body.Systems;
using Content.Shared._CP14.Farming;
using Content.Shared._CP14.Skills;
using Content.Shared._CP14.Knowledge;
using Content.Shared.Chemistry;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Components.SolutionManager;
@@ -35,8 +35,6 @@ public sealed class InjectorSystem : SharedInjectorSystem
private bool TryUseInjector(Entity<InjectorComponent> injector, EntityUid target, EntityUid user)
{
RaiseLocalEvent(injector, new CP14TrySkillIssueEvent(user)); //CP14 Skill issue event
var isOpenOrIgnored = injector.Comp.IgnoreClosed || !_openable.IsClosed(target);
// Handle injecting/drawing for solutions
if (injector.Comp.ToggleState == InjectorToggleMode.Inject)

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