DEMO:


Nota
Para o maininfo, você terá de fazer, o que não é difícil, em interface.cpp, os modelos são adicionados.


Cape.h
Código:
#pragma once

#define pDrawViewPort	((int(__cdecl*)(DWORD ObjectPointer, DWORD ModelPointer, int a3)) 0x56F210)
#define pRefreshViewport	((void(__cdecl*)(DWORD a1, DWORD a2, int a3)) 0x558630)

#define pRefreshCape1                        ((void(__thiscall*)(ObjectItem * lpItem)) 0x8363D0)
#define pRefreshCape2                        ((void(__thiscall*)(ObjectItem * lpItem)) 0x835E40)

#define pObjOnViewport				((int(__cdecl*)(int Object))0x5F61C0)
#define sub_57D9A0					((DWORD(__cdecl*)(DWORD)) 0x57D9A0)
#define sub_96A4C0					((int(__thiscall*)(LPVOID This, signed int a2)) 0x96A4C0)
#define sub_402BC0					((LPVOID(*)())0x402BC0)
#define sub_58AA80					((DWORD(__cdecl*)(DWORD)) 0x58AA80)
#define sub_558630					((void(__cdecl*)(int a1, int a2, int a3)) 0x558630)
#define sub_5012D0					((DWORD(__cdecl*)(DWORD)) 0x5012D0)
#define sub_9253D0					((int(__thiscall*)(LPVOID This,int a1, short a2)) 0x9253D0)
#define sub_4DB230					((LPVOID(*)())0x4DB230)
#define sub_501700					((DWORD(__cdecl*)(DWORD, DWORD, DWORD, DWORD, DWORD)) 0x501700)

static void		RefreshViewPortItem(int a1);
class CCapeAnimation
{
public:
	CCapeAnimation();
	virtual ~CCapeAnimation();
	void Load();
	static void DrawViewPort(DWORD ObjectPointer, DWORD ModelPointer, DWORD a3);
	
};

extern CCapeAnimation gCapeAnimation;
Cape.cpp
Código:
#include "stdafx.h"
#include "Cape.h"
#include "Defines.h"
#include "Object.h"
#include "Interface.h"
#include "Util.h"
#include "Item.h"
#include "CustomCloak.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);

	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), CapeModel->IndexCloak);
		SetDword((0x0057491F + 1), CapeModel->IndexCloak);

		if(CapeModel->Mode == 1){
			SetDword((0x00574F2E + 1), CapeModel->IndexStrip);
			SetDword((0x00574F33 + 1), CapeModel->IndexStrip);
			//
			SetDword((0x00574FFC + 1), CapeModel->IndexStrip);
			SetDword((0x00575001 + 1), 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í
}
Créditos:
Myheart
Kapocha
takumi12