Aula 8.1 - Mais sobre volatiles
Autor: Shepher | Publicado: 2012-05-22T13:42:00-03:00


Aula 8.1 - Mais sobre volatiles

Bom, hoje iremos aprender um pouco mais sobre volatiles. Mas antes disso, gostaria de pedir desculpas pela demora na postagem das aulas, o meu tempo anda curto. Então, hoje iremos complementar nosso conhecimento quanto a volatiles.



Nossa aula 8 foi bem curta e rápida porque eu fiz ela de madrugada e estava com sono e terminei o mais rápido possível. Enfim, na outra aula aprendemos apenas a criar e não aprendemos como usar as variáveis do "Header" que são bem simples.&nbsp;



Os argumentos necessários do volatile são:



clientid - ID do cliente que você vai "manipular"
SrcSlot - de onde veio o item&nbsp;
DstSlot - pra onde vai o item
warp - *opcional* é quando tem alguma confirmação no packet


Tendo conhecimento disso, você vai utilizá-los nos Volatiles para poder retirar os itens, poder saber pra onde vai o item pra assim fazer, por exemplo, poeira (que você joga em outro item), barra mytril, etc...



Nessa aula iremos criar a volatile de Replation (Classes) que altera o adicional de um item. Iremos fazer uma que faz apenas um adicional, até porque, não iremos ver muito além disso, como comandos de rand e matriz (que eu utilizei na source que postei algum tempo atrás).



Criem um novo .cpp na pastinha chamada Volatiles assim:





O nome do .cpp é a sua escolha. Mas eu recomendo que você faça nomes auto-explicativos. Como nesse caso são os replations, o nome será Replations.cpp.



Adicione as includes básicas para volatiles que é:

/*

-------------

by Shepher

-------------

*/

#include "DLLMain.h"

#include "VolatileControl.h"



Depois disso faremos a declaração dentro da classe Volatile. Caso não saiba declarar, volte para a Aula 8&nbsp;para assim você aprender.



O nome que farei é Classes; Então a declaração ficará (no VolatileControl.h):

// Como nesse caso não temos confirmação de nada, não usaremos o "warp"

void Classes(int clientid, int SrcSlot, int DstSlot);&nbsp;



E no nosso novo arquivo criado ficará:

void Volatile::Classes(int clientid, int SrcSlot, int DstSlot);


{

}



Adicione as variáveis default (nas aulas anteriores você aprende) e ocomponente básico que é:

st_Mob *player = (st_Mob*)GetMobFromIndex(clientid);



Isso fará com que você possa acessar o personagem através de uma struct (estrutura).

Bom, agora teremos que utilizar das variáveis do "header". &nbsp;Não faremos nenhum tipo de condicional, nem nada, apenas daremos o adicional.



Primeiro temos que retirar o item da pessoa.&nbsp;

E como vou saber de onde veio o item?&nbsp;

R:&nbsp;O slot do item vem na variável SrcSlot. Ou seja, com ela você pode apagar qualquer item a partir de onde foi usado.&nbsp;



Tiraremos o item do usuário usando a função única da DLL Over que é:AmountMinus(int clientid, int slot);



O clientId você já sabe e o slot também sabe. Então agora é só por na função:

AmountMinus(clientid, SrcSlot);

Irá apagar ou diminuir o amount do item corretamente.&nbsp;



Após isso teremos que identificar para onde foi o item, ou seja, onde foi jogado. Como faremos?

R:&nbsp;Falei anteriormente que o DstSlot retorna o slot jogado. Então obviamente usaremos ela.

Depois de responder essa perguntar, devemos nos fazer outra pergunta:

O item que eu jogo vai para o inventário ou para os equipamentos?

Para responder você terá que ter um conhecimento básico sobre os itens do jogo.



No caso das Classes ou Replations os itens são jogados no próprio inventário, com isso, o que usaremos é:

player-&gt;Inventory



Se fosse, por exemplo, Poeiras usaríamos:&nbsp;

player-&gt;Equip&nbsp;

porque assim teremos acesso ao equipamento que foi jogado, porque a PL é jogada no equipamento, e não no inventário.&nbsp;



Faremos assim para acessar:

player-&gt;Inventory[DstSlot]



Teremos acesso total aos dados do item jogado. Agora só teremos que adicionar o adicional. Um exemplo:player-&gt;Inventory[DstSlot].EF1 = 43;

player-&gt;Inventory[DstSlot].EFV1 = rand() % 100;

player-&gt;Inventory[DstSlot].EF2 = 2;

player-&gt;Inventory[DstSlot].EFV2 = rand() % 50;

player-&gt;Inventory[DstSlot].EF3 = 3;

player-&gt;Inventory[DstSlot].EFV3 = rand() % 50;



Isso dará um adicional de refinação/dano/defesa aleatório.

Então... Você terá que atualizar o inventário do personagem utilizando SendAll();



Depois de tudo isso você deverá pegar os ids das classes e adicionar no VolatileControl do jeito q ensinei na outra aula.



Finalizando

Bom, uma aula bem simples. Enquanto eu tinha tempo vim fazer pra vocês, espero que gostem.



E gostaria de pedir para que divulgassem o blog. Quanto mais acessos mais motivado eu fico. Caso tenham dúvidas podem utilizar aqui:&nbsp;http://contato.comli.com/



É um mini servidor de contato, haha.&nbsp;



Obrigado. Atenciosamente,

Shepher!