Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

[Development] Reversing for fun some main.exe (1.03.16) GMO Functions Season 4.6

Joined
Oct 29, 2007
Messages
1,288
Reaction score
1,308
English:
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! :D
};

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 :D sorry I'm noobish for this xD and this function don't have pointers !!!!! :D 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;
        }
    }
}
Video Test of: Luis_br modifying Original Effects ID by anothers ID:



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;
        }
    }
}
Results in Video of the Tests of: Luis_br with this modifications maded in the original code:



Credits:
Webzen (FOR THE GAME)
Hermex A.K.A (hermexjohn) (BY TEACH TO ME HOW TO MAKE TO CODE COOL THINGS :D)
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:
Joined
Oct 29, 2007
Messages
1,288
Reaction score
1,308
First Post Updated, Added Video Tests of: "RenderDarkHorseSkill" Function Decompiled and Full Adapted for works with: 1.04.05 (GMO) main.exe by: Luis_br hahaha -> SirMaster LOL ! :D (All maded without main.exe sources bro). :thumbdown:

Video Tests of: Luis_br (Using my original functions decompiled for 1.03.16 but adapted for works with main 1.04.05 GMO):





PS: Updated Code in the main topic :D:
 
Back
Top