amxx模块(amxx module),是amxx重要的组成部分,另外一个是amxx插件(amxx plugin)。amxx module是通过c或者c++编写并编译生成的dll文件(linux的是so文件),是能够直接调用hlsdk、metamod sdk和amxx sdk等提供的函数来控制游戏的,而amxx plugin则是通过调用amxx module来间接调用hlsdk、metamod和amxx sdk等来控制游戏。amxx在安装时,内置了功能强大的module模块,如fun_amxx、engine_amxx、geoip_amxx、sql_amxx等,也就是由于这些module的存在,除非我们有特别的或者性能上的要求,否则我们只需要编写plugin调用amxx内置module即可。

说白了,amxx module模块就是用来改变我们CS服务器的运行逻辑的,例如可以是死亡竞技模式、魔兽升级模式、僵尸模式等游戏玩法的魔改,也可以是会员系统、IP地理位置识别、WEB管理系统、数据库读写等服务器功能的增强。

调用层级:amxx plugins –> amxx modules –> metamod –> hl/cstrike

在开始amxx模块代码编写之前,我们需要把开发环境给搭建好,这里我们使用官方github的版本来开发,避免一些其他版本不同导致的兼容性问题。接着来我们会先把开发环境搭建好,然后编译一个最简单的modules(空架子,没有实际功能)来测试一下运行情况。

前言

现在开始,你将成为一个amxmodx的模块开发者。这篇入门教程不是很难,我们这里将会用windows操作系统来完成代码的编写和编译,当然了,生成的代码自然是dll后缀的,只能用在windows操作系统的服务器上。如果你是linux架设的服务器,那么就需要在linux系统下编译生成so文件,又或者在windows操作系统下使用跨平台编译工具来生成so文件,如AMBuild就是官方开发的专门用于模块编译的工具。

开发前的准备

操作系统和开发工具

我们这里用的是windows 10操作系统,并且安装了visual studio 2017以及windows 8.1 SDK和Windows 10 SDK,版本的选择是会影响兼容性的,这里安装的SDK版本尽量与我们的一致,否则可能会因为版本不兼容导致很多无法解决的问题。

Visual Studio官方下载地址

visual studio 的版本可以不一样,但是VC++的版本需要是一样的,安装好visual studio后,我们打开它,然后点击菜单栏上的“工具”->“获取工具和功能”,勾选“使用C++的桌面开发”,以及右边的“Windows 10 SDK”和“Windows 8.1 SDK”,如图所示:

PS:当然,为了方便开发测试,你还需要在本地装一个windows版本的cs1.6服务器,并且安装好metamod和amxmodx(若有需要,请参考往期文章来搭建cs1.6服务器,可以是正版hlds服务器,也可以是同时支持正盗版的rehlds服务器)。

SDK安装

由于我们这里使用的是官方github的SDK,我们最好先安装git工具,然后在进行接下来的操作。

HL-SDK

HL-SDK,即Half Life SDK,是半条命-1的开发包,我们的metamod和amxmodx的开发工作需要基于这个开发包。安装方法如下:

创建D:\sdk目录,在该目录下使用git命令下载hlsdk

初学时,建议使用fork的版本,因为本教学是根据fork时的版本来写的,避免官方版本更新导致的不兼容问题

1
2
3
# fork from https://github.com/alliedmodders/hlsdk.git on 2023-3

git clone https://github.com/wudics/hlsdk.git

Metamod SDK

Metamod SDK,是构建在HL-SDK基础之上的组件平台开发包,而Amxmodx SDK则是构建在Metamod SDK基础之上的组件开发包,所以我们需要Metamod SDK来支撑我们amxx模块的开发。同样的,我们也是在D:\sdk目录下,把metamod给clone下来。

初学时,建议使用fork的版本,因为本教学是根据fork时的版本来写的,避免官方版本更新导致的不兼容问题

1
2
3
# fork from https://github.com/alliedmodders/metamod-hl1.git on 2023-3

git clone https://github.com/wudics/metamod-hl1.git

PS:metamod原版基本上能够满足大部分的开发需求,兼容hlds和rehlds,如果你的服务端是rehlds的,并且你开发的模块需要用到rehlds一些高级功能的话,那么你需要安装metamod-r的版本的sdk。

Amxmodx SDK

Amxmodx SDK,是我们amxx模块开发直接使用的sdk开发工具包,同时,该开发包下的modules文件夹也有官方内置模块的源码可供我们学习参考,同样clone到D:\sdk目录下。

初学时,建议使用fork的版本,因为本教学是根据fork时的版本来写的,避免官方版本更新导致的不兼容问题

1
2
3
# fork from https://github.com/wudics/amxmodx.git on 2023-3

git clone --recursive https://github.com/wudics/amxmodx.git

这里使用了recursive参数,是因为amxmodx这个项目是包含子项目的,加了这个参数就能把子项目也同时clone到本地,否则,编译过程可能会出现一些错误。

其中的子项目也有可能会更新,编译遇到amtl不兼容问题时,也可以clone我仓库在2023-3时fork的版本,来替换amxmodx/public下的amtl目录,https://github.com/wudics/amtl.git

