quarta-feira, 14 de março de 2012

Aula 04 - Nosso primeiro código - Comandos

Aula 04 - Nosso primeiro código - Comandos
Finalmente! Chegamos na parte que todos esperavam. Agora você vai aprender a programar. Seu primeiro código ficará no arquivo "Commands.cpp". Esse arquivo possui todos os comandos do jogo. Os comandos nada mais são do que: /Reino /king /relo e assim por diante. Se no início do chat tiver uma barra ("/") quer dizer que é um comando e o packet mandado é o 0x334.

Como adicionar um novo comando?
Vá no arquivo "Commands.cpp" e você verá vários códigos. Ficou confuso? Bom, vou explicar. A primeira parte é essa: void Commands_game(BYTE* m_PacketBuffer,WORD clientid) { p334 *pServer = (p334*)m_PacketBuffer; MOB* player = (MOB*)GetMobFromIndex(clientid); pServer->eValue[99] = '\0'; pServer->eCommand[15] = '\0'; char tmp[1024];

Vamos então entender por partes.

void Commands_game(BYTE* m_PacketBuffer,WORD clientid) { -> Inicio da função Commands_game com 2 argumentos. O m_PacketBuffer é todo o packet que o servidor recebe (nível intermediário/avançado). Clientid já foi explicado anteriormente p334 *pServer = (p334*)m_PacketBuffer; -> Faz com que a struct p334 associe-se ao m_PacketBuffer. MOB* player = (MOB*)GetMobFromIndex(clientid); -> pega o personagem pelo id do client pServer->eValue[99] = '\0'; -> Identifica o que foi escrito depois do comando pServer->eCommand[15] = '\0'; -> Identifica o comando char tmp[1024]; -> Variável default

Essa parte sempre será a mesma. Não é necessário sua alteração, a não ser que você queira modificar algo para você. Ou também adicionar a variável default: int i;.

Logo depois de tudo isso, vem o comando:
if(strcmp(pServer->eCommand,"warp") ==0 && player->bStatus.Level >= 1000) // Teleportr command {

Isso aí que vai identificar o comando exatamente. Ele verifica se o que foi digitado no chat (pServer->eCommand) é igual ao que está no argumento 2 do comando strcmp();. Caso for, retorna 0, se não, retorna um valor diferente de 0. 

O comando strcmp(const char *str1, const char *str2); compara a str1 com a str2. Se o valor retornado for 0, quer dizer que a string1 é igual a string2 

No caso, queremos adicionar um novo comando, e não modificar um. No início do tutorial existia os requisitos de que era necessário saber o básico de C++. Então, agora você vai precisar.
Após o if geralmente tem um else if ou pelo menos um else. Após o if analisado anteriormente (if(strcmp(pServer->eCommand,"warp") ==0 && player->bStatus.Level >= 1000))  você vai adicionar um else if. Esse else if terá a seguinte condicional:
Se pServer->eCommand for igual a "tutorial" (strcmp == 0)

Espero que você tenha conseguido fazer. Se não... Você pega o código abaixo.

Resolução :

else if(!strcmp(pServer->eCommand, "tutorial"))
PS: Recomendo que se você não conseguiu fazer, releia o tutorial e tente novamente e não pegue a resolução.

No bloco de comandos desse else if (o que fica dentro dos "{" e "}") você mandará uma mensagem para o player (SendClientMsg) com a mensagem: "O famoso Hello World". Caso você tenha lido a aula anterior, saberá os argumentos.  E logo após isso um return; 

Porque um return?
O return faz sair da função o que faz não executar mais nada abaixo. Se você não botar o return, pode aparecer a mensagem "Personagem não está conectado".

O código todo fica:
Resolução

else if(!strcmp(pServer->eCommand, "tutorial")) { SendClientMsg(clientid, "O famoso Hello World"); return; }

Compile utilizando o atalho CTRL+F9 ou CTRL+SHIFT+B para compilar o projeto todo. Ponha a DLL criada na pasta Plugin. Entre no jogo e digite /tutorial. Apareceu a mensagem? Então beleza. Tudo OK. Se não apareceu, volte e releia a aula.

Condições para o comando funcionar
Uma das coisas básicas que eu nem deveria explicar aqui, mas eu vou. Você por exemplo, quer fazer um comando funcionar apenas para certos personagens, como admins, que são leveis acima do 1000. Então, como fazer?
Você terá que adicionar uma condicional juntamente com o comando. Ou você pode fazer dentro dele. Como fazer isso utilizando o código anterior?
else if(!strcmp(pServer->eCommand, "tutorial"))
Temos esse código. O que devemos fazer é adicionar antes do último ")" um operador relacional, são eles:

&E para bits
^Ou exclusivo para bits
|Ou para bits
&&E lógico
||Ou lógico
No caso, queremos que a função seja utilizada QUANDO for digitado /tutorial E o level for maior que 1000.

Então ficaria:
) && player->bStatus.Level >= 1000));

E você que não sabe o que e >=, <=, ==?

>maior que
<=menor ou igual
<menor que
<=menor ou igual
==igual a
!=diferente de


Finalizando
Essa parte será finalizada assim, mas será falada na próxima aula juntamente com outro assunto importante.


Atenciosamente, Shepher

Nenhum comentário:

Postar um comentário