cs1.6 amxx编程 状态分类器精研教程 -- 作者:偶萤蛉(Oinling)

状态分类器介绍:

除了本机函数(用native声明的函数),任何函数都可以拥有状态分类器(State Classifiers).

为预声明函数(用forward声明的函数)设定状态分类器是没有意义的.

若不为函数设定状态分类器,则不允许声明多个同名函数.

声明函数时,若需要声明多个拥有相同名称,不同作用的函数.可以为这些同名函数设定状态分类器.

状态分类器用于设定当前函数仅在插件的某些特定状态下可用(用state语句切换插件状态).

一个函数可以被划分给多个不同的状态.但两个同名函数不能被划分给同一个状态.

因此,多个同名函数中,只有一个能匹配插件当前状态.不论如何切换插件状态,总是只有一个函数能被调用.

状态分类器以 < 符号开始,以 > 符号结束. < 符号是状态分类器入口, > 符号是状态分类器出口.

< > 中间允许不填写任何内容.也允许填写(定义)一个自动机名称或多个不同状态名称.

若有多个状态名称,每个状态名称之间必须用 , 符号隔开.

插件可以拥有多个自动机,在状态分类器中 < 符号的右边可以填写1个自动机名称,以 : 符号结尾.

表示将自动机名称右边的所有状态划分给这个自动机.

若不填写自动机名称,则所有状态被划分给匿名自动机(默认自动机).

不同自动机可以拥有相同名称的状态.

自动机名称与状态名称都属于自定义符号(或自定义标识符),命名时必须遵守符号命名规则.

状态分类器是为state语句服务的.切换插件状态,执行不同函数的相关内容,请参阅state语句的相关教程.

状态分类器的语法格式:

状态分类器有以下数种语法格式:

// 当前函数仅在其它同名函数都无法被调用时能被调用 <> /* 当前函数仅在插件进入State1状态后能被调用, * 若这个状态不存在,则创建. */ <State1> /* 当前函数仅在插件进入State2或State3或State4状态后能被调用, * 若这些状态不存在,则创建. */ <State2, State3, State4> /* 当前函数仅在插件进入Automaton1:State1状态后能被调用, * 若这个自动机和状态不存在,则创建. */ <Automaton1:State1> /* 当前函数仅在插件进入Automaton1:State2或Automaton1:State3状态后能被调用, * 若这些自动机和状态不存在,则创建. */ <Automaton1:State2, State3>

以下是声明函数时,设定状态分类器的实例(尖括号部分的代码):

Function1() <> return 0; Function1() <Prologue> return 5; public Function1() <Beginning> return 10; static Function1() <Development> return 20; stock Function1() <Climax> return 30; static stock Function1() <Ending> return 40; @Function2() <> return 1; @Function2() <Beginning, Development> return 2; @Function2() <OtherState> return 3; static Function3() <> { return -1; } static Function3() <StoryPlot:Prologue, Beginning> { return -2; } static Function3() <StoryPlot:Development, Climax, Ending> { return -3; }