NicholaScott.BepInEx.RuntimeNetcodeRPCValidator
0.2.0
See the version list below for details.
dotnet add package NicholaScott.BepInEx.RuntimeNetcodeRPCValidator --version 0.2.0
NuGet\Install-Package NicholaScott.BepInEx.RuntimeNetcodeRPCValidator -Version 0.2.0
<PackageReference Include="NicholaScott.BepInEx.RuntimeNetcodeRPCValidator" Version="0.2.0" />
paket add NicholaScott.BepInEx.RuntimeNetcodeRPCValidator --version 0.2.0
#r "nuget: NicholaScott.BepInEx.RuntimeNetcodeRPCValidator, 0.2.0"
// Install NicholaScott.BepInEx.RuntimeNetcodeRPCValidator as a Cake Addin #addin nuget:?package=NicholaScott.BepInEx.RuntimeNetcodeRPCValidator&version=0.2.0 // Install NicholaScott.BepInEx.RuntimeNetcodeRPCValidator as a Cake Tool #tool nuget:?package=NicholaScott.BepInEx.RuntimeNetcodeRPCValidator&version=0.2.0
Runtime Unity Netcode Patcher
This plugin offers an easy-to-use solution for Netcode's NetworkBehaviour class, streamlining the approach to networking mods with Server and Client RPCs. By utilizing the CustomMessagingHandler of Netcode, it networks RPCs and their System.Serializable (Marked with [Serializable]) or INetworkSerializable parameters. While this is currently only in the Lethal Company directory, it can be expanded to other games upon request. Please reach out on Discord or via an issue here on Github for questions or contact.
Table of Contents
Getting Started
To integrate Runtime Unity Netcode Patcher in your Unity project, follow these steps:
- Reference Runtime Netcode RPC Validator: Either by utilizing a NuGet package inside visual studio
dotnet add package NicholaScott.BepInEx.RuntimeNetcodeRPCValidator --version 0.2.0
and add an[BepInDependency(RuntimeNetcodeRPCValidator.MyPluginInfo.PLUGIN_GUID, RuntimeNetcodeRPCValidator.MyPluginInfo.PLUGIN_VERSION)]
attribute to your[BepInPlugin]
. - Instantiate NetcodeValidator: Create and maintain a reference to an instance of
NetcodeValidator
and callNetcodeValidator.PatchAll()
. When you wish to revert any patches applied callDispose()
, orUnpatchSelf()
if you want to keep the instance for re-patching. - Define and Use RPCs: Ensure your Remote Procedure Calls on your NetworkBehaviours have the correct attribute and end their name with ServerRpc/ClientRpc.
Examples
For more robust examples check the Github Repo of the UnitTester plugin, which is used during development to verify codebase.
// Example of using NetcodeValidator
namespace SomePlugin {
[BepInPlugin("My.Plugin.Guid", "My Plugin Name", "0.1.1")]
[BepInDependency(RuntimeNetcodeRPCValidator.MyPluginInfo.PLUGIN_GUID, RuntimeNetcodeRPCValidator.MyPluginInfo.PLUGIN_VERSION)]
public class MyPlugin : BaseUnityPlugin {
private NetcodeValidator netcodeValidator;
private void Awake()
{
netcodeValidator = new NetcodeValidator("My.Plugin.Guid");
netcodeValidator.PatchAll();
}
// [[OPTIONAL DISPOSE TO UNPATCH]]
private void OnDestroy()
{
netcodeValidator.Dispose();
}
}
}
// Example of using Server or Client RPCs. Naming conventions require the method to end with the corresponding attribute name.
namespace SomePlugin {
// This assumes you've declared a BaseUnityPlugin and Harmony instance elsewhere. Including the previous snippet about NetcodeValidator.
[HarmonyPatch(typeof(Terminal), "Start")]
private static class Patch {
[HarmonyPrefix]
private static void AddToTerminalObject(Terminal __instance) {
__instance.gameObject.AddComponent<PluginNetworkingInstance>();
}
}
public class PluginNetworkingInstance : NetworkBehaviour {
[ServerRpc]
public void SendPreferredNameServerRpc(string name) {
// Log the received name
Debug.Log(name);
// Tell all clients what the sender told us
TellAllOtherClients(NetworkBehaviourExtensions.LastSenderId, name);
}
[ClientRpc]
public void TellAllOtherClients(ulong senderId, string name) {
Debug.Log(StartOfRound.Instance.allPlayerScripts.First(playerController => playerController.actualClientId == senderId).playerUsername + " is now " + name);
}
[ClientRpc]
public void RunClientRpc() {
// Send to the server what our preferred name is, f.e.
SendPreferredNameServerRpc("Nicki");
}
private void Awake()
{
// Are we a server instance?
if (IsHost)
StartCoroutine(WaitForSomeTime());
}
private IEnumerator WaitForSomeTime()
{
// We need to wait because sending an RPC before a NetworkObject is spawned results in errors.
yield return new WaitUntil(() => NetworkObject.IsSpawned);
// Tell all clients to run this method.
RunClientRpc();
}
}
}
Prerequisites
Ensure you have the following components within the environment:
- Unity's Netcode for GameObjects (NGO): For handling networked entities and communications.
- Harmony: A powerful library for patching, replacing and decorating .NET and Mono methods during runtime.
Notes
Utilize the NetworkBehaviourExtensions.LastSenderId
property to retrieve the ID of the last RPC sender. This will always be NetworkManager.ServerClientId
on the clients.
Built With
- Harmony - For runtime method patching.
- Unity's Netcode for GameObjects (NGO) - For robust networking in Unity.
Acknowledgments
- @Lordfirespeed for invaluable support and insights throughout the development.
Contributing
We welcome contributions! If you would like to help improve the Runtime Unity Netcode Patcher, please submit pull requests, and report bugs or suggestions in the issues section of this repository.
Contact
Discord: www.day.dream
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- BepInEx.Core (>= 5.4.21)
- BepInEx.PluginInfoProps (>= 2.1.0)
- LethalCompany.GameLibs.Steam (>= 45.0.2-alpha.1)
- MinVer (>= 4.3.0)
- UnityEngine.Modules (>= 2022.3.9)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.