Descrição
Este é apenas um pequeno include que usa OnPlayerCommandText () para processar os comandos dos jogadores. Cada comando tem uma função separada, como em dcmd, mas o zcmd os chama diretamente via CallLocalFunction (). Esse método é muito mais rápido do que quando você compara sucessivamente o texto inserido em cada comando que você tem em seu script (especialmente se ele envia um cmd inexistente, você passa por todos) e sua superioridade sobre o antigo é proporcional ao número de comandos. Eu fiz um teste de velocidade quando comecei a pensar sobre essa abordagem, você pode encontrar os resultados aqui.
Uso
Tudo que você precisa para adicionar um comando é apenas fazer uma função pública usando uma macro pré-definida especial, como esta:
ou (estilo antigo):
Aqui params [] é a string de parâmetros, o playerid é um ID do jogador que envia este comando.
Isso é tudo! Muito fácil, não é?
Importante: Já que a v0.3 OnPlayerCommandText não pode mais ser usada (também a opção ZCMD_NO_CALLBACK foi removida), mas há duas novas chamadas de retorno:
Este é chamado quando alguém envia um comando. Se você retornar 0 aqui, o comando não será executado.
E este é chamado após a execução do comando, aqui se você "retornar 0" o jogador verá a mensagem padrão "Comando Desconhecido". O parâmetro "success" é igual ao valor retornado pelos retornos da função de comando (se não existir, o sucesso será 0).
Observe que não é necessário adicionar esses retornos de chamada ao seu script se você não usá-los.
Como fazer dois comandos diferentes fazendo a mesma coisa
Por exemplo, você tem /something cmd:
e você quer criar outro como /another que faz o que /something faz. A maneira mais simples de fazer isso é:
Nota # 1: Se você quiser usar o zcmd em um filterscript, coloque isto define antes de incluir:
Nota #2: Se você quiser verificar se a string de parâmetros está vazia, você não deve fazer como:
ou:
porque seu comprimento nunca é nulo (leia mais aqui), simplesmente use isnull () incluído no zcmd:
Na verdade, se você usar o sscanf, não precisará fazer isso, pois ele possui uma verificação interna.
Aqui está um exemplo de como você pode fazer o comando / givemoney usando zcmd com sscanf:
Download
Pastebin
Este é apenas um pequeno include que usa OnPlayerCommandText () para processar os comandos dos jogadores. Cada comando tem uma função separada, como em dcmd, mas o zcmd os chama diretamente via CallLocalFunction (). Esse método é muito mais rápido do que quando você compara sucessivamente o texto inserido em cada comando que você tem em seu script (especialmente se ele envia um cmd inexistente, você passa por todos) e sua superioridade sobre o antigo é proporcional ao número de comandos. Eu fiz um teste de velocidade quando comecei a pensar sobre essa abordagem, você pode encontrar os resultados aqui.
Uso
Tudo que você precisa para adicionar um comando é apenas fazer uma função pública usando uma macro pré-definida especial, como esta:
- 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;
}
Aqui params [] é a string de parâmetros, o playerid é um ID do jogador que envia este comando.
Isso é tudo! Muito fácil, não é?
Importante: Já que a v0.3 OnPlayerCommandText não pode mais ser usada (também a opção ZCMD_NO_CALLBACK foi removida), mas há duas novas chamadas de retorno:
- Código:
OnPlayerCommandReceived(playerid, cmdtext[])
Este é 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 você "retornar 0" o jogador verá a mensagem padrão "Comando Desconhecido". O parâmetro "success" é igual ao valor retornado pelos retornos da função de comando (se não existir, o sucesso será 0).
Observe que não é necessário adicionar esses retornos de chamada ao seu script se você não usá-los.
Como fazer dois comandos diferentes fazendo a mesma coisa
Por exemplo, você tem /something cmd:
- Código:
COMMAND:something(playerid, params[])
{
// some stuff here
return 1;
}
e você quer criar outro como /another que faz o que /something faz. A maneira mais simples de fazer isso é:
- Código:
COMMAND:another(playerid, params[])
{
return cmd_something(playerid, params);
}
Nota # 1: Se você quiser usar o zcmd em um filterscript, coloque isto define antes de incluir:
- Código:
#define FILTERSCRIPT
Nota #2: Se você quiser verificar se a string de parâmetros está vazia, você não deve fazer como:
- Código:
if (!strlen(params))
{
// no parameters
}
ou:
- Código:
if (!params[0])
porque seu comprimento nunca é nulo (leia mais aqui), simplesmente use isnull () incluído no zcmd:
- Código:
if (isnull(params))
Na verdade, se você usar o sscanf, não precisará fazer isso, pois ele possui uma verificação interna.
Aqui está um exemplo de como você pode fazer o 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;
}
Download
Pastebin