Hola chicos estube haciendo el llamado del GetMainInfo para cargar las texturas desde un txt como los custom que ya conocemos, aclaro que no esta del todo funcional solo faltaria la carga de las texturas y validacion para que cargue capa mas tiras y otro que solo seria solo capa, me rompi la cabeza con esto que para algunos puede ser sencillo comparto todo lo que hice para que algun heroe sin capa complete el trabajo y pueda compartir con toda la comunidad. muchos estaremos agradecidos.
#include "stdafx.h"
#include "Cape.h"
#include "Defines.h"
#include "Object.h"
#include "Interface.h"
#include "Util.h"
#include "Item.h"
#include "CustomCloak.h"
#include "TMemory.h"
//#include "CustomPet.h"
//#include "PetHook.h"
//#include "Pet.h"
//#include "Import.h"
CCapeAnimation gCapeAnimation;
CCapeAnimation::CCapeAnimation()
{
}
CCapeAnimation::~CCapeAnimation()
{
}
DWORD CapeRegister;
DWORD CapeEffectPointer;
DWORD CapeEffectBuff;
void CCapeAnimation::DrawViewPort(DWORD ObjectPointer, DWORD ObjectModel, DWORD a3)
{
lpViewObj Object = &*(ObjectPreview*)(ObjectPointer);
//for ( int n = 0; n < gCloak.m_CustomCloakInfo.size(); ++n ) {
for(int n=0;n < MAX_CUSTOM_CLOAK;n++)
if(Object->WingsSlot == ITEM2(gCloak.m_CustomCloakInfo[n].Index,gCloak.m_CustomCloakInfo[n].ItemIndex)){
Object->WingsSlot = ITEM2(gCloak.m_CustomCloakInfo[n].Index,gCloak.m_CustomCloakInfo[n].ItemIndex);
if(gCloak.m_CustomCloakInfo[n].Mode == 0){
SetDword((0x0057491A + 1), gCloak.m_CustomCloakInfo[n].IndexCloak);
SetDword((0x0057491F + 1), gCloak.m_CustomCloakInfo[n].IndexCloak);
//
if( strcmp(gCloak.m_CustomCloakInfo[n].StripModel, "") != 0 )
{
SetDword((0x00574F2E + 1), gCloak.m_CustomCloakInfo[n].IndexStrip);
SetDword((0x00574F33 + 1), gCloak.m_CustomCloakInfo[n].IndexStrip);
//
SetDword((0x00574FFC + 1), gCloak.m_CustomCloakInfo[n].IndexStrip);
SetDword((0x00575001 + 1), gCloak.m_CustomCloakInfo[n].IndexStrip);
}
else
{
SetDword((0x00574F2E + 1), 0x7884);
SetDword((0x00574F33 + 1), 0x7884);
//
SetDword((0x00574FFC + 1), 0x7884);
SetDword((0x00575001 + 1), 0x7884);
}
}
else{
SetDword((0x005751EB + 1), gCloak.m_CustomCloakInfo[n].IndexCloak);
SetDword((0x005751F0 + 1), gCloak.m_CustomCloakInfo[n].IndexCloak);
//
if( strcmp(gCloak.m_CustomCloakInfo[n].StripModel, "") != 0 )
{
SetDword((0x0057562C + 1), gCloak.m_CustomCloakInfo[n].IndexStrip);
SetDword((0x00575631 + 1), gCloak.m_CustomCloakInfo[n].IndexStrip);
//
SetDword((0x005756EE + 1), gCloak.m_CustomCloakInfo[n].IndexStrip);
SetDword((0x005756F3 + 1), gCloak.m_CustomCloakInfo[n].IndexStrip);
/*}else
{
SetDword((0x0057562C + 1), 0x7884);
SetDword((0x00575631 + 1), 0x7884);
//
SetDword((0x005756EE + 1), 0x7884);
SetDword((0x005756F3 + 1), 0x7884);*/
}
}
}
switch(Object->WingsSlot)
{
case ITEM2(12,130):
case ITEM2(13,30):
Object->WingsSlot = ITEM2(13,30);
SetDword((0x0057491A + 1), 0x7756);
SetDword((0x0057491F + 1), 0x7756);
break;
case ITEM2(12,40):
Object->WingsSlot = ITEM2(12,40);
//-
SetDword((0x0057491A + 1), 0x7758);
SetDword((0x0057491F + 1), 0x7758);
//
SetDword((0x00574F2E + 1), 0x7759);
SetDword((0x00574F33 + 1), 0x7759);
//
SetDword((0x00574FFC + 1), 0x7759);
SetDword((0x00575001 + 1), 0x7759);
//-
break;
case ITEM2(12,49):
case ITEM2(12,135):
Object->WingsSlot = ITEM2(12,49); //capa rage fighter
SetDword((0x0057491A + 1), 0x07EE0);
SetDword((0x0057491F + 1), 0x07EE0);
break;
case ITEM2(12,50): //capa 2da rage fighter
Object->WingsSlot = ITEM2(12,50);
//-
SetDword((0x0057491A + 1), 0x07EE2);
SetDword((0x0057491F + 1), 0x07EE2);
//
SetDword((0x00574F2E + 1), 0x07EE1);
SetDword((0x00574F33 + 1), 0x07EE1);
//
SetDword((0x00574FFC + 1), 0x07EE1);
SetDword((0x00575001 + 1), 0x07EE1);
//-
break;
/*}
if(gCloak.isCloak(Object->WingsSlot - 1171)){
CUSTOMCLOAK_DATA* CapeModel = gCloak.GetInfoByItem(Object->WingsSlot - 1171);
int ItemGroup = CapeModel->ItemIndex / 512;
int ItemID = CapeModel->ItemIndex % 512;
Object->WingsSlot = ITEM2(ItemGroup, ItemID);
SetDword((0x0057491A + 1), (WORD)CapeModel->IndexCloak);
SetDword((0x0057491F + 1), (WORD)CapeModel->IndexCloak);
if(CapeModel->Mode == 1){
SetDword((0x00574F2E + 1), (WORD)CapeModel->IndexStrip);
SetDword((0x00574F33 + 1), (WORD)CapeModel->IndexStrip);
//
SetDword((0x00574FFC + 1), (WORD)CapeModel->IndexStrip);
SetDword((0x00575001 + 1), (WORD)CapeModel->IndexStrip);
}*/
}
pDrawViewPort(ObjectPointer, ObjectModel, a3);
}
//--- carga tiras de las capas
__declspec(naked) void CapeA() // 0x7759 //-> 03 Main
{
static DWORD Address1 = 0x00574F29;
static DWORD Address2 = 0x005750C5;
_asm{
Mov CapeEffectBuff, ecx
MOV EAX,DWORD PTR SS:[EBP+0x8]
MOVSX ECX,WORD PTR DS:[EAX+0x208]
Mov CapeEffectPointer,ecx
Mov ecx, CapeEffectBuff
}
if(CapeEffectPointer == ITEM2(12,40)
|| CapeEffectPointer == ITEM2(12,50)
|| gCloak.isCloakStrip(CapeEffectPointer - 1171))
{
_asm{Jmp Address1}
}
else
{
_asm{Jmp Address2}
}
}
//---- carga de la capa
__declspec(naked) void CapeB() //7758
{
static DWORD Address1 = 0x00574915;
static DWORD Address2 = 0x00574A6A;
_asm{
mov CapeEffectBuff, ecx
MOV EAX,DWORD PTR SS:[EBP+0x8]
MOVSX ECX,WORD PTR DS:[EAX+0x208]
mov CapeEffectPointer,ecx
mov ecx, CapeEffectBuff
}
if(CapeEffectPointer == ITEM2(12,40) //2da capa dl
|| CapeEffectPointer == ITEM2(12,49) //-- 1ra capa rf
|| CapeEffectPointer == ITEM2(12,50) //-- 2da capa rf
|| CapeEffectPointer == ITEM2(12,130)
|| CapeEffectPointer == ITEM2(12,135)
|| gCloak.isCloak(CapeEffectPointer - 1171))
{
_asm{Jmp Address1}
}
else
{
_asm{Jmp Address2}
}
}
__declspec(naked) void CapeE() //main allow
{
static DWORD Address1 = 0x005760C2;
static DWORD Address2 = 0x00576014;
_asm{
Mov CapeEffectBuff, ecx
MOV EAX,DWORD PTR SS:[EBP+0x8]
MOVSX ECX,WORD PTR DS:[EAX+0x208]
Mov CapeEffectPointer,Ecx
Mov Ecx, CapeEffectBuff
}
if(CapeEffectPointer == ITEM2(12,40) //-- capa 2 dl
|| CapeEffectPointer == ITEM2(12,130)
|| CapeEffectPointer == ITEM2(12,135) //-- mini capa
|| CapeEffectPointer == ITEM2(13,30) //-- capa 1 dl
|| gCloak.isCloak(CapeEffectPointer - 1171))
{
_asm{jmp Address1}
}
else
{
_asm{jmp Address2}
}
}
__declspec(naked) void CapeD() //allow play
{
static DWORD Address1 = 0x00574683;
static DWORD Address2 = 0x0057468F;
_asm{
Mov CapeEffectBuff, Ecx
MOV DWORD PTR SS:[EBP-0x2D8],4
MOV EAX,DWORD PTR SS:[EBP+0x8]
MOVSX ECX,WORD PTR DS:[EAX+0x208]
mov CapeEffectPointer,ecx
mov ecx, CapeEffectBuff
}
if(CapeEffectPointer == ITEM2(12,40)
|| CapeEffectPointer == ITEM2(12,49)
|| CapeEffectPointer == ITEM2(12,50)
|| CapeEffectPointer == ITEM2(12,130)
|| CapeEffectPointer == ITEM2(12,135)
|| gCloak.isCloak(CapeEffectPointer - 1171))
{
_asm{jmp Address1}
}
else
{
_asm{jmp Address2}
}
}
__declspec(naked) void HideCape()
{
static DWORD Address1 = 0x005FAD7D;
static DWORD Address2 = 0x005FAE90;
_asm
{
Mov Ecx, dword ptr ss : [ebp +0x10]
Mov Dword ptr ss : [ebp +0x10], Ecx
Mov CapeEffectPointer, Ecx
}
if (CapeEffectPointer == ITEM2(12,40)
|| CapeEffectPointer == ITEM2(12,49)
|| CapeEffectPointer == ITEM2(12,50)
|| CapeEffectPointer == ITEM2(12,130)
|| CapeEffectPointer == ITEM2(12,135)
|| gCloak.isCloak(CapeEffectPointer - 1171))
{
_asm{jmp Address1}
}
else
{
_asm{jmp Address2}
}
}
__declspec(naked) void AllowMGCape() //?
{
static DWORD Address1 = 0x00574D4C;
static DWORD Address2 = 0x00574DAC;
_asm
{
Mov CapeEffectBuff,Ecx
Mov Eax,Dword Ptr Ss : [Ebp + 0x8]
MOVZX ECX,BYTE Ptr Ds : [Eax + 0x13]
Mov CapeEffectPointer,Ecx
Mov Ecx, CapeEffectBuff
}
if (CapeEffectPointer == 3)
{
_asm{jmp Address1}
}
else
{
_asm{jmp Address2}
}
}
void __declspec(naked) CapeInventoryPos()
{
DWORD dwItem;
_asm
{
Mov Ecx,DWORD PTR SS:[EBP+0x8]
Mov dwItem,Ecx
CMP dwItem,ITEM2(12,40)
Je Exit
CMP dwItem,ITEM2(12,262)
Je Exit
CMP dwItem,ITEM2(12,418)
Je Exit
CMP dwItem,ITEM2(12,420)
Je Exit
Exit:
Mov Ecx,0x005CAFD2
Jmp Ecx
}
}
void DrawObjectDropOnViewport(int a1)
{
pObjOnViewport(a1);
switch(*(DWORD *)(a1 + 48))
{
case ITEM2(13,64):
*(float *)(a1 + 264) = 0.0f;
*(float *)(a1 + 96) = 0.2f;
*(float *)(a1 + 272) = 70.0f;
break;
}
}
void RefreshCapeUnEquip1(ObjectItem * lpItem)
{
if(gCloak.isCloak(lpItem->ItemID)){
pRefreshViewport(oUserPreviewStruct, oUserPreviewStruct + 776, 0);
return;
}
switch(lpItem->ItemID){
case ITEM(12,130):
case ITEM(12,135):
pRefreshViewport(oUserPreviewStruct, oUserPreviewStruct + 776, 0);
break;
}
pRefreshCape1(lpItem);
}
void RefreshCapeUnEquip2(ObjectItem * lpItem)
{
if(gCloak.isCloak(lpItem->ItemID)){
pRefreshViewport(oUserPreviewStruct, oUserPreviewStruct + 776, 0);
return;
}
switch(lpItem->ItemID){
case ITEM(12,130):
case ITEM(12,135):
pRefreshViewport(oUserPreviewStruct, oUserPreviewStruct + 776, 0);
break;
}
pRefreshCape2(lpItem);
}
__declspec(naked) void RemoveDarklordHair()
{
static DWORD Address1 = 0x00574755;
static DWORD Address2 = 0x005748FF;
_asm
{
Mov Eax, Dword Ptr Ss : [Ebp + 0x8]
Movzx Edx, Byte Ptr Ds : [Eax + 0x13]
And Edx, 0x7
Cmp Edx, 0x4
Jne EXIT
Push 0xC0000205
Jmp Address1
EXIT:
Jmp Address2
}
}
/*
//esto puede ir pet.cpp los que usan pet custom desde aquí
ObjCreateBug gObjCreateBug = (ObjCreateBug)0x00501700;
ObjCreatePet gObjCreatePet = (ObjCreatePet)0x00835E40;
void gObjCreatePetEx(int ItemId)
{
int ItemSwitch = *(WORD*)ItemId;
int PetPreview = LODWORD(pPreviewPetThis) + 776;
if (gCustomPet2.CheckCustomPetByItem(ItemSwitch))
{
gObjCreateBug(ItemSwitch + 1171, PetPreview + 252, PetPreview, 0, 0);
} else if (gCloak.isCloak(ItemSwitch)||ItemSwitch == ITEM(13,30)
||ItemSwitch == ITEM(12,130)
||ItemSwitch == ITEM(12,135)){
pRefreshViewport(oUserPreviewStruct, oUserPreviewStruct + 776, 0);
}
gObjCreatePet(ItemId);
}
bool ResetPetPreviewEx(int ItemId)
{
bool Result;
// ----
if (ItemId)
Result = *(WORD*)ItemId == 0x1A00 //Angel
|| *(WORD*)ItemId == 0x1A01 //Satan
|| *(WORD*)ItemId == 0x1A02 //Unicorn
|| *(WORD*)ItemId == 0x1A03 //Dinorant
|| *(WORD*)ItemId == 0x1A04 //Dark Horse
|| *(WORD*)ItemId == 0x1A05 //Dark Raven
|| *(WORD*)ItemId == 0x1A25 //Fenrir //
|| *(WORD*)ItemId == ITEM(13, 64)
|| *(WORD*)ItemId == ITEM(13, 65)
|| *(WORD*)ItemId == ITEM(13, 67)
|| *(WORD*)ItemId == ITEM(13, 80)
|| *(WORD*)ItemId == ITEM(13, 106)
|| *(WORD*)ItemId == ITEM(13, 123)
|| *(WORD*)ItemId >= ITEM(13, 200)
&& *(WORD*)ItemId <= ITEM(13, 410)
|| gCloak.isCloak(*(WORD*)ItemId)
|| *(WORD*)ItemId == ITEM(13,30)
|| *(WORD*)ItemId == ITEM(12,130)
|| *(WORD*)ItemId == ITEM(12,135);
else
Result = 0;
return Result;
}*/
//hasta aquí
void CCapeAnimation::Load()
{
SetCompleteHook(0xFF,0x0040487D, &this->DrawViewPort);
SetCompleteHook(0xFF,0x0048E56C, &this->DrawViewPort);
SetCompleteHook(0xFF,0x0057D4FF, &this->DrawViewPort);
SetCompleteHook(0xFF,0x0057D513, &this->DrawViewPort);
//-
SetCompleteHook(0xE9, 0x00572346, 0x00572370); //Apply
SetCompleteHook(0xE9, 0x0057464E, 0x00574667); //Apply
SetCompleteHook(0xE9, 0x00574750, &RemoveDarklordHair);
//-
SetRange(0x00574667,20,ASM::NOP);
SetOp(0x00574667,(LPVOID)CapeD,ASM::JMP);
//-
SetRange(0x00574F13,10,ASM::NOP);
SetOp(0x00574F13,(LPVOID)CapeA,ASM::JMP);
//-
SetRange(0x005748FF,10,ASM::NOP);
SetOp(0x005748FF,(LPVOID)CapeB,ASM::JMP);
//-
SetRange(0x00576058,10,ASM::NOP);
SetOp(0x00576058,(LPVOID)CapeE,ASM::JMP);
//-
SetRange(0x005FAD70,7,ASM::NOP);
SetOp(0x005FAD70,(LPVOID)HideCape,ASM::JMP);
//-
SetRange(0x00574D3D,13,ASM::NOP);
SetOp(0x00574D3D,(LPVOID)AllowMGCape,ASM::JMP);
//--
SetCompleteHook(0xE8,0x00833BE7,&RefreshCapeUnEquip1);
SetCompleteHook(0xE8,0x007DD304,&RefreshCapeUnEquip2);
SetCompleteHook(0xE8,0x00833B08,&RefreshCapeUnEquip2);
//-
//SetRange(0x005CAFCB,7,ASM::NOP);
//SetOp(0x005CAFCB,(LPVOID)CapeInventoryPos,ASM::JMP);
//esto también iría en custompet
// SetOp((LPVOID)0x00836481, (LPVOID)ResetPetPreviewEx, ASM::CALL);
// SetOp((LPVOID)0x007DD304, (LPVOID)gObjCreatePetEx, ASM::CALL);
// SetOp((LPVOID)0x00833B08, (LPVOID)gObjCreatePetEx, ASM::CALL);
//hasta aquí
}