骑砍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.mzph.cn/news/828306.shtml

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

相关文章

慢生活,慢光阴

不知是哪一天&#xff0c;也不知是在哪一年&#xff0c;生物钟不像以前那样准了&#xff0c;节奏也慢了许多&#xff0c;姿态也是收的&#xff0c;像暮色轻笼之下的睡莲&#xff0c;一瓣一瓣地收回盛开的花瓣&#xff1b;无谓的期盼渐渐少了&#xff0c;更在意过好每一个今天&a…

C++(Qt)软件调试---crashpad捕获崩溃(19)

C(Qt)软件调试—crashpad捕获崩溃&#xff08;19&#xff09; 文章目录 C(Qt)软件调试---crashpad捕获崩溃&#xff08;19&#xff09;1、概述2、资源地址3、配置环境4、解决报错5、测试代码6、测试结果7、Qt中使用crashpad 更多精彩内容&#x1f449;个人内容分类汇总 &#x…

Java学习路线大纲

一、Java基础 Java语言基础 变量与数据类型 运算符与表达式 控制结构&#xff08;if、switch、for、while等&#xff09; 方法与函数 数组与集合 面向对象编程 类与对象 封装、继承、多态 抽象类与接口 异常处理 泛型与注解 常用工具类与API Java常用工具类&#xff08;如Math…

c#对控件的操作无效,子线程调用主线程的控件

很多人都曾遇到过一件事&#xff0c;我明明已经对这个控件赋值了&#xff0c;或者对这个控件进行了什么操作&#xff0c;但是操作无效。我就曾遇到过这个问题。当时我上网搜了一下。其中可能出现的问题就是我在子线程中调用主线程中的控件。当时给出的答案都是使用委托来解决这…

矩阵按列相乘运算的并行化实现方法

这两天一直在琢磨如下矩阵计算问题。 已知dm矩阵X和hq矩阵Y&#xff0c;求如下矩阵&#xff1a; 其中X(:,i), Y(:,j)分别表示矩阵X, Y的第i列和第j列&#xff0c;易知Z为dh矩阵。 如果直接串行计算矩阵Z&#xff0c;两个循环共有mq&#xff0c;则会很慢&#xff0c;能不能并行化…

枚举(enum)/共用体(union)/结构体(struct)---详解

前言 C语言包含内置类型和自定义类型。 其实C语言中有内置类型&#xff0c;包含&#xff1a;char,short,int,long,long long,float,double,long double ,这些是C语言本身支持的现成的类型。 但仅仅只有内置类型是远远不够的&#xff0c;在描述一个复杂对象是无法使用内置类型来…

(不是Al创作助手、AiLink、开放猫、AiTab新标签、Official Index)分享好用的ChatGPT

目录 1、不是Ai创作助手 2、聊天 - AiLink 3、开放猫-你的智能助手 4、AiTab新标签

Java23种设计模式-创建型模式之建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;&#xff0c;也被称为生成器模式&#xff0c;是一种创建型设计模式&#xff0c;主要用于解决复杂对象的构建问题。建造者模式的主要特点是&#xff1a; 1.分离构建与表示&#xff1a;将一个复杂对象的构建与它的表示分离&…

ik分词器是什么,有那些配置? ik_smart和ik_max_word的两个分词算法有何区别?

1、ik分词器是什么&#xff0c;有那些配置&#xff1f; 1、ik分词器是什么&#xff1f; IK分词器是一种基于正向匹配的分词算法&#xff0c;它是中文自然语言处理中的一个基本环节。在搜索时&#xff0c;IK分词器会把用户的信息以及数据库或索引库中的数据进行分词&#xff0…

一般数组队列(具有伪溢出的队列)

该队列中需要用到的函数和结构体声明&#xff1a; #pragma once #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <assert.h> // 定义队列中的元素类型 typedef int Datatype;// 定义队列结构体 typedef struct Que…

