- Joined
- Oct 29, 2007
- Messages
- 1,288
- Reaction score
- 1,308
English:
Spanish:
Decompiled RenderDarkHorseSkill Function (maybe: 97%):
Decompiled Skeleton Pet Effects (Part of: NewPet Class from main maybe: 70%):
Decompiled RenderPartObjectBody Function + Call Hooks (maybe: 90%):
Decompiled (NOT TESTED) TransformPosition Function (Part of: BMD Class from main):
PS: In all cases is necesary import to his projects: zzzMathLib.h from Webzen (1.00.93) Original Sources can be used (Please don't use from: Deathway .18 decompilation because have bug).
Thread Updated: 22-10-20 Added some Video-Tests & Functions Adapted for main.exe Version: 1.04.05 (GMO) of: "RenderDarkHorseSkill" Function by: louis A.K.A: Luis_br
ObjectModel Struct Modified by Luis_br to Works with main.exe (1.04.05 GMO) + Defined Pointers (Offsets 1.04.05):
Using this function with Original Effects ID from this Skill:
Video Test of: Luis_br modifying Original Effects ID by anothers ID:
Changing this EffectID (Original):
By this EffectID (Custom):
Another Modification made by: Luis_br on code is this:
Results in Video of the Tests of: Luis_br with this modifications maded in the original code:
Hi folks!, I'm learning some things and etc.. by this motive I'm applying reverse engineering for some functions on my main 1.03.16, and... I'm was searching for share my work with all.
Not all the code is 100% but it is functional.
Spanish:
¡Hola amigos !, estoy aprendiendo algunas cosas y etc. por este motivo estoy aplicando ingeniería inversa para algunas funciones en mi 1.03.16 principal, y... estaba buscando compartir mi trabajo con todos.
No todo el código es 100% pero es funcional.
Decompiled RenderDarkHorseSkill Function (maybe: 97%):
#define pRenderDarkHorseSkill ((void(__cdecl*)(int a1))0x004AFF65)
#define pMoveSceneFrame *(int*)0x80AB430
#define pEarthQuake *(float*)0x80A2338
int RenderDarkHorseSkill(int aIndex)
{
int TimerSkill;
// ----
Character_Struct * Hero = &*(CHAR_STRUCT*)aIndex; // Character_Struct and OBJECT is the same SirMaster LOL !
// ----
Vector(Hero->Light[0],Hero->Light[1],Hero->Light[2],Hero->Light);
Vector(Hero->Angle[0],Hero->Angle[1],Hero->Angle[2],Hero->Angle);
Vector(Hero->Position[0],Hero->Position[1],Hero->Position[2],Hero->Position);
// ----
Hero->OnAttacking++;
// ----
if( !(pMoveSceneFrame%10) )
if(Hero->CoordX < 8.0 || Hero->CoordX > 9.5)
{ TimerSkill = Hero->OnAttacking;
// ----
if(TimerSkill == 19)
{
pCreateEffect(300,Hero->Position,Hero->Angle,Hero->Light,NULL,Hero,NONE,NULL,2,NULL,0,NONE);
Hero->OnAttacking = -3;
}
}
else
{
if(Hero->OnAttacking % 2 == 1)
{
Hero->Position[1] = (double)(Hero->OnAttacking / 2) * 150.0;
Hero->Angle[2] = (double)(rand() % 360);
// ----
for(int i=0;i<6;i++)
{
vec34_t Matrix; vec3_t ResultPosition;
// ----
Vector(Hero->Angle[0],Hero->Angle[1],Hero->Angle[2]+60.0,Hero->Angle);
Vector(Hero->Position[0],Hero->Position[1],Hero->Position[2],Hero->Position);
// ----
pAngleMatrix(Hero->Angle,Matrix);
pVectorRotate(Hero->Position,Matrix,ResultPosition);
// ----
ResultPosition[0] = ResultPosition[0] + Hero->Position[0];
ResultPosition[1] = ResultPosition[1] + Hero->Position[1];
ResultPosition[2] = ResultPosition[2] + Hero->Position[2];
// ----
int Randomizer = rand() % 2;
// ----
pCreateEffect(Randomizer+330,ResultPosition,Hero->Angle,Hero->Light,NULL,NULL,NONE,NULL,NULL,NULL,0,NONE); // NONE = -1 -> #define NONE -1 X_X
}
}
TimerSkill = rand() / 3; pEarthQuake = (double)((TimerSkill % 3) - 3) * 0.69999999;
}
return TimerSkill;
}
Decompiled Skeleton Pet Effects (Part of: NewPet Class from main maybe: 70%):
case ObjectId(13,123): // Skeleton Pet
{
float Formula = WorldTime * 0.003f;
float VecTick = sinf(Formula + 1.f) * 0.5f + 0.5f;
// ----
Vector(Hero->Position[0],Hero->Position[1],Hero->Position[2],Position); Vector(VecTick*0.f,VecTick*1.f,VecTick*0.5f,Light);
// ----
b->TransformByBoneMatrix(Position,BoneTransform[11],p,NULL); pCreateSprite(32050,Position,0.05f,Light,Hero,0.f,NULL);
// ----
b->TransformByBoneMatrix(Position,BoneTransform[12],p,NULL); pCreateSprite(32050,Position,0.05f,Light,Hero,0.f,NULL);
// ----
b->TransformByBoneMatrix(Position,BoneTransform[44],p,NULL); pCreateSprite(32002,Position,0.3f,Light,Hero,0.f,NULL);
// ----
b->TransformByBoneMatrix(Position,BoneTransform[46],p,NULL); pCreateSprite(32002,Position,0.6f,Light,Hero,0.f,NULL);
// ----
b->TransformByBoneMatrix(Position,BoneTransform[45],p,NULL); pCreateSprite(32002,Position,0.4f,Light,Hero,0.f,NULL);
// ----
b->TransformByBoneMatrix(Position,BoneTransform[62],p,NULL); pCreateSprite(32002,Position,0.3f,Light,Hero,0.f,NULL);
// ----
if(Hero && IsMoving >= 0.05f) // *(float*)(x+120) = IsMoving
{
Vector(0.f,1.f,0.5f,Light);
Vector(Angle[0]+35.f,Angle[1],Angle[2],Angle);
Vector(Hero->Position[0],Hero->Position[1],Hero->Position[2],Position);
// ----
b->TransformByBoneMatrix(Position,BoneTransform[13],p,NULL);
// ----
for(int l=0;l<2;l++)
{
if(l!=1||rand()%2)
{
int AnimationID = rand()%3;
// ----
if(AnimationID)
{
if(AnimationID==1) // Character StandBy
{ pCreateParticle(32351,Position,Angle,Light,8,0.5f,Hero);//Effect\\firehik_mono02.jpg }
else if(AnimationID==2) // Character Walking
{ pCreateParticle(32352,Position,Angle,Light,5,0.5f,Hero);//Effect\\firehik_mono03.jpg }
}
else
{ pCreateParticle(32350,Position,Angle,Light,4,0.5f,Hero);//Effect\\firehik_mono01.jpg }
}
}
}
}
break;
Decompiled RenderPartObjectBody Function + Call Hooks (maybe: 90%):
void BMD::RenderMesh() //0x004CECD0 //////////////////////////////////////////////////////////////////////////////////////////////////////
// Parameter Info About Usage Methods
// EX: RenderType & 0x40000:
// Render this effect only when the Character have Equiped the Item //////////////////////////////////////////////////////////////////////////////////////////////////////
#define ItemId(x,y) ((x*512)+y)
#define ObjectId(x,y) ((x*512)+y+833)
#define pGetTickCount *(DWORD*)0x80A68C4
#define pRenderPartObjectBody ((void(__cdecl*)(BMD*b,OBJECT*o,int Type,GLfloat Alpha,int RenderType))0x005C4AE6)
struct OBJECT
{
// -> Can be added comming soon SirMaster LOL!
};
class BMD
{
public:
char Unknown1; // 1
char Unknown2; // 2
char Unknown3; // 3
char Unknown4; // 4
char Unknown5; // 5
char Unknown6; // 6
char Unknown7; // 7
char Unknown8; // 8
char Unknown9; // 9
char Unknown10; // 10
char Unknown11; // 11
char Unknown12; // 12
char Unknown13; // 13
char Unknown14; // 14
char Unknown15; // 15
char Unknown16; // 16
char Unknown17; // 17
char Unknown18; // 18
char Unknown19; // 19
char Unknown20; // 20
char Unknown21; // 21
char Unknown22; // 22
float Unknown26; // +26
vec3_t Preview; // +27 +28 +29 (Original Name maybe: vector p)
char Version; // 33
short NumBones; // 34
short NumMeshs; // 36
short NumActions; // 38
void *Meshs; // 40
void *Bones; // 44
void *Actions; // 48
void *Textures; // 50
short *IndexTexture; // 54
short NumLightMaps; // 58
short IndexLightMap; // 60
void *LightMaps; // 64
bool LightEnable; // 68
bool ConstratEnable; // 69
vec3_t BodyLight; // 72, 76, 80
int BoneHead; // 84
int BoneFoot[4]; // 88 92 96 100
float BodyScale; // 104
vec3_t BodyOrigin; // 108, 112, 116
vec3_t BodyAngle; // 120, 124, 128
float BodyHeight; // 133
char StreamMesh; // 136
vec3_t ShadowAngle; // 137, 141, 145
char Skin; // 152
bool HideSkin; // 153
float Velocity; // 157
unsigned char CurrentAction; // 160
unsigned char PriorAction; // 161
float CurrentAnimation; // 164
short CurrentAnimationFrame; // 168
short Sounds[10]; // 170
bool LightMapEnable; // 192
// ----
BYTE Other[52]; // -> Total Size: 244
};
void RenderPartObjectBody(BMD*b,OBJECT*o,int Type,GLfloat Alpha,int RenderType)
{
switch(Type)
{
// Wings of Storm (for test) This function is for Texture Effects, I mean, not Pos Effects. for Pos Effects you must see: RenderPartObjectEffect function from main
case ObjectId(12,36):
{
b->BodyLight[0] = 1.00f;
b->BodyLight[1] = 0.69f;
b->BodyLight[2] = 0.50f;
// ----
Vector(b->BodyLight[0],b->BodyLight[1],b->BodyLight[2],b->BodyLight);
// ----
glColor3fv((const GLfloat*)b->BodyLight);
// ----
b->BodyLight = o->IndexLightMap;
b->BodyOrigin[2] = o->BodyOrigin[2];
b->BodyScale = o->BodyScale;
b->BodyFoot[4] = o->BodyFoot[4];
b->LightEnable = o->LightEnable;
// ----
b->RenderMesh(b,2,2,o->Skin,o->LightEnable,o->BodyFoot[4],o->BodyScale,o->BodyOrigin[2],o->IndexLightMap);
b->RenderMesh(b,0,66,o->Skin,o->LightEnable,o->BodyFoot[4],o->BodyScale,o->BodyOrigin[2],o->IndexLightMap);
// ----
if(pGetTickCount++ > 15)
pGetTickCount = 0;
float VecTick = pGetTickCount/4;
float Formula = (double)(VecTick)*0.25f;
// ----
b->BodyLight[0] = 0.89f;
b->BodyLight[1] = 0.60f;
b->BodyLight[2] = 0.30f;
// ----
b->RenderMesh(b,1,66,o->Skin,true,o->BodyFoot[4],Formula,o->BodyOrigin[2],o->IndexLightMap);
// ----
b->BodyLight[0] = 1.00f;
b->BodyLight[1] = 1.00f;
b->BodyLight[2] = 1.00f;
// ----
break;
}
}
// ----
pRenderPartObjectBody(b,o,Type,Alpha,RenderType);
}
void Load() // Only hook function for main
{
gToolKit.SetOp((LPVOID)0x005D1F80,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D1FF0,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D2060,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D211D,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D218D,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D21FD,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D226D,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D22B0,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0X005D235F,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D241F,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D251D,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D25ED,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D26B3,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D2752,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D27C3,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D2834,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D28C7,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D2962,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D2A01,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D2AD7,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D2BAD,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D2CB1,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D2DB9,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D2E84,this->RenderPartObjectBody,ASM::CALL); gToolKit.SetOp((LPVOID)0x005D2EC5,this->RenderPartObjectBody,ASM::CALL);
}
Decompiled (NOT TESTED) TransformPosition Function (Part of: BMD Class from main):
float *BMD::TransformPosition(BMD*b,vec34_t Matrix,vec3_t Position,vec3_t Preview,bool Translate)
{
if(Matrix)
{
if(Translate)
{
VectorTransform(Preview,Matrix,b->Preview);
b->Preview[0] = b->Unknown26 * b->Preview[0];
b->Preview[1] = b->Unknown26 * b->Preview[1];
b->Preview[2] = b->Unknown26 * b->Preview[2];
Preview[0] = b->Preview[0] + b->Preview[0];
Preview[1] = b->Preview[1] + b->Preview[1];
Preview[2] = b->Preview[2] + b->Preview[2];
}
else
{
VectorTransform(Position,Matrix,Preview);
}
}
return Position; // -> Here maybe return Preview vector or Position I don't know sorry I'm noobish for this xD and this function don't have pointers !!!!! this is because is complete... but must be included with all class BMD functions anyways I can decompile complete class now -> SirMaster LOL!
}
PS: In all cases is necesary import to his projects: zzzMathLib.h from Webzen (1.00.93) Original Sources can be used (Please don't use from: Deathway .18 decompilation because have bug).
Thread Updated: 22-10-20 Added some Video-Tests & Functions Adapted for main.exe Version: 1.04.05 (GMO) of: "RenderDarkHorseSkill" Function by: louis A.K.A: Luis_br
ObjectModel Struct Modified by Luis_br to Works with main.exe (1.04.05 GMO) + Defined Pointers (Offsets 1.04.05):
Code:
#define pAngleMatrix2 ((int(__cdecl*)(vec3_t a1, vec34_t a2)) 0x959CE0)
#define pVectorRotate2 ((int(__cdecl*)(vec3_t a1, vec34_t a2, vec3_t a3)) 0x95A1E0)
#define pMoveSceneFrame *(int*)0x00E8CB20
#define pEarthQuake *(float*)0x08787D48
typedef struct //648? 848!!
{
/*+0*/ int Prev;
/*+4*/ BYTE IsSetted;
/*+5*/ BYTE Unknown5;
BYTE gap01[3];
/*+9*/ BYTE Unknown9;
/*+10*/ BYTE Unknown10;
/*+11*/ BYTE Unknown11;
/*+12*/ BYTE Unknown12;
/*+13*/ BYTE Unknown13;
/*+14*/ BYTE Unknown14;
/*+15*/ BYTE Unknown15;
/*+16*/ BYTE Unknown16;
/*+17*/ BYTE Unknown17;
/*+18*/ WORD AnimationID;
/*+20*/ WORD Unknown20;
/*+22*/ BYTE Unknown22;
/*+23*/ BYTE Unknown23;
/*+24*/ BYTE ObjectType;
/*+25*/ BYTE Unknown25;
/*+26*/ BYTE Unknown26;
/*+27*/ BYTE Unknown27;
/*+28*/ BYTE Unknown28;
/*+29*/ BYTE Unknown29;
/*+30*/ BYTE OnAttacking;
/*+31*/ BYTE Unknown31;
/*+32*/ BYTE Unknown32;
/*+33*/ BYTE Unknown33;
/*+34*/ BYTE Unknown34;
/*+35*/ BYTE Unknown35;
/*+36*/ WORD Unknown36;
/*+38*/ WORD Unknown38;
BYTE gap05[8];
/*+48*/ DWORD SkinID;
/*+52*/ DWORD ActionType; //Fireworks
/*+56*/ DWORD Unknown56;
/*+60*/ DWORD Unknown60;
/*+64*/ DWORD Unknown64; //Count ?
/*+68*/ DWORD Transparency;
/*+72*/ float Unknown72;
/*+76*/ float Unknown76;
/*+80*/ float Unknown80;
BYTE gap06[8];
/*+92*/ DWORD Time; //Tempo de duração ?
/*+96*/ float Scale;
/*+100*/ float Unknown100;
/*+104*/ float Unknown104;
/*+108*/ float Unknown108;
/*+112*/ float Unknown112;
/*+116*/ float Unknown116;
/*+120*/ float Unknown120;
/*+124*/ float Unknown124;
/*+128*/ float Unknown128;
/*+132*/ float Unknown132;
/*+136*/ float Unknown136;
/*+140*/ float CoordX;
/*+144*/ float CoordY;
/*+148*/ float Unknown148;
/*+152*/ float Unknown152;
/*+156*/ float ColorR;
/*+160*/ float ColorG;
/*+164*/ float ColorB;
/*+168*/ float Unknown168;
/*+172*/ float Unknown172;
/*+176*/ float Unknown176;
/*+180*/ float Unknown180;
/*+184*/ float Unknown184;
/*+188*/ float Unknown188;
/*+192*/ float Unknown192;
/*+196*/ float Unknown196;
/*+200*/ float Unknown200;
/*+204*/ VAngle Unknown204;
/*+216*/ VAngle Unknown216;
/*+228*/ VAngle Unknown228;
/*+240*/ VAngle SelectZone; //ou o de cima
/*+252*/ float VecPosX;
/*+256*/ float VecPosY;
/*+260*/ float VecPosZ;
/*+264*/ VAngle WorldPos;
BYTE gap11[148];
/*+424*/ ObjectModel_424 Unknown424;
/*+472*/ VAngle Unknown472;
BYTE gap12[164];
/*+484*/
} ObjectModel, * lpModelObj;
Using this function with Original Effects ID from this Skill:
Code:
void RenderDarkHorseSkill(lpModelObj lpObjModel, lpViewObj lpObj)
{
if (lpObjModel && lpObj)
{
++lpObjModel->OnAttacking;
if ( !(pMoveSceneFrame % 10) )
pCreateEffect(32279, &lpObjModel->VecPosX, &lpObjModel->WorldPos.X, &lpObjModel->ColorR, 0, 0, -1, 0, 0, 0, 0.0, -1);
if ( lpObjModel->CoordX < 8.0 || lpObjModel->CoordX > 9.5 )
{
if ( lpObjModel->OnAttacking == 19 )
{
pCreateEffect(301, &lpObjModel->VecPosX, &lpObjModel->WorldPos.X, &lpObjModel->ColorR, 0, (int)lpObjModel, -1, 0, 2, 0, 0.0, -1);
lpObjModel->OnAttacking = -3;
}
}
else
{
if ( lpObjModel->OnAttacking % 2 == 1 )
{
vec3_t WorldPos;
vec3_t AnglePos;
Vector(0.0, (double)(lpObjModel->OnAttacking / 2) * 150.0, 0.0, WorldPos);
Vector(0.0, 0.0, (double)(rand() % 360), AnglePos);
vec34_t Matrix;
vec3_t ResultPosition;
for (int i = 0; i < 6; ++i )
{
AnglePos[2] += 60;
pAngleMatrix2(AnglePos,Matrix);
pVectorRotate2(WorldPos,Matrix,ResultPosition);
ResultPosition[0] += lpObjModel->VecPosX;
ResultPosition[1] += lpObjModel->VecPosY;
ResultPosition[2] += lpObjModel->VecPosZ;
pCreateEffect((rand() % 2) + 331, ResultPosition, &lpObjModel->WorldPos.X, &lpObjModel->ColorR, 0, 0, -1, 0, 0, 0, 0.0, -1);
}
}
pEarthQuake = (double)(rand() % 3 - 3) * 0.699999988079071;
}
}
}
Changing this EffectID (Original):
Code:
pCreateEffect((rand() % 2) + 331, ResultPosition, &lpObjModel->WorldPos.X, &lpObjModel->ColorR, 0, 0, -1, 0, 0, 0, 0.0, -1);
By this EffectID (Custom):
Code:
pCreateEffect(229, ResultPosition, &lpObjModel->WorldPos.X, &lpObjModel->ColorR, 0, 0, -1, 0, 0, 0, 0.0, -1);
Another Modification made by: Luis_br on code is this:
Code:
void RenderDarkHorseSkill(lpModelObj lpObjModel, lpViewObj lpObj)
{
if (lpObjModel && lpObj)
{
++lpObjModel->OnAttacking;
if ( !(pMoveSceneFrame % 10) )
{
vec3_t Color;
Color[0] = 1.0;
Color[1] = 0.0;
Color[2] = 0.0;
pCreateEffect(32279, &lpObjModel->VecPosX, &lpObjModel->WorldPos.X, Color, 6, 0, -1, 0, 0, 0, 0.0, -1);
pCreateEffect(223, &lpObjModel->VecPosX, &lpObjModel->WorldPos.X, &lpObjModel->ColorR, 1, 0, -1, 0, 0, 0, 0.0, -1);
}
if ( lpObjModel->CoordX < 8.0 || lpObjModel->CoordX > 9.5 )
{
if ( lpObjModel->OnAttacking == 19 )
{
//pCreateEffect(301, &lpObjModel->VecPosX, &lpObjModel->WorldPos.X, &lpObjModel->ColorR, 0, (int)lpObjModel, -1, 0, 2, 0, 0.0, -1);
lpObjModel->OnAttacking = -3;
}
}
else
{
if ( lpObjModel->OnAttacking % 2 == 1 )
{
vec3_t WorldPos;
vec3_t AnglePos;
Vector(0.0, (double)(lpObjModel->OnAttacking / 2) * 150.0, 0.0, WorldPos);
Vector(0.0, 0.0, (double)(rand() % 360), AnglePos);
vec34_t Matrix;
vec3_t ResultPosition;
for (int i = 0; i < 6; ++i )
{
AnglePos[2] += 60;
pAngleMatrix2(AnglePos,Matrix);
pVectorRotate2(WorldPos,Matrix,ResultPosition);
ResultPosition[0] += lpObjModel->VecPosX;
ResultPosition[1] += lpObjModel->VecPosY;
ResultPosition[2] += lpObjModel->VecPosZ;
pCreateEffect(229, ResultPosition, &lpObjModel->WorldPos.X, &lpObjModel->ColorR, 0, 0, -1, 0, 0, 0, 0.0, -1);
}
}
pEarthQuake = (double)(rand() % 3 - 3) * 0.699999988079071;
}
}
}
Credits:
Webzen (FOR THE GAME)
Hermex A.K.A (hermexjohn) (BY TEACH TO ME HOW TO MAKE TO CODE COOL THINGS )
Nemesis A.K.A (Kiosani) (ME AND I DID ALL WITHOUT MAIN SOURCES SirMaster LOL!).
louis A.K.A (Luis_br) (BY ADAPT THE ORIGINAL SOURCE (MY SRC) VERY VERY GOOD JOB BRO!).
Last edited: