Skip to content

Infernus 是什么

Infernus 的名字来源于游戏中 id411 的载具(特指 sa 中)。

Infernus 是一个基于 samp-node 打造的库,用于在 JavaScript 层调用游戏的 sdk

🚧 施工中

  • omp-node 目前正在积极开发中,未来它会取代Infernus
  • 如果您想尝鲜omp-node,或更喜欢原生语法而没有过多封装,请关注 @open.mp/node

缺陷

DANGER

是的,一切的开始前您需要了解缺陷。

一些缺陷极大影响了开发体验,建议您以实验性的心态尝试使用 samp-node 生态开发。

总的来说目前生态并不稳定,这是多方面因素导致的。

Samp Node 生态

原有的以 pawn 开发的库,比如 fcnpccolandreasnexac 等等著名的库,如果您的项目必须依赖这些,那么目前而言会出现两种情况:无人开发或是不兼容。

由于 samp-node 的插件开发是基于 samp 而不是基于 omp,所以对于 omp 而言,一些插件生态基本无法兼容,比如无法访问到一些插件的 native 函数,比如 raknet

这极大程度上的限制了基于 nodesamp 插件生态库开发,这一点需要 samp-node 的作者和社区共同努力推进。

当然对于 omp 而言,它们的重心是打造好 omp 本身,而不是在第三方上。

终端阻塞

重要信息

已通过 monkeyPatch 作为目前的解决方案,修复了此问题。

由于底层的 samp-node 对于部分异步的 node 生态库的兼容性不佳,会导致概率性的终端阻塞。

比如 typeorm/sequlizeorm 库,如果使用了,它将一直阻塞导致服务器未响应,除非您手动在终端敲下回车。

所以更建议您采取分布式开发,虽然这听起来很蠢……

即另外再建立一个数据库操作的 node 项目,比如用 nestjs 搭建 api,专门用来 crud,游戏服务端采用 http 请求来访问,或者您可以尝试用一些更高级的 rpc 或者 socket 来实现通信。

不过这样的好处是服务端只处理游戏逻辑,数据库逻辑交给另外的项目,顺手您还可以再开发一个后台管理系统,这样后台和服务端采用的是同一套 api

组成

通常来说您只需要关注第一层,即应用开发层。

Infernus 主要做的就是第二层和第三层的工作,依赖于 samp-nodeomp 游戏服务器。

如果您不知道怎样开始建立一个项目,请参考 快速上手

/介绍
1应用开发层游戏模式,比如自由或角色扮演
2类包装层通过类来调用函数式包装
3函数式包装层例如 samp/omp/streamer 的包装
4Samp NodeSDK 通往底层的桥梁
5Omp 游戏服务器底层

为何开发

对于编程初学者或者前端程序员而言,用类似于 C 语言的面向过程的 Pawn 语言开发游戏脚本上手具有一定难度。 同时对于一些基础的底层 api,比如字符串拼接,删除,数组的操作,远比面向对象的 JavaScript 要麻烦。

另外,在 Pawn 语言生态中,想要实现异步是比较困难的。 要实现国际化,一般都使用 utf8 编码,而由于 sa 发行的年代很早,没有使用 utf8 字符集来实现国际化差异。 比如在西方国家使用了 ISO-8859-1,在中国使用了 gbk 编码,这些都取决于 windows 系统语言的 ansi

通常使用 Pawn 语言开发本土化脚本,需要把开发的文件编码设置为本土化的 windows 系统语言字符集。 这会引发一些不可预料的一些编码 bug,比如将gbk 的数据存入到 utf8 的数据库当中,如果处理不妥当可能会出现乱码数据。

而基于 JavaScript 开发,我们就可以拥抱强大的 node 生态,比如日期时间处理库 dayjs,数据库 mysql/redis/mongodb,异步 Promise/Async 等等,以 node 生态替代 pawn 生态的库。