在当前版本的amxmodx模块开发时,我们可能需要用到METAMOD的一些HOOK功能,那么我们就需要先开启METAMOD功能,然后再按照需要逐个开启METAMOD下的HOOK功能。

开启方法

在moduleconfig.h中,找到USE_METAMOD

1
// #define USE_METAMOD

把前边的注释去掉即可开启(这是总开关,如果需要用到其他HOOK功能,也是在这里找到相应的HOOK功能,把注释去掉,接着在你的cpp文件中实现该HOOK功能的函数即可)

1
#define USE_METAMOD

编译方法

使用AMBuild编译(Windows)

打开模块项目下的AMBuilder,在AMXX.modules += [builder.Add(binary)]之前加上以下内容:

1
2
3
4
if builder.target_platform == 'windows':
binary.compiler.linkflags += [
'/EXPORT:GiveFnptrsToDll=_GiveFnptrsToDll@8,@1',
]

这里说的只是windows平台需要加上'/EXPORT:GiveFnptrsToDll=_GiveFnptrsToDll@8,@1',如果是linux平台是不需要加这个的。同样的在windows下,我们使用Visual Studio来进行编译时,也需要在附加选项中加上这条语句。

使用Visual Studio 2017编译

如果你开启了METAMOD功能,则需要在“附加选项”中,填入以下内容才能正常编译,反过来,如果你没有开启METAMODE功能,你需要在“附加选项”中,去掉以下的内容:

1
/EXPORT:GiveFnptrsToDll=_GiveFnptrsToDll@8,@1 %(AdditionalOptions)

附加选项说明

这是chatgpt给出的回答,大家可以参考一下:

这段代码是Microsoft Visual C++编译器的链接选项之一,用于控制导出函数名的名称修饰方式。

在Windows下,函数名导出时会被自动加上一个名称修饰(name decoration),用于标识函数的参数类型和返回值类型。这样做是为了支持函数重载,但是导出的函数名称对于外部调用者来说可能不太友好,也不太容易记忆和理解。为了解决这个问题,Windows提供了一个链接选项“/EXPORT”,可以手动指定导出函数的名称及其名称修饰方式。

在这段代码中,/EXPORT选项的语法为“/EXPORT:function=decorated_function_name”,其中“function”是导出的函数名称,而“decorated_function_name”是修饰后的函数名称。

具体来说,“GiveFnptrsToDll”是要导出的函数名称,而“_GiveFnptrsToDll@8”则是修饰后的函数名称。这个名称修饰方式是标准的C++名称修饰方式(又称为C++ name mangling),表示函数的名称是“_GiveFnptrsToDll”,参数列表的总大小是8个字节(因为这个函数有两个int类型的参数,每个参数占4个字节)。

另外,“@1”是一个特殊的导出名称,它表示这个函数是一个常量,通常用于导出常量数据。这个名称修饰方式是Windows API的标准名称修饰方式之一,表示这个导出的名称是“_1”。

参考文献

Module Writing (AMX Mod X)
AMX Mod X Documentation
AMX X Documentation - API