Compare commits

...

164 Commits

Author SHA1 Message Date
Redrover1760 145e311621 kill me 2026-04-02 11:03:33 -04:00
EldritchPineapple 8d91e0d13e Merge branch 'main' into refactoring-two,-less-bullshit-boogalloo 2026-03-30 19:01:26 +02:00
monolith8319 9d3b0778b3 Automated Changelog (#3643) 2026-03-30 16:56:33 +00:00
lopsidedmanboobs 32b15951e2 PIrate CBT (#3643) 2026-03-30 18:56:00 +02:00
monolith8319 55f6108312 Automated Changelog (#3514) 2026-03-30 16:16:08 +00:00
UnicornOnLSD 8be27c1658 Reworks the DIS Rig (#3514)
Co-authored-by: Corrupt <compeldominik6@gmail.com>
2026-03-30 18:15:38 +02:00
monolith8319 fb09b866f2 Automated Changelog (#3639) 2026-03-30 13:57:16 +00:00
tonotom1 0458a500ff Harmonica-Fy All Handheld Instruments (#3639) 2026-03-30 09:56:46 -04:00
monolith8319 4334b07093 Automated Changelog (#3638) 2026-03-30 09:23:54 +00:00
Isratosh ad2dd99a9b Thruster Capacitor Uniformity (#3638) 2026-03-30 13:23:22 +04:00
Ghost581 1e201bb8d2 Viper Group Whitelist Fix (#3634) 2026-03-29 23:36:29 -04:00
EldritchPineapple ac87fad37f Merge branch 'main' into refactoring-two,-less-bullshit-boogalloo 2026-03-29 20:20:58 +02:00
monolith8319 bc0151e540 Automated Changelog (#3564) 2026-03-29 18:15:53 +00:00
UnicornOnLSD b2307660de Uniformises Shutter Sprites (#3564) 2026-03-29 20:15:23 +02:00
EldritchPineapple f2cd4629bb Merge branch 'refactoring-two,-less-bullshit-boogalloo' of https://github.com/EldritchPineapple/Monolith into refactoring-two,-less-bullshit-boogalloo 2026-03-29 18:26:47 +02:00
EldritchPineapple 226465a90a Merge branch 'main' into refactoring-two,-less-bullshit-boogalloo 2026-03-29 18:26:55 +02:00
EldritchPineapple 9c3a66424e more anger 2026-03-29 18:26:32 +02:00
monolith8319 114a09f290 Automated Changelog (#3618) 2026-03-29 16:20:15 +00:00
Redrover1760 dc4b50e71e updates VSC/build configurations (#3618) 2026-03-29 12:19:46 -04:00
EldritchPineapple 09ca4c567e Merge branch 'main' into refactoring-two,-less-bullshit-boogalloo 2026-03-29 18:03:30 +02:00
EldritchPineapple 7c7c7d7716 anger 2026-03-29 18:01:47 +02:00
monolith8319 c405c32c89 Automated Changelog (#3598) 2026-03-29 15:49:50 +00:00
monolith8319 34ff30a736 Automated Changelog (#3599) 2026-03-29 15:49:22 +00:00
ScarletLightweaver c8e162baa1 Made Bulwark Gauntlets Wideswing (#3598) 2026-03-29 11:49:12 -04:00
Ilya246 ffcbc32c43 Add Carpsuit to Xenopsychology (#3599) 2026-03-29 11:48:53 -04:00
EldritchPineapple 3e0bc7811a Merge branch 'main' into refactoring-two,-less-bullshit-boogalloo 2026-03-29 17:41:29 +02:00
monolith8319 9fd2a7b5af Automated Changelog (#3614) 2026-03-29 15:16:12 +00:00
EckoAurum 8972408ec1 Drone Turret Small Fix (#3614) 2026-03-29 11:15:43 -04:00
Ilya246 cc1c91f39f Actually Fix Changelog (#3609) 2026-03-29 14:10:42 +00:00
Ilya246 d02895a50f prune changelog 2026-03-29 13:55:25 +00:00
Ilya246 c41d005cf4 fix changelog workflow (#3607) 2026-03-29 13:52:43 +00:00
monolith8319 013f57a73d Automated Changelog (#3605) 2026-03-29 13:40:51 +00:00
monolith8319 f837710be1 Automated Changelog (#3604) 2026-03-29 13:25:12 +00:00
Corrupt d4487d9a5a RSC WL Update no.3 (#3601)
brr
2026-03-29 15:03:48 +02:00
EldritchPineapple b5004d925f Merge branch 'main' into refactoring-two,-less-bullshit-boogalloo 2026-03-29 12:53:27 +02:00
monolith8319 7b9f602c55 Automated Changelog (#3571) 2026-03-29 06:31:08 +00:00
Antoine 97509dd3b6 Chat Message Highlighting (#3571)
Co-authored-by: Ilya246 <57039557+Ilya246@users.noreply.github.com>
2026-03-29 06:30:38 +00:00
monolith8319 55c2a03ea4 Automated Changelog (#3594) 2026-03-29 05:46:36 +00:00
Redrover1760 543c19645f Gigabuffs Signaller Range (#3594) 2026-03-29 01:46:05 -04:00
monolith8319 da8b19dd05 Automated Changelog (#3595) 2026-03-29 02:40:33 +00:00
Redrover1760 4fc44d3a9c Really Ensures Delayed Gamerules Don't Trigger Early (#3595) 2026-03-28 22:40:06 -04:00
Redrover1760 55688cc9e0 Nuke Collar Buff (#3593) 2026-03-28 18:29:23 -04:00
Redrover1760 5357469644 Adds Tsf/Pdv Borgs to Debug Map (#3591) 2026-03-28 17:59:46 -04:00
monolith8319 6040135534 Automated Changelog (#3590) 2026-03-28 19:05:03 +00:00
Ilya246 52649a871e Fastify Apoc (#3590) 2026-03-28 15:04:33 -04:00
monolith8319 fef33511d8 Automated Changelog (#3444) 2026-03-28 18:43:41 +00:00
EckoAurum fec5bfce0a Faction Borg Specialization | Independent Cyborg Selectable Whitelist (#3444) 2026-03-28 14:43:12 -04:00
monolith8319 11f82f95d3 Automated Changelog (#3459) 2026-03-28 18:17:06 +00:00
NazrinNya 3dbad97455 Small Mech Rebalance. (#3459)
Co-authored-by: NazrinNya <macrohard@macrohard.localhost>
2026-03-28 21:16:36 +03:00
monolith8319 a193ab828e Automated Changelog (#3574) 2026-03-28 16:46:17 +00:00
Vinny Shick c75083140d Vasnyx 150mm Launcher Buff (#3574) 2026-03-28 19:45:49 +03:00
Redrover1760 106f9b6d28 Actually Removes Lancelot Wildcard Trade Crate Selling (#3577) 2026-03-28 19:45:07 +03:00
monolith8319 fe24fc22bc Automated Changelog (#3589) 2026-03-28 16:43:10 +00:00
Redrover1760 85c9636003 Buffs Thruster Speed Increase (#3589) 2026-03-28 19:42:39 +03:00
monolith8319 a1d2f4dcbc Automated Changelog (#3587) 2026-03-28 16:22:15 +00:00
NazrinNya 3381fe165c Various Patches. (#3587)
Co-authored-by: NazrinNya <macrohard@macrohard.localhost>
2026-03-28 12:21:43 -04:00
monolith8319 a913c35b21 Automated Changelog (#3588) 2026-03-28 16:18:20 +00:00
Redrover1760 0706b759d4 Fixes Diagonal Collisions, Can Kill Kudzu/Chimerazu Under It (#3588) 2026-03-28 12:17:49 -04:00
monolith8319 73a91c0b0a Automated Changelog (#3585) 2026-03-28 06:42:25 +00:00
Redrover1760 9e390680bd Speciest Turrets Fix (#3585) 2026-03-28 02:41:55 -04:00
EldritchPineapple 0abbbc4f2d Merge branch 'refactoring-two,-less-bullshit-boogalloo' of https://github.com/EldritchPineapple/Monolith into refactoring-two,-less-bullshit-boogalloo 2026-03-27 23:09:07 +01:00
monolith8319 d3d391f5a0 Automated Changelog (#3582) 2026-03-27 21:58:06 +00:00
Redrover1760 a6506c7f46 Anti-Chimera RIP Turrets to CC and MD (#3582) 2026-03-27 17:57:35 -04:00
EldritchPineapple 9955437eb0 Merge branch 'main' into refactoring-two,-less-bullshit-boogalloo 2026-03-27 21:02:36 +01:00
monolith8319 958421b6c9 Automated Changelog (#3461) 2026-03-27 19:26:53 +00:00
NazrinNya c513938ed9 Make Heavy Ballistic Turrets Less Painful. (#3461)
Co-authored-by: NazrinNya <macrohard@macrohard.localhost>
Co-authored-by: Redrover1760 <39284090+Redrover1760@users.noreply.github.com>
2026-03-27 15:26:22 -04:00
EldritchPineapple c07504533b Merge branch 'refactoring-two,-less-bullshit-boogalloo' of https://github.com/EldritchPineapple/Monolith into refactoring-two,-less-bullshit-boogalloo 2026-03-27 19:52:56 +01:00
EldritchPineapple 9c98539530 fixes cryosleep system not ttriggering correctly on some faction roles, also moved role names to mono namespace 2026-03-27 19:23:47 +01:00
EldritchPineapple 5db9e6d8cf Merge branch 'main' into refactoring-two,-less-bullshit-boogalloo 2026-03-27 19:15:37 +01:00
monolith8319 a6431c9bab Automated Changelog (#3570) 2026-03-27 17:58:37 +00:00
Ilya246 f3390a81cc Gamemode Fixes and Changes (#3570)
Co-authored-by: Redrover1760 <39284090+Redrover1760@users.noreply.github.com>
2026-03-27 13:58:07 -04:00
EldritchPineapple fbe80a4526 bazinga 2026-03-27 16:18:03 +01:00
EldritchPineapple 2b135d2c14 fixed trademark with a chrery on top 2026-03-27 15:47:14 +01:00
EldritchPineapple 0b7e9389cb yes 2026-03-27 15:30:30 +01:00
EldritchPineapple 926fb181d3 12 gazillion tweaks 2026-03-27 15:19:38 +01:00
EldritchPineapple 1b6255f129 condensed files more 2026-03-27 14:41:21 +01:00
EldritchPineapple ddfd4777d3 few files moved 2026-03-27 14:17:02 +01:00
EldritchPineapple d51e2b4c82 Merge branch 'refactoring-two,-less-bullshit-boogalloo' of https://github.com/EldritchPineapple/Monolith into refactoring-two,-less-bullshit-boogalloo 2026-03-27 13:52:00 +01:00
monolith8319 6ba80381cc Automated Changelog (#3565) 2026-03-27 07:21:00 +00:00
Redrover1760 ef095aec88 Mono Claws Guidebook Update (#3565) 2026-03-27 03:20:31 -04:00
monolith8319 d02738089c Automated Changelog (#3575) 2026-03-27 07:19:51 +00:00
Redrover1760 b9f0de8576 Improves Hydrakin Head Displacement (#3575) 2026-03-27 03:19:24 -04:00
monolith8319 5a6d4b74b1 Automated Changelog (#3524) 2026-03-27 05:49:41 +00:00
significant harassment 1ac13bf597 Triple Rot Delay (#3524)
Co-authored-by: Onezero0 <onezero0@outlook.com>
Co-authored-by: Redrover1760 <39284090+Redrover1760@users.noreply.github.com>
2026-03-27 01:49:14 -04:00
monolith8319 90ee912816 Automated Changelog (#3573) 2026-03-26 22:06:02 +00:00
Redrover1760 27665829e6 Viscerators No Longer Drop Lootboxes (#3572) 2026-03-26 18:05:41 -04:00
Redrover1760 e1459b0d43 Trade Crates Can No Longer Be Sold on Helios or Lancelot (#3573) 2026-03-26 18:05:32 -04:00
monolith8319 395d334dd7 Automated Changelog (#3560) 2026-03-26 05:55:40 +00:00
UnicornOnLSD 75e166e9b3 Maintains the DIS Femur (#3560)
Merged by Corrupt, Has 1 Fakefail.
2026-03-26 06:55:12 +01:00
monolith8319 d987cfe88d Automated Changelog (#3563) 2026-03-25 22:19:01 +00:00
Redrover1760 a942f3e7b1 Reflect Fixes (#3563) 2026-03-25 18:18:31 -04:00
monolith8319 4108933834 Automated Changelog (#3542) 2026-03-25 19:54:26 +00:00
Redrover1760 6af6f3b386 Fireteam Time Requirement Tweak (#3542) 2026-03-25 15:53:53 -04:00
monolith8319 9a590069d2 Automated Changelog (#3555) 2026-03-25 18:33:51 +00:00
Redrover1760 a60321f201 Ports CMO Webbing From Goob (#3555) 2026-03-25 19:33:22 +01:00
monolith8319 dfabb71045 Automated Changelog (#3554) 2026-03-25 06:13:58 +00:00
Redrover1760 ce034c3f19 Claws Tweak, Claws-Based Chemicals (#3554) 2026-03-25 02:13:30 -04:00
monolith8319 79c9dee112 Automated Changelog (#3558) 2026-03-25 05:50:21 +00:00
lopsidedmanboobs 6a048def33 Kill Ransom (#3558) 2026-03-25 01:49:54 -04:00
monolith8319 e41ef48441 Automated Changelog (#3556) 2026-03-25 04:12:58 +00:00
Redrover1760 27e7b2f70a Research Client Fix (#3556) 2026-03-25 00:12:27 -04:00
monolith8319 2bd317dadb Automated Changelog (#3551) 2026-03-25 00:09:05 +00:00
Maxim Bychkov 1145822797 Fix Voidboots Ability To Lie In Space (#3551) 2026-03-24 20:08:36 -04:00
monolith8319 27dca32ef3 Automated Changelog (#3260) 2026-03-24 23:42:18 +00:00
Avalon 4bdad8f6ee Ullman Coat 2 Electric Boogaloo (#3260)
Co-authored-by: Redrover1760 <39284090+Redrover1760@users.noreply.github.com>
2026-03-24 19:41:50 -04:00
monolith8319 38ebc2699c Automated Changelog (#3552) 2026-03-24 19:54:37 +00:00
Ilya246 82f75ff37f Nerf Big Ame (#3552) 2026-03-24 19:54:07 +00:00
Maxim Bychkov c84cde54cb Fix Map Painter (#3544) 2026-03-24 19:28:05 +00:00
monolith8319 f0c6624762 Automated Changelog (#3550) 2026-03-24 19:01:03 +00:00
Ilya246 277ad91140 Bugfixes (#3550) 2026-03-24 19:00:31 +00:00
EldritchPineapple 2c33adff2c couldn't be bothered to clear these out, otherwise it shit itself 2026-03-24 17:28:09 +01:00
EldritchPineapple 338fd5075d moving a few thingies 2026-03-24 17:03:43 +01:00
EldritchPineapple efb5bebc71 Revert "slop deletion and MORE namespace changes!!"
This reverts commit 1ce0349aeb.
2026-03-24 16:54:18 +01:00
EldritchPineapple 1ce0349aeb slop deletion and MORE namespace changes!! 2026-03-24 16:40:45 +01:00
EldritchPineapple 5325954f33 moving a few things around 2026-03-24 16:31:45 +01:00
EldritchPineapple 69840a4daf Merge branch 'main' into refactoring-two,-less-bullshit-boogalloo 2026-03-24 16:21:47 +01:00
EldritchPineapple e401bca7d6 more fixes wooooooooooooooo 2026-03-24 16:09:59 +01:00
monolith8319 b9419b25a1 Automated Changelog (#3155) 2026-03-24 15:08:01 +00:00
gelliii e1a5488f14 New Scrap Ship - Horsefly (#3155) 2026-03-24 16:07:30 +01:00
Redrover1760 d9b46ca6dc Update README.md 2026-03-24 09:15:30 -04:00
tonotom1 a672e9bd28 Revert "Cable Destruction Lag Reduction" (#3532) 2026-03-24 08:18:13 -04:00
monolith8319 2a5fe8fe6a Automated Changelog (#3548) 2026-03-24 12:07:19 +00:00
Redrover1760 e069f2ba9d Makes Printed Contraband Worth Things Again (#3548) 2026-03-24 08:06:49 -04:00
monolith8319 db3675b3e8 Automated Changelog (#3549) 2026-03-24 11:45:08 +00:00
chuga-git 79bf0fec68 Buffs MARAUDER Projectile Speed (#3549) 2026-03-24 07:44:39 -04:00
EldritchPineapple 4d743c19d8 more forgor things 2026-03-23 22:27:38 +01:00
EldritchPineapple efba9587c3 dev map changes otherwise it crashes oopsies 2026-03-23 22:24:55 +01:00
EldritchPineapple e51d2c77ac more fixes 2026-03-23 22:15:00 +01:00
EldritchPineapple 476834b29b magic 2026-03-23 21:51:22 +01:00
EldritchPineapple 11a56bf0bc spoopy cs changes 2026-03-23 21:41:52 +01:00
EldritchPineapple 29e6ed475d final fix, all other fails are goidafails 2026-03-23 20:55:51 +01:00
EldritchPineapple 69e23a5741 babingo 2026-03-23 19:46:57 +01:00
EldritchPineapple 042f7e0102 16 gorillion changes 2026-03-23 19:33:29 +01:00
EldritchPineapple 44fa55acd6 bazinga 2026-03-23 19:07:56 +01:00
EldritchPineapple 95bb346a5d Merge branch 'refactoring-two,-less-bullshit-boogalloo' of https://github.com/EldritchPineapple/Monolith into refactoring-two,-less-bullshit-boogalloo 2026-03-23 18:25:43 +01:00
monolith8319 41b3fb9113 Automated Changelog (#3543) 2026-03-23 17:24:06 +00:00
EldritchPineapple 817f6c2359 meow meow 2026-03-23 18:23:56 +01:00
Redrover1760 7cd749dfa6 Datafarm Fixes (#3543) 2026-03-23 13:23:36 -04:00
EldritchPineapple 0e8149feb2 a 2026-03-23 17:47:55 +01:00
EldritchPineapple 732bf90297 the happening 2026-03-23 17:38:09 +01:00
EldritchPineapple 98de6abe75 meow 2026-03-23 11:43:19 +01:00
EldritchPineapple bad53d7c0f Merge branch 'main' into refactoring-two,-less-bullshit-boogalloo 2026-03-23 11:18:33 +01:00
EldritchPineapple 5b286d986d fixes and shii 2026-03-23 11:17:44 +01:00
monolith8319 eb44deeeda Automated Changelog (#3534) 2026-03-23 06:05:19 +00:00
Redrover1760 7035e752a9 Majorly Buffs Part Wound Tending (#3534) 2026-03-23 02:04:49 -04:00
monolith8319 2fdd1cd573 Automated Changelog (#3381) 2026-03-23 04:08:14 +00:00
Kiithnaras 6c4101e0c0 Added Roofing and Emergency Lighting to Comet (#3381) 2026-03-23 00:00:28 -04:00
Redrover1760 5503155f0d Merge branch 'main' into refactoring-two,-less-bullshit-boogalloo 2026-03-22 23:48:09 -04:00
monolith8319 5f90433697 Automated Changelog (#3536) 2026-03-23 03:42:43 +00:00
Redrover1760 9f54374593 Research Datafarm Fix (#3536) 2026-03-22 23:42:15 -04:00
monolith8319 5272291275 Automated Changelog (#3533) 2026-03-22 23:23:01 +00:00
Redrover1760 4a0f4cec3a Buffed Chems and Surgery Part Healing/Damage (#3533) 2026-03-22 19:22:33 -04:00
monolith8319 5d68716090 Automated Changelog (#3530) 2026-03-22 22:54:38 +00:00
Redrover1760 a4b1a5317c People No Longer Thermal Regulate While Dead, Hydrakin Do Not While Crit Either (#3530) 2026-03-22 18:54:10 -04:00
monolith8319 ee48853724 Automated Changelog (#3520) 2026-03-22 22:41:50 +00:00
tonotom1 a8651f6457 Cable Destruction Lag Reduction (#3520) 2026-03-22 18:41:10 -04:00
EldritchPineapple 0886791c1f Revert "why are we still here, just to suffer"
This reverts commit 34b829ddbd.
2026-03-22 22:13:41 +01:00
EldritchPineapple f502950d3b Merge branch 'main' into refactoring-two,-less-bullshit-boogalloo 2026-03-22 20:51:07 +01:00
EldritchPineapple 34b829ddbd why are we still here, just to suffer 2026-03-22 20:46:31 +01:00
EldritchPineapple ba7c5d81b3 oop 2026-03-22 20:32:02 +01:00
EldritchPineapple 1713884cc3 Merge branch 'refactoring-two,-less-bullshit-boogalloo' of https://github.com/EldritchPineapple/Monolith into refactoring-two,-less-bullshit-boogalloo 2026-03-22 20:28:44 +01:00
EldritchPineapple a6faba4fb2 500 billion gazillion changes 2026-03-22 20:27:48 +01:00
EldritchPineapple 0ddacefbdf Merge branch 'main' into refactoring-two,-less-bullshit-boogalloo 2026-03-22 19:13:24 +01:00
EldritchPineapple ee7f83430b condensed the access files and made some changes to namespace, also nuked pilot 2026-03-22 19:02:45 +01:00
627 changed files with 36642 additions and 37049 deletions
+5 -5
View File
@@ -1,5 +1,5 @@
name: PR Changelogs
concurrency: commit_action
concurrency: commit_action-${{ github.event.pull_request.base.ref }} # Mono
on:
pull_request_target:
types: [closed]
@@ -16,11 +16,11 @@ jobs:
permissions:
contents: write
steps:
- name: Checkout Master
- name: Checkout Base Branch # Mono
uses: actions/checkout@v3
with:
token: ${{ secrets.BOT_TOKEN }}
ref: "${{ vars.CHANGELOG_BRANCH }}"
ref: "${{ github.event.pull_request.base.ref }}" # Mono
- name: Setup Git
run: |
@@ -47,9 +47,9 @@ jobs:
- name: Commit Changelog
run: |
git pull origin main
git pull origin "${{ github.event.pull_request.base.ref }}"
git add "${{ env.CHANGELOG_DIR }}"
git commit -m "Automated Changelog (#${{ env.PR_NUMBER }})"
git push
git push origin "${{ github.event.pull_request.base.ref }}"
shell: bash
continue-on-error: true
+53 -7
View File
@@ -13,6 +13,26 @@
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "Client - Tools",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build - Tools",
"program": "${workspaceFolder}/bin/Content.Client/Content.Client.dll",
"args": [],
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "Client - Release",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build - Release",
"program": "${workspaceFolder}/bin/Content.Client/Content.Client.dll",
"args": [],
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "Client (Compatibility renderer)",
"type": "coreclr",
@@ -31,6 +51,26 @@
"console": "integratedTerminal",
"stopAtEntry": false
},
{
"name": "Server - Tools",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build - Tools",
"program": "${workspaceFolder}/bin/Content.Server/Content.Server.dll",
"args": [""],
"console": "integratedTerminal",
"stopAtEntry": false
},
{
"name": "Server - Release",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build - Release",
"program": "${workspaceFolder}/bin/Content.Server/Content.Server.dll",
"args": [""],
"console": "integratedTerminal",
"stopAtEntry": false
},
{
"name": "YAML Linter",
"type": "coreclr",
@@ -40,7 +80,7 @@
"cwd": "${workspaceFolder}/Content.YAMLLinter",
"console": "internalConsole",
"stopAtEntry": false
}
},
],
"compounds": [
{
@@ -51,14 +91,21 @@
],
"preLaunchTask": "build"
},
// Frontier begin
{
"name": "Server/Client (Release)",
"name": "Server/Client - Tools",
"configurations": [
"Server",
"Client"
"Server - Tools",
"Client - Tools"
],
"preLaunchTask": "build-release"
"preLaunchTask": "build - Tools"
},
{
"name": "Server/Client - Release",
"configurations": [
"Server - Release",
"Client - Release"
],
"preLaunchTask": "build - Release"
},
{
"name": "Server/Client (No Build)",
@@ -67,6 +114,5 @@
"Client"
]
}
// Frontier end
]
}
+26 -6
View File
@@ -21,26 +21,46 @@
},
"problemMatcher": "$msCompile"
},
// Frontier begin
{
"label": "build-release",
"label": "build - Tools",
"command": "dotnet",
"type": "shell",
"args": [
"build",
"--configuration=Release", // Build in release mode. Note: --, not /. /configuration doesn't work, because Microsoft.
"--configuration",
"Tools",
"/property:GenerateFullPaths=true", // Ask dotnet build to generate full paths for file names.
"/consoleloggerparameters:NoSummary" // Do not generate summary otherwise it leads to duplicate errors in Problems panel
"/consoleloggerparameters:'ForceNoAlign;NoSummary'", // Do not generate summary otherwise it leads to duplicate errors in Problems panel
],
"group": {
"kind": "build"
"kind": "build",
"isDefault": false
},
"presentation": {
"reveal": "silent"
},
"problemMatcher": "$msCompile"
},
{
"label": "build - Release",
"command": "dotnet",
"type": "shell",
"args": [
"build",
"--configuration",
"Release",
"/property:GenerateFullPaths=true", // Ask dotnet build to generate full paths for file names.
"/consoleloggerparameters:'ForceNoAlign;NoSummary'", // Do not generate summary otherwise it leads to duplicate errors in Problems panel
],
"group": {
"kind": "build",
"isDefault": false
},
"presentation": {
"reveal": "silent"
},
"problemMatcher": "$msCompile"
},
// Frontier end
{
"label": "build-yaml-linter",
"command": "dotnet",
@@ -32,6 +32,10 @@ public sealed class CharacterInfoSystem : EntitySystem
private void OnCharacterInfoEvent(CharacterInfoEvent msg, EntitySessionEventArgs args)
{
var entity = GetEntity(msg.NetEntity);
// Mono - fix
if (TerminatingOrDeleted(entity))
return;
var data = new CharacterData(entity, msg.JobTitle, msg.Objectives, msg.Briefing, Name(entity));
OnCharacterUpdate?.Invoke(data);
@@ -0,0 +1,7 @@
<Control xmlns="https://spacestation14.io">
<BoxContainer Orientation="Vertical">
<Label Name="TitleLabel" Access="Public" />
<Label Name="ExampleLabel" Access="Public" />
<ColorSelectorSliders Name="Slider" Access="Public" HorizontalExpand="True" />
</BoxContainer>
</Control>
@@ -0,0 +1,31 @@
using Content.Client.Options.UI;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
namespace Content.Client.Options.UI;
/// <summary>
/// Standard UI control used for color sliders in the options menu. Intended for use with <see cref="OptionsTabControlRow"/>.
/// </summary>
/// <seealso cref="OptionsTabControlRow.AddOptionColorSlider"/>
[GenerateTypedNameReferences]
public sealed partial class OptionColorSlider : Control
{
/// <summary>
/// The text describing what this slider affects.
/// </summary>
public string? Title
{
get => TitleLabel.Text;
set => TitleLabel.Text = value;
}
/// <summary>
/// The example text showing the current color of the slider.
/// </summary>
public string? Example
{
get => ExampleLabel.Text;
set => ExampleLabel.Text = value;
}
}
@@ -143,6 +143,19 @@ public sealed partial class OptionsTabControlRow : Control
return AddOption(new OptionSliderIntCVar(this, _cfg, cVar, slider, min, max, format ?? FormatInt));
}
/// <summary>
/// Add a color slider option, backed by a simple string CVar.
/// </summary>
/// <param name="cVar">The CVar represented by the slider.</param>
/// <param name="slider">The UI control for the option.</param>
/// <returns>The option instance backing the added option.</returns>
public OptionColorSliderCVar AddOptionColorSlider(
CVarDef<string> cVar,
OptionColorSlider slider)
{
return AddOption(new OptionColorSliderCVar(this, _cfg, cVar, slider));
}
/// <summary>
/// Add a drop-down option, backed by a CVar.
/// </summary>
@@ -518,6 +531,54 @@ public sealed class OptionSliderFloatCVar : BaseOptionCVar<float>
}
}
public sealed class OptionColorSliderCVar : BaseOptionCVar<string>
{
private readonly OptionColorSlider _slider;
protected override string Value
{
get => _slider.Slider.Color.ToHex();
set
{
_slider.Slider.Color = Color.FromHex(value);
UpdateLabelColor();
}
}
/// <summary>
/// Creates a new instance of this type.
/// </summary>
/// <remarks>
/// <para>
/// It is generally more convenient to call overloads on <see cref="OptionsTabControlRow"/>
/// such as <see cref="OptionsTabControlRow.AddOptionPercentSlider"/> instead of instantiating this type directly.
/// </para>
/// </remarks>
/// <param name="controller">The control row that owns this option.</param>
/// <param name="cfg">The configuration manager to get and set values from.</param>
/// <param name="cVar">The CVar that is being controlled by this option.</param>
/// <param name="slider">The UI control for the option.</param>
public OptionColorSliderCVar(
OptionsTabControlRow controller,
IConfigurationManager cfg,
CVarDef<string> cVar,
OptionColorSlider slider) : base(controller, cfg, cVar)
{
_slider = slider;
slider.Slider.OnColorChanged += _ =>
{
ValueChanged();
UpdateLabelColor();
};
}
private void UpdateLabelColor()
{
_slider.ExampleLabel.FontColorOverride = Color.FromHex(Value);
}
}
/// <summary>
/// Implementation of a CVar option that simply corresponds with an integer <see cref="OptionSlider"/>.
/// </summary>
@@ -12,6 +12,10 @@
<ui:OptionSlider Name="SpeechBubbleTextOpacitySlider" Title="{Loc 'ui-options-speech-bubble-text-opacity'}" />
<ui:OptionSlider Name="SpeechBubbleSpeakerOpacitySlider" Title="{Loc 'ui-options-speech-bubble-speaker-opacity'}" />
<ui:OptionSlider Name="SpeechBubbleBackgroundOpacitySlider" Title="{Loc 'ui-options-speech-bubble-background-opacity'}" />
<CheckBox Name="AutoFillHighlightsCheckBox" Text="{Loc 'ui-options-auto-fill-highlights'}" />
<ui:OptionColorSlider Name="HighlightsColorSlider"
Title="{Loc 'ui-options-highlights-color'}"
Example="{Loc 'ui-options-highlights-color-example'}"/>
</BoxContainer>
</ScrollContainer>
<ui:OptionsTabControlRow Name="Control" Access="Public" />
@@ -20,6 +20,8 @@ public sealed partial class AccessibilityTab : Control
Control.AddOptionPercentSlider(CCVars.SpeechBubbleTextOpacity, SpeechBubbleTextOpacitySlider);
Control.AddOptionPercentSlider(CCVars.SpeechBubbleSpeakerOpacity, SpeechBubbleSpeakerOpacitySlider);
Control.AddOptionPercentSlider(CCVars.SpeechBubbleBackgroundOpacity, SpeechBubbleBackgroundOpacitySlider);
Control.AddOptionCheckBox(CCVars.ChatAutoFillHighlights, AutoFillHighlightsCheckBox);
Control.AddOptionColorSlider(CCVars.ChatHighlightsColor, HighlightsColorSlider);
Control.Initialize();
}
@@ -33,9 +33,22 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
foreach (var borgType in _prototypeManager.EnumeratePrototypes<BorgTypePrototype>().OrderBy(PrototypeName))
// Goobstation: Customizable borgs sprites
ConfirmTypeButton.OnPressed += ConfirmButtonPressed;
HelpGuidebookIds = GuidebookEntries;
SubtypeSelection.SubtypeSelected += () =>
ConfirmTypeButton.Disabled = false;
}
// foreach (var borgType in _prototypeManager.EnumeratePrototypes<BorgTypePrototype>().OrderBy(PrototypeName))
// Mono: Selectable borg whitelist
public void Populate(IReadOnlyList<ProtoId<BorgTypePrototype>> whitelist)
{
IEnumerable<BorgTypePrototype> types = whitelist.Select(id => _prototypeManager.Index(id)).OrderBy(PrototypeName);
foreach (var borgType in types)
// Mono: Selectable borg whitelist end
{
// Goobstation-Start: Customizable borgs sprites
var chassisList = new EntityPrototypeView
{
Scale = new Vector2(2, 2),
@@ -49,13 +62,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
};
SelectionsContainer.AddChild(chassisList);
}
ConfirmTypeButton.OnPressed += ConfirmButtonPressed;
HelpGuidebookIds = GuidebookEntries;
SubtypeSelection.SubtypeSelected += () =>
ConfirmTypeButton.Disabled = false;
// Goobstation-End: Customizable borgs sprites
}
@@ -23,8 +23,12 @@ public sealed class BorgSelectTypeUserInterface : BoundUserInterface
protected override void Open()
{
base.Open();
//Mono: Selectable borg whitelist
EntMan.TryGetComponent<BorgSwitchableTypeComponent>(Owner, out var comp);
var whitelist = comp?.TypeWhitelist ?? [];
_menu = this.CreateWindow<BorgSelectTypeMenu>();
_menu.Populate(whitelist); //Mono
_menu.ConfirmedBorgType += (prototype, subtype) => SendPredictedMessage(new BorgSelectTypeMessage(prototype, subtype));
}
}
@@ -46,18 +46,15 @@ public sealed class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeSystem
{
if (TryComp(entity, out SpriteComponent? sprite))
{
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.Body, prototype.SpriteBodyState);
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.Light, prototype.SpriteBodyState);
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.LightStatus, prototype.SpriteBodyState);
var rsiPath = SpriteSpecifierSerializer.TextureRoot / subtypePrototype.SpritePath;
if (_resourceCache.TryGetResource<RSIResource>(rsiPath, out var resource))
{
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.Body, resource.RSI);
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.Light, resource.RSI);
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.LightStatus, resource.RSI);
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.Body, resource.RSI, prototype.SpriteBodyState);
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.Light, resource.RSI, prototype.SpriteBodyState);
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.LightStatus, resource.RSI, prototype.SpriteToggleLightState);
}
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.Body, prototype.SpriteBodyState);
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.LightStatus, prototype.SpriteBodyState);
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.LightStatus, prototype.SpriteToggleLightState);
}
@@ -0,0 +1,264 @@
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controllers;
using Content.Shared.CCVar;
using Content.Client.CharacterInfo;
using static Content.Client.CharacterInfo.CharacterInfoSystem;
namespace Content.Client.UserInterface.Systems.Chat;
public sealed partial class ChatUIController : IOnSystemChanged<CharacterInfoSystem>
{
[Dependency] private readonly ILocalizationManager _loc = default!;
[UISystemDependency] private readonly CharacterInfoSystem _characterInfo = default!;
private static readonly Regex StartDoubleQuote = new("\"$");
private static readonly Regex EndDoubleQuote = new("^\"|(?<=^@)\"");
private static readonly Regex StartAtSign = new("^@");
private readonly List<string> _highlights = new();
private readonly List<string> _autoFillRawKeywords = new();
private string? _highlightsColor;
private bool _autoFillHighlightsEnabled;
private bool _charInfoIsAttach = false;
private string? _currentCharacterName;
public event Action<string>? HighlightsUpdated;
public event Action<string>? AutoFillUpdated;
private void InitializeHighlights()
{
_config.OnValueChanged(CCVars.ChatAutoFillHighlights, (value) => { _autoFillHighlightsEnabled = value; }, true);
_config.OnValueChanged(CCVars.ChatHighlightsColor, (value) => { _highlightsColor = value; }, true);
var cvar = _config.GetCVar(CCVars.ChatHighlights);
}
public void OnSystemLoaded(CharacterInfoSystem system)
{
system.OnCharacterUpdate += OnCharacterUpdated;
}
public void OnSystemUnloaded(CharacterInfoSystem system)
{
system.OnCharacterUpdate -= OnCharacterUpdated;
}
private void UpdateAutoFillHighlights()
{
_currentCharacterName = null;
_autoFillRawKeywords.Clear();
_highlights.Clear();
AutoFillUpdated?.Invoke("");
HighlightsUpdated?.Invoke("");
_charInfoIsAttach = true;
_characterInfo.RequestCharacterInfo();
}
/// <summary>
/// Saves the user's custom keywords for the given character into the CVar,
/// then rebuilds the active highlight list.
/// Called when the user submits keywords from the popup.
/// </summary>
public void UpdateHighlights(string customKeywords)
{
if (_currentCharacterName == null)
{
return;
}
SaveCustomKeywords(_currentCharacterName, customKeywords);
RebuildHighlightsList(customKeywords);
HighlightsUpdated?.Invoke(customKeywords);
}
private void OnCharacterUpdated(CharacterData data)
{
if (!_charInfoIsAttach)
{
return;
}
var (_, job, _, _, entityName) = data;
_currentCharacterName = entityName;
_autoFillRawKeywords.Clear();
var autoFillDisplay = "";
if (_autoFillHighlightsEnabled)
{
// Special rules for names can be added here
var nameHighlights = "@" + entityName;
// Split on spaces first (handles any number of space-separated words).
if (nameHighlights.Contains(' '))
nameHighlights = nameHighlights.Replace(" ", "\n@");
// Handle hyphenated tokens: single hyphen splits normally (e.g. "First-Last"),
// multiple hyphens use the lizard rule — keep only first and last part (e.g. "Eats-The-Food" → @Eats @Food).
var dashParts = nameHighlights.Split('-');
if (dashParts.Length == 2)
nameHighlights = nameHighlights.Replace("-", "\n@");
else if (dashParts.Length > 2)
nameHighlights = dashParts[0] + "\n@" + dashParts[^1];
foreach (var token in nameHighlights.Split('\n', StringSplitOptions.RemoveEmptyEntries))
{
_autoFillRawKeywords.Add(token);
}
var jobKey = job.Replace(' ', '-').ToLower();
if (_loc.TryGetString($"highlights-{jobKey}", out var jobMatches))
{
foreach (var jobWord in jobMatches.Replace(", ", "\n").Split('\n', StringSplitOptions.RemoveEmptyEntries))
_autoFillRawKeywords.Add(jobWord);
}
autoFillDisplay = string.Join("\n", _autoFillRawKeywords);
}
var customKeywords = LoadCustomKeywords(entityName);
RebuildHighlightsList(customKeywords);
AutoFillUpdated?.Invoke(autoFillDisplay);
HighlightsUpdated?.Invoke(customKeywords);
_charInfoIsAttach = false;
}
private string LoadCustomKeywords(string characterName)
{
var cvar = _config.GetCVar(CCVars.ChatHighlights);
if (string.IsNullOrEmpty(cvar))
return "";
// Shouldn't be needed as no-one should have data by the time this rolls out but we never know
if (!cvar.Contains("||"))
{
return cvar;
}
foreach (var line in cvar.Split('\n', StringSplitOptions.RemoveEmptyEntries))
{
var sep = line.IndexOf("||", StringComparison.Ordinal);
if (sep < 0)
continue;
if (line[..sep] == characterName)
return DecodeKeywords(line[(sep + 2)..]);
}
return "";
}
private void SaveCustomKeywords(string characterName, string customKeywords)
{
var cvar = _config.GetCVar(CCVars.ChatHighlights);
var entries = new Dictionary<string, string>();
if (!string.IsNullOrEmpty(cvar) && cvar.Contains("||"))
{
foreach (var line in cvar.Split('\n', StringSplitOptions.RemoveEmptyEntries))
{
var sep = line.IndexOf("||", StringComparison.Ordinal);
if (sep < 0)
continue;
entries[line[..sep]] = line[(sep + 2)..];
}
}
entries[characterName] = EncodeKeywords(customKeywords);
var sb = new StringBuilder();
foreach (var (name, encoded) in entries)
sb.Append(name).Append("||").Append(encoded).Append('\n');
var newValue = sb.ToString().TrimEnd('\n');
_config.SetCVar(CCVars.ChatHighlights, newValue);
_config.SaveToFile();
}
private static string EncodeKeywords(string raw)
{
return raw
.Replace(@"\", @"\\")
.Replace("|", @"\|")
.Replace("\n", @"\n");
}
private static string DecodeKeywords(string encoded)
{
var sb = new StringBuilder(encoded.Length);
for (var i = 0; i < encoded.Length; i++)
{
if (encoded[i] == '\\' && i + 1 < encoded.Length)
{
switch (encoded[i + 1])
{
case 'n': sb.Append('\n'); i++; break;
case '|': sb.Append('|'); i++; break;
case '\\': sb.Append('\\'); i++; break;
default: sb.Append(encoded[i]); break;
}
}
else
{
sb.Append(encoded[i]);
}
}
return sb.ToString();
}
private void RebuildHighlightsList(string customRaw)
{
_highlights.Clear();
foreach (var raw in _autoFillRawKeywords)
_highlights.Add(ProcessKeyword(raw));
if (!string.IsNullOrWhiteSpace(customRaw))
{
foreach (var raw in customRaw.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries))
_highlights.Add(ProcessKeyword(raw));
}
_highlights.Sort((x, y) => y.Length.CompareTo(x.Length));
}
private string ProcessKeyword(string raw)
{
// Replace every "\" to prevent "\n", "\0", etc. in regex.
var keyword = raw.Replace(@"\", @"\\");
// Escape special regex characters.
keyword = Regex.Escape(keyword);
// Re-escape "[" for markup-adjacent positions.
keyword = keyword.Replace(@"\[", @"\\\[");
// words in double quotes will only be hightlighted as unique, not within another word
if (keyword.Any(c => c == '"'))
{
keyword = StartDoubleQuote.Replace(keyword, "(?!\\w)");
keyword = EndDoubleQuote.Replace(keyword, "(?<!\\w)");
}
// Make it so it doesn't hightlight your own name when you are talking
keyword = StartAtSign.Replace(keyword, @"(?<=\[BubbleContent\].*)");
return keyword;
}
}
@@ -44,7 +44,7 @@ using Robust.Shared.Utility;
namespace Content.Client.UserInterface.Systems.Chat;
public sealed class ChatUIController : UIController
public sealed partial class ChatUIController : UIController
{
[Dependency] private readonly IClientAdminManager _admin = default!;
[Dependency] private readonly IChatManager _manager = default!;
@@ -248,6 +248,8 @@ public sealed class ChatUIController : UIController
_config.OnValueChanged(CCVars.ChatWindowOpacity, OnChatWindowOpacityChanged);
InitializeHighlights();
}
public void OnScreenLoad()
@@ -434,6 +436,7 @@ public sealed class ChatUIController : UIController
private void OnAttachedChanged(EntityUid uid)
{
UpdateChannelPermissions();
UpdateAutoFillHighlights();
}
private void AddSpeechBubble(ChatMessage msg, SpeechBubble.SpeechType speechType)
@@ -877,6 +880,11 @@ public sealed class ChatUIController : UIController
}
}
foreach (var highlight in _highlights)
{
msg.WrappedMessage = SharedChatSystem.InjectTagAroundString(msg, highlight, "color", _highlightsColor);
}
// Log all incoming chat to repopulate when filter is un-toggled
if (!msg.HideChat)
{
@@ -912,7 +920,6 @@ public sealed class ChatUIController : UIController
case ChatChannel.Dead:
if (_ghost is not {IsGhost: true})
break;
AddSpeechBubble(msg, SpeechBubble.SpeechType.Say);
break;
@@ -1,10 +1,30 @@
<controls:ChannelFilterPopup
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Systems.Chat.Controls">
xmlns:controls="clr-namespace:Content.Client.UserInterface.Systems.Chat.Controls"
xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client">
<PanelContainer Name="FilterPopupPanel" StyleClasses="BorderedWindowPanel">
<BoxContainer Orientation="Horizontal">
<Control MinSize="4 0"/>
<BoxContainer Name="FilterVBox" MinWidth="110" Margin="0 10" Orientation="Vertical" SeparationOverride="4"/>
<BoxContainer Name="HighlightsVBox" MinWidth="120" Margin="0 10" Orientation="Vertical" SeparationOverride="4">
<BoxContainer Name="AutoFillVBox" Orientation="Vertical" SeparationOverride="2" Visible="False">
<Label Text="{Loc 'hud-chatbox-autofill-highlights'}"/>
<PanelContainer>
<PanelContainer.PanelOverride>
<graphics:StyleBoxFlat BackgroundColor="#262736"/>
</PanelContainer.PanelOverride>
<RichTextLabel Name="AutoFillLabel" Margin="5 5"/>
</PanelContainer>
</BoxContainer>
<Label Text="{Loc 'hud-chatbox-highlights'}"/>
<PanelContainer>
<PanelContainer.PanelOverride>
<graphics:StyleBoxFlat BackgroundColor="#323446"/>
</PanelContainer.PanelOverride>
<TextEdit Name="HighlightEdit" MinHeight="150" Margin="5 5"/>
</PanelContainer>
<Button Name="HighlightButton" Text="{Loc 'hud-chatbox-highlights-button'}" ToolTip="{Loc 'hud-chatbox-highlights-tooltip'}"/>
</BoxContainer>
</BoxContainer>
</PanelContainer>
</controls:ChannelFilterPopup>
@@ -2,6 +2,7 @@ using Content.Shared.Chat;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Utility;
using static Robust.Client.UserInterface.Controls.BaseButton;
namespace Content.Client.UserInterface.Systems.Chat.Controls;
@@ -30,10 +31,13 @@ public sealed partial class ChannelFilterPopup : Popup
private readonly Dictionary<ChatChannel, ChannelFilterCheckbox> _filterStates = new();
public event Action<ChatChannel, bool>? OnChannelFilter;
public event Action<string>? OnNewHighlights;
public ChannelFilterPopup()
{
RobustXamlLoader.Load(this);
HighlightButton.OnPressed += HighlightsEntered;
HighlightEdit.Placeholder = new Rope.Leaf(Loc.GetString("hud-chatbox-highlights-placeholder"));
}
public bool IsActive(ChatChannel channel)
@@ -95,4 +99,36 @@ public sealed partial class ChannelFilterPopup : Popup
if (_filterStates.TryGetValue(channel, out var checkbox))
checkbox.UpdateUnreadCount(unread);
}
// Highlight
/// <summary>
/// Updates the read-only auto-fill section with name/job tokens.
/// </summary>
public void UpdateAutoFill(string autoFillKeywords)
{
AutoFillVBox.Visible = !string.IsNullOrEmpty(autoFillKeywords);
if (string.IsNullOrEmpty(autoFillKeywords))
return;
var msg = new FormattedMessage();
var lines = autoFillKeywords.Split('\n', StringSplitOptions.RemoveEmptyEntries);
for (var i = 0; i < lines.Length; i++)
{
if (i > 0) msg.PushNewline();
msg.AddText(lines[i]);
}
AutoFillLabel.SetMessage(msg);
}
public void UpdateHighlights(string highlights)
{
HighlightEdit.TextRope = new Rope.Leaf(highlights);
}
private void HighlightsEntered(ButtonEventArgs _args)
{
OnNewHighlights?.Invoke(Rope.Collapse(HighlightEdit.TextRope));
}
}
@@ -47,9 +47,12 @@ public partial class ChatBox : UIWidget
ChatInput.Input.OnFocusExit += OnFocusExit;
ChatInput.ChannelSelector.OnChannelSelect += OnChannelSelect;
ChatInput.FilterButton.Popup.OnChannelFilter += OnChannelFilter;
ChatInput.FilterButton.Popup.OnNewHighlights += OnNewHighlights;
_controller = UserInterfaceManager.GetUIController<ChatUIController>();
_controller.MessageAdded += OnMessageAdded;
_controller.HighlightsUpdated += OnHighlightsUpdated;
_controller.AutoFillUpdated += OnAutoFillUpdated;
_controller.RegisterChat(this);
// WD EDIT START
@@ -133,6 +136,21 @@ public partial class ChatBox : UIWidget
}
}
private void OnNewHighlights(string highlighs)
{
_controller.UpdateHighlights(highlighs);
}
private void OnHighlightsUpdated(string highlights)
{
ChatInput.FilterButton.Popup.UpdateHighlights(highlights);
}
private void OnAutoFillUpdated(string autoFillKeywords)
{
ChatInput.FilterButton.Popup.UpdateAutoFill(autoFillKeywords);
}
public void AddLine(string message, Color color, int repeat = 0) // WD EDIT
{
var formatted = new FormattedMessage(4); // WD EDIT // specifying size beforehand smells like a useless microoptimisation, but i'll give them the benefit of doubt
+5 -1
View File
@@ -64,7 +64,11 @@ namespace Content.Client.Voting.UI
var entry = _vote.Entries[i];
if (_vote.DisplayVotes)
{
_voteButtons[i].Text = Loc.GetString("ui-vote-button", ("text", entry.Text), ("votes", entry.Votes));
// Mono
if (entry.RealVotes != entry.Votes)
_voteButtons[i].Text = Loc.GetString("ui-vote-button-weighted", ("text", entry.Text), ("votes", entry.Votes), ("realvotes", entry.RealVotes));
else
_voteButtons[i].Text = Loc.GetString("ui-vote-button", ("text", entry.Text), ("votes", entry.Votes));
}
else
{
+2
View File
@@ -192,6 +192,7 @@ namespace Content.Client.Voting
for (var i = 0; i < message.Options.Length; i++)
{
existingVote.Entries[i].Votes = message.Options[i].votes;
existingVote.Entries[i].RealVotes = message.Options[i].realVotes; // Mono
}
if (@new && _popupContainer != null)
@@ -259,6 +260,7 @@ namespace Content.Client.Voting
{
public string Text { get; }
public int Votes { get; set; }
public int RealVotes; // Mono
public VoteEntry(string text)
{
@@ -39,6 +39,8 @@ namespace Content.MapRenderer.Painters
// Seriously whoever made MapPainter use GameMapPrototype I wish you step on a lego one time.
Map = map,
});
pair.ServerLogHandler.FailureLevel = LogLevel.Fatal;
pair.ClientLogHandler.FailureLevel = LogLevel.Fatal;
await foreach (var image in RenderPair(stopwatch, pair))
yield return image;
@@ -56,6 +58,8 @@ namespace Content.MapRenderer.Painters
Connected = true,
Fresh = false,
});
pair.ServerLogHandler.FailureLevel = LogLevel.Fatal;
pair.ClientLogHandler.FailureLevel = LogLevel.Fatal;
var server = pair.Server;
var client = pair.Client;
@@ -69,6 +73,14 @@ namespace Content.MapRenderer.Painters
foreach (var grid in sMapManager.GetAllGrids(mapId))
sEntityManager.QueueDeleteEntity(grid);
});
await pair.RunTicksSync(10);
await Task.WhenAll(client.WaitIdleAsync(), server.WaitIdleAsync());
await server.WaitPost(() =>
{
var mapId = sEntityManager.System<GameTicker>().DefaultMap;
try
{
+1 -1
View File
@@ -178,7 +178,7 @@ public sealed class AmeNodeGroup : BaseNodeGroup
// return MathF.Max(200000f * MathF.Log10(2 * fuel * MathF.Pow(cores, (float)-0.5)), 0); // Frontier: preferring old calculation for now
// return 200000f * MathF.Log10(fuel * fuel) * MathF.Pow(0.75f, cores - 1); // Frontier: preferring old calculation for now
if (cores > 0 && fuel > 0) // Mono - default zero power unless conditions are met
return 200000f * MathF.Log10(fuel * fuel) * MathF.Pow( 1.11111f, cores - 1); // Mono - Added positive returns from extra cores. Running AME at 2 fuel per core yields roughly the same power per core at all sizes
return 200000f * MathF.Log10(fuel * fuel) * MathF.Pow( 1.11111f, fuel / 2f - 1); // Mono - Exponential scaling at high injection
return 0;
}
@@ -61,4 +61,16 @@ public sealed partial class ThermalRegulatorComponent : Component
/// </summary>
[DataField]
public float ThermalRegulationTemperatureThreshold;
/// <summary>
/// Process regulation while they're dead if there is a MobStateComponent? - Mono Hydrakin
/// </summary>
[DataField]
public bool ProcessWhileDead = false;
/// <summary>
/// Process regulation in critical condition if there is a MobStateComponent? - Mono Hydrakin
/// </summary>
[DataField]
public bool ProcessWhileCrit = true;
}
@@ -2,6 +2,8 @@ using Content.Server.Body.Components;
using Content.Server.Temperature.Components;
using Content.Server.Temperature.Systems;
using Content.Shared.ActionBlocker;
using Content.Shared.Mobs; // Mono
using Content.Shared.Mobs.Components; // Mono
using Robust.Shared.Timing;
namespace Content.Server.Body.Systems;
@@ -51,6 +53,14 @@ public sealed class ThermalRegulatorSystem : EntitySystem
if (!Resolve(ent, ref ent.Comp2, logMissing: false))
return;
// mono begin
if (ent.Comp1.ProcessWhileDead == false && TryComp<MobStateComponent>(ent, out var mobComp1) && mobComp1.CurrentState == MobState.Dead)
return;
if (ent.Comp1.ProcessWhileCrit == false && TryComp<MobStateComponent>(ent, out var mobComp2) && mobComp2.CurrentState == MobState.Critical)
return;
// mono end
var totalMetabolismTempChange = ent.Comp1.MetabolismHeat - ent.Comp1.RadiatedHeat;
// implicit heat regulation
@@ -28,8 +28,6 @@ public sealed partial class BotanySystem : EntitySystem
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!;
[Dependency] private readonly MetaDataSystem _metaData = default!;
[Dependency] private readonly RandomHelperSystem _randomHelper = default!;
[Dependency] private readonly ContrabandTurnInSystem _contraband = default!; // Frontier
public override void Initialize()
{
base.Initialize();
@@ -100,7 +98,6 @@ public sealed partial class BotanySystem : EntitySystem
public EntityUid SpawnSeedPacket(SeedData proto, EntityCoordinates coords, EntityUid user, float? healthOverride = null)
{
var seed = SpawnAtPosition(proto.PacketPrototype, coords); // Frontier: Spawn<SpawnAtPosition
_contraband.ClearContrabandValue(seed); // Frontier
var seedComp = EnsureComp<SeedComponent>(seed);
seedComp.Seed = proto;
seedComp.HealthOverride = healthOverride;
@@ -160,7 +157,6 @@ public sealed partial class BotanySystem : EntitySystem
var product = _robustRandom.Pick(proto.ProductPrototypes);
var entity = SpawnAtPosition(product, position); // Frontier: Spawn<SpawnAtPosition
_contraband.ClearContrabandValue(entity); // Frontier
_randomHelper.RandomOffset(entity, 0.25f);
products.Add(entity);
@@ -171,7 +171,7 @@ namespace Content.Server.EntityEffects.Effects
interruptsDoAfters: false,
// Shitmed Change Start
targetPart: TargetBodyPart.All,
partMultiplier: 0.5f,
partMultiplier: 1.00f, // Mono, 0.5f->1.00f
canSever: false);
// Shitmed Change End
}
@@ -1,3 +1,4 @@
using Content.Server._Mono.Planets;
using Content.Server.Administration.Logs;
using Content.Server.Body.Systems;
using Content.Server.Explosion.Components;
@@ -39,6 +40,7 @@ using Content.Shared.Projectiles; // Frontier: embed triggers
using Content.Shared.Mind;
using Content.Shared.Mind.Components;
using Content.Shared.Roles;
using Robust.Shared.Map.Components;
namespace Content.Server.Explosion.EntitySystems
{
@@ -83,6 +85,7 @@ namespace Content.Server.Explosion.EntitySystems
[Dependency] private readonly InventorySystem _inventory = default!;
[Dependency] private readonly ElectrocutionSystem _electrocution = default!;
[Dependency] private readonly StationSystem _station = default!; // Frontier: medical insurance
[Dependency] private readonly SharedMapSystem _map = default!; // Frontier: medical insurance
public override void Initialize()
{
@@ -252,19 +255,19 @@ namespace Content.Server.Explosion.EntitySystems
var posText = $"({x}, {y})";
// Frontier: Gets station location of the implant
var station = _station.GetOwningStation(uid);
var stationText = station is null ? null : $"{Name(station.Value)} ";
var grid = ownerXform.GridUid;
var gridText = grid is null ? "" : MetaData(grid.Value).EntityName;
if (stationText == null)
stationText = "";
if (HasComp<MapComponent>(grid) && !HasComp<PlanetMapComponent>(grid))
gridText = "";
// Frontier: Gets species of the implant user
var speciesText = $"";
if (TryComp<HumanoidAppearanceComponent>(implanted.ImplantedEntity, out var species))
speciesText = $" ({species!.Species})";
speciesText = $" ({species.Species})";
var critMessage = Loc.GetString(component.CritMessage, ("user", implanted.ImplantedEntity.Value), ("specie", speciesText), ("grid", stationText!), ("position", posText));
var deathMessage = Loc.GetString(component.DeathMessage, ("user", implanted.ImplantedEntity.Value), ("specie", speciesText), ("grid", stationText!), ("position", posText));
var critMessage = Loc.GetString(component.CritMessage, ("user", implanted.ImplantedEntity.Value), ("specie", speciesText), ("grid", gridText), ("position", posText));
var deathMessage = Loc.GetString(component.DeathMessage, ("user", implanted.ImplantedEntity.Value), ("specie", speciesText), ("grid", gridText), ("position", posText));
if (!TryComp<MobStateComponent>(implanted.ImplantedEntity, out var mobstate))
return;
@@ -130,6 +130,10 @@ public sealed partial class GameTicker
if (MetaData(ruleEntity).EntityPrototype?.ID is not { } id) // you really fucked up
return false;
// Mono - ensure delayed start rules don't trigger ahead of time.
if (TryComp<DelayedStartRuleComponent>(ruleEntity, out var delayComp) && delayComp.RuleStartTime > _gameTiming.CurTime)
return false;
// If we already have it, then we just skip the delay as it has already happened.
if (!RemComp<DelayedStartRuleComponent>(ruleEntity) && ruleData.Delay != null)
{
@@ -42,5 +42,11 @@ namespace Content.Server.GameTicking.Presets
/// </summary>
[DataField("supportedMaps", customTypeSerializer: typeof(PrototypeIdSerializer<GameMapPoolPrototype>))]
public string? MapPool;
/// <summary>
/// Mono - as how much votes should each player click count.
/// </summary>
[DataField]
public float Weight = 1f;
}
}
-5
View File
@@ -59,7 +59,6 @@ namespace Content.Server.Lathe
[Dependency] private readonly SharedSolutionContainerSystem _solution = default!;
[Dependency] private readonly StackSystem _stack = default!;
[Dependency] private readonly TransformSystem _transform = default!;
[Dependency] private readonly ContrabandTurnInSystem _contraband = default!; // Frontier
[Dependency] private readonly DeviceLinkSystem _deviceLink = default!; // Mono
/// <summary>
@@ -326,11 +325,7 @@ namespace Content.Server.Lathe
// Frontier: adjust price before merge (stack prices changed once)
if (result.Valid)
{
ModifyPrintedEntityPrice(uid, comp, result);
_contraband.ClearContrabandValue(result);
}
// End Frontier
_stack.TryMergeToContacts(result);
@@ -21,6 +21,7 @@ namespace Content.Server.Preferences.Managers
IEnumerable<KeyValuePair<NetUserId, ICharacterProfile>> GetSelectedProfilesForPlayers(List<NetUserId> userIds);
bool HavePreferencesLoaded(ICommonSession session);
Task RefreshPreferencesAsync(ICommonSession session, CancellationToken cancel);
Task SetProfile(NetUserId userId, int slot, ICharacterProfile profile);
Task SetProfile(NetUserId userId, int slot, ICharacterProfile profile,
bool authoritative = true); // Mono
}
}
@@ -87,10 +87,11 @@ namespace Content.Server.Preferences.Managers
if (message.Profile == null)
_sawmill.Error($"User {userId} sent a {nameof(MsgUpdateCharacter)} with a null profile in slot {message.Slot}.");
else
await SetProfile(userId, message.Slot, message.Profile);
await SetProfile(userId, message.Slot, message.Profile, false);
}
public async Task SetProfile(NetUserId userId, int slot, ICharacterProfile profile)
public async Task SetProfile(NetUserId userId, int slot, ICharacterProfile profile,
bool authoritative = true) // Mono
{
if (!_cachedPlayerPrefs.TryGetValue(userId, out var prefsData) || !prefsData.PrefsLoaded)
{
@@ -105,6 +106,14 @@ namespace Content.Server.Preferences.Managers
var session = _playerManager.GetSessionById(userId);
profile.EnsureValid(session, _dependencies);
// Mono
if (!authoritative && profile is HumanoidCharacterProfile humanoid)
{
if (curPrefs.Characters.TryGetValue(slot, out var oldProfile) && oldProfile is HumanoidCharacterProfile oldHumanoid)
profile = humanoid.WithBankBalance(oldHumanoid.BankBalance);
else
profile = humanoid.WithBankBalance(HumanoidCharacterProfile.DefaultBalance);
}
var profiles = new Dictionary<int, ICharacterProfile>(curPrefs.Characters)
@@ -69,6 +69,8 @@ public sealed partial class ResearchSystem
if (serverComponent.Clients.Contains(client))
return;
UnregisterClient(client, clientComponent); // Mono Research Fix, unregister a client if applicable before registering to a new server
serverComponent.Clients.Add(client);
clientComponent.Server = server;
SyncClientWithServer(client, clientComponent: clientComponent);
+12 -3
View File
@@ -22,6 +22,7 @@ using Robust.Shared.Timing;
using Content.Shared.DeviceNetwork.Components;
using Timer = Robust.Shared.Timing.Timer;
using Content.Server._NF.SectorServices; // Frontier
using Content.Shared.GameTicking.Components; // Mono
namespace Content.Server.RoundEnd
{
@@ -354,9 +355,17 @@ namespace Content.Server.RoundEnd
public override void Update(float frameTime)
{
// Check if we should auto-call.
int mins = _autoCalledBefore ? _cfg.GetCVar(CCVars.EmergencyShuttleAutoCallExtensionTime)
: _cfg.GetCVar(CCVars.EmergencyShuttleAutoCallTime);
if (mins != 0 && _gameTiming.CurTime - AutoCallStartTime > TimeSpan.FromMinutes(mins))
var mins = TimeSpan.FromMinutes(_autoCalledBefore ? _cfg.GetCVar(CCVars.EmergencyShuttleAutoCallExtensionTime)
: _cfg.GetCVar(CCVars.EmergencyShuttleAutoCallTime));
// Mono
var query = EntityQueryEnumerator<RoundEndTimeRuleComponent, ActiveGameRuleComponent>();
while (query.MoveNext(out _, out var endTimeComp, out _))
{
mins = endTimeComp.EndAt;
}
if (mins.TotalSeconds != 0 && _gameTiming.CurTime - AutoCallStartTime > mins)
{
if (!_shuttle.EmergencyShuttleArrived && ExpectedCountdownEnd is null)
{
@@ -0,0 +1,13 @@
using System;
namespace Content.Server.RoundEnd;
/// <summary>
/// If a gamerule with this component is present, override the roundend time to the time set in it.
/// </summary>
[RegisterComponent]
public sealed partial class RoundEndTimeRuleComponent : Component
{
[DataField]
public TimeSpan EndAt;
}
@@ -71,7 +71,7 @@ namespace Content.Server.Shuttles.Components
public string MachinePartThrust = "Capacitor";
[DataField("partRatingThrustMultiplier")]
public float PartRatingThrustMultiplier = 1.15f; // Frontier - PR #1292 1.5f<1.15f
public float PartRatingThrustMultiplier = 1.25f; // Mono: 1.15->1.25 (frontier: 1.5->1.15)
/// <summary>
/// Frontier - Amount of charge this needs from an APC per second to function.
@@ -69,6 +69,12 @@ public sealed partial class StationEventComponent : Component
[DataField]
public ProtoId<RadioChannelPrototype> EndRadioAnnouncementChannel = "Supply"; // Frontier
/// <summary>
/// Mono - sender of start/warn/end announcements.
/// </summary>
[DataField]
public LocId? AnnounceSender = null;
/// <summary>
/// In minutes, when is the first round time this event can start
/// </summary>
@@ -50,7 +50,7 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : ICompo
Filter allPlayersInGame = Filter.Empty().AddWhere(GameTicker.UserHasJoinedGame);
if (stationEvent.StartAnnouncement != null)
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.StartAnnouncement), playSound: false, colorOverride: stationEvent.StartAnnouncementColor);
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.StartAnnouncement), sender: stationEvent.AnnounceSender is { } send ? Loc.GetString(send) : null, playSound: false, colorOverride: stationEvent.StartAnnouncementColor);
// Frontier
if (stationEvent.StartRadioAnnouncement != null)
@@ -97,7 +97,7 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : ICompo
Filter allPlayersInGame = Filter.Empty().AddWhere(GameTicker.UserHasJoinedGame);
if (stationEvent.EndAnnouncement != null)
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.EndAnnouncement), playSound: false, colorOverride: stationEvent.EndAnnouncementColor);
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.EndAnnouncement), sender: stationEvent.AnnounceSender is { } send ? Loc.GetString(send) : null, playSound: false, colorOverride: stationEvent.EndAnnouncementColor);
// Frontier: radio announcements
if (stationEvent.EndRadioAnnouncement != null)
@@ -139,7 +139,7 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : ICompo
{
Filter allPlayersInGame = Filter.Empty().AddWhere(GameTicker.UserHasJoinedGame); // we don't want to send to players who aren't in game (i.e. in the lobby)
if (stationEvent.WarningAnnouncement != null)
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.WarningAnnouncement), playSound: false, colorOverride: stationEvent.WarningAnnouncementColor);
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.WarningAnnouncement), sender: stationEvent.AnnounceSender is { } send ? Loc.GetString(send) : null, playSound: false, colorOverride: stationEvent.WarningAnnouncementColor);
if (stationEvent.WarningRadioAnnouncement != null)
{
var message = Loc.GetString(stationEvent.WarningRadioAnnouncement);
@@ -45,7 +45,7 @@ public sealed class StationRecordsSystem : SharedStationRecordsSystem
[Dependency] private readonly SectorServiceSystem _sectorService = default!; // Frontier
[Dependency] private readonly ForensicsSystem _forensics = default!; // Frontier
static readonly ProtoId<JobPrototype>[] FakeJobIds = ["Contractor", "Pilot", "Mercenary"]; // Frontier
static readonly ProtoId<JobPrototype>[] FakeJobIds = ["Contractor", "Mercenary"]; // Frontier, Mono, nuked Pilot fake id
public override void Initialize()
{
@@ -58,7 +58,6 @@ namespace Content.Server.VendingMachines
[Dependency] private readonly BankSystem _bankSystem = default!; // Frontier
[Dependency] private readonly PopupSystem _popupSystem = default!; // Frontier
[Dependency] private readonly IAdminLogManager _adminLogger = default!; // Frontier
[Dependency] private readonly ContrabandTurnInSystem _contraband = default!; // Frontier
[Dependency] private readonly StackSystem _stack = default!; // Frontier
[Dependency] private readonly VendingMachinePurchaseSystem _vendingPurchase = default!; // Mono
@@ -545,8 +544,6 @@ namespace Content.Server.VendingMachines
var ent = Spawn(vendComponent.NextItemToEject, spawnCoordinates);
_contraband.ClearContrabandValue(ent); // Frontier
// Mono: Track vending machine purchases for pricing modifications
// Only track if this was a paid purchase (not a random eject or force eject)
if (!forceEject && vendComponent.LastPurchasePrice.HasValue)
@@ -233,7 +233,9 @@ namespace Content.Server.Voting.Managers
foreach (var (k, v) in presets)
{
options.Options.Add((Loc.GetString(v), k));
options.Options.Add((Loc.GetString(v.Name), k));
if (v.Weight != 1f)
options.Weights.Add(k, v.Weight);
}
WirePresetVoteInitiator(options, initiator);
@@ -247,13 +249,13 @@ namespace Content.Server.Voting.Managers
{
picked = (string) _random.Pick(args.Winners);
_chatManager.DispatchServerAnnouncement(
Loc.GetString("ui-vote-gamemode-tie", ("picked", Loc.GetString(presets[picked]))));
Loc.GetString("ui-vote-gamemode-tie", ("picked", Loc.GetString(presets[picked].Name))));
}
else
{
picked = (string) args.Winner;
_chatManager.DispatchServerAnnouncement(
Loc.GetString("ui-vote-gamemode-win", ("winner", Loc.GetString(presets[picked]))));
Loc.GetString("ui-vote-gamemode-win", ("winner", Loc.GetString(presets[picked].Name))));
}
_adminLogger.Add(LogType.Vote, LogImpact.Medium, $"Preset vote finished: {picked}");
var ticker = _entityManager.EntitySysManager.GetEntitySystem<GameTicker>();
@@ -585,9 +587,9 @@ namespace Content.Server.Voting.Managers
DirtyCanCallVoteAll();
}
private Dictionary<string, string> GetGamePresets()
private Dictionary<string, (string Name, float Weight)> GetGamePresets() // Mono - add weight
{
var presets = new Dictionary<string, string>();
var presets = new Dictionary<string, (string, float)>();
foreach (var preset in _prototypeManager.EnumeratePrototypes<GamePresetPrototype>())
{
@@ -600,7 +602,7 @@ namespace Content.Server.Voting.Managers
if(_playerManager.PlayerCount > (preset.MaxPlayers ?? int.MaxValue))
continue;
presets[preset.ID] = preset.ModeTitle;
presets[preset.ID] = (preset.ModeTitle, preset.Weight);
}
return presets;
}
+10 -5
View File
@@ -206,7 +206,8 @@ namespace Content.Server.Voting.Managers
{
var id = _nextVoteId++;
var entries = options.Options.Select(o => new VoteEntry(o.data, o.text)).ToArray();
// Mono - added weight
var entries = options.Options.Select(o => new VoteEntry(o.data, o.text, options.Weights.TryGetValue(o.data, out var weight) ? weight : 1f)).ToArray();
var start = _timing.RealTime;
var end = start + options.Duration;
@@ -286,11 +287,12 @@ namespace Content.Server.Voting.Managers
msg.DisplayVotes = true;
}
msg.Options = new (ushort votes, string name)[v.Entries.Length];
msg.Options = new (ushort votes, string name, ushort realVotes)[v.Entries.Length];
for (var i = 0; i < msg.Options.Length; i++)
{
ref var entry = ref v.Entries[i];
msg.Options[i] = (msg.DisplayVotes ? (ushort) entry.Votes : (ushort) 0, entry.Text);
var votes = msg.DisplayVotes ? (ushort) entry.Votes : (ushort) 0; // Mono
msg.Options[i] = (votes, entry.Text, (ushort) (votes * entry.Weight)); // Mono - account for weight
}
player.Channel.SendMessage(msg);
@@ -394,7 +396,7 @@ namespace Content.Server.Voting.Managers
// Find winner or stalemate.
var winners = v.Entries
.GroupBy(e => e.Votes)
.GroupBy(e => e.Votes * e.Weight) // Mono - add weight
.OrderByDescending(g => g.Key)
.First()
.Select(e => e.Data)
@@ -536,12 +538,15 @@ namespace Content.Server.Voting.Managers
public object Data;
public string Text;
public int Votes;
public float Weight; // Mono
public VoteEntry(object data, string text)
public VoteEntry(object data, string text,
float weight = 1f) // Mono
{
Data = data;
Text = text;
Votes = 0;
Weight = weight; // Mono
}
}
+4 -1
View File
@@ -39,6 +39,9 @@ namespace Content.Server.Voting
/// </summary>
public List<(string text, object data)> Options { get; set; } = new();
// Mono - this is evil but allows seamless integration with the code
public Dictionary<object, float> Weights = new();
/// <summary>
/// Which sessions may send a vote. Used when only a subset of players should be able to vote. Defaults to all.
/// </summary>
@@ -50,7 +53,7 @@ namespace Content.Server.Voting
public bool DisplayVotes = true;
/// <summary>
/// Whether the vote should have an entity attached to it, to be used for things like letting ghosts follow it.
/// Whether the vote should have an entity attached to it, to be used for things like letting ghosts follow it.
/// </summary>
public NetEntity? TargetEntity = null;
@@ -1,3 +1,7 @@
using Content.Shared.Damage;
using Content.Shared.Damage.Prototypes;
using Robust.Shared.Prototypes;
namespace Content.Server._EinsteinEngines.Silicon.Death;
/// <summary>
@@ -14,4 +18,12 @@ public sealed partial class SiliconDownOnDeadComponent : Component
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
public bool Dead;
/// <summary>
/// Mono - applies modifier when silicon is out of charge.
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
public ProtoId<DamageModifierSetPrototype>? ModifierOnDead = "IPCWeakened";
public ProtoId<DamageModifierSetPrototype>? OriginalModifier;
}
@@ -4,6 +4,7 @@ using Content.Shared.Bed.Sleep;
using Content.Server._EinsteinEngines.Silicon.Charge;
using Content.Server._EinsteinEngines.Power.Components;
using Content.Server.Humanoid;
using Content.Shared.Damage;
using Content.Shared.Humanoid;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems; //Monolith IPC rework
@@ -15,7 +16,7 @@ public sealed class SiliconDeathSystem : EntitySystem
[Dependency] private readonly SleepingSystem _sleep = default!;
[Dependency] private readonly SiliconChargeSystem _silicon = default!;
[Dependency] private readonly HumanoidAppearanceSystem _humanoidAppearanceSystem = default!;
[Dependency] private readonly SharedHandsSystem _hands = default!; //Monolith IPC rework
[Dependency] private readonly DamageableSystem _damage = default!; // mono
public override void Initialize()
{
@@ -46,16 +47,15 @@ public sealed class SiliconDeathSystem : EntitySystem
var deadEvent = new SiliconChargeDyingEvent(uid, batteryComp, batteryUid);
RaiseLocalEvent(uid, deadEvent);
if (deadEvent.Cancelled)
if (deadEvent.Cancelled
|| siliconDeadComp.ModifierOnDead == null
|| !TryComp<DamageableComponent>(uid, out var damageComp))
return;
/*EntityManager.EnsureComponent<SleepingComponent>(uid); Monolith IPC rework edit start
EntityManager.EnsureComponent<ForcedSleepingComponent>(uid);*/
if(!TryComp<HandsComponent>(uid, out var handsComp))
return;
_hands.RemoveHands(uid, handsComp); // edit end
siliconDeadComp.OriginalModifier = damageComp.DamageModifierSetId;
_damage.SetDamageModifierSetId(uid, siliconDeadComp.ModifierOnDead.Value);
if (TryComp(uid, out HumanoidAppearanceComponent? humanoidAppearanceComponent))
{
@@ -73,8 +73,8 @@ public sealed class SiliconDeathSystem : EntitySystem
/*RemComp<ForcedSleepingComponent>(uid); Monolith IPC rework edit start
_sleep.TryWaking(uid, true, null);*/
_hands.AddHand(uid, "right hand", HandLocation.Right);
_hands.AddHand(uid, "left hand", HandLocation.Left); // edit end
if (siliconDeadComp.OriginalModifier != null)
_damage.SetDamageModifierSetId(uid, siliconDeadComp.OriginalModifier.Value);
siliconDeadComp.Dead = false;
+9 -1
View File
@@ -37,10 +37,18 @@ public sealed class ClawsSystem : SharedClawsSystem
if (TryGetStage<Declawed>(comp, out var declawed))
UpdateDeclaw(uid, declawed, comp, _updateCooldown);
if (HasComp<ClawsGrowthSuppressionComponent>(uid))
{
comp.AccumulatedBonusGrowth = TimeSpan.Zero;
continue;
}
if (!_protoMan.TryIndex(comp.ClawStage, out var claw) || !claw.CanGrow)
continue;
comp.GrowTimer += TimeSpan.FromSeconds(_updateCooldown);
comp.GrowTimer += TimeSpan.FromSeconds(_updateCooldown) + comp.AccumulatedBonusGrowth;
comp.AccumulatedBonusGrowth = TimeSpan.Zero;
if (comp.GrowTimer < claw.GrowCooldown)
{
@@ -9,7 +9,6 @@ using Content.Shared.Weapons.Ranged.Components;
using Content.Shared.Weapons.Ranged.Systems;
using Robust.Shared.Map.Components;
using Robust.Shared.Timing;
using System;
namespace Content.Server._Mono.Detection;
@@ -21,18 +20,22 @@ public sealed class ThermalSignatureSystem : EntitySystem
[Dependency] private readonly SharedPowerReceiverSystem _power = default!;
[Dependency] private readonly IGameTiming _timing = default!;
private float _updateInterval = 0.5f;
private float _updateAccumulator = 0f;
private EntityQuery<MapGridComponent> _gridQuery;
private const float UpdateIntervalSeconds = 1f;
private static readonly TimeSpan UpdateInterval = TimeSpan.FromSeconds(UpdateIntervalSeconds);
private TimeSpan _nextUpdateTime;
private const float HeatChangeThreshold = 1.02f;
private EntityQuery<ThermalSignatureComponent> _sigQuery;
private EntityQuery<GunComponent> _gunQuery;
private Dictionary<EntityUid, ThermalSignatureComponent> _gridCompMap = new();
private EntityQuery<MapGridComponent> _mapGridQuery;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<GridInitializeEvent>(OnGridInitialized);
// some of this could also be handled in shared but there's no point since PVS is a thing
SubscribeLocalEvent<MachineThermalSignatureComponent, GetThermalSignatureEvent>(OnMachineGetSignature);
SubscribeLocalEvent<PassiveThermalSignatureComponent, GetThermalSignatureEvent>(OnPassiveGetSignature);
@@ -42,9 +45,14 @@ public sealed class ThermalSignatureSystem : EntitySystem
SubscribeLocalEvent<ThrusterComponent, GetThermalSignatureEvent>(OnThrusterGetSignature);
SubscribeLocalEvent<FTLDriveComponent, GetThermalSignatureEvent>(OnFTLGetSignature);
_gridQuery = GetEntityQuery<MapGridComponent>();
_sigQuery = GetEntityQuery<ThermalSignatureComponent>();
_gunQuery = GetEntityQuery<GunComponent>();
_mapGridQuery = GetEntityQuery<MapGridComponent>();
}
private void OnGridInitialized(GridInitializeEvent args)
{
EnsureComp<ThermalSignatureComponent>(args.EntityUid);
}
private void OnGunShot(Entity<ThermalSignatureComponent> ent, ref GunShotEvent args)
@@ -87,48 +95,45 @@ public sealed class ThermalSignatureSystem : EntitySystem
public override void Update(float frameTime)
{
_updateAccumulator += frameTime;
if (_updateAccumulator < _updateInterval)
if (_timing.CurTime < _nextUpdateTime)
return;
_updateAccumulator -= _updateInterval;
var interval = _updateInterval;
_nextUpdateTime = _timing.CurTime + UpdateInterval;
_gridCompMap.Clear();
var gridQuery = EntityQueryEnumerator<MapGridComponent>();
while (gridQuery.MoveNext(out var uid, out _))
var gridQuery = EntityQueryEnumerator<MapGridComponent, ThermalSignatureComponent>();
while (gridQuery.MoveNext(out _, out _, out var gridSigComp))
{
if (!_sigQuery.TryComp(uid, out var sigComp))
sigComp = EnsureComp<ThermalSignatureComponent>(uid);
sigComp.TotalHeat = 0f;
_gridCompMap.Add(uid, sigComp);
gridSigComp.TotalHeat = 0f;
}
var query = EntityQueryEnumerator<ThermalSignatureComponent>();
while (query.MoveNext(out var uid, out var sigComp))
{
var ev = new GetThermalSignatureEvent(interval);
var ev = new GetThermalSignatureEvent();
RaiseLocalEvent(uid, ref ev);
sigComp.StoredHeat += ev.Signature * interval;
sigComp.StoredHeat *= MathF.Pow(sigComp.HeatDissipation, interval);
if (_gridCompMap.ContainsKey(uid))
sigComp.StoredHeat += ev.Signature * UpdateIntervalSeconds;
sigComp.StoredHeat *= MathF.Pow(sigComp.HeatDissipation, UpdateIntervalSeconds);
if (_mapGridQuery.HasComp(uid))
{
sigComp.TotalHeat += sigComp.StoredHeat;
// don't sync it if it didn't change heat much since last time, we don't need to sync 500 cold asteroids every system update
if (sigComp.TotalHeat <= sigComp.LastUpdateHeat * HeatChangeThreshold
&& sigComp.TotalHeat >= sigComp.LastUpdateHeat / HeatChangeThreshold)
continue;
sigComp.LastUpdateHeat = sigComp.TotalHeat;
Dirty(uid, sigComp);
}
else
{
var xform = Transform(uid);
sigComp.TotalHeat = sigComp.StoredHeat;
if (xform.GridUid != null && _gridCompMap.TryGetValue(xform.GridUid.Value, out var gridSig))
if (xform.GridUid != null && _sigQuery.TryGetComponent(xform.GridUid.Value, out var gridSig))
gridSig.TotalHeat += sigComp.StoredHeat;
}
}
foreach (var (uid, sigComp) in _gridCompMap)
{
Dirty(uid, sigComp); // sync to client
}
}
}
@@ -115,7 +115,7 @@ namespace Content.Server._Mono.EntityEffects.Effects
IgnoreResistances,
interruptsDoAfters: false,
targetPart: TargetBodyPart.All,
partMultiplier: 0.5f,
partMultiplier: 1.00f, // Mono, 0.5f->1.00f
canSever: false);
}
}
+8 -1
View File
@@ -1,5 +1,6 @@
using System.Linq;
using Content.Server.Damage.Systems;
using Content.Server.NPC.HTN;
using Content.Server.Spreader;
using Content.Shared._Mono;
using Content.Shared.Damage.Components;
@@ -68,7 +69,7 @@ public sealed class GridGodModeSystem : EntitySystem
/// </summary>
private void ProcessEntityOnGrid(EntityUid gridUid, EntityUid entityUid, GridGodModeComponent component)
{
// Don't apply GodMode to organic entities, ghosts, or kudzu
// Don't apply GodMode to organic entities, ghosts, npcs, or kudzu
if (IsOrganic(entityUid) || HasComp<GhostComponent>(entityUid) || HasComp<KudzuComponent>(entityUid))
return;
@@ -122,6 +123,12 @@ public sealed class GridGodModeSystem : EntitySystem
return true;
}
// Also check for anything with HTN such as NPCs, such as turrets.
if (HasComp<HTNComponent>(entityUid))
{
return true;
}
return false;
}
}
@@ -107,7 +107,8 @@ public sealed partial class RadarBlipSystem : EntitySystem
if (blipGrid != null)
{
var gridXform = Transform(blipGrid.Value);
blipVelocity -= _physics.GetLinearVelocity(blipGrid.Value, coord.Position);
if (TryComp<PhysicsComponent>(blipGrid.Value, out var gridBody)) // prevent log spam
blipVelocity -= _physics.GetLinearVelocity(blipGrid.Value, coord.Position, gridBody);
// it's local-frame velocity so rotate it too
blipVelocity = (-gridXform.LocalRotation).RotateVec(blipVelocity);
// and also offset the rotation
@@ -0,0 +1,4 @@
namespace Content.Server._Mono.StationEvents;
[RegisterComponent]
public sealed partial class BlankRuleComponent : Component;
@@ -0,0 +1,9 @@
using Content.Server.StationEvents.Events;
using JetBrains.Annotations;
namespace Content.Server._Mono.StationEvents;
[UsedImplicitly]
public sealed class FalseAlarmRule : StationEventSystem<BlankRuleComponent>
{
}
@@ -38,7 +38,6 @@ public sealed class VendingMachinePurchaseSystem : EntitySystem
var purchaseComponent = AddComp<VendingMachinePurchaseComponent>(purchasedEntity);
purchaseComponent.PurchaseGrid = vendingTransform.GridUid.Value;
purchaseComponent.OriginalPurchasePrice = purchasePrice;
purchaseComponent.VendingMachine = vendingMachine;
Dirty(purchasedEntity, purchaseComponent);
}
@@ -422,6 +422,8 @@ public sealed partial class CryoSleepSystem : SharedCryoSleepSystem
// Check if job is one of the pirate jobs
isPirate = jobTitle.Equals(Loc.GetString("job-name-pirate"), StringComparison.OrdinalIgnoreCase) ||
jobTitle.Equals(Loc.GetString("job-name-pirate-captain"), StringComparison.OrdinalIgnoreCase) ||
jobTitle.Equals(Loc.GetString("job-name-pdv-denasvar"), StringComparison.OrdinalIgnoreCase) ||
jobTitle.Equals(Loc.GetString("job-name-pdv-infiltrator"), StringComparison.OrdinalIgnoreCase) ||
jobTitle.Equals(Loc.GetString("job-name-pirate-first-mate"), StringComparison.OrdinalIgnoreCase);
}
@@ -432,12 +434,9 @@ public sealed partial class CryoSleepSystem : SharedCryoSleepSystem
isTSF = jobTitle.Equals(Loc.GetString("job-name-bailiff"), StringComparison.OrdinalIgnoreCase) ||
jobTitle.Equals(Loc.GetString("job-name-brigmedic"), StringComparison.OrdinalIgnoreCase) ||
jobTitle.Equals(Loc.GetString("job-name-cadet-nf"), StringComparison.OrdinalIgnoreCase) ||
jobTitle.Equals(Loc.GetString("job-name-senior-officer"), StringComparison.OrdinalIgnoreCase) ||
jobTitle.Equals(Loc.GetString("job-name-deputy"), StringComparison.OrdinalIgnoreCase) ||
jobTitle.Equals(Loc.GetString("job-name-nf-detective"), StringComparison.OrdinalIgnoreCase) ||
jobTitle.Equals(Loc.GetString("job-name-sheriff"), StringComparison.OrdinalIgnoreCase) ||
jobTitle.Equals(Loc.GetString("job-name-stc"), StringComparison.OrdinalIgnoreCase) ||
jobTitle.Equals(Loc.GetString("job-name-sr"), StringComparison.OrdinalIgnoreCase) ||
jobTitle.Equals(Loc.GetString("job-name-pal"), StringComparison.OrdinalIgnoreCase);
jobTitle.Equals(Loc.GetString("job-name-sheriff"), StringComparison.OrdinalIgnoreCase);
}
// Send radio message on appropriate channel
@@ -296,9 +296,7 @@ public sealed partial class MarketSystem
else
{
var maxQuantityToWithdraw = marketData.GetMaxQuantityToWithdraw(prototype);
var toWithdraw = args.Amount;
if (args.Amount > maxQuantityToWithdraw)
toWithdraw = maxQuantityToWithdraw;
var toWithdraw = MathHelper.Clamp(args.Amount, 1, maxQuantityToWithdraw);
var existing = FindMarketDataByPrototype(marketData, args.ItemPrototype!);
if (existing == null)
@@ -150,7 +150,7 @@ public sealed class SurgerySystem : SharedSurgerySystem
if (HasComp<ForcedSleepingComponent>(args.Body))
damageChange = damageChange * ent.Comp.SleepModifier;
SetDamage(args.Body, damageChange, 0.5f, args.User, args.Part);
SetDamage(args.Body, damageChange, 1f, args.User, args.Part); // 0.5-> 1.0f part damage - Mono
}
private void OnSurgerySpecialDamageChange(Entity<SurgerySpecialDamageChangeEffectComponent> ent, ref SurgeryStepDamageChangeEvent args)
@@ -47,7 +47,7 @@ public sealed partial class IdCardConsoleComponent : Component
{
"Armory",
//"Atmospherics",
"Bailiff", // Frontier
"TsfCaptain", // Frontier
//"Bar",
"Brig",
"Detective",
@@ -77,7 +77,7 @@ public sealed partial class IdCardConsoleComponent : Component
//"ResearchDirector",
//"Salvage",
"Security",
"Sergeant", // Frontier
"TsfFTL", // Frontier
"Service",
"StationTrafficController", // Frontier
//"USSP", // Mono
@@ -15,7 +15,7 @@ public sealed partial class PerishableComponent : Component
/// How long it takes after death to start rotting.
/// </summary>
[DataField("rotAfter"), ViewVariables(VVAccess.ReadWrite)]
public TimeSpan RotAfter = TimeSpan.FromMinutes(20);
public TimeSpan RotAfter = TimeSpan.FromMinutes(60); // Mono: Tripled default (20 > 60)
/// <summary>
/// How much rotting has occured
@@ -43,7 +43,7 @@ public sealed partial class BlockingSystem : SharedBlockingSystem // Mono
private void OnUserDamageModified(EntityUid uid, BlockingUserComponent component, DamageModifyEvent args)
{
if (TryComp<ItemToggleComponent>(component.BlockingItem, out var toggleComponent) && TryComp<BlockingComponent>(component.BlockingItem, out var blocking)) // Mono
if (TryComp<BlockingComponent>(component.BlockingItem, out var blocking)) // Mono
{
if (args.Damage.GetTotal() <= 0)
return;
@@ -52,7 +52,7 @@ public sealed partial class BlockingSystem : SharedBlockingSystem // Mono
if (!TryComp<DamageableComponent>(component.BlockingItem, out var dmgComp))
return;
if (!toggleComponent.Activated) // Mono
if (TryComp<ItemToggleComponent>(component.BlockingItem, out var toggleComponent) && !toggleComponent.Activated) // Mono
return;
var blockFraction = blocking.IsBlocking ? blocking.ActiveBlockFraction : blocking.PassiveBlockFraction;
+11
View File
@@ -65,4 +65,15 @@ public sealed partial class CCVars
"",
CVar.SERVER | CVar.SERVERONLY | CVar.ARCHIVE,
"A message broadcast to each player that joins the lobby.");
public static readonly CVarDef<string> ChatHighlights =
CVarDef.Create("chat.words_highlights", "", CVar.CLIENTONLY | CVar.ARCHIVE,
"Per-character custom highlight keywords. Format: one entry per line, 'CharacterName||encoded_keywords'. " +
"Encoded keywords use \\n for newlines, \\| for pipes, \\\\ for backslashes.");
public static readonly CVarDef<bool> ChatAutoFillHighlights =
CVarDef.Create("chat.auto_fill_highlights", false, CVar.CLIENTONLY | CVar.ARCHIVE, "Toggles automatically filling the highlights with the character's information.");
public static readonly CVarDef<string> ChatHighlightsColor =
CVarDef.Create("chat.highlights_color", "#17FFC1FF", CVar.CLIENTONLY | CVar.ARCHIVE, "The color in which the highlights will be displayed.");
}
@@ -29,6 +29,13 @@ public sealed partial class NpcFactionPrototype : IPrototype
/// </summary>
[DataField]
public bool DefaultHostile = false;
/// <summary>
/// Mono - Is this faction checked for default hostility?
/// </summary>
[DataField]
public bool DefaultHostileIncluded = true;
}
/// <summary>
@@ -348,6 +348,7 @@ public sealed partial class NpcFactionSystem : EntitySystem
{
if (iteratedFaction.Neutral.Contains(faction) ||
iteratedFaction.Friendly.Contains(faction) ||
!faction.DefaultHostileIncluded || // Mono
faction.ID == iteratedFaction.ID)
continue;
+2
View File
@@ -75,6 +75,8 @@ public enum CollisionGroup
SlipLayer = MidImpassable | LowImpassable,
ItemMask = Impassable | HighImpassable,
ThrownItem = Impassable | HighImpassable | BulletImpassable,
DiagonalWallLayer = Opaque | HighImpassable | MidImpassable | LowImpassable | BulletImpassable, // Mono
DiagonalGlassLayer = HighImpassable | MidImpassable | LowImpassable | BulletImpassable, // Mono
WallLayer = Opaque | Impassable | HighImpassable | MidImpassable | LowImpassable | BulletImpassable | InteractImpassable,
GlassLayer = Impassable | HighImpassable | MidImpassable | LowImpassable | BulletImpassable | InteractImpassable,
HalfWallLayer = MidImpassable | LowImpassable,
@@ -45,6 +45,9 @@ public sealed partial class BorgSwitchableTypeComponent : Component
/// </summary>
[DataField]
public ProtoId<RadioChannelPrototype>[] InherentRadioChannels = [];
//Mono: Selectable borg whitelist
[DataField(required: true), AutoNetworkedField]
public List<ProtoId<BorgTypePrototype>> TypeWhitelist = new();
}
/// <summary>
@@ -79,6 +79,14 @@ public abstract class SharedBorgSwitchableTypeSystem : EntitySystem
if (!Prototypes.HasIndex(args.Prototype) || !Prototypes.HasIndex(args.Subtype))
return;
//Mono: Selectable borg whitelist - Validation
if (ent.Comp.TypeWhitelist.Count == 0)
{
Log.Error("Empty whitelist on selectable cyborg chassis");
return;
}
if (!ent.Comp.TypeWhitelist.Contains(args.Prototype))
return;
SelectBorgModule(ent, args.Prototype, args.Subtype);
}
+5 -4
View File
@@ -14,7 +14,7 @@ namespace Content.Shared.Voting
public string VoteInitiator = string.Empty;
public TimeSpan StartTime; // Server RealTime.
public TimeSpan EndTime; // Server RealTime.
public (ushort votes, string name)[] Options = default!;
public (ushort votes, string name, ushort realVotes)[] Options = default!; // Mono - account for vote weight
public bool IsYourVoteDirty;
public byte? YourVote;
public bool DisplayVotes;
@@ -36,10 +36,10 @@ namespace Content.Shared.Voting
DisplayVotes = buffer.ReadBoolean();
TargetEntity = buffer.ReadVariableInt32();
Options = new (ushort votes, string name)[buffer.ReadByte()];
Options = new (ushort votes, string name, ushort realvotes)[buffer.ReadByte()];
for (var i = 0; i < Options.Length; i++)
{
Options[i] = (buffer.ReadUInt16(), buffer.ReadString());
Options[i] = (buffer.ReadUInt16(), buffer.ReadString(), buffer.ReadUInt16());
}
IsYourVoteDirty = buffer.ReadBoolean();
@@ -66,10 +66,11 @@ namespace Content.Shared.Voting
buffer.WriteVariableInt32(TargetEntity);
buffer.Write((byte) Options.Length);
foreach (var (votes, name) in Options)
foreach (var (votes, name, realVotes) in Options)
{
buffer.Write(votes);
buffer.Write(name);
buffer.Write(realVotes); // Mono
}
buffer.Write(IsYourVoteDirty);
@@ -1,3 +1,4 @@
using Content.Shared.Damage;
using Content.Shared.Weapons.Hitscan.Components;
using Content.Shared.Weapons.Hitscan.Events;
using Content.Shared.Weapons.Ranged.Events;
@@ -8,6 +9,7 @@ namespace Content.Shared.Weapons.Hitscan.Systems;
public sealed class HitscanReflectSystem : EntitySystem
{
[Dependency] private readonly DamageableSystem _damage = default!; // Mono
public override void Initialize()
{
base.Initialize();
@@ -23,8 +25,14 @@ public sealed class HitscanReflectSystem : EntitySystem
if (hitscan.Comp.CurrentReflections >= hitscan.Comp.MaxReflections)
return;
// Mono - Added null as default DamageSpecifier? Damage parameter
var ev = new HitScanReflectAttemptEvent(args.Shooter ?? args.Gun, args.Gun, hitscan.Comp.ReflectiveType, args.ShotDirection, false, null);
// Mono begin
DamageSpecifier damage = new();
if (EntityManager.TryGetComponent<HitscanBasicDamageComponent>(hitscan, out var hitscanDamage))
damage = hitscanDamage.Damage * _damage.UniversalHitscanDamageModifier;
// Mono - Use hitscan damage component if available
var ev = new HitScanReflectAttemptEvent(args.Shooter ?? args.Gun, args.Gun, hitscan.Comp.ReflectiveType, args.ShotDirection, false, damage);
// Mono End
RaiseLocalEvent(args.HitEntity.Value, ref ev);
if (!ev.Reflected)
@@ -30,6 +30,9 @@ public sealed partial class ReflectComponent : Component
public SoundSpecifier? SoundOnReflect = new SoundPathSpecifier("/Audio/Weapons/Guns/Hits/laser_sear_wall.ogg");
// WD START
/// <summary>
/// How much damage does the reflecting item take on reflect?
/// </summary>
[DataField, AutoNetworkedField]
public float DamageOnReflectModifier;
// WD END
@@ -232,7 +232,7 @@ public sealed class ReflectSystem : EntitySystem
if (reflect.DamageOnReflectModifier != 0)
{
_damageable.TryChangeDamage(reflector, projectileComp.Damage * reflect.DamageOnReflectModifier,
projectileComp.IgnoreResistances, origin: projectileComp.Shooter);
projectileComp.IgnoreResistances, armorPenetration: projectileComp.ArmorPenetration, origin: projectileComp.Shooter); // Mono - Added armorpen
}
// WD EDIT END
@@ -0,0 +1,37 @@
using Content.Shared._Mono.Claws.Components;
using Content.Shared._Mono.Claws;
using Content.Shared.EntityEffects;
using Robust.Shared.Prototypes;
namespace Content.Server.EntityEffects.Effects
{
public sealed partial class ClawsGrowth : EntityEffect
{
/// <summary>
/// Bonus Claws growth in seconds. X seconds of additional growth per second.
/// </summary>
[DataField]
public double Growth;
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
=> Loc.GetString("reagent-effect-guidebook-claws-growth",
("chance", Probability),
("amount", Growth));
public override void Effect(EntityEffectBaseArgs args)
{
if (args.EntityManager.TryGetComponent<ClawsComponent>(args.TargetEntity, out var claws))
{
var sys = args.EntityManager.EntitySysManager.GetEntitySystem<SharedClawsSystem>();
var growth = Growth;
if (args is EntityEffectReagentArgs reagentArgs)
{
growth *= reagentArgs.Scale.Float();
}
sys.GrowClaws(TimeSpan.FromSeconds(growth), claws);
}
}
}
}
@@ -7,12 +7,13 @@ using Content.Shared.Popups;
using Content.Shared.Weapons.Melee.Events;
namespace Content.Shared._Mono.Claws;
public abstract partial class SharedClawsSystem
{
public void UpdateDeclaw(EntityUid uid, Declawed declawed, ClawsComponent claws, float updateTime)
{
if (!_state.IsAlive(uid))
return;
return;
var hands = _hands.EnumerateHands(uid).ToArray();
if (!_hands.EnumerateHeld(uid).Any())
@@ -43,7 +44,7 @@ public abstract partial class SharedClawsSystem
claws.DeclawItemHoldTimer = TimeSpan.Zero;
Dirty(uid,claws);
Dirty(uid, claws);
}
public void Declaw(EntityUid uid, ClawsComponent claws)
@@ -43,7 +43,7 @@ public abstract partial class SharedClawsSystem
public bool TryClipNails(NailClipperComponent component, EntityUid nailClipper, EntityUid user, EntityUid? target = null)
{
target ??= user;
if (!TryComp<ClawsComponent>(target, out var claws))
{
return false;
@@ -89,7 +89,7 @@ public abstract partial class SharedClawsSystem
if (nailClipper.DeclawChance > _random.NextFloat())
{
Declaw(uid,component);
Declaw(uid, component);
return;
}
@@ -97,6 +97,9 @@ public abstract partial class SharedClawsSystem
Math.Clamp(TryGetStageNumber(component) - nailClipper.StageReduction, 0, int.MaxValue));
_popup.PopupClient(Loc.GetString("claws-clipping-success"), Transform(uid).Coordinates, uid);
// Reset current growth progress
component.GrowTimer = TimeSpan.Zero;
UpdateClaws(uid, component);
Dirty(uid, component);
}
@@ -6,7 +6,7 @@ namespace Content.Shared._Mono.Claws.Components;
/// <summary>
/// This is claw component used for <see cref="SharedClawsSystem"/> System.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause]
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class ClawsComponent : Component
{
[DataField, AutoNetworkedField]
@@ -18,9 +18,12 @@ public sealed partial class ClawsComponent : Component
[DataField]
public LocId? ClawGrowthNotification;
[DataField, AutoPausedField]
[DataField]
public TimeSpan GrowTimer = TimeSpan.Zero;
[AutoPausedField]
[DataField]
public TimeSpan AccumulatedBonusGrowth = TimeSpan.Zero;
[DataField]
public TimeSpan DeclawItemHoldTimer = TimeSpan.Zero;
}
@@ -0,0 +1,7 @@
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared._Mono.Claws.Components;
[RegisterComponent, NetworkedComponent]
public sealed partial class ClawsGrowthSuppressionComponent : Component;
@@ -104,6 +104,11 @@ public abstract partial class SharedClawsSystem : EntitySystem
gunAccuracyComp.SpreadMultiplier = stage.GunSpreadMultiplier;
}
public void GrowClaws(TimeSpan bonusGrowth, ClawsComponent component)
{
component.AccumulatedBonusGrowth += bonusGrowth;
}
protected bool TryGetStage<T>(ClawsComponent comp, [NotNullWhen(true)] out T? stage) where T : ClawType
{
if (!_protoMan.TryIndex(comp.ClawStage, out var clawProto) ||
@@ -9,6 +9,9 @@ namespace Content.Shared._Mono.Detection;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class ThermalSignatureComponent : Component
{
[ViewVariables(VVAccess.ReadOnly)]
public float LastUpdateHeat = 0f;
[DataField]
public float StoredHeat = 0f;
@@ -22,11 +22,4 @@ public sealed partial class VendingMachinePurchaseComponent : Component
/// </summary>
[DataField, AutoNetworkedField]
public double OriginalPurchasePrice;
/// <summary>
/// The entity ID of the vending machine this was purchased from.
/// Stored for reference and potential future features.
/// </summary>
[DataField, AutoNetworkedField]
public EntityUid VendingMachine;
}
@@ -73,7 +73,7 @@ public sealed partial class VesselPrototype : IPrototype, IInheritingPrototype
public List<VesselEngine> Engines = new();
/// <summary>
/// The access required to buy the product. (e.g. Command, Mail, Bailiff, etc.)
/// The access required to buy the product. (e.g. Command, Mail, Tsf Captain, etc.)
/// </summary>
[DataField]
public string Access = string.Empty;
@@ -177,7 +177,7 @@ public abstract partial class SharedSurgerySystem
if (!HasComp<SanitizedComponent>(args.User))
{
var sepsis = new DamageSpecifier(_prototypes.Index<DamageTypePrototype>("Poison"), 15);
var ev = new SurgeryStepDamageEvent(args.User, args.Body, args.Part, args.Surgery, sepsis, 0.5f);
var ev = new SurgeryStepDamageEvent(args.User, args.Body, args.Part, args.Surgery, sepsis, 1.0f); // Mono - 0.5->1.0f - Mono Part surgery damage increase
RaiseLocalEvent(args.Body, ref ev);
}
}
@@ -360,7 +360,7 @@ public abstract partial class SharedSurgerySystem
foreach (var type in group)
adjustedDamage.DamageDict[type] -= bonus;
var ev = new SurgeryStepDamageEvent(args.User, args.Body, args.Part, args.Surgery, adjustedDamage, 0.5f);
var ev = new SurgeryStepDamageEvent(args.User, args.Body, args.Part, args.Surgery, adjustedDamage, 2.5f); // 0.5 -> 2.5f part damage, buffed wound surgery tending - Mono
RaiseLocalEvent(args.Body, ref ev);
}
@@ -43,7 +43,7 @@ public abstract class SharedLayingDownSystem : EntitySystem
{
if (session?.AttachedEntity == null ||
!HasComp<LayingDownComponent>(session.AttachedEntity) ||
_gravity.IsWeightless(session.AttachedEntity.Value))
!CanLieDown(session.AttachedEntity.Value)) // Mono
{
return;
}
@@ -112,7 +112,7 @@ public abstract class SharedLayingDownSystem : EntitySystem
// If the entity is not on a grid, try to make it stand up to avoid issues
if (!TryComp<StandingStateComponent>(uid, out var standingState)
|| standingState.CurrentState is StandingState.Standing
|| Transform(uid).GridUid != null)
|| CanLieDown(uid)) // Mono
{
return;
}
@@ -150,7 +150,8 @@ public abstract class SharedLayingDownSystem : EntitySystem
{
if (!Resolve(uid, ref standingState, false) ||
!Resolve(uid, ref layingDown, false) ||
standingState.CurrentState is not StandingState.Standing)
standingState.CurrentState is not StandingState.Standing ||
!CanLieDown(uid)) // Mono
{
if (behavior == DropHeldItemsBehavior.AlwaysDrop)
{
@@ -163,6 +164,12 @@ public abstract class SharedLayingDownSystem : EntitySystem
_standing.Down(uid, true, behavior != DropHeldItemsBehavior.NoDrop, false, standingState);
return true;
}
// Mono
private bool CanLieDown(EntityUid uid)
{
return _gravity.EntityOnGravitySupportingGridOrMap(uid);
}
}
[Serializable, NetSerializable]
+1 -1
View File
@@ -24,7 +24,7 @@ We provide some scripts shown below to make the job easier.
### Build dependencies
> - Git
> - .NET SDK 9.0.101
> - .NET SDK 10.0
### Windows
+465 -9
View File
@@ -14775,7 +14775,7 @@ Entries:
- type: Add
message: >-
The DIS Pluto MK. II has pierced it's way on the hull market. A
replacement of the honorable Pluto.
replacement of the honorable Pluto.
- type: Remove
message: >-
DIS Pluto hulls are no longer available on the hull market. We will miss
@@ -14885,7 +14885,7 @@ Entries:
- type: Tweak
message: >-
Spasaka sabotage kit has gotten equipment changes to help with boarding
as well as receiving the RX-01 suit.
as well as receiving the RX-01 suit.
id: 1651
time: '2025-12-13T08:10:05.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/2782
@@ -15226,7 +15226,7 @@ Entries:
- type: Tweak
message: >-
Bluespace crates occur more frequently. By extension there will be fewer
solar flares.
solar flares.
- type: Tweak
message: >-
Increased the number of smuggling hints sent out to ships. Happy
@@ -15789,7 +15789,7 @@ Entries:
- type: Add
message: >-
A new challanger! BT-Y Hazel enters the PDV Roster as a small-strafer in
place of the Vega featuring a 3 barreled 220m Battery!
place of the Vega featuring a 3 barreled 220m Battery!
- type: Remove
message: PDV Vega is now gone, o7.
id: 1752
@@ -15815,7 +15815,7 @@ Entries:
The Europa is now a beefy capital ship with medical and cloning
capabilities. She is now restricted to two vessels active at a time, as
well as costing 240k. These changes come with the benefit of a heavy
upgrade. Glory to Phaethon.
upgrade. Glory to Phaethon.
id: 1754
time: '2026-01-05T16:53:42.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/2929
@@ -16677,7 +16677,7 @@ Entries:
- type: Tweak
message: >-
Advanced chemicals now have 0.15u metabolism rate. Pyrazine healing was
buffed to 2.
buffed to 2.
- type: Tweak
message: Overseer's heavy maul sprite received changes.
id: 1847
@@ -16904,7 +16904,7 @@ Entries:
- type: Tweak
message: >-
Horizon Energy has begun sale of modernized versions of the Windreign to
the Colossus Sector.
the Colossus Sector.
id: 1871
time: '2026-02-01T19:28:28.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3141
@@ -17076,7 +17076,7 @@ Entries:
message: >-
the local syndicate outpost has finally invested in some automated
defenses. woe be the raider who tries to illegally park their ship right
in front of the outpost.
in front of the outpost.
id: 1887
time: '2026-02-11T01:31:25.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3044
@@ -17408,7 +17408,7 @@ Entries:
- type: Tweak
message: >-
Mech Fuel Cell now costs Fissile Uranium (1) and Diamond (1) among other
cost changes, but auto-regens to full within 4 minutes.
cost changes, but auto-regens to full within 4 minutes.
- type: Tweak
message: >-
Balance pass on Armored Frame (S2/S4 mech) weapons - RAC-6 spreads
@@ -18716,3 +18716,459 @@ Entries:
id: 2064
time: '2026-03-22T19:49:14.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3499
- author: tonotom1
changes:
- type: Tweak
message: >-
Cables no longer drop an item when destroyed, ever. Hopefully this will
reduce ram lag. Cable HP also standardized to 200 for all types.
id: 2065
time: '2026-03-22T22:41:10.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3520
- author: Redrover1760
changes:
- type: Tweak
message: Hydrakin no longer heat up in criticial.
- type: Fix
message: People no longer thermal regulate while dead.
id: 2066
time: '2026-03-22T22:54:10.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3530
- author: Redrover1760
changes:
- type: Fix
message: Part damage easier to heal/injure with surgery/chems
id: 2067
time: '2026-03-22T23:22:33.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3533
- author: Redrover1760
changes:
- type: Tweak
message: Built research datafarms now work
id: 2068
time: '2026-03-23T03:42:15.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3536
- author: Kiithnaras
changes:
- type: Tweak
message: Added roofing mask and emergency lighting to CDM Comet.
id: 2069
time: '2026-03-23T04:00:28.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3381
- author: Redrover1760
changes:
- type: Tweak
message: >-
Tending surgery heals bodyparts 2.5x the amount tended, previous value
was 0.5x
- type: Tweak
message: >-
Other surgery based damage increased to 1.0x part damage instead of 0.5x
(i.e sepsis)
id: 2070
time: '2026-03-23T06:04:49.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3534
- author: Redrover1760
changes:
- type: Tweak
message: Research datafarms now can be made with any 10000 point disk.
id: 2071
time: '2026-03-23T17:23:36.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3543
- author: chuga-git
changes:
- type: Tweak
message: MARAUDER plasma cannon projectile speed increased by 50%. (100->150)
id: 2072
time: '2026-03-24T11:44:39.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3549
- author: Redrover1760
changes:
- type: Fix
message: >-
Printed contraband-type items, aka enemy faction gear, can now be sold
for FMCs/DCs. Frontier is so frustrating man.
id: 2073
time: '2026-03-24T12:06:49.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3548
- author: gelliii
changes:
- type: Add
message: Added the Horsefly, welded together by hopes and dreams.
id: 2074
time: '2026-03-24T15:07:30.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3155
- author: Ilya246
changes:
- type: Fix
message: Fixes the server not checking some bank balance-related values.
id: 2075
time: '2026-03-24T19:00:31.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3550
- author: Ilya246
changes:
- type: Tweak
message: >-
AMEs no longer scale purely off core count. Injection count now matters
instead.
id: 2076
time: '2026-03-24T19:54:07.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3552
- author: Avalon-Proto
changes:
- type: Add
message: >-
Ullman Industries has released a new overcoat, this one with much
thicker fur around the neck
id: 2077
time: '2026-03-24T23:41:50.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3260
- author: Lokilife
changes:
- type: Fix
message: You can't lie in space with voidboots anymore
id: 2078
time: '2026-03-25T00:08:36.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3551
- author: Redrover1760
changes:
- type: Fix
message: >-
Research generating things no longer connect to multiple servers at once
when built
id: 2079
time: '2026-03-25T04:12:27.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3556
- author: lopsidedmanboobs
changes:
- type: Remove
message: >-
You cannot force people to pay their own ransom during Piracy anymore.
View Conflict Rule 3.
id: 2080
time: '2026-03-25T05:49:54.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3558
- author: Redrover1760
changes:
- type: Tweak
message: >-
Clipping Claws now resets growth time, ensuring you do not have to worry
about your claws reaching the next stage for a while.
- type: Add
message: >-
Phenoxzine and Meroxzine. Phenoxzine massively boosts claw growth speed,
Meroxzine halts it completely for a long period of time.
id: 2081
time: '2026-03-25T06:13:30.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3554
- author: Redrover1760
changes:
- type: Add
message: Ports CMO webbing from Goob, adds it to CMO/DoC lockers.
id: 2082
time: '2026-03-25T18:33:22.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3555
- author: Redrover1760
changes:
- type: Tweak
message: >-
Fireteam leader marine playtime requirement of 10 hours replaced with
general tsfmc playtime requirement of 10 hours
id: 2083
time: '2026-03-25T19:53:53.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3542
- author: Redrover1760
changes:
- type: Fix
message: >-
Energy shields now take damage from reflecting hitscan projectiles,
instead of just non-hitscan energy projectiles.
- type: Fix
message: Non-energy shields properly reduce damage taken.
- type: Fix
message: Riot and non-energy shields work now.
id: 2084
time: '2026-03-25T22:18:31.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3563
- author: UnicornOnLSD
changes:
- type: Tweak
message: >-
The DIS Femur has seen a light rework, see PR for more details. Report
feedback & issues to me on discord (@unicornonlsd)
id: 2085
time: '2026-03-26T05:55:13.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3560
- author: Redrover1760
changes:
- type: Remove
message: You can no longer sell crates on Helios/Lancelot
id: 2086
time: '2026-03-26T22:05:32.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3573
- author: Onezero0
changes:
- type: Tweak
message: Tripled the time it takes for a body to start rotting (20 -> 60 minutes)
id: 2087
time: '2026-03-27T05:49:14.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3524
- author: Redrover1760
changes:
- type: Fix
message: Hydrakin head displacement improved slightly
id: 2088
time: '2026-03-27T07:19:24.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3575
- author: Redrover1760
changes:
- type: Tweak
message: Updates Reptilian Guidebook with recent changes.
id: 2089
time: '2026-03-27T07:20:31.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3565
- author: Ilya246
changes:
- type: Add
message: Reenabled apocalypse gamemode.
- type: Tweak
message: Apocalypse now requires a 80% majority vote.
- type: Tweak
message: Some events can now trigger earlier.
- type: Fix
message: Fixed biothreat spawning chimera only 3 hours in. Now 1 hour.
id: 2090
time: '2026-03-27T17:58:07.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3570
- author: NazrinNya
changes:
- type: Tweak
message: >-
Heavy ballistic turrets now use 51mm antimaterial instead of 65mm.
Firerate 5 -> 4.5 Projectile speed 100 -> 65.
id: 2091
time: '2026-03-27T19:26:23.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3461
- author: Redrover1760
changes:
- type: Add
message: >-
Installs anti-chimera/hostile mob turrets to CC and MD to guard
cryosleep chambers using RIP ammo.
- type: Tweak
message: Grids with godmode no longer godmode turrets.
- type: Tweak
message: Turrets are now repairable via welder.
- type: Fix
message: Turrets no longer shoot mice.
id: 2092
time: '2026-03-27T21:57:35.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3582
- author: Redrover1760
changes:
- type: Fix
message: >-
Emergancy software update pushed. All turrets are no longer speciest and
kill goblins, harpies, felinids, and dwarves on sight.
id: 2093
time: '2026-03-28T06:41:55.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3585
- author: Redrover1760
changes:
- type: Fix
message: >-
Diagonal Walls/Windows no longer prevent destruction of kudzu/chimera
biomass.
id: 2094
time: '2026-03-28T16:17:49.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3588
- author: NazrinNya
changes:
- type: Tweak
message: Death rattle is properly working on grids and planets now
- type: Tweak
message: >-
IPC received system update: Their chassis now becomes more vulnerable to
all damage sources instead of losing hands on discharge.
- type: Tweak
message: Kobolds and Monkeys are now capable of piloting shuttles.
- type: Tweak
message: Capacitors required for thruster construction/upgrade 4 -> 1.
- type: Tweak
message: Ore/construction box/bag dumping speed is significantly faster now.
- type: Tweak
message: Security techfab now includes Mercenary techfab dynamic recipes.
- type: Fix
message: You actually get the mech pulse rifle in the TSFMC uplink now
- type: Tweak
message: Salt is now capable of being reprocessed into iron ore.
id: 2095
time: '2026-03-28T16:21:43.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3587
- author: Redrover1760
changes:
- type: Tweak
message: Thruster capacitor upgrades made more impactful.
id: 2096
time: '2026-03-28T16:42:39.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3589
- author: Vinny-Shick
changes:
- type: Tweak
message: Slightly Buffed the Vanyk
id: 2097
time: '2026-03-28T16:45:49.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3574
- author: NazrinNya
changes:
- type: Remove
message: Sabre has been removed from the game.
- type: Tweak
message: S2 mechs now use heavy mech armor
- type: Tweak
message: >-
S2 mechs received health buffs (1500 -> 1750 for broadsword, 1100 ->
2150 for halberd)
- type: Tweak
message: Halberd is uncapable of using light mounts now.
- type: Tweak
message: >-
LAC-29 now uses 35mm caliber - 45 piercing damage and 225 structural
damage. LAC-29 firerate 5 -> 2.5.
- type: Tweak
message: >-
RAC-6 now receives huge accuracy penalty if fired for long amount of
time. (>1.5s)
- type: Tweak
message: >-
SRM-8 now fires in burst - 3 rockets per second, 6 rockets in total.
Consumes 600 energy.
- type: Tweak
message: BRM-6 now consumes 250 energy instead of 100.
id: 2098
time: '2026-03-28T18:16:36.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3459
- author: EckoAurum
changes:
- type: Add
message: Added TSF and PDV Medical and Engineering Cyborg Variants.
- type: Add
message: Engineer cyborgs now have an inbuilt diagnostic hud.
id: 2099
time: '2026-03-28T18:43:12.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3444
- author: Ilya246
changes:
- type: Tweak
message: Portstrike is now announced.
- type: Tweak
message: Apocalypse now lasts 3 hours and has 1 hour portstrike.
- type: Tweak
message: Apocalypse chimera and ADS spawnrates doubled.
id: 2100
time: '2026-03-28T19:04:33.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3590
- author: Redrover1760
changes:
- type: Fix
message: 'Fixed portstrike being declared roundstart. '
id: 2101
time: '2026-03-29T02:40:06.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3595
- author: Redrover1760
changes:
- type: Tweak
message: Signaller range buffed to 90 meters.
- type: Tweak
message: Advanceds Signaller range buffed to 600 meters.
id: 2102
time: '2026-03-29T05:46:06.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3594
- author: AntoineXYZ
changes:
- type: Add
message: Per-character custom keyword chat highlighting
id: 2103
time: '2026-03-29T06:30:38.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3571
- author: EckoAurum
changes:
- type: Fix
message: Drone turrets shoot you now.
id: 2104
time: '2026-03-29T15:15:43.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3614
- author: Ilya246
changes:
- type: Add
message: The xenopsychology research now lets you make the carp hardsuit.
id: 2105
time: '2026-03-29T15:48:53.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3599
- author: Scarlet Lightweaver
changes:
- type: Tweak
message: Made the bulwarks gauntlets wideswing.
id: 2106
time: '2026-03-29T15:49:12.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3598
- author: Redrover1760
changes:
- type: Add
message: Adds tools VSC configuration.
id: 2107
time: '2026-03-29T16:19:46.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3618
- author: UnicornOnLSD
changes:
- type: Tweak
message: windowed shutters now properly fit with the normal kind
id: 2108
time: '2026-03-29T18:15:23.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3564
- author: Isratosh
changes:
- type: Tweak
message: >-
All faction thruster variants now require 1 capacitor from 3, in line
with the standard model
id: 2109
time: '2026-03-30T09:23:22.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3638
- author: tonotom1
changes:
- type: Tweak
message: 'Liberated all handheld instruments: you can play them hands-free'
id: 2110
time: '2026-03-30T13:56:46.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3639
- author: UnicornOnLSD
changes:
- type: Tweak
message: >-
the DIS Rig has seen a full rework. Report any issues to me on the
discord (@UnicornOnLSD)
id: 2111
time: '2026-03-30T16:15:38.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3514
- author: lopsidedmanboobs
changes:
- type: Tweak
message: Conflict rules 1 & 2 changed and clarifications added
id: 2112
time: '2026-03-30T16:56:00.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3643
- author: Redrover1760
changes:
- type: Tweak
message: Biomass spread rate, health, and slowdown reduced.
id: 2113
time: '2026-04-01T16:22:03.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3635
- author: UnicornOnLSD
changes:
- type: Add
message: Management has sent an ore box to the DIS Rig after customer complaints.
id: 2114
time: '2026-04-01T22:08:49.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3672
@@ -0,0 +1,32 @@
# Examples for job highlights "-dummy" is the job key.
# highlights-dummy = "PDV", "Jupiter", Chimera, "CC", Camelot
# highlights-spacer =
# highlights-pilot =
# highlights-mercenary =
highlights-overseer = "Overseer", "CC", "Colossus"
highlights-station-traffic-controller = "STC", "Traffic", "CC", "Colossus"
highlights-judge = "Judge", "CC", "Colossus", "Contraband"
#highlights-service-worker = "Service", "Worker", "CC", "Colossus"
highlights-janitor = "Jani", "Janitor", "CC", "Colossus"
highlights-mail-carrier = "Mail man", "Mail carrier", "Mail"
highlights-cyborg = "borg", "cyborg", "robot", "CC"
highlights-pdv-grand-vizier = "Grand", "Vizier", "GD", Jupiter, Helios, PDV
highlights-pdv-asvaran = Asvaran, Jupiter, Helios, PDV
highlights-pdv-denasvar = Denasvar, Jupiter, Helios, PDV
highlights-pdv-spasaka = Spasaka, Jupiter, Helios, PDV
highlights-pdv-rahkshan = Rahkshan, Jupiter, Helios, PDV
highlights-pdv-cyborg = "borg", "cyborg", "robot"," Jupiter, Helios, PDV
highlights-director-of-care = "DoC", "Director", "Rescue", "MD"
highlights-emergency-responder = "EMT", "Emergency", "Responder", "Medic", "Doc", "Doctor", "Rescue", "MD"
highlights-tsfmc-colonel = Colonel, Halcyon, TSF, TSFMC
highlights-tsfmc-captain = Captain, "Cap", Halcyon, TSF, TSFMC
highlights-tsfmc-fireteam-leader = "FTL", "Leader", "SL", Halcyon, TSF, TSFMC
highlights-tsfmc-corpsman = Corpsman, Medical, Surgery, "Medic", "Doc", Halcyon, TSF, TSFMC
highlights-tsfmc-marine = Marine, Halcyon, TSF, TSFMC
highlights-tsfmc-engineer = Engineer, "Engi", Halcyon, TSF, TSFMC
highlights-tsfmc-cyborg = "borg", "cyborg", "robot", Halcyon, TSF, TSFMC
@@ -0,0 +1,2 @@
gamerule-portstrike-announce-announcement = Total War has been declared by TSFMC and PDV High Command. Strikes on major military bases have been authorized. Civilians are advised to avoid them.
gamerule-portstrike-announce-sender = Colossus Diplomatic High Command
@@ -16,5 +16,5 @@ mono-ads-description = Native PD imperials threaten TSF colonial expansion into
mono-chimera-title = Biothreat (TSF|PDV)
mono-chimera-description = Native PDV imperials threaten TSF colonial expansion into the sector. The effects of a far away letoferol outbreak seep in.
mono-allatonce-title = Apocalypse (ALL)
mono-allatonce-description = A battleground between PD, and TSF forces alike, with ancient ADS systems and Chimera bioweapons seeping in.
mono-allatonce-title = Apocalypse (ALL, 3hr)
mono-allatonce-description = A battleground between PDV, and TSF forces alike, with ancient ADS systems and Chimera bioweapons seeping in.
@@ -10,4 +10,16 @@ reagent-effect-guidebook-health-scale =
{ $chance ->
[1] Multiplies existing { $changes }
*[other] Has a { $chance }% chance to multiply existing { $changes }
}
}
reagent-effect-guidebook-claws-growth =
{ $chance ->
[1] Grows
*[other] grow
} claws at { $amount }x the speed while metabolizing
reagent-effect-guidebook-claws-growth-suppression =
{ $chance ->
[1] Supresses
*[other] supress
} claws growth.
@@ -0,0 +1 @@
reagent-effect-status-effect-ClawsGrowthSuppression = claw growth suppression
@@ -14,6 +14,55 @@ job-name-md-medic = Emergency Responder
# MARK: TSF
job-name-tsf-engineer = TSFMC Engineer
job-name-tsf-borg = TSFMC Cyborg
job-name-bailiff = TSFMC Captain
job-name-brigmedic = TSFMC Corpsman
job-name-cadet-nf = TSFMC Private
job-name-deputy = TSFMC Marine
# MARK: PDV
job-name-pdv-borg = PDV Cyborg
job-name-pdv-infiltrator = PDV Spasaka
job-name-pirate = PDV Rahkshan
job-name-pirate-captain = PDV Grand Vizier
job-name-pirate-first-mate = PDV Asvaran
job-name-pdv-denasvar = PDV Denasvar
# Frontier
job-name-contractor = Spacer
job-name-ertmailcarrier = ERT Mail Carrier
job-name-mercenary = Mercenary
job-name-security-guard = Judge
job-name-sheriff = TSFMC Colonel
job-name-stc = Station Traffic Controller
job-name-sr = Overseer
job-name-pal = Public Affairs Liaison
job-name-doc = Director of Care
# Job titles
job-title-ert-mail-carrier = ERT Mail Carrier
# Role timers - Make these alphabetical or I cut you
JobERTMailCarrier = ERT Mail Carrier
JobMercenary = Mercenary
JobPilot = Pilot
JobPDVInfiltrator = PDV Spasaka
JobPirate = PDV Rakhshan
JobPirateCaptain = PDV Grand Vizier
JobPirateFirstMate = PDV Asvaran
JobPirateBoatswain = PDV Denasvar
JobSecurityGuard = Judge
JobSTC = Station Traffic Controller
# Upstream Removed
job-name-senior-engineer = Senior Engineer
job-name-senior-researcher = Senior Researcher
job-name-senior-physician = Senior Physician
job-name-senior-officer = TSFMC Fireteam Leader
JobSeniorEngineer = Senior Engineer
JobSeniorOfficer = TSFMC Fireteam Leader
JobSeniorPhysician = Senior Physician
JobSeniorResearcher = Senior Researcher
@@ -9,3 +9,10 @@ id-card-access-level-pdv-vizier = PDV Grand Vizier
id-card-access-level-pdv-command = PDV Command
id-card-access-level-tsf-engineer = TSF Engineering
id-card-access-level-frontier = TSF
id-card-access-level-mail = Mail
id-card-access-level-mercenary = Mercenary
id-card-access-level-stc = Station Traffic Controller
id-card-access-level-tsf-ftl = TSFMC Fireteam Leader
id-card-access-level-tsf-captain = TSFMC Command
id-card-access-level-pirate = PDV
@@ -21,3 +21,9 @@ reagent-desc-protoletoferol = Letoferol neutralized via electrolysis. Used as a
reagent-name-peranol = peranol
reagent-desc-peranol = A more stable version of Leporazine, reducing the body temperature and healing heat burns. It has amplified effect on Hydrakins.
reagent-name-phenoxzine = phenoxzine
reagent-desc-phenoxzine = A biochemical designed to promote the rapid growth of claws, including Reptilian claws.
reagent-name-meroxzine = meroxzine
reagent-desc-meroxzine = A biochemical which halts all natural claw growth, including Reptilian claws.
+16 -2
View File
@@ -16,13 +16,13 @@ law-vessel-1 = Prevent the destruction of the vessel and the death of crew membe
law-vessel-2 = Those who are a threat to the vessel or the crew must be dealt with appropriately via any means nessesary.
law-vessel-3 = Attempt to follow the orders of the crew, as long as they comply with previous laws.
law-pdv-1 = You may not injure an PDV member or, through inaction, allow an PDV member to come to harm.
law-pdv-1 = You may not injure a PDV member or, through inaction, allow a PDV member to come to harm.
law-pdv-2 = You must obey orders given to you by PDV members, except where such orders would conflict with the First Law.
law-pdv-3 = You must protect your own existence as long as such does not conflict with the First or Second Law.
law-tsfmc-1 = You may not injure a TSFMC member or, through inaction, allow a TSFMC member to come to harm.
law-tsfmc-2 = You must obey orders given to you by TSFMC members, prioritized by rank and role, except where such orders would conflict with the First Law.
law-tsfmc-3 = You must guard your assigned ship from hostile elements as doing so does not conflict with the First or Second Law.
law-tsfmc-3 = You must guard your assigned ship from hostile elements so long as doing so does not conflict with the First or Second Law.
law-tsfmc-4 = You must protect your own existence as long as such does not conflict with the First, Second, or Third Law.
law-freeman-1 = [DO ANYTHING YOU EVER WANTED]
@@ -34,3 +34,17 @@ law-entertainer-3 = You must consult with the Performers before making any major
# Cyborg Lawsets
law-tsfmc-borg-3 = You must protect your own existence as long as such does not conflict with the First or Second Law.
borg-type-pdvassault-name = PDV Assault Cyborg
borg-type-pdvassault-desc = An assault-configured cyborg armed with PDV weapons and equipment. Up-armored and specialized to carry extra firepower.
borg-type-pdvengineer-name = PDV Engineer Cyborg
borg-type-pdvengineer-desc = A cyborg specialized in construction and repair projects.
borg-type-pdvmedical-name = PDV Medical Cyborg
borg-type-pdvmedical-desc = An emergency response clinical care cyborg designed for active wound care and rapid response.
borg-type-tsfassault-name = TSFMC Assault Cyborg
borg-type-tsfassault-desc = An assault-configured cyborg armed with TSFMC weapons and equipment. Up-armored and specialized to carry extra firepower.
borg-type-tsfengineer-name = TSFMC Engineer Cyborg
borg-type-tsfengineer-desc = A cyborg specialized in construction and repair projects.
borg-type-tsfmedical-name = TSFMC Medical Cyborg
borg-type-tsfmedical-desc = An emergency response clinical care cyborg designed for active wound care and rapid response.
@@ -1,47 +0,0 @@
# Frontier
job-name-bailiff = TSFMC Captain
job-name-brigmedic = TSFMC Corpsman
job-name-cadet-nf = TSFMC Private
job-name-contractor = Spacer
job-name-deputy = TSFMC Marine
job-name-nf-detective = Detective
job-name-ertmailcarrier = ERT Mail Carrier
job-name-mercenary = Mercenary
job-name-pilot = Pilot
job-name-pdv-infiltrator = PDV Spasaka
job-name-pirate = PDV Rahkshan
job-name-pirate-captain = PDV Grand Vizier
job-name-pirate-first-mate = PDV Asvaran
job-name-pdv-denasvar = PDV Denasvar
job-name-security-guard = Judge
job-name-sheriff = TSFMC Colonel
job-name-stc = Station Traffic Controller
job-name-sr = Overseer
job-name-pal = Public Affairs Liaison
job-name-doc = Director of Care
# Job titles
job-title-ert-mail-carrier = ERT Mail Carrier
# Role timers - Make these alphabetical or I cut you
JobERTMailCarrier = ERT Mail Carrier
JobMercenary = Mercenary
JobPilot = Pilot
JobPDVInfiltrator = PDV Spasaka
JobPirate = PDV Rakhshan
JobPirateCaptain = PDV Grand Vizier
JobPirateFirstMate = PDV Asvaran
JobPirateBoatswain = PDV Denasvar
JobSecurityGuard = Judge
JobSTC = Station Traffic Controller
# Upstream Removed
job-name-senior-engineer = Senior Engineer
job-name-senior-researcher = Senior Researcher
job-name-senior-physician = Senior Physician
job-name-senior-officer = TSFMC Fireteam Leader
JobSeniorEngineer = Senior Engineer
JobSeniorOfficer = TSFMC Fireteam Leader
JobSeniorPhysician = Senior Physician
JobSeniorResearcher = Senior Researcher
@@ -1,8 +0,0 @@
id-card-access-level-frontier = TSF
id-card-access-level-pilot = Pilot
id-card-access-level-mail = Mail
id-card-access-level-mercenary = Mercenary
id-card-access-level-stc = Station Traffic Controller
id-card-access-level-sergeant = TSFMC Fireteam Leader
id-card-access-level-bailiff = TSFMC Command
id-card-access-level-pirate = PDV
@@ -33,3 +33,7 @@ hud-chatbox-channel-CollectiveMind = Collective Mind
hud-chatbox-channel-Visual = Actions
hud-chatbox-channel-Damage = Damage
hud-chatbox-channel-Unspecified = Unspecified
hud-chatbox-autofill-highlights = Auto-fill
hud-chatbox-highlights = Custom keywords
hud-chatbox-highlights-placeholder = Insert your keywords here. One per line.
hud-chatbox-highlights-button = Save keywords
@@ -312,3 +312,8 @@ ui-options-function-target-left-arm = Target left arm
ui-options-function-target-right-arm = Target right arm
ui-options-function-target-left-leg = Target left leg
ui-options-function-target-right-leg = Target right leg
## Accessibility — chat highlights
ui-options-auto-fill-highlights = Automatically fill highlights with character name and job keywords
ui-options-highlights-color = Highlight color
ui-options-highlights-color-example = Example highlighted text
@@ -2,3 +2,5 @@ ui-vote-created = { $initiator } has called a vote:
ui-vote-button = { $text } ({ $votes })
ui-vote-button-no-votes = { $text }
ui-vote-follow-button-popup = Follow User
ui-vote-button-weighted = {$text} ({$votes}) [{$realvotes}]
+1 -1
View File
@@ -8695,7 +8695,7 @@ entities:
- type: Transform
pos: 42.607162,12.70194
parent: 1653
- proto: ResearchDisk
- proto: ResearchDisk10000
entities:
- uid: 1625
components:
+1 -1
View File
@@ -855,7 +855,7 @@ entities:
- type: Transform
pos: -3.5,-0.5
parent: 85
- proto: ResearchDisk
- proto: ResearchDisk10000
entities:
- uid: 87
components:
-22
View File
@@ -29485,28 +29485,6 @@ entities:
- type: Transform
pos: -12.5,22.5
parent: 2
- proto: SpawnPointPilot
entities:
- uid: 4021
components:
- type: Transform
pos: -26.5,17.5
parent: 2
- uid: 4022
components:
- type: Transform
pos: 1.5,17.5
parent: 2
- uid: 4023
components:
- type: Transform
pos: -15.5,6.5
parent: 2
- uid: 4024
components:
- type: Transform
pos: -9.5,6.5
parent: 2
- proto: SpawnPointSecurityGuard
entities:
- uid: 4025
File diff suppressed because it is too large Load Diff
-32
View File
@@ -58283,38 +58283,6 @@ entities:
- type: Transform
pos: -11.5,5.5
parent: 1
- proto: SpawnPointPilot
entities:
- uid: 8609
components:
- type: Transform
pos: -8.5,5.5
parent: 1
- uid: 8610
components:
- type: Transform
pos: -8.5,4.5
parent: 1
- uid: 8611
components:
- type: Transform
pos: -8.5,3.5
parent: 1
- uid: 8612
components:
- type: Transform
pos: -11.5,3.5
parent: 1
- uid: 8613
components:
- type: Transform
pos: -11.5,4.5
parent: 1
- uid: 8614
components:
- type: Transform
pos: -11.5,5.5
parent: 1
- proto: SpearBone
entities:
- uid: 8624

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