C#骑砍逻辑类Mod制作详细解说

前言:

最近在研究骑砍的mod,主要是想修改其中的逻辑部分,因此有了这篇帖子。

一,文件夹与XML配置

在Modules创建一个新文件夹,文件夹名称随意,不影响实际的读取。

文件夹下面的位置需要固定,因为我只是为了修改逻辑,所以只需要bin\Win64_Shipping_Client,这是之后放dll位置的地方。

XML的配置如下:

 <Module><Name value="YeMod"/><Id value="YeMod"/><Version value="v1.0.0"/><SingleplayerModule value="true"/><MultiplayerModule value="false"/><DependedModules><DependedModule Id="Native"/><DependedModule Id="SandBoxCore"/><DependedModule Id="Sandbox"/><DependedModule Id="CustomBattle"/><DependedModule Id="StoryMode" /></DependedModules><SubModules><SubModule><Name value="YeMod"/><DLLName value="YeMod.dll"/><SubModuleClassType value="YeMod.Main"/><Tags><Tag key="DedicatedServerType" value="none" /><Tag key="IsNoRenderModeElement" value="false" /></Tags></SubModule></SubModules><Xmls/></Module>

参考论坛里面xml的配置方式,大概说明如下:

*1

<?xml version="1.0" encoding="utf-8"?>,SubModule文件里有的开头有的会有这样的标头,这个代表的意思是:声明这个文件是个xml类型,1.0版,用的utf-8编码。(其实这句话在SubModule文件里带不带都无所谓,它默认就按这个执行,你不带这句话把mod名称打成中文都可以。)另外,紧跟着会有个<Module>,这个<Module>和文件结尾的</Module>是一对,一个是开始标记,一个结束标记,无论隔多远,这两个符号之间的都是一个段落,所以这两个少一个就出错。还有一些标记是这样的:<Name value=" "/>,标记<之后找它后面最近的/>配对,这之间的语句是一个封闭的语句(不知道专业名称用的对不对,反正是这样用的)。

*2

<Name value=" "/> 这是mod在启动器里显示的名称,可以打成中文或英文,和id没关系,可以随便起。

*3

<Id value=" "/>这个对应mod文件夹名称,不区分大小写。

*4

<Version value="v1.0.0"/> 这个讲就是在启动器里显示的mod版本,你填什么那里显示什么,但要用v开头,用e开头之前试过,会报错。

*5

<SingleplayerModule value="true"/>是单人模式的mod吗?是的话填true,不是填false,我们这里填true。<MultiplayerModule value="false"/>不是多人模式mod,直接填false。

*6

<DependedModules>和</DependedModules>之间这几个=""里是需要依赖哪些mod,一般填官方这几个就可以,最少也要填一个,不能空,不然会报错。
    <DependedModules>
        <DependedModule Id="Native"/>
        <DependedModule Id="SandBoxCore"/>
        <DependedModule Id="Sandbox"/>
        <DependedModule Id="CustomBattle"/>
        <DependedModule Id="StoryMode" />
    </DependedModules>

*7

<SubModules>和</SubModules>之间的放所有mod所需的dll文件,如果不需要dll文件,就把<SubModules>和</SubModules>之间的内容全部删除。如果有dll文件,就要把每个dll文件的各个属性都要放在一对<SubModule></SubModule>之间的。接着说下每个dll的属性内容填写:①<Name value=" "/>,随便起名,中文英文都可以,但最好别和别的dll文件名字重名。
②<DLLName value="xxx.dll"/>,这里就是所需dll文件在bin\Win64_Shipping_Client目录下的文件名,要填写正确,复制粘贴过来就好。
③<SubModuleClassType value="xxx.xxx"/>,这里在一楼讲过,对应的是dll文件里的“空间名.类型名”。
④<Tags></Tags>,这之间填mod的类型属性,主要起个标识作用,只要用到dll,就一定要有这对标记,不然会报错,但这之间的内容可以不填,假如想填可以把别人mod里的复制过来,至于填什么没实际影响,总之有dll,<Tags></Tags>这对标记就要有,但之间的内容可填可不填,保证文件格式正确就行了。

*8

<Xmls></Xmls>,这对标记之间放mod需要的所有xml文档,每个xml文档要用一对<XmlNode> </XmlNode> 括起来,这之间填每个xml文档的属性。
①<XmlName id=" " path=" "/>,id=" "里填mod需要加载的xml文档的命名空间名称,例如你创建了一个新人物,人物属于NPCCharacters这个命名空间里的,这个文档里都是新建人物,所以这里填NPCCharacters,假如是新增武器,就要填Items。path=" "这里填需要加载的xml文档名称,不需要带后缀名,比如你新建人物的xml文档的名称是hero.xml,那这里就填hero。
②<IncludedGameTypes></IncludedGameTypes>这对标记之间填xml文档对应游戏类型,只要也是标识作用,不填也不要紧,甚至连这对标记都可以不要,想填可以把别人的复制过来,填什么没影响,但要注意文件格式正确。
 

