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] Full MapLoad 97D

Initiate Mage
Joined
Jun 2, 2019
Messages
2
Reaction score
5
Hi people

I leaved my private server and MuOnline's development since 2014.

I've come to share a bit of my old work... It's for 97.04 GS:

Maps.cpp
Code:
#include "Maps.h"

unsigned char MapStruct[25][0x4DB68] = {0x00};
int num_maps;

void FixMapAttribute()
{
    *(DWORD*)(0x4055A2) = (DWORD)&MapStruct;
    *(DWORD*)(0x405616) = (DWORD)&MapStruct;
    *(DWORD*)(0x405737) = (DWORD)&MapStruct;
    *(DWORD*)(0x405A31) = (DWORD)&MapStruct;
    *(DWORD*)(0x405A99) = (DWORD)&MapStruct;
    *(DWORD*)(0x405B3F) = (DWORD)&MapStruct;
    *(DWORD*)(0x4060C7) = (DWORD)&MapStruct;
    *(DWORD*)(0x406470) = (DWORD)&MapStruct;
    *(DWORD*)(0x4064B7) = (DWORD)&MapStruct;
    *(DWORD*)(0x4065FF) = (DWORD)&MapStruct;
    *(DWORD*)(0x407867) = (DWORD)&MapStruct;
    *(DWORD*)(0x407B1A) = (DWORD)&MapStruct;
    *(DWORD*)(0x407B46) = (DWORD)&MapStruct;
    *(DWORD*)(0x407DB9) = (DWORD)&MapStruct;
    *(DWORD*)(0x408577) = (DWORD)&MapStruct;
    *(DWORD*)(0x4085B6) = (DWORD)&MapStruct;
    *(DWORD*)(0x4086D2) = (DWORD)&MapStruct;
    *(DWORD*)(0x409700) = (DWORD)&MapStruct;
    *(DWORD*)(0x40A014) = (DWORD)&MapStruct;
    *(DWORD*)(0x40A12A) = (DWORD)&MapStruct;
    *(DWORD*)(0x40A214) = (DWORD)&MapStruct;
    *(DWORD*)(0x40CAE9) = (DWORD)&MapStruct;
    *(DWORD*)(0x40CCE9) = (DWORD)&MapStruct;
    *(DWORD*)(0x40CE2A) = (DWORD)&MapStruct;
    *(DWORD*)(0x412652) = (DWORD)&MapStruct;
    *(DWORD*)(0x4126A9) = (DWORD)&MapStruct+0xB0;
    *(DWORD*)(0x4126D0) = (DWORD)&MapStruct+0xB8;
    *(DWORD*)(0x41270F) = (DWORD)&MapStruct+0xB0;
    *(DWORD*)(0x412736) = (DWORD)&MapStruct+0xB8;
    *(DWORD*)(0x41894E) = (DWORD)&MapStruct+0x20;
    *(DWORD*)(0x418A6A) = (DWORD)&MapStruct;
    *(DWORD*)(0x418BB0) = (DWORD)&MapStruct;
    *(DWORD*)(0x419EF9) = (DWORD)&MapStruct;
    *(DWORD*)(0x424DBC) = (DWORD)&MapStruct;
    *(DWORD*)(0x424DEE) = (DWORD)&MapStruct;
    *(DWORD*)(0x425396) = (DWORD)&MapStruct;
    *(DWORD*)(0x4253C8) = (DWORD)&MapStruct;
    *(DWORD*)(0x436E3C) = (DWORD)&MapStruct;
    *(DWORD*)(0x4373AB) = (DWORD)&MapStruct;
    *(DWORD*)(0x43776F) = (DWORD)&MapStruct;
    *(DWORD*)(0x437B11) = (DWORD)&MapStruct;
    *(DWORD*)(0x437ED7) = (DWORD)&MapStruct;
    *(DWORD*)(0x43830C) = (DWORD)&MapStruct;
    *(DWORD*)(0x438668) = (DWORD)&MapStruct;
    *(DWORD*)(0x4389EC) = (DWORD)&MapStruct;
    *(DWORD*)(0x454E30) = (DWORD)&MapStruct;
    *(DWORD*)(0x45C68A) = (DWORD)&MapStruct;
    *(DWORD*)(0x45C702) = (DWORD)&MapStruct;
    *(DWORD*)(0x45C74A) = (DWORD)&MapStruct;
    *(DWORD*)(0x45C7C6) = (DWORD)&MapStruct;
    *(DWORD*)(0x45C81B) = (DWORD)&MapStruct;
    *(DWORD*)(0x45C894) = (DWORD)&MapStruct;
    *(DWORD*)(0x45CA19) = (DWORD)&MapStruct;
    *(DWORD*)(0x45CA62) = (DWORD)&MapStruct;
    *(DWORD*)(0x45D221) = (DWORD)&MapStruct;
    *(DWORD*)(0x45D4FB) = (DWORD)&MapStruct;
    *(DWORD*)(0x45EDE6) = (DWORD)&MapStruct;
    *(DWORD*)(0x460F6C) = (DWORD)&MapStruct;
    *(DWORD*)(0x460FB3) = (DWORD)&MapStruct;
    *(DWORD*)(0x460FD5) = (DWORD)&MapStruct;
    *(DWORD*)(0x460FF7) = (DWORD)&MapStruct;
    *(DWORD*)(0x461019) = (DWORD)&MapStruct;
    *(DWORD*)(0x4624C0) = (DWORD)&MapStruct;
    *(DWORD*)(0x462561) = (DWORD)&MapStruct;
    *(DWORD*)(0x462587) = (DWORD)&MapStruct;
    *(DWORD*)(0x4626E9) = (DWORD)&MapStruct;
    *(DWORD*)(0x462939) = (DWORD)&MapStruct;
    *(DWORD*)(0x46295D) = (DWORD)&MapStruct;
    *(DWORD*)(0x466197) = (DWORD)&MapStruct;
    *(DWORD*)(0x469848) = (DWORD)&MapStruct+0xAA;
    *(DWORD*)(0x469874) = (DWORD)&MapStruct+0x24;
    *(DWORD*)(0x469970) = (DWORD)&MapStruct+0x20;
    *(DWORD*)(0x46998D) = (DWORD)&MapStruct+0x24;
    *(DWORD*)(0x47116E) = (DWORD)&MapStruct;
    *(DWORD*)(0x471902) = (DWORD)&MapStruct+0x24;
    *(DWORD*)(0x47192A) = (DWORD)&MapStruct+0xAC;
    *(DWORD*)(0x47195C) = (DWORD)&MapStruct+0xA9;
    *(DWORD*)(0x471979) = (DWORD)&MapStruct+0xA8;
    *(DWORD*)(0x4719BA) = (DWORD)&MapStruct+0xAA;
    *(DWORD*)(0x4719DA) = (DWORD)&MapStruct+0xAB;
    *(DWORD*)(0x472EF1) = (DWORD)&MapStruct;
    *(DWORD*)(0x472FBF) = (DWORD)&MapStruct;
    *(DWORD*)(0x47302A) = (DWORD)&MapStruct;
    *(DWORD*)(0x473087) = (DWORD)&MapStruct;
    *(DWORD*)(0x473112) = (DWORD)&MapStruct;
    *(DWORD*)(0x473152) = (DWORD)&MapStruct;
    *(DWORD*)(0x47335C) = (DWORD)&MapStruct;
    *(DWORD*)(0x474114) = (DWORD)&MapStruct;
    *(DWORD*)(0x47640E) = (DWORD)&MapStruct+0xAC;
    *(DWORD*)(0x476442) = (DWORD)&MapStruct+0xA8;
    *(DWORD*)(0x47646A) = (DWORD)&MapStruct+0xA9;
    *(DWORD*)(0x476492) = (DWORD)&MapStruct+0x2A;
    *(DWORD*)(0x4764C0) = (DWORD)&MapStruct+0x80;
    *(DWORD*)(0x4764F3) = (DWORD)&MapStruct+0x80;
    *(DWORD*)(0x47651E) = (DWORD)&MapStruct+0x2A;
    *(DWORD*)(0x4765AF) = (DWORD)&MapStruct+0x20;
    *(DWORD*)(0x4765D5) = (DWORD)&MapStruct+0x24;
    *(DWORD*)(0x47768C) = (DWORD)&MapStruct;
    *(DWORD*)(0x4776BE) = (DWORD)&MapStruct;
    *(DWORD*)(0x47C4C1) = (DWORD)&MapStruct;
    *(DWORD*)(0x47C50B) = (DWORD)&MapStruct;
    *(DWORD*)(0x47C84A) = (DWORD)&MapStruct;
    *(DWORD*)(0x47C8A6) = (DWORD)&MapStruct;
    *(DWORD*)(0x47CFB7) = (DWORD)&MapStruct;
    *(DWORD*)(0x47CFDB) = (DWORD)&MapStruct;
    *(DWORD*)(0x48942B) = (DWORD)&MapStruct;
    *(DWORD*)(0x489496) = (DWORD)&MapStruct;
    *(DWORD*)(0x48A67A) = (DWORD)&MapStruct;
    *(DWORD*)(0x48A6AB) = (DWORD)&MapStruct;
    *(DWORD*)(0x490509) = (DWORD)&MapStruct;
    *(DWORD*)(0x491657) = (DWORD)&MapStruct;
    *(DWORD*)(0x49581D) = (DWORD)&MapStruct;
    *(DWORD*)(0x496272) = (DWORD)&MapStruct;
    *(DWORD*)(0x4974AF) = (DWORD)&MapStruct+0x10;
    *(DWORD*)(0x4974D0) = (DWORD)&MapStruct+0x10;
    *(DWORD*)(0x4975BF) = (DWORD)&MapStruct+0x10;
    *(DWORD*)(0x4975E0) = (DWORD)&MapStruct+0x10;
    *(DWORD*)(0x4976CF) = (DWORD)&MapStruct+0x10;
    *(DWORD*)(0x4976F0) = (DWORD)&MapStruct+0x10;
    *(DWORD*)(0x4977DF) = (DWORD)&MapStruct+0x10;
    *(DWORD*)(0x497800) = (DWORD)&MapStruct+0x10;
    *(DWORD*)(0x497923) = (DWORD)&MapStruct+0x10;
    *(DWORD*)(0x497944) = (DWORD)&MapStruct+0x10;
    *(DWORD*)(0x497A83) = (DWORD)&MapStruct+0x10;
    *(DWORD*)(0x497AA4) = (DWORD)&MapStruct+0x10;
    *(DWORD*)(0x497B85) = (DWORD)&MapStruct+0x10;
    *(DWORD*)(0x497BA3) = (DWORD)&MapStruct+0x10;
    *(DWORD*)(0x497C55) = (DWORD)&MapStruct+0x10;
    *(DWORD*)(0x497C73) = (DWORD)&MapStruct+0x10;
}

