This repository has been archived on 2026-05-30. You can view files and clone it, but cannot push or open issues or pull requests.
Files
undead-universal-patch-il2cpp/README.md
2026-05-21 20:03:09 +00:00

9.5 KiB

Undead Universal Patch

This project is currently in private development and public support will be paused while we prepare for Rec Room's shutdown.

Non-EAC, IL2CPP build patcher for Rec Room (Dec 2018*-*Apr 3 2020)

Only supports unobfuscated builds. EAC build support will never be provided.

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 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.

Server Developers

Hi developers. You can implement Undead patch configurations here.

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/RecRoom.Promises.Runtime
  • BepInEx/interop/UnityEngine.CoreModule.dll
  • BepInEx/interop/UnityEngine.TextRenderingModule.dll

Dependencies

  • Mapster
    • Requires Mapster.dll and Mapster.Core.dll (place in /BepInEx/plugins)
    • Mapster on GitHub

Linux users

See the Linux installation instructions. You may need to work around your distribution's package manager to install the necessary packages.

GameManager Patches

THESE WILL SOON BE MOVED TO SERVER 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:

  • GameConfigurationAsset
    • Dictionary of changes to the game configurations
    • Must use the entire game configuration when including one
    • See the example for syntax
    • Example:
      {
          "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:
      ["Crescendo Of The Blood Moon", "Paintball Capture The Flag"]