搜索
查看: 4718|回复: 8

cmd_access的用法(已解决)

[复制链接]
发表于 2009-1-25 02:07:56 | 显示全部楼层 |阅读模式 来自 日本–东京都–千代田区
本帖最后由 cityhonghu 于 2009-1-26 16:11 编辑

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

其中 cid,num是指什么呢?

谢谢
发表于 2009-1-25 10:33:09 | 显示全部楼层 来自 中国–北京–北京–海淀区
cid = command id
num = 命令行参数个数,包括命令本身
回复

使用道具 举报

 楼主| 发表于 2009-1-25 13:53:58 | 显示全部楼层 来自 日本–东京都–千代田区
本帖最后由 cityhonghu 于 2009-1-25 13:57 编辑

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

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

使用道具 举报

发表于 2009-1-25 16:08:30 | 显示全部楼层 来自 中国–北京–北京–西城区
cid是amxx的cmd forward直接传递的,num是命令行的参数个数,如果一个命令不带参数,则num为1,否则为1+参数个数。
回复

使用道具 举报

 楼主| 发表于 2009-1-25 20:29:46 | 显示全部楼层 来自 日本–东京都–千代田区
谢谢 jim_yang 。
回复

使用道具 举报

发表于 2009-1-26 12:46:02 | 显示全部楼层 来自 中国–福建–漳州
本帖最后由 Rulzy 于 2009-1-26 12:48 编辑
  1. ......
  2. register_concmd("amx_mycommand","MyFunction",ADMIN_KICK,"Description of the command")
  3. ........

  4. public MyFunction(id, level, cid)
  5. {
  6.     if(!cmd_access(id, level, cid, 3))
  7.         return PLUGIN_HANDLED;
  8.     ........
  9. }
复制代码
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版本的代码。

  1. stock cmd_access(id,level,cid,num) {
  2.   new has_access = 0
  3.   if ( id==(is_dedicated_server()?0:1) ) {
  4.     has_access = 1
  5.   } else if ( level==ADMIN_ADMIN ) {
  6.     if ( is_user_admin(id) )
  7.       has_access = 1
  8.   } else if ( get_user_flags(id) & level ) {
  9.     has_access = 1
  10.   } else if (level == ADMIN_ALL) {
  11.         has_access = 1
  12.   }

  13.   if ( has_access==0 ) {
  14. #if defined AMXMOD_BCOMPAT
  15.     console_print(id, SIMPLE_T("You have no access to that command."))
  16. #else
  17.     console_print(id,"%L",id,"NO_ACC_COM")
  18. #endif
  19.     return 0
  20.   }
  21.   if (read_argc() < num) {
  22.     new hcmd[32], hinfo[128], hflag
  23.     get_concmd(cid,hcmd,31,hflag,hinfo,127,level)
  24. #if defined AMXMOD_BCOMPAT
  25.     console_print(id, SIMPLE_T("Usage:  %s %s"), hcmd, SIMPLE_T(hinfo))
  26. #else
  27.     console_print(id,"%L:  %s %s",id,"USAGE",hcmd,hinfo)
  28. #endif
  29.     return 0
  30.   }
  31.   return 1
  32. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2009-1-26 16:10:26 | 显示全部楼层 来自 日本–东京都–千代田区
谢谢2位,再仔细看看。
回复

使用道具 举报

 楼主| 发表于 2009-2-1 03:52:33 | 显示全部楼层 来自 日本–东京都–千代田区
再问一下。
如此看来,num的最小值为1,那么为什么有的源码num可以为0呢?
举例来说amxx1.81的adminvote插件里的cancelvote的代码部分。
回复

使用道具 举报

发表于 2009-2-1 11:20:44 | 显示全部楼层 来自 中国–北京–北京–海淀区
对参数个数的判断只是用于以下情况:
比如一个命令有两个参数
set #player 100
如果你只给出一个参数,而检查命令时用的num为3
则会提示你该命令该如何正确使用。
对于num==0的情况,就是没有参数,所以1和0都无所谓。
只要你读懂了版主上面贴的cmd_access代码就明白了
if (read_argc() < num) { 只是检查参数小于num的情况。
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

快速回复 返回顶部 返回列表