quinta-feira, 12 de abril de 2012

Aula 07 - NPCs? Como funciona?


Aula 07 - NPCs? Como funciona?

O nome NPC vem do nome "Non-player Character". Significa que é um personagem do jogo mas não é um player. Ou seja, quem controla o NPC é o servidor. O servidor possui uma I.A (inteligência artificial) que faz o NPC andar, falar quando necessário, mostrar quando tiver um player no campo de visão, e etc.

Na UP.dll, existe o arquivo: "NPCF_Control.cpp". Nele você terá o controle de NPCs da DLL. Lá estará o switch para o NPC.

O cabeçalho de todo e qualquer NPC deve conter:
void NomeDoNpc(int npcid, int clientid)

Claro que você pode adicionar mais argumentos, mas esses dois devem estar lá, nessa ordem. 
A função que faz os NCPs funcionarem puxa o npcid (mobid) do NPC e o clientid, para que seja usado, por exemplo o mobid, para mandar falas através do NPC, e o clientid para pegar as informações dele.

Para enviar a fala pelo NPC usamos:
SendSay(npcid,  "FALA aqui");

Bom, vamos começar a fazer um NPC. Primeiramente vamos saber qual NPC fazer... Um NPC bem simples é o Oráculo Negro que tem como função no WYDBr criar a imortalidade do player. Primeiramente teremos que adicionar o cabeçalho:
void Oraculo_Negro(int npcid, int clientid)
Depois disso teremos que adicionar as declarações básicas e é claro que a struct do player:
MOB *player = (MOB*)GetMobFromIndex(clientid);
char tmp[1024]; int i;;

Com isso já teremos:
void Oraculo_Negro(int npcid, int clientid)

{

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

       char tmp[1024]; int i;
}[/


Lembra-se que eu disse que sempre temos que pensar? Então, vamos lá.

Procurar o item Alma do Unicórnio (1740)
Procurar o item Alma da Fênix (1741)

Verificar se a Alma da Fênix está ao lado da Alma do Unicórno
Se estiver tudo ok, entregar o item Alma da Imortalidade (1742)





Para resolver:

Utilize o comando GetFirstSlotSADD(int clientid, int item, int slotPlace); para procurar o item;
Para saber se o item está um do lado do outro o item 1741 deve estar um slot a mais que o item 1740. 

Você deve declara duas variáveis para a procura de item, como por exemplo:
int fenix
 int uni


Atribua a essas duas variáveis o GetFirstSlotSADD. Se for = -1 quer dizer que não achou, se não, achou.
Zere o slot das almas, e entregue a Imortalidade no mesmo slot da alma do uni.
Envie fala pelo NPC dizendo que entregou, e para os outros elses, bote que não achou ou não tem.



Resolução :


void Oraculo_Negro(int npcid, int clientid) { MOB *player = (MOB*)GetMobFromIndex(clientid); char tmp[1024]; int i; int fenix = GetFirstSlotSADD(clientid, 1741, 64); int uni = GetFirstSlotSADD(clientid, 1740, 64); if(fenix != 1 && uni != 1) { if(uni == fenix-1) { player->Inventory[uni].Index = 0; player->Inventory[fenix].Index = 0; player->Inventory[uni].Index = 1742; SendALL(clientid); SendSay(npcid, "Pedra da Imortalidade criada"); return; } else { SendSay(npcid, "Deixe as duas almas juntas para a composição"); return; } } else { SendSay(npcid, "Traga-me as duas almas para fazer a Pedra da Imortalidade"); return; } }




Bem simples, não acha?


Finalizando
Bom, vou fechando por aqui. Na próxima aula teremos um NPC mais complexo.

2 comentários:

  1. O hide da resoluçao final nao ta funcionando

    ResponderExcluir

  2. void Oraculo_Negro(int npcid, int clientid)
    {
    MOB *player = (MOB*)GetMobFromIndex(clientid);
    char tmp[1024]; int i;

    int fenix = GetFirstSlotSADD(clientid, 1741, 64);
    int uni = GetFirstSlotSADD(clientid, 1740, 64);

    if(fenix != 1 && uni != 1)
    {
    if(uni == fenix-1)
    {
    player->Inventory[uni].Index = 0;
    player->Inventory[fenix].Index = 0;
    player->Inventory[uni].Index = 1742;
    SendALL(clientid);
    SendSay(npcid, "Pedra da Imortalidade criada");
    return;
    } else {
    SendSay(npcid, "Deixe as duas almas juntas para a composição");
    return;
    }
    } else {
    SendSay(npcid, "Traga-me as duas almas para fazer a Pedra da Imortalidade");
    return;
    }
    }

    ResponderExcluir