最后我们打开外层的TaleWorlds.MountAndBlade.Launcher.exe,就可以看到我们配置的mod选项出现:

用mod配置器进入之后,会报错如下,大概意思就是缺少对应的dll,这个是正常的,接下来补上就是:

二,代码编写

通过VS建立一个类库工程,建立的步骤可以参考这个帖子。大概流程就是:

1,改下输出目录为mod的目录;

2,通过NuGet工具下载harmony,关于工具的使用,可以看上个帖子。

3,创建继承于MBSubModuleBase的Main.cs文件(这里MsgBox是测试函数,可除去)

using HarmonyLib;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using TaleWorlds.MountAndBlade;namespace YeMod
{public class Main:MBSubModuleBase{protected override void OnSubModuleLoad(){base.OnSubModuleLoad();try{new Harmony("YeMod").PatchAll();MsgBox(0, "succenss", "msg box", 0x30);}catch{MsgBox(0, "error", "msg box", 0x30);}}[DllImport("user32.dll", EntryPoint = "MessageBoxA")]public static extern int MsgBox(int hWnd, string msg, string caption, int type);}
}

4,创建一个类,来修改对应的方法。比如,这里我要修改Agent类中的Die方法:

using HarmonyLib;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using TaleWorlds.MountAndBlade;namespace YeMod
{[HarmonyPatch(typeof(Agent), "Die")]public class Test{private static bool Prefix(Blow b, Agent.KillInfo overrideKillInfo,Agent __instance){MsgBox(0, "die", "msg box", 0x30);return false;}[DllImport("user32.dll", EntryPoint = "MessageBoxA")]public static extern int MsgBox(int hWnd, string msg, string caption, int type);}
}

关于补丁参数该怎么填,可以看这个帖子,重点内容如下:

三,真实测试

进入游戏的时候,会有如下弹窗表示启动成功:

战斗死亡的时候,会有如下提示:

点掉之后,发现对方并未死亡,因为我们已经将死亡函数给拦截了。

其它可自己引申,老板需要定制请私信联系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

八股总结-----C++、数据结构、算法

1.内存基础 11.内存分区 代码区&#xff1a;存储可执行代码&#xff08;程序指令&#xff09;。 全局区&#xff1a;存储全局变量和静态变量&#xff08;已初始化和未初始化&#xff09;。 堆区&#xff1a;用于动态内存分配&#xff0c;由程序员管理。 栈区&#xff1a;存…

python:reportlab 生成PDF文件,生成基因图谱

reportLab是 python的一个第三方库&#xff0c;它能够用来生成PDF文件。这个库提供了一系列的工具&#xff0c;允许用户从简单的文档到复杂的多列布局进行PDF的创建和编辑。 使用 reportLab&#xff0c;你可以执行以下功能&#xff1a; 创建文本块、图片、图表等元素。 利用绘…

JS中【浅克隆】和【深克隆】方法解读

在JavaScript中&#xff0c;“克隆”指的是创建一个对象或数组的副本。克隆可以分为浅克隆和深克隆两种方式。了解这两种克隆的差异对编程非常重要。 浅克隆&#xff08;Shallow Clone&#xff09; 浅克隆会复制对象或数组的第一层属性&#xff0c;但对于嵌套的对象或数组&am…

如何通过rsync+sersync 实现同步备份

该文档是在很早之前写的&#xff0c;一直存在草稿箱中&#xff0c;最近在整理其它学习资料时发现还没有发布&#xff0c;内容和方法有可能和现在的操作系统版本有些不符合了&#xff0c;但处理思路没有变化&#xff0c;大家可以根据最新版本要求&#xff0c;参照该文档进行配置…

JVM调优原理

文章目录 引言I 调整JVM的默认堆内存配置1.1 java命令启动jar包时配置JVM 的内存参数1.2 基于Tomcat服务器部署的java应用,配置JVM 的内存参数II JVM GC 调优基本概念: 应用程序的响应时间(RT)和吞吐量(QPS)JVM调优原理调优思路调优方法JVM调优技巧建议引言 内存参数:ht…

南阳施工企业资质续期成本详解与节省策略

南阳施工企业资质续期费用涉及多个方面&#xff0c;包括官方收取的费用、咨询与代办费用、材料准备与审核费用等。以下是对这些费用的详细解析以及相应的节省方法&#xff1a; 一、费用详述 1. 官方收取的费用 延期申请费&#xff1a;这是办理资质续期时必须缴纳的费用&…

闲置物品|基于SprinBoot+vue的校园闲置物品交易平台(源码+数据库+文档)

