2.0.0 - any gameconfigurationasset can be changed! breaking public API

This commit is contained in:
2025-08-10 18:04:52 -04:00
parent 8f4ffff08a
commit 48ca74d2db
12 changed files with 464 additions and 117 deletions

326
README.md
View File

@@ -1,89 +1,289 @@
# Undead Universal Patch
Non-EAC, IL2CPP build patcher for Rec Room (Dec 2018\*-*Apr 3 2020)
**Currently only supports unobfuscated builds**
Part two of two universal patches. The Mono patch is available at https://git.proxnet.dev/zombieb/undead-universal-patch-mono.
Part two of two universal patches. The Mono patch is available at
https://git.proxnet.dev/zombieb/undead-universal-patch-mono.
Compatible with [BepInEx builds](https://builds.bepinex.dev/projects/bepinex_be) that can automatically load interop assemblies before plugins (builds 710 and later)
Compatible with [BepInEx builds](https://builds.bepinex.dev/projects/bepinex_be)
that can automatically load interop assemblies before plugins (builds 710 and
later)
**When submitting issues**, please submit your BepInEx log file with all log levels enabled. You can do this by setting `Logging.Disk.LogLevels` in `BepInEx.cfg` to `All`.
**When submitting issues**, please submit your BepInEx log file with all log
levels enabled. You can do this by setting `Logging.Disk.LogLevels` in
`BepInEx.cfg` to `All`.
### Compiling
Unlike the Mono patch, some assemblies must be referenced.
Run BepInEx interop on your build and add the following assemblies to new folder `.\AssemblyReferences\` in this project directory:
* `BepInEx/interop/Assembly-CSharp.dll`
* `BepInEx/interop/Il2Cppmscorlib.dll`
* `BepInEx/interop/Il2CppSystem.dll`
* `BepInEx/interop/Photon3Unity3D.dll`
* `BepInEx/interop/RecRoom.Datastructures.Runtime`
* `BepInEx/interop/UnityEngine.CoreModule.dll`
Run BepInEx interop on your build and add the following assemblies to new folder
`.\AssemblyReferences\` in this project directory:
- `BepInEx/interop/Assembly-CSharp.dll`
- `BepInEx/interop/Il2Cppmscorlib.dll`
- `BepInEx/interop/Il2CppSystem.dll`
- `BepInEx/interop/Photon3Unity3D.dll`
- `BepInEx/interop/RecRoom.Datastructures.Runtime`
- `BepInEx/interop/UnityEngine.CoreModule.dll`
## Dependencies
- Mapster
- Requires `Mapster.dll` and `Mapster.Core.dll` (place in /BepInEx/plugins)
- [Mapster on GitHub](https://github.com/MapsterMapper/Mapster)
### Linux users
Wine currently has problems generating the keypair used in Galvanic authentication.
Wine currently has problems generating the keypair used in Galvanic
authentication.
You can use a real Windows system to generate the keys for the first startup.
If you're unsure how to start your build on linux:
* Install Steam
* Add Rec Room as a non-steam game
* Set the compatibility mode to the latest stable version of proton
* Use protontricks to add the doorstop DLL
* Start Rec Room through Steam
- Install Steam
- Add Rec Room as a non-steam game
- Set the compatibility mode to the latest stable version of proton
- Use protontricks to add the doorstop DLL
- Start Rec Room through Steam
### (AssetChanges) and (GameManager Patches)
Properties of the object in the patch file will be used to set the properties of the respective object in the game's assembly.
Properties of the object in the patch file will be used to set the properties of
the respective object in the game's assembly.
Each object type can be configured as follows:
* `AGRoomRuntimeConfig.Room` or `AGRoomRuntimeConfig.RoomScene` or `AGRoomRuntimeConfig.Location`
- Set the key to the replicationId of the object you want to change
* Any object with a replicationId can be changed
- Objects in the list have properties "Key" and "Value"
* The key represents the name of the property to modify
* The value will replace the current value in the assembly
- Example:
```json
{"76d98498-60a1-430c-ab76-b54a29b7a163": [
- `AGRoomRuntimeConfig.Room` or `AGRoomRuntimeConfig.RoomScene` or
`AGRoomRuntimeConfig.Location`
- Set the key to the replicationId of the object you want to change
- Any object with a replicationId can be changed
- Objects in the list have properties "Key" and "Value"
- The key represents the name of the property to modify
- The value will replace the current value in the assembly
- Example:
```json
{
"76d98498-60a1-430c-ab76-b54a29b7a163": [
{
"Key": "ReleaseStatus",
"Value": 0
}
]}
```
will prevent you from loading into the dorm, because you can't go to editor-only rooms.
You can set rooms with ReleaseStatus:0 to 2 if you'd like to go to those rooms.
This isn't very useful for most people. You *should* set this when using `TeamConfiguration` below.
* `GameConfigurationAsset`
- List of changes to the game configurations
- See the example for syntax
* Ex. "Crescendo Of The Blood Moon" (CrescendoOfTheBloodMoon_Config, 20200306)
- Example:
```json
[
{
"GameName": "Crescendo Of The Blood Moon",
"TeamConfigurations": [
{"Size":6},
{"Size":6}
]
},
{
"GameName": "Paintball Capture The Flag",
"TeamConfigurations": [
{"Size":1},
{"Size":1},
{"Size":1},
]
}
]
```
* Some games have issues with spawning players from other teams into regular spawnpoints. Use `GameFreeSpawns` to remedy this.
* GameFreeSpawns
- Sets every current playing spawnpoint to be available to any team
- Allows more than 4 players to spawn in correctly in quests like Crescendo
- List the game names (strings) to enable the patch for
- Example:
```json
["Crescendo Of The Blood Moon", "Paintball Capture The Flag"]
```
}
```
will prevent you from loading into the dorm, because you can't go to
editor-only rooms. You can set rooms with ReleaseStatus:0 to 2 if you'd like
to go to those rooms. This isn't very useful for most people. You _should_
set this when using `TeamConfiguration` below.
- `GameConfigurationAsset`
- Dictionary of changes to the game configurations
- Must use the entire game configuration when including one
- See the example for syntax
- Example:
```json
{
"Soccer": {
"Name": "COOLER Soccer",
"LoadPriority": -1,
"ManualGameStartRequirement": {
"MinPlayerCount": 2,
"MinTeamCount": 2,
"MinTeamSize": 1
},
"AutomaticGameStartSupported": false,
"AutomaticGameStartRequirement": {
"MinPlayerCount": -1,
"MinTeamCount": -1,
"MinTeamSize": -1
},
"PreGameVoiceOverSupported": true,
"ResultsVoiceOverSupported": true,
"CountdownVoiceOverSupported": true,
"GameModeNotificationsSupported": true,
"InGamePlayerNotificationsSupported": true,
"GameStartDelay": 10.0,
"EndGameResultsDuration": 15.0,
"RespawnOnGameStartSupported": true,
"RespawnOnGameEndSupported": true,
"JoinInProgressSupported": true,
"TeamConfigurations": [
{
"MaxTeamSize": 12
},
{
"MaxTeamSize": 12
}
],
"TeamSelectionMethod": 2,
"EndGameIfStartRequirementsNotMet": true,
"ExplicitTeamSelectionSupported": false,
"GameRunningTeamChangeSupported": false,
"RespawnOnGameRunningTeamChangeSupported": true,
"SpectatingSupported": true,
"ShowOpenSlotsOnScoreboard": true,
"ClearTeamsAfterGame": true,
"TeamPlayerVisualSettings": {
"UseTeamNameInsteadOfPlayerNameInNotifications": true,
"UseTeamColorInFeedback": true,
"TeamColorMode": 0,
"TeamOutfitsSupported": true,
"TeammateBeaconMode": 0,
"OpponentBeaconMode": 0
},
"TeamRadioSupported": true,
"TeamRadioSettings": {
"RadioVolume": 0.12,
"EnterRadioDistance": 1.5,
"ExitRadioDistance": 1.0
},
"StatConfigurations": [
{
"Name": "Stat 1",
"HideInUI": true,
"HideInHUD": true,
"Format": 0
},
{
"Name": "Stat 2",
"HideInUI": true,
"HideInHUD": true,
"Format": 0
},
{
"Name": "Stat 3",
"HideInUI": true,
"HideInHUD": true,
"Format": 0
},
{
"Name": "Stat 4",
"HideInUI": true,
"HideInHUD": true,
"Format": 0
},
{
"Name": "Stat 5",
"HideInUI": true,
"HideInHUD": true,
"Format": 0
},
{
"Name": "Stat 6",
"HideInUI": true,
"HideInHUD": true,
"Format": 0
},
{
"Name": "Stat 7",
"HideInUI": true,
"HideInHUD": true,
"Format": 0
},
{
"Name": "Stat 8",
"HideInUI": true,
"HideInHUD": true,
"Format": 0
},
{
"Name": "Stat 9",
"HideInUI": true,
"HideInHUD": true,
"Format": 0
},
{
"Name": "Stat 10",
"HideInUI": true,
"HideInHUD": true,
"Format": 0
}
],
"PersistStatsOnGameStart": false,
"MaxHealth": 100,
"MaxShield": 0,
"SuppressWeaponDamage": false,
"AutoHealSupported": false,
"AutoHealSettings": {
"Delay": 0.0,
"Duration": 0.0
},
"DownButNotOutSupported": false,
"DownButNotOutSettings": {
"MaxDepletionDuration": 0.0,
"InvincibilityDuration": 0.0
},
"AutoRespawnSupported": true,
"RespawnSettings": {
"AutoRespawnDelay": 5.0,
"RestoreHealthOnRespawn": true,
"RespawnInvincibilityDuration": 3.0
},
"ReviveMode": 0,
"ReviveSettings": {
"RequiredDelay": 0.0,
"MaxReviveHealthNormalized": 1.0,
"MinReviveHealthNormalized": 1.0,
"MultiplierPerReviveHealthNormalized": 1.0,
"PickupToolsOnRevive": false,
"ReviverInvincibilityDuration": 0.0,
"ReviveeInvincibilityDuration": 0.0,
"HandshakeHoldDuration": 0.0
},
"HUDSupported": false,
"FriendlyFireSettings": {
"PlayerOnPlayerFriendlyFireSupported": false,
"PlayerOnEnemyFriendlyFireSupported": false,
"EnemyOnPlayerFriendlyFireSupported": false,
"EnemyOnEnemyFriendlyFireSupported": false,
"GrenadesCanDamageTeammates": true
},
"PlayerCombatUISettings": {
"LocalPlayerUISupported": false,
"OpponentUISupported": true,
"TeammateUISupported": true,
"TeammateUIAlwaysVisible": false,
"OpponentUIAlwaysVisible": false
},
"EnemyCombatUISettings": {
"OpponentUISupported": true,
"TeammateUISupported": false
},
"DeadMonochromeEffectSupported": true,
"DownButNotOutMonochromeEffectSupported": true,
"DamageRedFlashEffectSupported": true,
"DefaultHitFeedbackSupported": true,
"DefaultReviveFeedbackSupported": true,
"DefaultDownedOpponentFeedbackSupported": true,
"DefaultDownedLocalPlayerFeedbackSupported": true,
"DefaultDownedTeammateFeedbackSupported": false,
"DeadPersistentNotificationSupported": true,
"SpawnPointSelectionMethod": 2,
"MainHandTool": -1,
"OffHandTool": -1,
"ResetToolsOnGameStartSupported": true,
"BrokenToolBehavior": 0,
"EquipmentBeaconsSupported": true,
"WeaponInfiniteAmmoSupported": false,
"TeleportBufferDistanceRetricted": false,
"OutOfBoundsSupported": false,
"OutOfBoundsSpectatorsSupported": false,
"DownOutOfBoundsPlayers": false,
"OutOfBoundsGracePeriod": 3.0,
"OutOfBoundsMaxDuration": 4.0
}
}
```
- Some games have issues with spawning players from other teams into regular
spawnpoints. Use `GameFreeSpawns` to remedy this.
- GameFreeSpawns
- Sets every current playing spawnpoint to be available to any team
- Allows more than 4 players to spawn in correctly in quests like Crescendo
- List the game names (strings) to enable the patch for
- Example:
```json
["Crescendo Of The Blood Moon", "Paintball Capture The Flag"]
```