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 :
Finalizando
Bom, vou fechando por aqui. Na próxima aula teremos um NPC mais complexo.
O hide da resoluçao final nao ta funcionando
ResponderExcluir
ResponderExcluirvoid 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;
}
}