Mostrando postagens com marcador Funções. Mostrar todas as postagens
Mostrando postagens com marcador Funções. Mostrar todas as postagens

quarta-feira, 23 de maio de 2012

[Source]Catalisador Makav - Exemplo de SendRemoveMob

Um exemplo pra quem quer utilizar a Função SendRemoveMob e não sabe como.

Tá aí a Source para o Catalisador Makav.

void Catalisador_Makav(int clientid, int SrcSlot, int DstSlot, int warp)
{
st_Mob *player = (st_Mob*)GetMobFromIndex(clientid);
int mount = player->Equip[14].Index;
char tmp[1024];
int cHora = PInt(0x00A5EA418);
int cMin = PInt(0x00A5EA414);
int cSeg = PInt(0x00A5EA410);
srand(time(NULL) * (cHora / cMin + cSeg + ((cMin + rand() % 100 - cSeg) / cHora)) * rand()%200+150);
if(mount >= 2330 && mount <= 2358)
{
if(DstSlot == 14)
{
if(mount == 2354 || mount == 2355 || mount == 2356)
{
/*EF2 = level
EFV2 = vitalidade
EF3 = ração
EFV1 = HP*/
int mountIn = mount + 30;
player->Equip[14].Index = mountIn;
player->Equip[14].EFV2 += rand() % 16;
player->Equip[14].EF2 = 0;
SendItens(clientid, 14);
player->Inventory[SrcSlot].Index = 0;
SendRemoveMob(clientid);
SendAll(clientid);
return;
} else {
SendClientMsg(clientid, "Tipo não confere");
SendAll(clientid);
return;
}
} else {
SendClientMsg(clientid, "Utilize em montarias");
SendAll(clientid);
return;
}
} else {
SendClientMsg(clientid, "Aplicado somente em montarias");
SendAll(clientid);
return;
}
return;
}


Créditos:
Shepher;

terça-feira, 22 de maio de 2012

[Source]Todas as rações

Na TMSRV atual, algumas das rações, são bugadas impossibilitando usá-las. Então resolvi postar a primeira source de rações que eu fiz e que uso até hoje.
Ela tá bem grandinha. Poderia diminuir para ficar automático, mas algumas montarias não tem IDs certinhos (não sei explicar). Enfim,

tá aí.

void Racoes(int clientid, int SrcSlot, int DstSlot, int warp)
{
st_Mob *player = (st_Mob*)GetMobFromIndex(clientid);
int mount = player->Equip[14].Index;
if(player->Equip[14].Index >= 2360 && player->Equip[14].Index <= 2388)
{
int mountIndex;
if(mount == 2360) mountIndex = 0;
if(mount == 2361) mountIndex = 1;
if(mount == 2362) mountIndex = 2;
if(mount == 2363) mountIndex = 3;
if(mount == 2364) mountIndex = 4;
if(mount == 2365) mountIndex = 5;
if(mount >= 2366 && mount <= 2370) mountIndex = 6;
if(mount == 2371) mountIndex = 9;
if(mount >= 2372 && mount <= 2375 || mount == 2387) mountIndex = 6;
if(mount == 2376) mountIndex = 16;
if(mount == 2378) mountIndex = 18;
if(mount == 2371 || mount == 2381 || mount == 2382 || mount == 2383 || mount == 2388) 
mountIndex = 9;
if(mount == 2377) mountIndex = 17;
if(mount == 2380) mountIndex = 8;
if(mount >= 2384 && mount <= 2386) mountIndex = 10;
if((mountIndex + 2420) == player->Inventory[SrcSlot].Index)
{
/*EF2 = level
EFV2 = vitalidade
EF3 = ração
EFV1 = HP*/
int val;
if(player->Equip[14].EFV1 >= 120 || player->Equip[14].EFV1 == 0)
return;
val = player->Equip[14].EFV1 += 30;
if(val > 100)
val = 100;
player->Equip[14].EFV1 = val;
val = player->Equip[14].EF3 += 1;
if(val > 100)
val = 100;
player->Equip[14].EF3 = val;
AmountMinus(clientid, SrcSlot);
AtualizaInvt(clientid);
} else {
SendClientMsg(clientid, "Tipo não confere");
return;
}
SendItens(clientid, 14);
} else {
SendClientMsg(clientid, "Usado apenas em montarias");
return;
}
}