void MapInit()
{
    FixMapAttribute();

    BYTE cMapLoadFix[] = {0xFF,0x15,0x4B,0x4A,0x4D,0x00,0xE9,0xA2,0x03,0x00,0x00};
    *(DWORD*)0x004D4A4B = (DWORD)&MapLoad;
    memcpy((int *)0x0048A309,cMapLoadFix,sizeof(cMapLoadFix));

    num_maps = 25;

    memset((PBYTE)0x4122FC, num_maps-0x01, 1);//ItemSerialCreateRecv
    memset((PBYTE)0x4188DD, num_maps-0x01, 1);//CGItemGetRequest
    memset((PBYTE)0x443782, num_maps-0x01, 1);//MapNumberCheck
    memset((PBYTE)0x45BA63, num_maps-0x01, 1);//GetMapMoveLevel
    memset((PBYTE)0x45C620, num_maps-0x01, 1);//gObjSetCharacter
    memset((PBYTE)0x460E00, num_maps-0x01, 1);//gObjCheckXYMapTile
    memset((PBYTE)0x4623B0, num_maps-0x01, 1);//gObjBackSpring
    memset((PBYTE)0x4627E0, num_maps-0x01, 1);//gObjBackSpring2
    memset((PBYTE)0x47334E, num_maps, 1);     //gObjSetState
    memset((PBYTE)0x47C499, num_maps, 1);     //gObjCheckTeleportArea
    memset((PBYTE)0x47C7D4, num_maps, 1);     //gObjCheckAttackArea
    memset((PBYTE)0x47C7FE, num_maps, 1);     //gObjCheckAttackArea
    memset((PBYTE)0x489424, num_maps, 1);
    memset((PBYTE)0x48948F, num_maps, 1);
    memset((PBYTE)0x4904FB, num_maps, 1);     //WndProc
}

