骑砍2霸主MOD开发(6)-使用C#-Harmony修改本体游戏逻辑

一.C#-Harmony反射及动态注入

    利用C#运行时环境的反射原理,实现对已加载DLL,未加载DLL中代码替换和前置后置插桩.

    C#依赖库下载地址:
霸王•吕布 / CSharpHarmonyLib · GitCodeicon-default.png?t=N7T8https://gitcode.net/qq_35829452/csharpharmonylib

    根据实际运行.Net环境选择对应版本的0Harmony.dll

二.csproj文件添加0Harmony.dll依赖

    <1.使用dnspy确定当前游戏版本使用.NET运行时环境

    <2.确定启动项为TaleWorlds.MountAndBlade.Launcher.exe

    <3.csproj选择编译环境,依赖dll路径

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><Version>0.0.1</Version><!--指定VS编译依赖.net2框架--><TargetFramework>netstandard2.0</TargetFramework><Platforms>x64</Platforms><!--指定游戏安装目录--><GameFolder>D:\work\Steam\steamapps\common\Mount &amp; Blade II Bannerlord</GameFolder><GameBinariesFolder Condition="Exists('$(GameFolder)\bin\Win64_Shipping_Client\Bannerlord.exe')">Win64_Shipping_Client</GameBinariesFolder><GameBinariesFolder Condition="Exists('$(GameFolder)\bin\Gaming.Desktop.x64_Shipping_Client\Bannerlord.exe')">Gaming.Desktop.x64_Shipping_Client</GameBinariesFolder><!--指定输出dll名称,输出dll路径--><AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath><AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath><AssemblyName>NativeTest</AssemblyName><OutputPath>D:\work\Steam\steamapps\common\Mount &amp; Blade II Bannerlord\Modules\NativeTest\bin\Win64_Shipping_Client</OutputPath></PropertyGroup><!--指定使用C#接口--><ItemGroup><Reference Include="$(GameFolder)\bin\$(GameBinariesFolder)\Newtonsoft.Json.dll"><HintPath>%(Identity)</HintPath><Private>False</Private></Reference><Reference Include="$(GameFolder)\Modules\Harmony\bin\Win64_Shipping_Client\0Harmony.dll"><HintPath>%(Identity)</HintPath><Private>False</Private></Reference><Reference Include="$(GameFolder)\bin\$(GameBinariesFolder)\TaleWorlds.*.dll" Exclude="$(GameFolder)\bin\$(GameBinariesFolder)\TaleWorlds.Native.dll"><HintPath>%(Identity)</HintPath><Private>False</Private></Reference><Reference Include="$(GameFolder)\Modules\Native\bin\$(GameBinariesFolder)\*.dll"><HintPath>%(Identity)</HintPath><Private>False</Private></Reference><Reference Include="$(GameFolder)\Modules\SandBox\bin\$(GameBinariesFolder)\*.dll"><HintPath>%(Identity)</HintPath><Private>False</Private></Reference><Reference Include="$(GameFolder)\Modules\SandBoxCore\bin\$(GameBinariesFolder)\*.dll"><HintPath>%(Identity)</HintPath><Private>False</Private></Reference><Reference Include="$(GameFolder)\Modules\StoryMode\bin\$(GameBinariesFolder)\*.dll"><HintPath>%(Identity)</HintPath><Private>False</Private></Reference><Reference Include="$(GameFolder)\Modules\CustomBattle\bin\$(GameBinariesFolder)\*.dll"><HintPath>%(Identity)</HintPath><Private>False</Private></Reference><Reference Include="$(GameFolder)\Modules\BirthAndDeath\bin\$(GameBinariesFolder)\*.dll"><HintPath>%(Identity)</HintPath><Private>False</Private></Reference></ItemGroup>
</Project>

三.SubModule.xml添加0Harmony.dll依赖

  <!-- 对应bin\Win64_Shipping_Client下的MOD自定义DLL--><SubModules><SubModule><Name value="NativeTestSubModule" /><DLLName value="NativeTest.dll" /><SubModuleClassType value="NativeTest.NativeTest" /><Assemblies><Assembly value="0Harmony.dll" /></Assemblies><Tags><Tag key="DedicatedServerType" value ="none" /></Tags></SubModule></SubModules>

四.Harmony实现对任意类任意方法的前置后置插桩

    <1.MBSubModuleBase.OnSubModuleLoad()中进行Harmony注入

    <2.实现Prefix,Postfix前置后置插桩,实现对本体代码的修改,例如游戏菜单的加载调用前插入一个对话框MsgBox

