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!

[ XMAS 2018 ] Client Edits

Experienced Elementalist
Joined
Feb 10, 2008
Messages
249
Reaction score
161
Yoooooo Merry Christmas /f425/ :thumbup1:

Since September I got back into maple and have been working on my from scratch v95 server and client. I've learned so much and got making localhost enablers down to a science for every version using GG and HS.

I'll release all that stuff once I get hit by that Nexon lawsuit :lol:

But in the meantime here are some fun client edits you can use !!!

Also check out my analysis of v95 AntiHack:


Lie Detector Fix : http://forum.ragezone.com/f921/xmas-2018-fix-lie-detector-1157154/



ZXString is really a struct but we can get away with doing this for most things
Code:
#define ZXString        char*

PatchRetZero Function

Code:
xor eax,eax
ret

StringPool Hook

Code:
bool Hook_StringPool__GetString(bool enable){    typedef ZXString*(__fastcall* StringPool__GetString_t)(void* ecx, void* edx, ZXString* result, unsigned int nIdx, char formal);    static auto StringPool__GetString = reinterpret_cast<StringPool__GetString_t>(0xBADF00D);    StringPool__GetString_t Hook = [](void* ecx, void* edx, ZXString* result, unsigned int nIdx, char formal) -> ZXString*    {        auto ret = StringPool__GetString(ecx, edx, result, nIdx, formal);        //Replace the strings here!!!        if (nIdx == 2722) //Ranking URL for the ingame WebBrowser        {            strcpy(*ret, "http://rebirth.ms");        }        //Log("StringPool__GetString: %s\r\n", *result);        return ret;    };    return SetHook(enable, reinterpret_cast<void**>(&StringPool__GetString), Hook);}
Attack without a weapon (punch) | Credits to VirtualKernel for the idea
Code:
bool Hook_CUserLocal__CanUseBareHand(bool enable){    typedef int(__fastcall* CUserLocal__CanUseBareHand_t)(LPVOID lpvClassPtr, LPVOID lpvEdx);    static auto CUserLocal__CanUseBareHand = reinterpret_cast<CUserLocal__CanUseBareHand_t>(0xBADF00D);    CUserLocal__CanUseBareHand_t Hook = [](void* ecx, void* edx) -> int    {        return 1;    };    return SetHook(enable, reinterpret_cast<void**>(&CUserLocal__CanUseBareHand), Hook);}
Implement your own custom HWID
Code:
struct CSystemInfo{    void *vfptr;    char SupportId[16];    char MachineId[16];};bool Hook_CSystemInfo__Init(bool enable){    typedef int(__fastcall* CSystemInfo__Init_t)(CSystemInfo* lpvClassPtr, LPVOID lpvEdx);    static auto CSystemInfo__Init = reinterpret_cast<CSystemInfo__Init_t>(0xBADF00D);    CSystemInfo__Init_t Hook = [](CSystemInfo* ecx, void* edx) -> int    {        auto ret = CSystemInfo__Init(ecx, edx);        //Replace the struct values here!!!        return ret;    };    return SetHook(enable, reinterpret_cast<void**>(&CSystemInfo__Init), Hook);}
Custom MapleTips
Code:
bool Hook_CTips__GetTip(bool enable){    typedef int(__fastcall* CTips__GetTip_t)(LPVOID lpvClassPtr, LPVOID lpvEdx, int nJob, int nLevel, ZXString* sTip);    static auto CTips__GetTip = reinterpret_cast<CTips__GetTip_t>(0xBADF00D);    CTips__GetTip_t Hook = [](LPVOID lpvClassPtr, LPVOID lpvEdx, int nJob, int nLevel, ZXString* sTip)-> int    {        int ret = CTips__GetTip(lpvClassPtr, lpvEdx, nJob, nLevel, sTip);        if (ret)        {            //Edit the MapleTip in here!!!            Log("CTips__GetTip: %s", *sTip);        }        return ret;    };    return SetHook(enable, reinterpret_cast<void**>(&CTips__GetTip), Hook);}
Unlimited Attack
Code:
bool Hook_CAntiRepeat__TryRepeat(bool enable){    typedef int(__fastcall* CAntiRepeat__TryRepeat_t)(LPVOID lpvClassPtr, LPVOID lpvEdx, int nX, int nY);    static auto CAntiRepeat__TryRepeat = reinterpret_cast<CAntiRepeat__TryRepeat_t>(0xBADF00D);    CAntiRepeat__TryRepeat_t Hook = [](LPVOID lpvClassPtr, LPVOID lpvEdx, int nX, int nY)-> int    {        return 1; //Can attack    };    return SetHook(enable, reinterpret_cast<void**>(&CAntiRepeat__TryRepeat), Hook);}
Logo Skipper
Code:
PatchNop(g_CLogo__Init_Skip, 16);
Essentially it nops the if statement here so the body executes
Code:
if ( sPasswd._m_pStr && *sPasswd._m_pStr && TSingleton<CWvsApp>::ms_pInstance->m_bAutoConnect )

    CLogo::LogoEnd(v2, (int)sPasswd._m_pStr);
No Fades ( Map Loads Faster )
Code:
PatchRetZero(g_CStage__FadeIn);


PatchRetZero(g_CStage__FadeOut);
GodMode
Code:
PatchRetZero(g_CUserLocal__SetDamaged);
Shorten Whisper Sending IntervalJust look in the func and locate where the 3000 const is
Code:
WriteValue(g_CField__Update_WhisperDelay, 50); //3000ms delay on sending whispers to 50ms
Skip the "You have unused SP message"The start is the block that checks if you're a GM. If that if statement returns true the body jumps to a block that send the skill request. Start is the first jnz after first cmp. End is the goto inside the if statement
Code:
PatchJmp(g_CUISkill__OnSkillLevelUpButton_Start, 
(void*)g_CUISkill__OnSkillLevelUpButton_End);






Yooooo also you can embed your own win32 dialogs into the games CWnd's . But I'll leave that do you guys to figure out :p:

If you have any good quality of life patches you'd like to see let me know maybe ill code it!!!

Credits would always be appreciated if you used these but I doubt y'all gon do that.

Holla @ me if you need someone to create a custom client for your server :thumbup1:


Merry Christmas.
 
Last edited:
Back
Top