Descrição Este é apenas um pouco de incluir que usa OnPlayerCommandText () para processar comandos dos jogadores. Cada comando tem uma função separada como em dcmd, mas zcmd chama-los diretamente via CallLocalFunction () . Esse método é muito mais rápido do que quando você sucessivamente comparar o jogador texto inserido a cada comando que você tem em seu script (especialmente se ele enviar um cmd inexistente, você passa embora todos então) e sua superioridade sobre a maneira antiga é proporcional ao número de comandos. Eu fiz um teste de velocidade quando eu acabei de statrted pensar sobre esta abordagem, você pode encontrar seus resultados aqui .
Usage Tudo que você precisa para adicionar um comando é apenas fazer uma função pública usando macro pré-definido especial, como este:
- Código:
COMMAND:mycommand(playerid, params[]) // or CMD:mycommand(playerid, params[])
{
// Do something
return 1;
}
ou (estilo antigo):
- Código:
command(mycommand, playerid, params[]) // or cmd(mycommand, playerid, params[])
{
// Do something
return 1;
}
Este é um chamado quando alguém envia um comando. Se você retornar 0 aqui, o comando não será executado.
- Código:
OnPlayerCommandPerformed(playerid, cmdtext[], success)
E este é chamado após a execução do comando, aqui se "retornar 0", o jogador verá a mensagem padrão "Comando desconhecido". O parâmetro "sucesso" é igual ao valor retornado pela função de comando de retorno (se não existir o sucesso vai ser 0). Note-se que não é necessário para adicionar esses retornos de chamada para o seu script, se você não usá-los. Como fazer dois comandos diferentes fazendo a mesma coisa Por exemplo, você tem / algo cmd:
- Código:
COMMAND:something(playerid, params[])
{
// some stuff here
return 1;
}
}
e você quiser criar um outro como o / outra que faz o / algo faz. A maneira mais simples de fazer isso é:
- Código:
COMMAND:something(playerid, params[])
{
// some stuff here
return 1;
}
Nota # 1: Se você quiser usar zcmd em um filterscript, colocar isso definir antes de incluir:
- Código:
#define FILTERSCRIPT
Nota # 2: Se você quiser verificar se cadeia de parâmetros está vazia, não deve fazê-lo gosto:
- Código:
if (!strlen(params))
{
// no parameters
}
ou:
- Código:
if (!params[0])
porque o seu comprimento nunca é nula (leia mais aqui ), basta usar isnull () incluído na zcmd:
- Código:
if (isnull(params)
Na verdade, se você usar sscanf você não precisa fazer isso, pois foi construído com verificação isnull. Aqui está um exemplo de como você pode fazer de comando / givemoney usando zcmd com sscanf:
- Código:
COMMAND:givemoney(playerid, params[])
{
if (IsPlayerAdmin(playerid))
{
new
toplayerid, // the player we want to give money to
amount;
// extracting player's ID and amount from params
if (!sscanf(params, "ii", toplayerid, amount))
{
if (toplayerid != INVALID_PLAYER_ID)
{
new
message[40];
GivePlayerMoney(toplayerid, amount);
format(message, sizeof(message), "You got $%d from admin!", amount);
SendClientMessage(toplayerid, 0x00FF00FF, message);
}
else SendClientMessage(playerid, 0xFF0000FF, "That player is not connected");
}
else SendClientMessage(playerid, 0xFFFFFFFF, "Usage: /givemoney <playerid> <amount>");
}
else SendClientMessage(playerid, 0xFF0000FF, "Only admins can use this command!");
return 1;
}
Codigo logo abaixo:
- Código:
/**********************************
* *
* @Author: ZeeX *
* @Version: 0.3.1 *
* @Released: 31/10/2009 *
* *
**********************************/
#if defined _zcmd_included
#endinput
#endif
#define _zcmd_included
#define MAX_FUNC_NAME (32)
#define COMMAND:%1(%2) \
forward cmd_%1(%2); \
public cmd_%1(%2)
#define CMD:%1(%2) \
COMMAND:%1(%2)
#define command(%1,%2,%3) \
COMMAND:%1(%2, %3)
#define cmd(%1,%2,%3) \
COMMAND:%1(%2, %3)
#if !defined isnull
#define isnull(%1) \
((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
#endif
forward OnPlayerCommandReceived(playerid, cmdtext[]);
forward OnPlayerCommandPerformed(playerid, cmdtext[], success);
static
bool:zcmd_g_HasOPCS = false,
bool:zcmd_g_HasOPCE = false;
#if defined FILTERSCRIPT
public OnFilterScriptInit()
{
zcmd_g_HasOPCS = funcidx("OnPlayerCommandReceived") != -1;
zcmd_g_HasOPCE = funcidx("OnPlayerCommandPerformed") != -1;
return CallLocalFunction("zcmd_OnFilterScriptInit", "");
}
#if defined _ALS_OnFilterScriptInit
#undef OnFilterScriptInit
#else
#define _ALS_OnFilterScriptInit
#endif
#define OnFilterScriptInit zcmd_OnFilterScriptInit
forward zcmd_OnFilterScriptInit();
#else /*not a filterscript*/
public OnGameModeInit()
{
zcmd_g_HasOPCS = funcidx("OnPlayerCommandReceived") != -1;
zcmd_g_HasOPCE = funcidx("OnPlayerCommandPerformed") != -1;
if (funcidx("zcmd_OnGameModeInit") != -1)
{
return CallLocalFunction("zcmd_OnGameModeInit", "");
}
return 1;
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit zcmd_OnGameModeInit
forward zcmd_OnGameModeInit();
#endif /*if defined FILTERSCRIPT*/
public OnPlayerCommandText(playerid, cmdtext[])
{
if (zcmd_g_HasOPCS && !CallLocalFunction("OnPlayerCommandReceived", "is", playerid, cmdtext))
{
return 1;
}
new
pos,
funcname[MAX_FUNC_NAME];
while (cmdtext[++pos] > ' ')
{
funcname[pos-1] = tolower(cmdtext[pos]);
}
format(funcname, sizeof(funcname), "cmd_%s", funcname);
while (cmdtext[pos] == ' ') pos++;
if (!cmdtext[pos])
{
if (zcmd_g_HasOPCE)
{
return CallLocalFunction("OnPlayerCommandPerformed", "isi", playerid, cmdtext, CallLocalFunction(funcname, "is", playerid, "\1"));
}
return CallLocalFunction(funcname, "is", playerid, "\1");
}
if (zcmd_g_HasOPCE)
{
return CallLocalFunction("OnPlayerCommandPerformed", "isi", playerid, cmdtext, CallLocalFunction(funcname, "is", playerid, cmdtext[pos]));
}
return CallLocalFunction(funcname, "is", playerid, cmdtext[pos]);
}
#if defined _ALS_OnPlayerCommandText
#undef OnPlayerCommandText
#else
#define _ALS_OnPlayerCommandText
#endif
#define OnPlayerCommandText zcmd_OnPlayerCommandText
forward zcmd_OnPlayerCommandText(playerid, cmdtext[]);
Agradecimentos especiais a:
- Y_Less