public class NativeTest : MBSubModuleBase
{protected override void OnSubModuleLoad(){base.OnSubModuleLoad();Harmony patch = new Harmony("MyPatch");patch.PatchAll();PrefixbBox();}
}#实现对游戏菜单初始化的前置插桩
namespace CampaignMissionPatch
{[HarmonyPatch(typeof(EncounterGameMenuBehavior), "AddGameMenus")]public class CampaignMissionPatch {[DllImport("user32.dll", EntryPoint = "MessageBoxA")]public static extern int MsgBox(int hWnd, string msg, string caption, int type);public static bool Prefix(CampaignGameStarter gameSystemInitializer){MsgBox(0, "this is conversation mission", "msg box", 0x30);return true;}}
}

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

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

相关文章

ssh免秘钥登录与时钟同步

ssh免秘钥登录及数据拷贝 ssh免秘钥登录及数据拷贝环境生成秘钥拷贝公钥到到远程服务器通过ssh-copy-id命令拷贝公钥到远程服务器通过手动拷贝公钥到远程服务器 非root用户远程拷贝公钥 设置编码方式临时设置编码永久设置方法一永久设置方法二 设置时钟同步使用 ntpdate 命令使…

闲话电子设计之100条

1、BUCK芯片延时上电的方法&#xff1a; 1&#xff09;缓启动芯片 2&#xff09;SS引脚电容变更引起延时 3&#xff09;RC阻容延时 电容谐振峰&#xff0c;受电容自身参数影响。 2、反射/EMI 源反射&#xff08;Zs-Zline&#xff09;/&#xff08;ZsZline&#xff09; 终…

Scala的函数至简原则

对于scala语言来说&#xff0c;函数的至简原则是它的一大特色。下面让我们一起来看看分别有什么吧&#xff01; 函数至简原则&#xff1a;能省则省&#xff01; 初始函数 def test(name:String):String{return name }1、return可以省略&#xff0c;Scala会使用函数体的最后一…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果 一、简单介绍 二、简单人脸检测添加戴眼镜效…

react入门基础

React 简介 React ------- 用于构建用户界面的JavaScript库/一个将数据渲染为HTML视图的开源JavaScript库 React历史 【经典水时长/水字数】 由Facebook开发&#xff0c;且开源 起初由Facebook的软件工程师 Jordan Walke 创建 【膜拜 React 祖师爷】于2011年部署于 Facebo…

SQLAIchemy 异步DBManager封装-01入门理解

前言 SQLAlchemy 是一个强大的 Python SQL 工具包和对象关系映射&#xff08;ORM&#xff09;系统&#xff0c;是业内比较流行的ORM&#xff0c;设计非常优雅。随着其2.0版本的发布&#xff0c;SQLAlchemy 引入了原生的异步支持&#xff0c;这极大地增强了其在处理高并发和异步…

AD高速板设计-DDR(笔记)

【一】二极管 最高工作频率&#xff1a; 定义&#xff1a;二极管的最高工作频率&#xff0c;即二极管在电路中能够正常工作的最高频率。常见的硅二极管的最高工作频率通常在几十MHz到几百MHz之间。在高频下&#xff0c;二极管可能无法有效地阻止反向电流&#xff0c;但也不会…

入门1-顺序结构

Hello,World! #include<iostream> using namespace std; int main(){ cout<<"Hello,World!"; return 0; }输出字符菱形 #include<iostream> using namespace std; int main() {// 上半部分菱形for(int i 1; i < 3; i){for(int j 1; j < 3…

智慧煤矿/智慧矿区视频汇聚存储与安全风险智能分析平台建设思路

一、建设背景 目前我国非常重视煤矿安全生产&#xff0c;并投入大量资金用于煤矿安全综合远程监控系统的研发。视频监控系统作为实现煤矿智能化无人开采的关键系统与煤矿安全生产的多系统协同分析与处理的关键信息源&#xff0c;在智慧矿山管控平台的建设中发挥着重要的作用。…

Linux学习之路 -- 进程篇 -- 环境变量

本文将介绍环境变量的相关内容&#xff0c;以及相关操作 目录 一、main 二、环境变量 1.为什么要有环境变量&#xff1f; 2.环境变量的特性以及命令行操作 <1>命令行操作&#xff1a; <2>特性&#xff1a; 一、main 介绍一下main函数的参数。 在一些教材上…

17. map和set的基本使用

1. 关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身。 那什么是关联式容器&#xff…

数据输入输出流(I/O)

文章目录 前言一、数据输入输出流是什么&#xff1f;二、使用方法 1.DataInputStream类2.DataOutoutStream类3.实操展示总结 前言 数据输入输出流也是将文件输入输出流打包后使用的对象。相比于文件输入输出流&#xff0c;数据输入输出流提供了简单易用的方法去操作不同类型的数…