cityhonghu 发表于 2009-1-25 02:07:56

cmd_access的用法(已解决)

本帖最后由 cityhonghu 于 2009-1-26 16:11 编辑

格式为
cmd_access(id, level, cid, num)

其中 cid,num是指什么呢?

谢谢

jim_yang 发表于 2009-1-25 10:33:09

cid = command id
num = 命令行参数个数,包括命令本身

cityhonghu 发表于 2009-1-25 13:53:58

本帖最后由 cityhonghu 于 2009-1-25 13:57 编辑

谢谢 jim_yang 。
那么, cid是固定写法 ,而num 需要改为数字 ?

比如不加参数直接command时显示用法,command <1|0>时让他执行的话,是不是num为2就可以呢?

jim_yang 发表于 2009-1-25 16:08:30

cid是amxx的cmd forward直接传递的,num是命令行的参数个数,如果一个命令不带参数,则num为1,否则为1+参数个数。

cityhonghu 发表于 2009-1-25 20:29:46

谢谢 jim_yang 。

Rulzy 发表于 2009-1-26 12:46:02

本帖最后由 Rulzy 于 2009-1-26 12:48 编辑

......
register_concmd("amx_mycommand","MyFunction",ADMIN_KICK,"Description of the command")
........

public MyFunction(id, level, cid)
{
    if(!cmd_access(id, level, cid, 3))
      return PLUGIN_HANDLED;
    ........
}cmd_access函数是用来判断玩家是否有权限,并且参数个数是否符合。请看上面的例子:
“public MyFunction(id, level, cid)”是注册的命令需要执行的函数的固定格式,如果不需要判断玩家权限和参数个数,则也可以简写为“public MyFunction(id)”。这里的cid即此命令的ID。
“cmd_access(id, level, cid, 3)”中最后的数字3表示为,如果玩家实际执行此命令的参数个数(包括命令本身)小于3(即实际参数小于2),则此函数会返回0,并且会在服务器或玩家控制台里给出提示信息。如果此命令必须带参数执行,则num应该大于或等于2,根据实际需要确定。如果此命令不需要带参数,num设为1即可。

具体可以参考 include/amxmisc.ini,上面有它的函数源代码。下面的代码是1.76b版本的代码。
stock cmd_access(id,level,cid,num) {
new has_access = 0
if ( id==(is_dedicated_server()?0:1) ) {
    has_access = 1
} else if ( level==ADMIN_ADMIN ) {
    if ( is_user_admin(id) )
      has_access = 1
} else if ( get_user_flags(id) & level ) {
    has_access = 1
} else if (level == ADMIN_ALL) {
        has_access = 1
}

if ( has_access==0 ) {
#if defined AMXMOD_BCOMPAT
    console_print(id, SIMPLE_T("You have no access to that command."))
#else
    console_print(id,"%L",id,"NO_ACC_COM")
#endif
    return 0
}
if (read_argc() < num) {
    new hcmd, hinfo, hflag
    get_concmd(cid,hcmd,31,hflag,hinfo,127,level)
#if defined AMXMOD_BCOMPAT
    console_print(id, SIMPLE_T("Usage:%s %s"), hcmd, SIMPLE_T(hinfo))
#else
    console_print(id,"%L:%s %s",id,"USAGE",hcmd,hinfo)
#endif
    return 0
}
return 1
}

cityhonghu 发表于 2009-1-26 16:10:26

谢谢2位,再仔细看看。

cityhonghu 发表于 2009-2-1 03:52:33

再问一下。
如此看来,num的最小值为1,那么为什么有的源码num可以为0呢?
举例来说amxx1.81的adminvote插件里的cancelvote的代码部分。

jim_yang 发表于 2009-2-1 11:20:44

对参数个数的判断只是用于以下情况:
比如一个命令有两个参数
set #player 100
如果你只给出一个参数,而检查命令时用的num为3
则会提示你该命令该如何正确使用。
对于num==0的情况,就是没有参数,所以1和0都无所谓。
只要你读懂了版主上面贴的cmd_access代码就明白了
if (read_argc() < num) { 只是检查参数小于num的情况。
页: [1]
查看完整版本: cmd_access的用法(已解决)