Créditos totais a Shepher + Supernov4 (lógica)

sexta-feira, 20 de abril de 2012

[Source]Atualizar Inventário em forma de Packet

Bom, fiz essa func para enviar o packet de atualizar o inventário (0x185). Já é bem antiguinha minha. Quando fiz essa gambiarra pra poder atualizar sem o SendAll pra ver se o packet não abria o inventário automaticamente. Aí fui ver que mesmo assim ele abre. Daí tem o mandar um sinal para o cliente fechar.

struct p185 {
PacketHeader Header;
st_Item Item[64];
int gold;
};


void AtualizaInvt(int clientid)
{
p185 p = *(p185*)malloc(sizeof(p185));
st_Mob *player = (st_Mob*)GetMobFromIndex(clientid);
p.Header.ClientId = clientid; p.Header.PacketId = 0x185; p.Header.Size = sizeof(p185);
memcpy(&p.Item, &player->Inventory, sizeof(player->Inventory));
memcpy(&p.gold, &player->Gold, sizeof(p.gold));
SendPacket((BYTE*)&p, clientid, sizeof(p185));
SendClientSignalParm(clientid,0x7530, 0x3A7, 2); // Serve pra fechar o inventário
}

Créditos:
 Shepher

terça-feira, 13 de março de 2012

SendRemoveMob - Remove summon do mapa


Essa função faz com que um summon saia do mapa e do grupo.

No caso de catalisadores, quando uma Cria vira Adulto, o mob tem que sair do mapa, mas isso não acontece. Agora basta usar essa função.


Declare no seu .h a struct:


Código:
struct pCL_P1h
{
    PacketHeader Header;
    int dat1;
};




Declare também:

Código:
void SendRemoveMob(int clientid);
void SendRemoveParty(int clientid, int mobId);

#define DELETE_NORMAL 0 // Somente desaparece
#define DELETE_DEAD 1 // Animacao da morte do spawn
#define DELETE_DISCONNECT 2 // Efeito de quando o personagem sai do jogo
#define DELETE_UNSPAWN 3 // Efeito quando os monstros ancts somem

No seu .cpp adicione:

Código:


void SendRemoveParty(int clientid, int mobId)
{
 int removeparty_addr = 0x00442410;
 _asm
 {
  PUSH mobId
  PUSH clientid
  CALL removeparty_addr
  ADD ESP,0x04
 }
}

void SendRemoveMob(int clientid)
{
 pCL_P1h pRemMob;
    pRemMob.Header.Size = sizeof(pCL_P1h);
 pRemMob.Header.PacketId = 0x165;
 char tmp[1024];
 for(int i = 0; i < 12; i++)
 {
  int masterIndex = clientid * 0x410;
  int memberId = *(WORD*)(masterIndex + 0x015C6D86 + (i * 2));
  if(*(DWORD*)(memberId * 0xC4C + 0x07B318E0) == 0x00)
  {
   if(memberId != 0x0)
   {
    pRemMob.dat1 = DELETE_UNSPAWN;
    pRemMob.Header.ClientId = memberId;
    AddMessage((BYTE*)&pRemMob ,clientid);
    SendRemoveParty(clientid, memberId);
                                return;
   }
  }
 }
}


Para usar chame:

SendRemoveMob(clientid);


Créditos:
Shepher

SendRemoveParty - Retirar membro do Grupo



Essa função retira um membro do seu grupo.

Declare em seu .h:

void SendRemoveParty(int clientid, int mobId);

E no seu arquivo de funções adicione:

void SendRemoveParty(int clientid, int mobId)
{
int removeparty_addr = 0x00442410;
_asm
{
PUSH mobId
PUSH clientid
CALL removeparty_addr
ADD ESP,0x04
}
}

Para usar:
SendRemoveParty(clientid, ID DO PLAYER QUE SERÁ RETIRADO DO GRUPO);

Link pastebin:
http://pastebin.com/ShvSGDVn


Créditos:
TMSRV.map & Shepher