Kift
坎巴拉太空计划(Kerbal Space Program, v1.8.1)的Thrift(v0.12.0)插件.
在线文档: https://vaporz.github.io/Kift/index.html
一开始打算用GRPC,但GRPC要求.NET Framework的版本在4.5以上,而KSP是基于3.5版本的,很老的版本。
Kift是什么?
Kift受启发自 kRPC —— 一个由@djungelorm开发的很棒的Mod。
Kift是位于你的程序和游戏程序之间的桥梁,让你能够在运行于游戏外的程序中,控制游戏内内容。
软件架构
Kift在KSP进程里启动一个Thrift Server线程。 这个Server接收请求,并发送到一个消息队列(MQ)。KSP中有一个Addon会从MQ中消费消息,并运行对应的Executor。 对每一个Request,Server在接收到Response之前,会一直阻塞等待,直到收到Response,或者超时。
支持的编程语言
理论上,只要是Thrift v0.12.0支持的语言,Kift都支持。
C, C++, Go, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml 和 Delphi, 等等.
入门指南
1, 安装Kift
下载Kift.zip,将压缩包中的Kift文件夹复制到"Kerbal Space Programe/GameData"内。
现在服务端就准备好了。当你的游戏载入完成,显示出主菜单是,Thrift server应该已经启动,并准备好接收请求了。
2, 连接Server端,调用Kift API
为了跟Thrift Server端互动,你需要自己写Client端的代码。
下面的示例代码,展示了如何获取当前游戏中的飞行器相关的数据:
// 游戏已经启动,并且必须在Flight场景下
// 导入"Kift.ThriftGen.dll"(编译自"Kift/thrift-gen/gen-csharp"),
// 或者你可以自己生成桩代码,然后编译并导入你的DLL文件。
using Kift;
// 导入"Thrift.dll": https://cwiki.apache.org/confluence/display/thrift/ThriftUsageCSharp
using Thrift.Protocol;
using Thrift.Transport;
...
// 监听端口是可配置的,配置文件是"Kerbal Space Program/GameData/Kift/server.cfg"
TTransport transport = new TFramedTransport(new TSocket("localhost", 9090));
TProtocol protocol = new TCompactProtocol(transport);
KiftService.Client client = new KiftService.Client(protocol);
transport.Open(); // 连接Server
Vessel v = client.currentVessel(); // 请求 API "currentVessel"
Console.WriteLine(v.Name);
...
transport.Close(); // 最后关闭连接
Kift APIs
Kift提供两大类API:“数据同步API”和“指令API”。
“数据同步API”从游戏中接收数据,而“指令API”则向游戏发送指令,以便控制载具,部件以及游戏本身。
“指令API”又根据目标不用,分成三个小类。
更多细节请查看在线文档: https://vaporz.github.io/Kift/api/index.html
为其他编程语言生成Thrift桩代码
在"Kift/thrift-gen"文件夹内有一些现成的Thrift生成代码,涵盖的语言有:
C, C++, C#, Go, Java, JavaScript, Node.js, Lua, PHP, Ruby 和 Rust。
只需要向你的项目中导入这些代码,然后你就可以创建Client来连接Server,并请求Kift API了。
如果你使用的语言不在列表中,你可以自己生成。
Thrift是一个软件框架,用来开发可扩展,跨语言的程序。通过Thrift的帮助,你可以用任何语言写Client端代码,只要Thrift支持。
Kift提供的API都定义在“Kift”文件夹内的IDL文件“service.thrift”中。
下载 Thrift v0.12.0,然后用下面的命令生成桩代码:
thrift --gen <language> <Thrift filename>
例如,如果你用C#开发,那就运行:
$thrift -r --gen csharp service.thrift
如果你用Golang,那就运行:
$thrift -r --gen go service.thrift
一些备注
- 致Kift开发者:复制"Kerbal Space Program"文件夹,粘贴到"Kift"文件夹内。
- 凡是通过现有API能够实现的功能,一般都不会考虑加入到Kift API列表中,比如,自动驾驶。
- 高级功能应当在Client端实现,代码放在目录"Kift/client/[Language]"中。