Valheim 插件开发教程:实现版本验证插件-C#语言论坛-编程语言区-资源工坊-游戏模组资源分享

Valheim 插件开发教程:实现版本验证插件

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("版本验证插件 - 客户端版本与服务器版本匹配!"); // 记录日志
            }
        }
    }
}

 

请登录后发表评论

    没有回复内容