state关键字可在运行时切换插件自动机和插件状态。
声明函数时,可设定函数所属的插件自动机和状态。
一个脚本可以拥有多个从属于不同自动机或状态的同名函数。
使用state关键字切换脚本的自动机和状态,便可调用从属于此状态下的函数。
如果要调用默认状态下的函数,需要切换到任意一个未被该函数绑定的自动机或状态。
(state) 【(条件表达式)】 【自动机名称(:)】(状态名称) [;]
若省略(条件表达式),表示无条件切换到指定状态。
若不省略(条件表达式),仅在条件表达式返回非0时才会切换。
注意:
若条件表达式是常量表达式,会触发警告。
因为常量表达式的结果在编译时就已经确定,在运行时判断其为0或非0是没有意义的。
要么改为运行时表达式,要么使用#if指令包裹无条件切换状态语句。
#include <amxmodx>
public plugin_init()
{
// 调用状态下的func函数,返回1
state yes;
server_print("[AMXX]文本内容:%d", func());
// 调用状态下的func函数,返回2
state no;
server_print("[AMXX]文本内容:%d", func());
// 所有func都不从属于插件auto状态,因此这里调用的是<>状态下的func函数,返回0
state auto;
server_print("[AMXX]文本内容:%d", func());
}
static func() <> return 0;
static func() <yes> return 1;
static func() <no> return 2;
static func2() <auto> return 3;
#include <amxmodx>
public plugin_init()
{
// 调用状态下的func函数,返回1
state debugmode:yes;
server_print("[AMXX]文本内容:%d", func());
// 调用状态下的func函数,返回2
state debugmode:no;
server_print("[AMXX]文本内容:%d", func());
// 所有func都不从属于插件debugmode:auto状态,因此这里调用的是<>状态下的func函数,返回0
state debugmode:auto;
server_print("[AMXX]文本内容:%d", func());
}
static func() <> return 0;
static func() <debugmode:yes> return 1;
static func() <debugmode:no> return 2;
static func2() <debugmode:auto> return 3;
#include <amxmodx>
enum tObjectInfo
{
Array: OI_Handle,
_: OI_ElementSize
}
static Array:gObjects;
public plugin_precache()
{
register_plugin("测试插件", "1.0.0", "插件作者");
// 若编译器调试级别大于1,说明允许AMX Mod X调试当前插件(通过添加-d0 -d1 -d2 -d3等编译器参数,可更改此常量)
#if (1 < debug)
// 用6个单元储存插件运行状态文本
new status[6];
get_plugin(-1, .status = status, .len5 = charsmax(status));
// 若AMX Mod X正在调试当前插件,切换到调试模式(在配置文件夹中,为当前插件名称末尾添加debug)
state (equal(status, "debug")) PluginDebugging;
#endif
gObjects = ArrayCreate(tObjectInfo);
// 根据此时插件状态(默认状态或PluginDebugging状态),调用对应的ArrayCreateEx函数
new Array:handle = ArrayCreateEx();
// ...
}
// 此函数仅在发布模式下可用
static Array:ArrayCreateEx(cellsize = 1, reserved = 32) <>
{
// 调用默认的创建数组函数
return ArrayCreate(cellsize, reserved);
}
// 此函数仅在调试模式下可用
static Array:ArrayCreateEx(cellsize = 1, reserved = 32) <PluginDebugging>
{
new sObjectInfo[tObjectInfo];
sObjectInfo[OI_Handle] = ArrayCreate(cellsize, reserved);
sObjectInfo[OI_ElementSize] = cellsize;
// 将创建的数组相关数据存入一个大数组中,方便未来检查
ArrayPushArray(gObjects, sObjectInfo);
return sObjectInfo[OI_Handle];
}