Bueno como lo prometi en la Seccion de Ventas del foro, aca mi pequeña contribucion, quizas no sea mucho... pero espero sepan entender que basicamente no me gusta regalar mi trabajo. Esta funcion basicamente lo que hace es Renderizar algunas propiedades en los Objetos del Cliente, comunmente conocidos como: Pets o Mascotas, para ser mas Especificos, es la funcion encargada de crear 1 de los 2 tipos de Efectos que tiene el: Guardian Angel (es decir, el Angelito Blanco), que como muchos de ustedes saben existe en los clientes de MU practicamente desde las primeras versiones: 0.65~0.74 mas o menos, quizas tambien desde la viejisima e inconcedible ya: 0.63, bueno sin mas preambulos aca dejo el codigo:
.CPP
char cPets::LoadObjectEffect(int lpObj,char Switch)
{
char Change;
vec3_t Color;
Vector(0.f,0.f,0.f,Color);
// ----
lpViewObj lpPet = &*(OBJSTRUCT*)lpObj;
// ----
if(lpPet->IsRender)
{
if(Switch)
{
Change = 1;
}
else
{
float AngleX = *(float*)(lpObj+252)*0.0099999998f;
float AngleY = *(float*)(lpObj+256)*0.0099999998f;
// ----
Change = pObjectGetAngle(AngleX,AngleY,-20.0f);
}
// ----
lpPet->ViewportID = Change;
// ----
if(lpPet->ViewportID)
{
if(*(DWORD*)(*(DWORD*)(lpObj+472)+48) != 825 && lpPet->dwObjectID != ObjectId(13,0))
return 1;
// ----
if(Switch)
{
lpPet->dwObjectSize = lpPet->dwObjectSize;
}
else if(lpPet->dwObjectID != BlackFenrir
&& lpPet->dwObjectID != RedFenrir
&& lpPet->dwObjectID != BlueFenrir
&& lpPet->dwObjectID != GoldenFenrir
&& lpPet->dwObjectID != OrangeFenrir
&& lpPet->dwObjectID != DarkWolfPet)
{
lpPet->dwObjectSize = 0x3F800000;
}
else if(pMainState == SwitchCharacter)
{
lpPet->dwObjectSize = 0x3F99999A;
}
// ----
int MaxPetCount = NULL;
// ----
if(pObjectCharSet((char*)(*(DWORD*)(lpObj+472)+484),18))
MaxPetCount = 10;
// ----
pObjectMaxBug(lpObj,0,0,MaxPetCount);
// ----
float Formula = (double)(rand()%30+70)*0.0099999998f;
// ----
if(lpPet->dwObjectID == ObjectId(13,0))
{
Vector(Formula*0.5f,Formula*0.8f,Formula*0.6f,Color);
pCreateSpriteEx(Flare01,lpObj+252,1.0f,Color,lpObj,NULL,NULL);
}
}
}
// ----
return 1;
}
void cPets::InitObjectEffect()
{
gToolKit.SetOp((LPVOID)0x0046D715,this->LoadObjectEffect,ASM::CALL);
gToolKit.SetOp((LPVOID)0x004AFF4C,this->LoadObjectEffect,ASM::CALL);
}
.H
typedef struct
{
/*+0*/ BYTE Unknown0;
/*+1*/ BYTE Unknown1;
/*+2*/ BYTE Unknown2;
/*+3*/ BYTE Unknown3;
/*+4*/ BYTE IsRender;
/*+5*/ BYTE Unknown5;
/*+6*/ BYTE Unknown6;
/*+7*/ BYTE Unknown7;
/*+8*/ BYTE Unknown8;
/*+9*/ BYTE Unknown9;
/*+10*/ BYTE Unknown10;
/*+11*/ BYTE Unknown11;
/*+12*/ BYTE ViewportID;
/*+13*/ BYTE Unknown13;
/*+14*/ BYTE Unknown14;
/*+15*/ BYTE Unknown15;
/*+16*/ BYTE Unknown16;
/*+17*/ BYTE Unknown17;
/*+18*/ BYTE Unknown18;
/*+19*/ BYTE Unknown19;
/*+20*/ BYTE Unknown20;
/*+21*/ BYTE Unknown21;
/*+22*/ BYTE Unknown22;
/*+23*/ BYTE Unknown23;
/*+24*/ BYTE Unknown24;
/*+25*/ BYTE Unknown25;
/*+26*/ BYTE Unknown26;
/*+27*/ BYTE Unknown27;
/*+28*/ BYTE Unknown28;
/*+29*/ BYTE Unknown29;
/*+30*/ BYTE Unknown30;
/*+31*/ BYTE Unknown31;
/*+32*/ BYTE Unknown32;
/*+33*/ BYTE Unknown33;
/*+34*/ BYTE Unknown34;
/*+35*/ BYTE Unknown35;
/*+36*/ BYTE Unknown36;
/*+37*/ BYTE Unknown37;
/*+38*/ BYTE Unknown38;
/*+39*/ BYTE Unknown39;
/*+40*/ BYTE Unknown40;
/*+41*/ BYTE Unknown41;
/*+42*/ BYTE Unknown42;
/*+43*/ BYTE Unknown43;
/*+44*/ BYTE Unknown44;
/*+45*/ BYTE Unknown45;
/*+46*/ BYTE Unknown46;
/*+48*/ DWORD dwObjectID;
BYTE Shift0[44];
/*+96*/ DWORD dwObjectSize;
/*+98*/ BYTE Unknown98;
/*+100*/ DWORD Unknown100;
BYTE Shift1[18];
/*+120*/ DWORD Unknown120;
/*+122*/ BYTE Unknown122;
/*+123*/ BYTE Unknown123;
/*+124*/ BYTE Unknown124;
/*+125*/ BYTE Unknown125;
/*+126*/ BYTE Unknown126;
/*+127*/ BYTE Unknown127;
/*+128*/ BYTE Unknown128;
/*+129*/ BYTE Unknown129;
/*+130*/ BYTE Unknown130;
BYTE Shift2[8];
/*+140*/ DWORD bMapPosX;
/*+144*/ DWORD bMapPosY;
/*+146*/ BYTE Unknown146;
/*+148*/ DWORD Unknown148;
/*+150*/ BYTE Unknown150;
/*+152*/ DWORD Unknown152;
/*+154*/ BYTE Unknown154;
/*+156*/ DWORD Unknown156;
/*+158*/ BYTE Unknown158;
/*+160*/ DWORD Unknown160;
/*+162*/ BYTE Unknown162;
/*+164*/ DWORD Unknown164;
BYTE Shift3[86];
/*+252*/ vec3_t Position;
/*+264*/ vec3_t Rotation;
BYTE Shift4[196];
/*+472*/ DWORD Unknown472;
} OBJSTRUCT, *lpViewObj;
enum eMauntType
{
DarkHorse = 225,
DarkSpirit = 226,
Uniria = 232,
Dinorant = 322,
BlackFenrir = 383,
RedFenrir = 384,
BlueFenrir = 385,
GoldenFenrir = 386,
OrangeFenrir = 518, // -> Objects from: 518 to: 535 (Free Space). (17)
DarkWolfPet = 519,
};
// -> General
#define pMainState *(int*)0x008EC0EC // -> Main States
#define pMapNumber *(int*)0x008CA030 // -> Current Map ID
#define pObjectGetAngle ((char(__cdecl*)(float PosX,float PosY,float PosZ))0x005AC6A5)
#define pObjectCharSet ((bool(__thiscall*)(LPVOID This,char Arg2))0x00605F5D)
#define pObjectMaxBug ((void(__cdecl*)(int lpObj,char Arg2,int Arg3,int BugCount))0x005B8F70)
// -> Effect
#define pCreateSpriteEx ((int(__cdecl*)(int Type,int Position,float Scale,vec3_t Light,int lpObj,float Rotation,int SubType))0x006BBBD2)
#define ObjectId(x,y) ((x*512)+y+833)
y para que no empiecen con: "NO PUEDO COMPILARLA,ETC,ETC" tambien les voy a dejar mi clase: cToolKit y las definiciones para: vec3_t o mejor dicho los archivos: zzzMathLib.cpp y .h (que igualmente si alguno se quiere fijar, estan en las fuentes de cualquier GameServer, solo que en las de la decompilacion hecha por: DeathWay, son malos, es decir, no son los originales hechos por la Empresa: Valve, para el manejo de los modelos .smd, a los cuales posteriormente la Webzen, les agrega un metodo de Encript basado en XOR y utilizando zlib xD), SI con todo esta info que les doy a conocer, todavia no me creen, bueno no se comprense un perro.
Los Archivos:
https://mega.nz/#!OVo0DRTR!J0XMpbSia_dGJkfzcRsXG54iSJ3OjK_kQ4xoK5Z_HTcy también creo les puse la contraseña que es obligatoria acá en el foro. contraseña: tuservermu.com.ve
pero si no fue así, le pido disculpas de ante mano a los Administradores o Moderadores del foro, y les pido de la manera mas atenta corrijan los archivos añadiendo la contraseña, Gracias.