RugbugRedfern.MyceliumNetworking.CW
1.0.5
See the version list below for details.
dotnet add package RugbugRedfern.MyceliumNetworking.CW --version 1.0.5
NuGet\Install-Package RugbugRedfern.MyceliumNetworking.CW -Version 1.0.5
<PackageReference Include="RugbugRedfern.MyceliumNetworking.CW" Version="1.0.5" />
paket add RugbugRedfern.MyceliumNetworking.CW --version 1.0.5
#r "nuget: RugbugRedfern.MyceliumNetworking.CW, 1.0.5"
// Install RugbugRedfern.MyceliumNetworking.CW as a Cake Addin #addin nuget:?package=RugbugRedfern.MyceliumNetworking.CW&version=1.0.5 // Install RugbugRedfern.MyceliumNetworking.CW as a Cake Tool #tool nuget:?package=RugbugRedfern.MyceliumNetworking.CW&version=1.0.5
An easy to use networking library for sending custom RPCs through Steam.
A note
Landfall has asked mod developers not to send lots of data through Photon, which is the networking solution mainly used by the game. This is because they have to pay for all the bandwidth that modders use. To solve this issue, this mod was created to be used as an alternative to Photon. With MyceliumNetworking, RPCs can be used in a very similar fashion to Photon without compromising on features.
Usage
- Add MyceliumNetworkingForCW.dll as a reference in your Visual Studio solution.
- Add
using MyceliumNetworking;
at the top of your script.
Defining RPCs
To define an RPC, simply add the [CustomRPC] attribute to a method:
[CustomRPC]
void ChatMessage(string message)
{
Debug.Log("Received chat message: " + message);
}
To get the player who sent an RPC, add a RPCInfo as the final parameter in your RPC. You don't need to send the info yourself, it will be provided automatically if you include the parameter.
[CustomRPC]
void ChatMessage(string message, RPCInfo info)
{
CSteamID sender = info.SenderSteamID;
string username = SteamFriends.GetFriendPersonaName(sender);
Debug.Log("Received chat message from " + username + ": " + message);
}
You can add as many arbitrary parameters to an RPC as you want, and they will automatically be synced when used.
[CustomRPC]
void DoSomething(string message, int num, ulong id)
{
Debug.Log("The message is " + message);
Debug.Log("The num is " + num);
Debug.Log("The id is " + id);
}
Calling RPCs
To call an RPC, first register the object with the network. Each mod needs a unique ID, which is just a random number you define unique to your mod. This is to make sure mods don't accidentally call an RPC on a separate mod. I recommend you store the modId as a constant somewhere in your program.
const uint modId = 12345;
void Start()
{
MyceliumNetwork.RegisterNetworkObject(this, modId);
}
To call the RPC, use MyceliumNetwork.RPC
. Pass in the mod ID, the name of the RPC you are calling, what kind of reliability you want the RPC to have (leave it at Reliable if you are unsure), and the parameters to pass in the RPC:
// This will call the RPC named ChatMessage on all clients, with the parameter "Hello World!" being sent.
MyceliumNetwork.RPC(modId, nameof(ChatMessage), ReliableType.Reliable, "Hello World!");
You can also call an RPC on a specific player using MyceliumNetwork.RPCTarget
.
// This will call the RPC named ChatMessage on only the specified player, with the parameter "Hello World!" being sent.
MyceliumNetwork.RPCTarget(modId, nameof(ChatMessage), targetSteamId, ReliableType.Reliable, "Hello World!");
Keypress Syncing Demo
To demonstrate how to define and send RPCs, there is a full demo you can access here, but this is the main important script. It simply demonstrates how to use the RPCs by sending all key presses between players to the console.
using MyceliumNetworking;
using Steamworks;
using System;
using UnityEngine;
namespace MyceliumNetworkingTest
{
internal class SyncedGameObject : MonoBehaviour
{
void Start()
{
MyceliumNetwork.RegisterNetworkObject(this, BasePlugin.MOD_ID);
}
void Update()
{
foreach(KeyCode kcode in Enum.GetValues(typeof(KeyCode)))
{
if(Input.GetKeyDown(kcode))
{
MyceliumNetwork.RPC(BasePlugin.MOD_ID, nameof(KeyReceived), ReliableType.Reliable, kcode.ToString());
}
}
}
[CustomRPC]
public void KeyReceived(string keyPressed, RPCInfo info)
{
CSteamID sender = info.SenderSteamID;
string username = SteamFriends.GetFriendPersonaName(sender);
Debug.Log("Received key from " + username + ": " + keyPressed);
}
}
}
Using Masks
Sometimes you only want to run an RPC on a single instance of an object, for example calling an RPC on one player. To do this, you use masks.
Pass the ViewID of the PhotonView on your object in as the mask when registering a network object.
class PlayerTest : MonoBehaviour
{
void Start()
{
MyceliumNetwork.RegisterNetworkObject(this, BasePlugin.MOD_ID, GetComponent<PhotonView>().ViewID);
}
}
Then when calling the RPC, use the Masked variant.
MyceliumNetwork.RPCMasked(modId, nameof(KillPlayer), ReliableType.Reliable, GetComponent<PhotonView>().ViewID, "You Died!");
A masked RPC will only be called on objects with the same mask. Using this, you can make the RPC only be called on a single PhotonView, synced across clients.
Need Help?
Join the Content Warning Modding discord and @ me (@rugdev): https://discord.gg/yeGDSm4gFq
Credits
Contributors
- Rugbug Redfern
- Sprinkles
- zatrit
- Xilophor
Playtesting
Code License: Attribution-NonCommercial-ShareAlike 4.0 International
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
- No dependencies.
NuGet packages (2)
Showing the top 2 NuGet packages that depend on RugbugRedfern.MyceliumNetworking.CW:
Package | Downloads |
---|---|
RedstoneWizard08.ConfigurableWarning
Makes the game configurable! |
|
rivinwin.MortalEnemies
A Content Warning mod to make enemies damageable, used as a dependancy. |
GitHub repositories
This package is not used by any popular GitHub repositories.