#include "stdafx.h"
#include "Cape.h"
#include "Defines.h"
#include "Object.h"
#include "Interface.h"
#include "Util.h"
#include "Item.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,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):
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;
case ITEM2(12,220):
Object->WingsSlot = ITEM2(12,220);
//
SetDword((0x0057491A + 1), iCapeDeath1);
SetDword((0x0057491F + 1), iCapeDeath1);
//
SetDword((0x00574F2E + 1), iCapeDeath2);
SetDword((0x00574F33 + 1), iCapeDeath2);
//
SetDword((0x00574FFC + 1), iCapeDeath2);
SetDword((0x00575001 + 1), iCapeDeath2);
//-
break;
case ITEM2(12,418):
Object->WingsSlot = ITEM2(12,418);
SetDword((0x0057491A + 1), 0x78A5);
SetDword((0x0057491F + 1), 0x78A5);
//
SetDword((0x00574F2E + 1), 0x78A6);
SetDword((0x00574F33 + 1), 0x78A6);
//
SetDword((0x00574FFC + 1), 0x78A6);
SetDword((0x00575001 + 1), 0x78A6);
break;
case ITEM2(12,420):
Object->WingsSlot = ITEM2(12,420);
SetDword((0x0057491A + 1), 0x78A7);
SetDword((0x0057491F + 1), 0x78A7);
break;
}
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) || CapeEffectPointer == ITEM2(12,418))
{
_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,418)
|| CapeEffectPointer == ITEM2(12,420))
{
_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) //-- mini capa
|| CapeEffectPointer == ITEM2(13,30) //-- capa 1 dl
|| CapeEffectPointer == ITEM2(12,418)
|| CapeEffectPointer == ITEM2(12,420))
{
_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,418)
|| CapeEffectPointer == ITEM2(12,420)
)
{
_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,418)
|| CapeEffectPointer == ITEM2(12,420))
{
_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,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 RefreshCapeUnEquip(ObjectItem * lpItem)
{
switch(lpItem->ItemID)
{
case ITEM2(12,418):
case ITEM2(12,420):
pRefreshViewport(oUserPreviewStruct, oUserPreviewStruct + 776, 0);
break;
}
pRefreshCape1(lpItem);
}
void RefreshCapeUnEquip1(ObjectItem * lpItem)
{
switch(lpItem->ItemID)
{
case ITEM(12,418):
case ITEM(12,420)://Control Cloak
pRefreshViewport(oUserPreviewStruct, oUserPreviewStruct + 776, 0);
break;
}
pRefreshCape1(lpItem);
}
void RefreshCapeUnEquip2(ObjectItem * lpItem)
{
switch(lpItem->ItemID)
{
case ITEM(12,418):
case ITEM(12,420)://Control Cloak
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
}
}
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);
}
para los que andan probando, ahí esta las offset de la capa del RF la 1 y la 2, anexo código semi corregido, y digo semi corregido porque aun no genera el refresh, intenté de muchas manera pero no funciona del todo se bugguea xD