Bueno hola gente, les cuento que estoy trabajando con Season 4 Episode 2 Korea, main.exe versión: 1.05.50 (1.05X+) para ser precisos, y bueno ya tengo desarrolladas una serie de cosas importantes para mi próximo proyecto: Server <-> Cliente, (que estaré aportando dentro de muy poco aquí en el foro), pero por el momento, quería dejarles esta pequeña función, cabe destacar que no se trata de la función decompilada completa propiamente dicha, como debería ser, sino mas bien que es una pequeña Emulación utilizando punteros, pero funciona al: 100% para agregar Alas Custom.
El Resultado en el Juego es algo como esto:
Claro que, para que las Alas funcionen correctamente es necesario arreglar 2 funciones en sus GameServers, suponiendo que utilicen algún derivado de la Decompilacion de DeathWay 1.00.18, SCF o bien algún derivado de la Decompilacion de HermeX 1.00.87, los nombres de estas funciones son: "JGPGetCharList"
después del: else // -> case DB 3 ubicada en el archivo: DSProtocol.cpp, y "gObjMakePreviewCharSet" ubicada en el archivo: user.cppPreview.cpp Class File:
#include "StdAfx.h"
cPreview gPreview;
cPreview::cPreview()
{
// -> Constructor
}
cPreview::~cPreview()
{
// -> Destructor
}
void cPreview::MakeCharSet(int aIndex,BYTE *CharSet,int Struct,int Mode)
{
pMakePreviewCharSet(aIndex,CharSet,Struct,Mode);
// ----
BYTE CustomWings = CharSet[16]>>2;
// ----
if(CustomWings)
{
switch(CustomWings)
{
// -> Arieth Mu 4th Level Wings
case HeavenWings:
{
*(WORD*)(1148*aIndex+*(DWORD*)oPreviewStruct+0x1C0) = ObjectId(12,240);
break;
}
case DemonicWings:
{
*(WORD*)(1148*aIndex+*(DWORD*)oPreviewStruct+0x1C0) = ObjectId(12,241);
break;
}
case BlossomWings:
{
*(WORD*)(1148*aIndex+*(DWORD*)oPreviewStruct+0x1C0) = ObjectId(12,242);
break;
}
case ThunderWings:
{
*(WORD*)(1148*aIndex+*(DWORD*)oPreviewStruct+0x1C0) = ObjectId(12,243);
break;
}
case RavenWings:
{
*(WORD*)(1148*aIndex+*(DWORD*)oPreviewStruct+0x1C0) = ObjectId(12,244);
break;
}
case EternalWings:
{
*(WORD*)(1148*aIndex+*(DWORD*)oPreviewStruct+0x1C0) = ObjectId(12,245);
break;
}
}
}
}
void cPreview::Load()
{
gToolKit.SetOp((LPVOID)oMakePreviewCharSet_Call01,this->MakeCharSet,ASM::CALL);
gToolKit.SetOp((LPVOID)oMakePreviewCharSet_Call02,this->MakeCharSet,ASM::CALL);
gToolKit.SetOp((LPVOID)oMakePreviewCharSet_Call03,this->MakeCharSet,ASM::CALL);
gToolKit.SetOp((LPVOID)oMakePreviewCharSet_Call04,this->MakeCharSet,ASM::CALL);
gToolKit.SetOp((LPVOID)oMakePreviewCharSet_Call05,this->MakeCharSet,ASM::CALL);
gToolKit.SetOp((LPVOID)oMakePreviewCharSet_Call06,this->MakeCharSet,ASM::CALL);
gToolKit.SetOp((LPVOID)oMakePreviewCharSet_Call07,this->MakeCharSet,ASM::CALL);
}
Preview.h Class File:
#ifndef __PREVIEW_H__
#define __PREVIEW_H__
class cPreview
{
public:
cPreview();
virtual ~cPreview();
// ----
void Load();
// ----
static void MakeCharSet(int aIndex,BYTE *CharSet,int Struct,int Mode);
};
extern cPreview gPreview;
#endif // __PREVIEW_H__
Defines.h File:
#define MODELS_ARRAY 828
#define ItemId(x,y) ((x*512)+y)
#define ObjectId(x,y) ((x*512)+y+MODELS_ARRAY)
Import.h File:
#ifndef __IMPORT_H__
#define __IMPORT_H__
// -> Struct
#define oPreviewStruct 0x079CD0E8
// -> Preview
#define oMakePreviewCharSet_Call01 0x0046BF25
#define oMakePreviewCharSet_Call02 0x00603183
#define oMakePreviewCharSet_Call03 0x00609265
#define oMakePreviewCharSet_Call04 0x00609D0A
#define oMakePreviewCharSet_Call05 0x0060A2F0
#define oMakePreviewCharSet_Call06 0x0062DFEC
#define oMakePreviewCharSet_Call07 0x00631037
#define pMakePreviewCharSet ((void(__cdecl*)(int aIndex,BYTE *CharSet,int Struct,int Mode))0x004F9532)
#endif // __IMPORT_H__
Enums.h File:
enum eWingsId
{
HeavenWings = 1,
DemonicWings = 2,
BlossomWings = 3,
ThunderWings = 4,
RavenWings = 5,
EternalWings = 6,
};
PD: Si a alguien le hace falta algo mas, hagamelo saber y con mucho gusto le proporciono lo restante (clase ToolKit).
Créditos:
Webzen
AriethMu
Nemesis