如何从外部程序获取魔兽争霸3的游戏内数据?

我正在实施一个行为algorithm,并希望用我可爱的魔兽争霸III游戏来testing它,看看它将如何与真实玩家对抗。

我遇到的问题是我不知道如何从运行的WC3游戏中获取关于游戏内状态(单位,结构,环境等)的信息。 我的algorithm需要访问硬盘和可能的分布式计算,这就是为什么JASS(WC3的编辑语言)不合适; 我需要从一个单独的进程运行我的algorithm。

Direct3D挂钩是一种方法,但对于WC3还没有完成,而且这种方法的一个明显缺点是无法观看AI如何在线执行,因为它使用视口来发出命令。

我如何以最快,最简单的方式在不同的过程中读取WC3中的游戏数据?

正是我需要的魔兽争霸3存在的星际争霸: BWAPI 。

我基本上可以看到两种方法可以解决这个问题,但是在这两种情况下,您都需要使用我的SharpCraft项目,这是一个C#powerered的方式注入function到我制作的魔兽争霸III,从一堆其他人的研究。 请注意,自述文件已过时,但我将尽我所能帮助您解决当前版本问题。

使用JASS

通过这种方式,您可以轻松访问完整的JASS API,从而轻松获取所有内容。 你在这里做的是在JASS API中添加一些自定义本地代码,以帮助弥补JASS和你的应用程序之间的差距。 这可能是写入硬盘的本机或将消息发送到应用程序的本机。

使用C#

这种方法的优点是可以保存在所有C#中,这比JASS更通用,但不能使用使用string的本机。 您可以从C#完全访问JASS API,因此您不会错失任何function。

包中包含一个插件,显示插件的XML结构。 要使用该库,请添加对SharpCraft.dll的引用,然后创建一个实现FullPluginBase类的类。 从那里你可以访问API的不同部分。

public class MyPlugin : FullPluginBase { public override void Initialize() { // This is a pretty cheap way to get into any map without the map needing to be coded for it. Script.PostMain = this.Script_PostMain; } private void Script_PostMain() { // Create a JASS trigger. var trigger = JassTrigger.Create(); // Make the trigger run every .01 seconds, repeatedly. trigger.RegisterTimerEvent(0.01f, true); // Make the trigger call our Tick function when triggered. trigger.AddAction(new DelegateAction(this.Tick)); } private void Tick(JassTrigger trigger) { // Do the stuff you want to do, using the JASS API or .NET API. } } 

我希望这给你一个如何使用它的想法。