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í
}