骑砍2霸主MOD开发(2)-基础开发环境搭建

2024-04-09 20:52

本文主要是介绍骑砍2霸主MOD开发(2)-基础开发环境搭建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.骑砍2霸主程序架构

二.骑砍2霸主C#接口层代码查看

     1.C#反编译工具dnspy下载:

     2.骑砍2霸主游戏引擎接口查看:

     例如IMBAgent interface接口:

#调用TaleWorlds.Native.dll中的函数
[EngineMethod("get_movement_flags", false)]
uint GetMovementFlags(UIntPtr agentPointer);// Token: 0x060015BE RID: 5566
[EngineMethod("set_movement_flags", false)]
void SetMovementFlags(UIntPtr agentPointer, Agent.MovementControlFlag value);// Token: 0x060015BF RID: 5567
[EngineMethod("get_movement_input_vector", false)]
Vec2 GetMovementInputVector(UIntPtr agentPointer);// Token: 0x060015C0 RID: 5568
[EngineMethod("set_movement_input_vector", false)]
void SetMovementInputVector(UIntPtr agentPointer, Vec2 value);// Token: 0x060015C1 RID: 5569
[EngineMethod("get_collision_capsule", false)]
void GetCollisionCapsule(UIntPtr agentPointer, ref CapsuleData value);

三.MOD下C#代码编译调试

     1.VisualStudio下载并创建csproj配置文件:

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><Version>0.0.1</Version>#指定VS编译依赖.net6框架<TargetFramework>net6</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)\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>

    2.生成/生成解决方案编译cs文件为dll

四.MOD文件目录结构

    1.sub_module.xml

       MOD启动配置文件,配置XML

<?xml version="1.0" encoding="utf-8"?>
<Module>#对应MOD启动器下显示MOD的版本和名称<Id value = "NativeTest"/><Name value = "NativeTest"/><Version value = "v1.2.9.36960"/><DependedModules><DependedModule Id="Native" DependentVersion="v1.2.9" Optional="false"/><DependedModule Id="SandBoxCore" DependentVersion="v1.2.9" Optional="false"/></DependedModules>#对应module_data下武器装备,军团属性的xml文件<Xmls><XmlNode>                <XmlName id="Items" path="items"/><IncludedGameTypes><GameType value = "Campaign"/><GameType value = "CampaignStoryMode"/><GameType value = "CustomGame"/><GameType value = "EditorGame"/></IncludedGameTypes></XmlNode></Xmls>#对应bin\Win64_Shipping_Client下的MOD自定义DLL<SubModules><SubModule><Name value="NativeTestSubModule" /><DLLName value="NativeTest.dll" /><SubModuleClassType value="NativeTest.NativeTest" />		<Tags><Tag key="DedicatedServerType" value ="none" /></Tags></SubModule></SubModules>
</Module>

    2.module_data

       存放武器装备,军队兵种,场景物等相关配置xml文件.

       SandBoxCore\ModuleData\items:存放装备的配置文件

       SandBoxCore\ModuleData'spnpccharacters:存放军团兵种的配置文件

五.MOD启动C#接口

    通过实现MBSubModuleBase中的接口实现各个阶段的重写


// Token: 0x06001AAB RID: 6827 RVA: 0x0005D190 File Offset: 0x0005B390
protected internal virtual void OnSubModuleLoad()
{
}// Token: 0x06001AAC RID: 6828 RVA: 0x0005D192 File Offset: 0x0005B392
protected internal virtual void OnSubModuleUnloaded()
{
}// Token: 0x06001AAD RID: 6829 RVA: 0x0005D194 File Offset: 0x0005B394
protected internal virtual void OnBeforeInitialModuleScreenSetAsRoot()
{
}// Token: 0x06001AAE RID: 6830 RVA: 0x0005D196 File Offset: 0x0005B396
public virtual void OnConfigChanged()
{
}// Token: 0x06001AAF RID: 6831 RVA: 0x0005D198 File Offset: 0x0005B398
protected internal virtual void OnGameStart(Game game, IGameStarter gameStarterObject)
{
}

六.日志收集&诊断

     cs文件范例:

using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using TaleWorlds.Core;
using TaleWorlds.Engine;
using TaleWorlds.InputSystem;
using TaleWorlds.Library;
using TaleWorlds.MountAndBlade;
using TaleWorlds.MountAndBlade.Source.Missions.Handlers;namespace NativeTest
{public class NativeTest : MBSubModuleBase{#调用windows弹框MessageBox[DllImport("user32.dll", EntryPoint = "MessageBoxA")]public static extern int MsgBox(int hWnd, string msg, string caption, int type);protected override void OnSubModuleLoad(){base.OnSubModuleLoad();MsgBox(0, "OnSubModuleLoad", "msg box", 0x30);}public override void OnGameLoaded(Game game, object initializerObject){base.OnGameLoaded(game, initializerObject);MsgBox(0, "OnGameLoaded", "msg box", 0x30);}public override void OnNewGameCreated(Game game, object initializerObject){base.OnNewGameCreated(game, initializerObject);MsgBox(0, "OnNewGameCreated", "msg box", 0x30);}public override void OnBeforeMissionBehaviorInitialize(Mission mission){base.OnBeforeMissionBehaviorInitialize(mission);try{var val = 0;var rst = 8 / val;throw new Exception("Dummy exception for stack trace");InformationManager.DisplayMessage(new InformationMessage("on mission behavior initialize"));mission.AddMissionBehavior(new FlyMissionTimer());}catch (Exception ex){string stackTrace = new StackTrace(ex, true).ToString();File.WriteAllText("../../Modules/NativeTest/crash_log.txt", stackTrace);}}}

这篇关于骑砍2霸主MOD开发(2)-基础开发环境搭建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/889185

相关文章

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1