react经验14:动态修改第三方组件的样式

应用场景 已知第三方组件提供了少许的属性用于程序控制部分样式&#xff0c;现在要求能控制所有细节。 实现方式 核心思路&#xff1a;使用css变量 这里以antd组件库的Tabs控件为例&#xff0c;控制Tabs被选中的页签字体样式。 定义css class&#xff0c;这里用的sass .t…

区块链安全应用------压力测试

测试要求&#xff1a; 1. 对以下AccountManager智能合约进行压测(基础要求set函数测试&#xff0c;balanceOf涵为20分加分项)2. 在本地链进行测试&#xff0c;需要监控本地进程的资源使用情况。每个进程的multiOutput属性为Avg3. 需要将每一个更改的配置文件截图&#xff0c;和…

政安晨:【Keras机器学习示例演绎】(十五)—— 用于图像分类的 CutMix 数据增强技术

目录 简介 设置 加载 CIFAR-10 数据集 定义超参数 定义图像预处理函数 将数据转换为 TensorFlow 数据集对象 定义 CutMix 数据增强功能 可视化应用 CutMix 扩增后的新数据集 定义 ResNet-20 模型 使用经 CutMix 扩展的数据集训练模型 使用原始非增强数据集训练模型 …

排列类枚举(递归)

全部排列问题 题目描述&#xff1a;输出 1…n 个数的全部排列。全部排列中&#xff0c;数字可以重复 。 例如输入 3 输出全部排列的结果如下&#xff1a;1 11、112、113、121、122、123、131、132、133、211、212、213、221、 222、223、231、232、233、311、312、313、321、…

vscode 配置verilog环境

一、常用的设置 1、语言设置 安装如下插件&#xff0c;然后在config 2、编码格式设置 解决中文注释乱码问题。vivado 默认是这个格式&#xff0c;这里也设置一样。 ctrl shift p 打开设置项 3、插件信任区设 打开一个verilog 文件&#xff0c;显示是纯本文&#xff0c;没…

Xbar控制图的定义和应用

1、定义 Xbar控制图&#xff08;X-Bar Chart&#xff09;是一种统计图表&#xff0c;用于展示数据分布情况。它通过绘制一系列数据点在均值线&#xff08;通常为X轴&#xff09;周围的分布情况来显示数据的波动性。这种图表可以用来监控生产过程、质量管理、金融分析等多个领域…

【MHA】MySQL高可用MHA介绍1-功能,架构,优势,案例

目录 一 MHA 介绍 1 MHA功能 自动化主服务器监控和故障转移 交互式&#xff08;手动启动的&#xff09;主故障转移 非交互式主故障转移 在线切换主机 2 主服务器故障转移的难点 二 MHA架构 1 MHA组件 2 自定义扩展&#xff08;脚本&#xff09; 三 MHA优势 1 MHA可以…

面试算法十问(中英文)

1.两数之和 (Two Sum) 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那两个整数&#xff0c;并返回它们的数组下标。 Given an array of integers nums and a target value target, find the two integers in the array that sum up t…

【k8s】(四)kubernetes1.29.4离线部署之-组件安装

&#xff08;一&#xff09;kubernetes1.29.4离线部署之-安装文件准备 &#xff08;二&#xff09;kubernetes1.29.4离线部署之-镜像文件准备 &#xff08;三&#xff09;kubernetes1.29.4离线部署之-环境初始化 &#xff08;四&#xff09;kubernetes1.29.4离线部署之-组件安装…

【Godot4自学手册】第三十八节给游戏添加音效

今天&#xff0c;我的主要任务就是给游戏添加音效。在添加音效前&#xff0c;我们需要了解一个东西&#xff1a;音频总线。这个东西或许有些枯燥&#xff0c;如果你只为添加一个音效没必要了解太多&#xff0c;但如果你以后将要经常与音频播放打交道&#xff0c;还是要了解一下…