校园闲置物品交易平台 目录 基于SprinBootvue的校园闲置物品交易平台 一、前言 二、系统设计 三、系统功能设计 5.1系统功能实现 5.2管理员模块实现 5.3用户模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xf…

项目:基于TCP的文件传输系统

项目介绍: 模拟FTP原理&#xff1a;客户端连接服务器后&#xff0c;向服务器发送一个文件。文件名可以通过参数指定&#xff0c;服务器端接收客户端传来的文件&#xff08;文件名随意&#xff09;&#xff0c;如果文件不存在自动创建文件&#xff0c;如果文件存在&#xff0c;…

PsConvertToGuiThread函数调用前传

PsConvertToGuiThread函数调用前传 第一部分&#xff1a;位置 chchenghaodeiMac base % grep "Kss_ErrorHandler" -nr ./ .//ntos/ke/i386/trap.asm:1026:Kss_ErrorHandler: .//ntos/ke/i386/trap.asm:1220: jae Kss_ErrorHandler ; if ae, try…

matlab 相位解缠

目录 一、功能概述1、相位解缠2、主要函数二、代码实现1、螺旋线的正确相位角2、使用不同阈值平移相位角3、将相移应用于矩阵三、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 一、功能概述 1、相位解缠 对…

FPGA实现多功能SDI视频采集卡,基于GTX+RIFFA架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案本博已有的 SDI 编解码方案 3、详细设计方案设计框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGBFDMA图像缓存RIFFA用户数据控制RIFFA架构详解Xilinx 7 Series Integrated Bloc…

C#面:ASP.NET MVC 中还有哪些注释属性用来验证?

在 ASP.NET MVC 中&#xff0c;除了常见的数据注解属性&#xff08;如Required、StringLength等&#xff09;&#xff0c;还有一些其他的注解属性用来验证数据。以下是一些常用的注解属性&#xff1a; Range&#xff1a;用于验证数字类型的属性值是否在指定的范围内。 [Range(…

中文乱码解决方案

解决程序中的中文乱码问题通常涉及到几个关键点&#xff1a;字符编码的设置、环境变量的配置以及程序内部处理方式。这里提供一些常见的解决方案&#xff1a; 1. 设置正确的输入输出流编码 如果你的应用程序是在读取或写入文件时出现乱码&#xff0c;确保设置了正确的文件编码…

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(XGBoost分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#xff08;XGBoost分类器&#xff09; 文章目录 一、基本原理鲸鱼智能优化特征选择流程 二、实验结果三、核心代码四、代码获取五、总结 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序…

从地图信息实时检测路口的各向通行状况、红绿灯及溢出情况

高德地图、百度地图都能获得实时的道路信息。 C# 编写的路况信息爬虫可获得准实时&#xff08;1分钟间隔&#xff09;的路口的各向通行状况、红绿灯及溢出情况。 优势&#xff1a; 投入少&#xff0c;效果好&#xff0c;无需安装设备&#xff1b; 缺陷&#xff1a; 时间间隔…

人工智能在网络安全领域的应用探索

随着网络技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;成为制约数字化进程的重要瓶颈。人工智能&#xff08;AI&#xff09;作为一种变革性技术&#xff0c;正逐步在网络安全领域展现出其巨大的潜力和价值。本文旨在探讨人工智能在网络安全领域的应用现状、优势…

更新RK3588开发板的rknn_server和librknnrt.so【这篇文章是RKNPU2从入门到实践 --- 【5】的配套文章】

作者使用的平台有&#xff1a; 一台装有Windows系统的宿主机&#xff0c;在该宿主机上装有Ubuntu 20.04虚拟系统&#xff1b; 瑞芯微RK3588开发板&#xff0c;开发板上的系统为Ubuntu22.04系统&#xff1b; 更新板子的 rknn_server 和 librknnrt.so&#xff0c;rknn_server 和…

单HTML文件集成Vue2+axios的使用

1、下载vue2.js和axios.js到本地 2、建一个HTML文件&#xff0c;内容如下&#xff1a; <html> <head><meta charset"UTF-8"><script src"./js/vue2.js"></script><script src"./js/axios.js"></script&…

USART之串口发送+接收应用案例

文章目录 前言一、电路接线图二、应用案例代码三、应用案例分析3.1 USART模块初始化3.1.1 RCC开启时钟3.1.2 GPIO初始化3.1.3 配置USART3.1.4 开启中断、配置NVIC3.1.5 开启USART 3.2 USART串口收发模块3.2.1 Serial_SendByte&#xff08;发送一个字节数据&#xff09;3.2.2 US…

Array常用的函数

在JavaScript中&#xff0c;Array 对象提供了许多实用的方法来操作数组。以下是常用的几个函数及其简要说明&#xff1a; 1. Array.prototype.forEach forEach 用于遍历数组中的每个元素&#xff0c;并执行一个提供的函数。 语法 array.forEach(callback(currentValue[, in…