CHAR MapBuff[25][24] = {
    "..\\data\\terrain1.att",
    "..\\data\\terrain2.att",
    "..\\data\\terrain3.att",
    "..\\data\\terrain4.att",
    "..\\data\\terrain5.att",
    "..\\data\\terrain6.att",
    "..\\data\\terrain7.att",
    "..\\data\\terrain8.att",
    "..\\data\\terrain9.att",
    "..\\data\\terrain10.att",
    "..\\data\\terrain11.att",
    "..\\data\\terrain12.att",
    "..\\data\\terrain12.att",
    "..\\data\\terrain12.att",
    "..\\data\\terrain12.att",
    "..\\data\\terrain12.att",
    "..\\data\\terrain12.att",
    "..\\data\\(null).att",
    "..\\data\\(null).att",
    "..\\data\\(null).att",
    "..\\data\\terrain21.att",
    "..\\data\\terrain22.att",
    "..\\data\\terrain23.att",
    "..\\data\\terrain24.att",
    "..\\data\\terrain25.att"
};

void MapLoad()
{
    for(int i = 0;i<num_maps;i++)
    {
        _asm
        {
            mov ecx, i
            imul ecx, ecx, 0x4DB68
            add ecx, offset MapStruct
            mov eax, 0x402225
            call eax
            mov eax, i
            push eax
            mov ecx, i
            imul ecx, ecx, 18h
            add ecx, offset MapBuff
            push ecx
            mov ecx, 0x687DE60
            mov eax, 0x00401A7D
            call eax
            push eax
            mov ecx, i
            imul ecx, ecx, 0x4DB68
            add ecx, offset MapStruct
            mov eax, 0x00401FC3
            call eax
        }
    }
}

