描述
这只是一个使用OnPlayerCommandText()处理玩家指令的小头文件。每个命令都有一个单独的函数,就像在dcmd中一样,但是zcmd直接通过CallLocalFunction()调用它们。这种方法比连续比较玩家输入的每个指令与脚本中的每个命令要快得多,而且随着命令的数量的增加,zcmd的优势则会越来越明显。我做了一个命令的速度测试,你可以在这里找到它的结果。
使用方法
添加命令所需的只是使用特殊的预定义宏生成公共函数,如下所示:
COMMAND:mycommand(playerid, params[]) // or CMD:mycommand(playerid, params[]) { // 在这里设计你的代码 return 1; }
或者(旧版风格):
command(mycommand, playerid, params[]) // 或者 cmd(mycommand, playerid, params[]) { // 在这里设计你的代码 return 1; }
这里params[]是参数字符串,playerid是发送此命令的玩家的ID。
这就是全部!很容易,不是吗?
OnPlayerCommandText()回调被下面这个回调函数所取代,当有人输入指令时会调用下面这个回调函数,如果返回0,则指令不会被执行:
OnPlayerCommandReceived(playerid, cmdtext[])
而下面这个回调函数则会在指令执行后被调用,如果你返回0,那么玩家将会看到Unknown command的服务器提示,success参数是命令函数返回的值,如果命令函数没有返回值或者没有匹配到命令函数,那么success将会是0:
OnPlayerCommandPerformed(playerid, cmdtext[], success)
请注意 ,如果不是必须使用这些回调函数,请不要把他们加入到脚本文件中
怎样让两条不同的指令执行相同的操作
例如,你写了一个刷车命令/car:
COMMAND:car(playerid, params[]) { //刷车代码 return 1; }
并且你想创建另一个刷车命令/vehcile,然后让他做和/car一样的事情,最简单的方法是:
COMMAND:vehicle(playerid, params[]) { return cmd_car(playerid, params); }
注意 #1:如果你想在脚本文件中使用zcmd,请在脚本文件中写下这个宏定义:
#define FILTERSCRIPT
注意 #1:如果你想检查参数是否为空,请不要使用strlen函数或者检查第一个字符是否为空字符,这样做是错误的:
if (!strlen(params)) { //在这里设计你的代码 }
或者:
if (!params[0]) { //在这里设计你的代码 }
因为params字符串的长度永远不为空(点击这里了解与之相关的更多知识),所以只需使用zcmd中自带的的isnull()函数即可:
if (isnull(params)) { //当参数为空时会执行这个语句块中的内容 }
实际上,如果你使用了sscanf()函数,则不需要这么做,因为它内置了和isnull()一样的功能,看下面这个例子:
COMMAND:money(playerid, params[]) { new money; if (sscanf(params,"i",money)) { //当参数为空时会执行这个语句块中的内容 } else { GivePlayerMoney(playerid,money); } return 1; }
下载
这个项目目前被放置在了GitHub上:点我前往页面
原文:https://www.cnblogs.com/FranciumKIKI/p/12832953.html