PS:我们在开发过程中,常用的只有三个文件,分别是amxxmodule.h、amxxmodule.cpp和moduleconfig.h,而我们只需要修改的文件只有一个,即moduleconfig.h,通过这个模块配置文件,我们可以配置我们的模块名称、模块描述等信息,还能够对模块开发过程中使用到的回调函数进行导出。请忽略我这里说的话,后续在模块代码编写时再细说。

好了,这样我们sdk的目录结构如下:

1
2
3
D:\sdk\hlsdk
D:\sdk\metamod-h1
D:\sdk\amxmodx

SDK环境变量配置

由于amxmodx sdk提供的modules代码工程实例,是需要配置SDK环境变量(HLSDK和METAMOD)的,为了降低我们前期入门的难度,我们这里需要配置HLSDK和METAMOD两个环境变量的路径,分别指向D:\sdk下对应的目录。

鼠标右键“此电脑”->“属性”->“高级系统设置”->“高级”选项卡->“环境变量”,新建变量名和值:

变量名 值
HLSDK D:\sdk\hlsdk
METAMOD D:\sdk\metamod-h1

PS:配置SDK环境变量不是必须的,这是得看你如何组织你的visual studio工程。至此,我们配置的工作完成了,下面我们来编译一个样例,并且把它放到cs1.6服务器上测试是否正常运行。

样例代码下载、配置、编译和测试

样例代码下载安装

首先,我们先进入到D:\amxmodx\modules目录下,我们可以看到这里有很多amxmodx官方内置的modules模块源码项目(可参考学习)。在此目录下,使用git clone把我们的样例代码下载安装到这里。

1
git clone https://github.com/wudics/mymodule.git first_mm

其中first_mm,是存放样例代码的文件夹名称,建议是以你模块名称来命名,命名规则是:小写、无空格。

命令执行成功后,我们在modules目录中会多出一个first_mm文件夹,这里边的就是我们的样例代码了。

PS:因为vs工程的路径配置是非常繁琐的,为了降低我们的学习成本,所以我们这里模仿官方模块,也把样例代码放置在这个目录中。

模块配置

进入first_mm/msvc12目录,双击打开mymodule.sln项目文件。

然后鼠标右键点击解决方案资源管理器中的解决方案“mydoule”,选择重命名,将名称修改成first_mm。

同样的,我们把解决方案下的项目名称也修改为first_mm,这样我们在编译时就自动生成first_mm_amxx.dll命名的模块文件,修改前后对比如下:

修改前:

修改后:

接下来我们需要对模块的基本信息进行配置,双击打开moduleconfig.h文件,对一下内容进行修改:

修改前:

1
2
3
4
5
6
7
#define MODULE_NAME "My Module"
#define MODULE_VERSION AMXX_VERSION
#define MODULE_AUTHOR "wudics"
#define MODULE_URL "https://www.wudics.com"
#define MODULE_LOGTAG "MYMODULE"
#define MODULE_LIBRARY "mymodule"
#define MODULE_LIBCLASS ""

修改后:

1
2
3
4
5
6
7
#define MODULE_NAME "My First Module"
#define MODULE_VERSION AMXX_VERSION
#define MODULE_AUTHOR "Laura Mercia"
#define MODULE_URL "https://www.google.com"
#define MODULE_LOGTAG "FIRSTMM"
#define MODULE_LIBRARY "firstmm"
#define MODULE_LIBCLASS ""

保存修改后,接下来我们要对它进行编译。

代码编译

将代码生成模式,从Debug切换成Release模式。

在解决方案资源管理器中,选中“first_mm”项目,鼠标右键选择“生成”。

生成成功后,我们会在D:\sdk\amxmodx\modules\first_mm\msvc12目录下的Release文件夹中,会找到first_mm_amxx.dll文件,这就是我们的amxx模块。

模块测试

首先,我们把first_mm_amxx.dll文件拷贝到CS1.6服务器安装目录下的cstrike\addons\amxmodx\modules文件夹中。

然后,我们找到cstrike\addons\amxmodx\configs文件夹中的modules.ini文件,双击打开,在末尾另起一行并加上first_mm(不需要_amxx.dll后缀),保存。

现在,可以启动我们的CS1.6服务器了。

服务器启动后,我们在控制台输入命令amxx modules,就可以看到我们的模块了。

  • name:My First Module,moduleconfig.h配置的模块名称
  • version:这里显示的是系统自动生成的,我们可以手动修改成别的值
  • author:模块作者,也是在moduleconfig.h配置的
  • status:running,表示正常运行,如果出现pendding或者其他状态,那可能就是运行时错误了,需要重新检查代码重新生成模块文件。

这里,我们完成了amxx模块开发的环境搭建和样例代码的编译测试

目前,这个样例代码只是个框架,没有任务业务功能。

那么我们接下来,也是按照这个套路,把代码框架搭起来之后,来开始我们的amxx代码编写。

资源下载

Visual Studio
HL-SDK v2.3 p3 Official
Metamod SDK v1.20 v1.20 Sourcecode Official
Amxmodx SDK lasted version from github
Amxmodx SDK old version
Module: Semiclip source code

参考文献

AMX Mod X 1.60 Documentation
Module Writing (AMX Mod X)
[TUT] Creating AMXX modules (VS 2013 - 2019)
How to Compile AMXX Modules, Metamod Plugins
Alliedmods Wiki
AMX Mod X API
Dokumentacja AMX Mod X
Metamod Documentation