PDA

View Full Version : |Source| CustomCape 100% 1.4e MuEmu



Goten
24/04/2020, 12:21 PM
DEMO:

[Only registered and activated users can see links]

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

Cape.h

#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

#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