sexta-feira, 25 de maio de 2012

Aula 9 - MobKilledEvent

Aula 9 - MobKilledEvent 
Uma aula exclusiva para a minha DLL, já que outras DLLs não são iguais. Então vamos a uma breve explicação do que é:
MobKilledEvent é uma função que acontece quando um mob específico morre. Pode ser qualquer MOB. Desde que você tenha os números do status dele. Todos os dados podem ser verificados, como nome, exp, level, learn, set, arma, e etc. Você pode ser bem específico caso você queira que não ocorra algum bug, como por exemplo ter um mob com o mesmo nome, só que esse mob seria um boss e se o servidor, por algum caso misterioso, "confundisse" os dois e identificasse como boss, seria um problema.

Eu deixei na DLL o seguinte código como principal:
void MobKilledEvent(BYTE *m_PacketBuffer)
{
p338 *p = (p338*)m_PacketBuffer; char tmp[1024];
WORD clientid = p->killer; WORD mobid = p->killed;
st_Mob *mob = (st_Mob*)GetMobFromIndex(p->killed);
MobKilledE *MobKilled = new MobKilledE();
if(strcmp((char*)mob->Name, "Kefra") == 0)
MobKilled->Kefra(clientid, mobid);
else if(strcmp((char*)mob->Name, "NOMEQUEQUISER") == 0)
return; // Função que quiser;
else {
sprintf(tmp, "Nome do mob é: %s", (char*)mob->Name);
SendClientMsg(clientid, tmp);
}
return;
}
Source OverDestiny  v1.1
Bom, o código é bem simples, não tem segredo. Deixei ali como exemplo para quando o personagem matar um mob com o nome "Kefra". .E como faço pra adicionar outro MOB pelo nome?

Simples, como tá mostrando ali, você só tem que adicionar o else if com uma comparação do nome do mob morto pelo que quiser. Ali tem um exemplo: "NOMEQUEQUISER".
else if(strcmp((char*)mob->Name, "NOMEQUEQUISER") == 0)
Você só trocaria o NOMEQUEQUISER pelo nome do Mob que quer que faça algo.
Caso queira mais um, adicione logo abaixo outro else if desse.

Além do nome, quero verificar outras coisas. Como faço?
Você simplesmente adiciona um else if com a condição que quiser. Caso queira pelo level, ficaria:
else if(mob->bStatus.Level == 500)
E logo após isso, a função.

Criando as Funções para o MobKilledEvent
Para criar uma função você deve declará-la, primeiramente. Será declarado no arquivo "MobKilledEvent.h" dentro da class MobKilledE.
Vamos fazer um exemplo. O código atual é:
/*
-------------
by Shepher
-------------
*/
#ifndef __MOBKILLED_EVENT_H__
#define __MOBKILLED_EVENT_H__

class MobKilledE{
public:
void Kefra(int clientid, int npcid);
};
#endif
Iremos criar a função para o mob chamado "Cav._Kaizen". O nome da func farei:
void MobKilledE::Cav_Kaizen(int clientid, int npcid)
Declare ela no MobKilledEvent.h assim:
void Cav_Kaizen(int clientid, int npcid);
Ficando o total no arquivo assim:
/*
-------------
by Shepher
-------------
*/
#ifndef __MOBKILLED_EVENT_H__
#define __MOBKILLED_EVENT_H__

class MobKilledE{
public:
void Kefra(int clientid, int npcid);
void Cav_Kaizen(int clientid, int npcid);
};
#endif

Entendeu como declara? Se não, volte o tutorial.
Após isso faça o bloco de códigos para a função:
void MobKilledE::Cav_Kaizen(int clientid, int npcid)
{
st_Mob *player = (st_Mob*)GetMobFromIndex(clientid); char tmp[1024];

}
Fazendo isso, faça o código que souber fazer normalmente. Como ensinamos nos códigos de NPCs e comandos.

Na função principal, você adicionará a condição para acionar o evento. Pensaremos numa legal. O mob tem que ter o nome citado anteriormente, level 355, exp 50000, okay? Então fica assim:
else if(strcmp((char*)mob->Name, "Cav. Kaizen") == 0 && mob->bStatus.Level == 354 && mob->Exp == 50000)
OBS: No nome deve-se trocar o underline ( "_" ) por espaço ( " " );

Após isso, só chamaremos a função usando MobKilled->. Ficando assim:
else if(strcmp((char*)mob->Name, "Cav. Kaizen") == 0 && mob->bStatus.Level == 354 && mob->Exp == 50000)
MobKilled->Cav_Kaizen(clientid, mobid);

Finalizando
Bom, hoje aprendemos a criar um novo mob para o MobKilledEvent. Espero que tenham gostado.:D


Então, só testar no jogo.


Atenciosamente,
Shepher

Nenhum comentário:

Postar um comentário