📦 如何编写AMXX插件源码

通常应该在编译器目录(源码目录)创建文本文档,填写英文文件名和.sma后缀。

打开这个文件,开始编写代码。

📌 核心规则: AMXX插件源码必须包含至少一个公共函数作为入口,否则无法编译。

函数是有名字的代码块。声明公共函数并定义其代码的示例:

// 声明一个函数 Function (名称可自定义),public 表示公开 public Function() { // 这里填写需要执行的代码,例如下面这行代码作用是在控制台发送文本 server_print("====================== Hello ======================"); }

其他模块不会主动访问你的公共函数,因此上面的代码仅保证能编译通过,公共函数的代码块内容无法执行。

要使代码实际执行,通常在源码需要引用 amxmodx.inc 这个头文件:

#include <amxmodx>

amxmodx.inc 中包含许多用 forward 声明的函数(缺少代码块部分的函数定义),像这样:

/** * Called just after server activation. * * @note Good place to initialize most of the plugin... */ forward plugin_init();

你在自己的源码中用 public 定义同名函数,它就会在特定时刻被触发。

#include <amxmodx> public plugin_init() { // 根据amxmodx.inc文件中的介绍,此函数在服务器启动后立刻触发。 // 是适合大部分插件进行数据初始化的好函数。 // 也可以调用其它函数(不包括forward函数) // 调用Function函数的效果是在控制台发送Hello文本 Function(); // 下面这行代码作用是在控制台发送Rainbow文本 server_print("====================== Rainbow ======================"); } public Function() { server_print("====================== Hello ======================"); }

⚙️ 编译与运行

编译源码得到.amxx文件后,存放到插件目录,并用记事本打开plugins.ini,另起一行填写插件文件名和介绍:

my_plugin.amxx ; 这是我正在测试的小插件

进入游戏地图后按打开控制台,发送amxx plugins即可查看插件信息。


📝 设置插件信息

调用 register_plugin 函数可以设置插件名称,版本,作者等信息:

#include <amxmodx> public plugin_init() { register_plugin("插件名称", "插件版本", "插件作者"); }

若字符串内包含中文,保存时请设置为 UTF-8 无 BOM 编码。


🎯 监听更多事件

除了forward函数,还可以利用特定的native函数监听事件,决定什么情况下触发自定义的公共函数。

例如:

amxmodx.incregister_eventregister_logevent函数。

fakemeta.incregister_forward函数。

hamsandwich.incRegisterHam函数。

这类函数可以让特定事件触发之前或之后,先执行你制作的公共函数。

更详细的介绍需自行查阅inc文件提供的注释,其可监听的相关事件通常位于其它头文件内,例如**const.inc结尾的头文件。

示例:玩家实体被击杀后,凶手满血

#include <amxmodx> #include <fakemeta> #include <hamsandwich> public plugin_init() { register_plugin("测试", "1.0.0", "作者"); // 设置玩家实体被击杀事件触发之后,调用Player_Killed_Post函数 RegisterHam(Ham_Killed, "player", "Player_Killed_Post", 1, true); } public Player_Killed_Post(killedEntId, killerEntId, shouldGib) { // 若凶手还或者 if (is_user_alive(killerEntId)) { // 获取凶手的最大生命值 new Float:maxHealth; pev(killerEntId, pev_max_health, maxHealth); // 设置凶手的生命值为最大生命值 set_pev(killerEntId, pev_health, maxHealth); } }

📚 下一步

虽然本教程让你快速上手,但要想写出复杂插件,还需要学习基础语法。下一篇:

📄 04. AMXX源码的注释 →