Regards :blushing:.
 
Last edited:
Initiate Mage
Joined
Jun 2, 2019
Messages
2
Reaction score
5
Any way to modify the respawn in the new maps?

Of course, you need do some like that:
Code:
RECT gRegenRect[25];

SetRect(&gRegenRect[0], 130, 116, 151, 137);
SetRect(&gRegenRect[1], 106, 236, 112, 243);
SetRect(&gRegenRect[2], 197, 35, 218, 50);
SetRect(&gRegenRect[3], 174, 101, 187, 125);
SetRect(&gRegenRect[4], 201, 70, 213, 81);
SetRect(&gRegenRect[5], 89, 135, 90, 136);
SetRect(&gRegenRect[6], 89, 135, 90, 136);
SetRect(&gRegenRect[7], 14, 11, 27, 23);
SetRect(&gRegenRect[8], 187, 54, 203, 69);
[...]
SetRect(&gRegenRect[x], x1, y1, x2, y2);
 
Last edited:
Newbie Spellweaver
Joined
Feb 10, 2013
Messages
22
Reaction score
0
Of course, you need do some like that:
Code:
RECT gRegenRect[25];

SetRect(&gRegenRect[0], 130, 116, 151, 137);
SetRect(&gRegenRect[1], 106, 236, 112, 243);
SetRect(&gRegenRect[2], 197, 35, 218, 50);
SetRect(&gRegenRect[3], 174, 101, 187, 125);
SetRect(&gRegenRect[4], 201, 70, 213, 81);
SetRect(&gRegenRect[5], 89, 135, 90, 136);
SetRect(&gRegenRect[6], 89, 135, 90, 136);
SetRect(&gRegenRect[7], 14, 11, 27, 23);
SetRect(&gRegenRect[8], 187, 54, 203, 69);
[...]
SetRect(&gRegenRect[x], x1, y1, x2, y2);
but how to do it
 
Newbie Spellweaver
Joined
Jun 1, 2020
Messages
12
Reaction score
12
but how to do it

Ok, i will help you. If you use the code published, i suppose that you are using a plugin (dll).

Step 1:
In the same way that you add maps, you will need allocate memory for the respawns. You can create a new memory space defining:
RECT gRegenRect[25]; -> 25 maps

Step 2:
Then, you need to redirect the calls to the address of memory of gRegenRect of GS to your new address.
Check the functions instructions at:
0x004437A0
0x00443AB0

Step 3:
Populate your variable with your customs values

Or well, you can use this compiled version (only needs be hooked and basic configurations):
http://forum.ragezone.com/f197/release-compiled-map-respawn-loader-1178448/

And thats all. Good luck!
 
Last edited:
Back
Top