Valheim 是一款受欢迎的沙盒生存游戏,允许玩家在一个神秘的北欧世界中建造和生存。通过使用BepInEx和HarmonyLib框架,您可以为Valheim创建自定义插件,以扩展游戏的功能。在这篇教程中,我们将指导您如何创建一个版本验证插件,以确保游戏客户端与服务器端的版本匹配。以下是如何实现这一目标的详细步骤。
步骤1:创建一个新的 Valheim 插件项目
首先,您需要创建一个新的Valheim插件项目。您可以使用BepInEx模板来快速开始。确保您有安装并配置了BepInEx框架。
步骤2:创建插件代码
在插件项目中,创建一个新的C#类,将其命名为 VersionCheckPlugin
或您喜欢的其他名称。将以下代码添加到该类中:
using HarmonyLib;
using System;
using System.Collections.Generic;
using BepInEx;
namespace YourModNamespace
{
[BepInPlugin("com.example.yourmod", "版本验证插件", "1.0.0")]
public class VersionCheckPlugin : BaseUnityPlugin
{
public const string ModVersion = "1.0.0"; // 设置你的插件版本号
private void Awake()
{
var harmony = new Harmony("com.example.yourmod");
harmony.PatchAll();
}
}
// 其他代码...
}
这个代码创建了一个Valheim插件,定义了插件的基本信息和版本号。
步骤3:编写版本验证逻辑
接下来,我们将添加版本验证逻辑。在这个示例中,我们将确保客户端的插件版本与服务器的插件版本匹配。以下是添加的代码片段:
[HarmonyPatch(typeof(ZNet), "OnNewConnection")]
public static class RegisterAndCheckVersion
{
// 存储已验证的客户端的RPC连接
public static List<ZRpc> _validatedPeers = new List<ZRpc>();
private static void Prefix(ZNetPeer peer, ref ZNet __instance)
{
// 注册版本检查调用
ZLog.Log("版本验证插件 - 注册版本RPC处理程序"); // 记录日志
peer.m_rpc.Register<ZPackage>("YOURMOD_Version", new Action<ZRpc, ZPackage>(RpcHandlers.RPC_YOURMOD_Version));
// 进行版本检查调用
ZLog.Log("版本验证插件 - 调用版本检查"); // 记录日志
ZPackage zpackage = new ZPackage();
zpackage.Write(VersionCheckPlugin.ModVersion); // 将插件版本信息写入数据包
peer.m_rpc.Invoke("YOURMOD_Version", (object)zpackage); // 调用版本检查方法
}
}
public static class RpcHandlers
{
// 处理YOURMOD的版本检查RPC
public static void RPC_YOURMOD_Version(ZRpc rpc, ZPackage pkg)
{
string clientVersion = pkg.ReadString(); // 从数据包中读取客户端版本信息
ZLog.Log("版本验证插件 - 客户端版本: " + clientVersion + ",服务器版本: " + VersionCheckPlugin.ModVersion); // 记录版本检查日志
if (clientVersion != VersionCheckPlugin.ModVersion)
{
// 如果版本不匹配,强制断开与客户端的连接
ZLog.LogWarning("版本验证插件 - 客户端具有不兼容的版本,断开连接"); // 记录警告日志
rpc.Invoke("Error", 3); // 调用"Error"方法通知客户端并断开连接
}
else
{
// 版本匹配,处理版本一致的情况
ZLog.Log("版本验证插件 - 客户端版本与服务器版本匹配!"); // 记录日志
}
}
}
这段代码创建了版本验证逻辑,当客户端与服务器建立连接时,会发送版本信息并进行验证。如果版本不匹配,它会强制断开连接。
步骤4:启用专用服务器
如果您希望在专用服务器上启用插件,可以添加以下代码:
[HarmonyPatch(typeof(ZNet), "Awake")]
public static class EnableOnDedicatedServer
{
private static void Prefix(ref ZNet __instance)
{
// 在专用服务器上启用
if (__instance.IsDedicated())
{
ZLog.Log("版本验证插件 - 启用专用服务器"); // 记录日志
}
}
}
这段代码在专用服务器上启用插件并记录日志。
步骤5:安装和测试插件
最后,将编写的插件编译并安装到Valheim的BepInEx插件文件夹中。启动游戏以测试插件的功能。确保插件能够在客户端和服务器之间执行版本验证,并在版本不匹配时正确断开连接。
这篇教程介绍了如何创建一个版本验证插件,以确保Valheim的客户端和服务器版本匹配。通过使用BepInEx和HarmonyLib框架,您可以轻松地为Valheim创建自定义插件,以增强游戏的功能和安全性。希望这篇教程对您的Valheim插件开发项目有所帮助。
完整代码示例
using HarmonyLib;
using System;
using System.Collections.Generic;
using BepInEx;
namespace YourModNamespace
{
[BepInPlugin("com.example.yourmod", "版本验证插件", "1.0.0")]
public class VersionCheckPlugin : BaseUnityPlugin
{
public const string ModVersion = "1.0.0"; // 设置你的插件版本号
private void Awake()
{
var harmony = new Harmony("com.example.yourmod");
harmony.PatchAll();
}
}
[HarmonyPatch(typeof(ZNet), "Awake")]
public static class EnableOnDedicatedServer
{
private static void Prefix(ref ZNet __instance)
{
// 在专用服务器上启用
if (__instance.IsDedicated())
{
ZLog.Log("版本验证插件 - 启用专用服务器"); // 记录日志
}
}
}
[HarmonyPatch(typeof(ZNet), "OnNewConnection")]
public static class RegisterAndCheckVersion
{// 存储已验证的客户端的RPC连接
public static List<ZRpc> _validatedPeers = new List<ZRpc>();
private static void Prefix(ZNetPeer peer, ref ZNet __instance)
{
// 注册版本检查调用
ZLog.Log("版本验证插件 - 注册版本RPC处理程序"); // 记录日志
peer.m_rpc.Register<ZPackage>("YOURMOD_Version", new Action<ZRpc, ZPackage>(RpcHandlers.RPC_YOURMOD_Version));
// 进行版本检查调用
ZLog.Log("版本验证插件 - 调用版本检查"); // 记录日志
ZPackage zpackage = new ZPackage();
zpackage.Write(VersionCheckPlugin.ModVersion); // 将插件版本信息写入数据包
peer.m_rpc.Invoke("YOURMOD_Version", (object)zpackage); // 调用版本检查方法
}
}
// 在ZNet的RPC_PeerInfo方法前插入代码
[HarmonyPatch(typeof(ZNet), "RPC_PeerInfo")]
public static class VerifyClient
{
private static bool Prefix(ZRpc rpc, ZPackage pkg, ref ZNet __instance)
{
if (__instance.IsServer() && !RegisterAndCheckVersion._validatedPeers.Contains(rpc))
{
// 如果服务器端且尚未验证此客户端的版本,断开连接客户端
ZLog.LogWarning("版本验证插件 - 客户端从未发送版本信息,断开连接"); // 记录警告日志
rpc.Invoke("Error", (object)3); // 调用"Error"方法通知客户端并断开连接
return false; // 阻止调用底层方法
}
return true;
}
}
// 在ZNet的Disconnect方法前插入代码
[HarmonyPatch(typeof(ZNet), "Disconnect")]
public static class RemoveDisconnectedPeerFromVerified
{
private static void Prefix(ZNetPeer peer, ref ZNet __instance)
{
if (__instance.IsServer())
{
// 如果是服务器端,从验证列表中移除已断开的客户端
ZLog.Log("版本验证插件 - 客户端断开连接,从验证列表中移除"); // 记录日志
RegisterAndCheckVersion._validatedPeers.Remove(peer.m_rpc); // 从验证列表中移除客户端
}
}
}
public static class RpcHandlers
{
// 处理YOURMOD的版本检查RPC
public static void RPC_YOURMOD_Version(ZRpc rpc, ZPackage pkg)
{
string clientVersion = pkg.ReadString(); // 从数据包中读取客户端版本信息
ZLog.Log("版本验证插件 - 客户端版本: " + clientVersion + ",服务器版本: " + VersionCheckPlugin.ModVersion); // 记录版本检查日志
if (clientVersion != VersionCheckPlugin.ModVersion)
{
// 如果版本不匹配,强制断开与客户端的连接
ZLog.LogWarning("版本验证插件 - 客户端具有不兼容的版本,断开连接"); // 记录警告日志
rpc.Invoke("Error", 3); // 调用"Error"方法通知客户端并断开连接
}
else
{
// 版本匹配,处理版本一致的情况
ZLog.Log("版本验证插件 - 客户端版本与服务器版本匹配!"); // 记录日志
}
}
}
}
没有回复内容