forked from zombieb/undead-universal-patch-il2cpp
290 lines
10 KiB
Markdown
290 lines
10 KiB
Markdown
# 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.
|
|
|
|
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`.
|
|
|
|
### 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`
|
|
|
|
## 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.
|
|
|
|
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
|
|
|
|
### (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.
|
|
|
|
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": [
|
|
{
|
|
"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`
|
|
- 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"]
|
|
```
|