Как известно, полную карту имеют только основные регионы (Аскарон, Магический океан и Великий синий океан). В данной статье я расскажу и покажу как можно сделать полную карту для любого региона и местности:
Когда игрок нажимает кнопку "Карта" под миникартой, чтобы открыть полную карту местности, клиент отправляет серверу пакет с запросом. Сервер читает этот пакет, решает, имеет ли регион, в котором в данный момент находится клиент, полную карту, и отправляет ответ клиенту. Если ответ "положительный", то клиент открывает игроку большую карту. Если "отрицательный", то игрок получает в систему сообщение "Эта местность не имеет полной карты":
Наша задача заключается в том, чтобы добавить в GameServer.exe карты, которые должны иметь полную карту местности.
Нам понадобится:
Отладчик OllyDbg v1.10;
GameServer.exe (Я буду работать с GameServer из сборки PKO 1.38);
Внимательность и терпение
Редактируем GameServer.exe: 1) Запустите GameServer.exe. Затем запустите OllyDbg. В OllyDbg выполните команду File => Attach. В окошке "Select process to attach" выберите процесс Вашего GameServer.exe.
Откроется окно "CPU" отладчика:
2) В панели инструментов нажмите кнопку "E" () или сочетание клавиш Alt + E. Появится окно "Executable modules".
В нем выберите модуль "GameServ":
Откроется окно "CPU" для модуля "GameServ". Правым кликом вызовите контекстное меню и выберите команду Analysis => Analyse code (сочетание клавиш ALT + A)
3) Перейдите по адресу 0x005B25A4.
Для этого выполните команду Go to => Expression из контекстного меню:
В появившемся окне "Enter expression to follow" введите значение "0x005B25A4" и нажмите кнопку "ОК"
В результате Вы должны оказаться на адресе 0x005B25A4:
4) Теперь Вам нужно ввести названия карт для которых требуется сделать полную карту местности.
Список стандартных карт:
garner — Аскарон
magicsea — Магический Океан
darkblue — Великий Синий Океан
lonetower — Одинокая башня
eastgoaf — Серебрянные шахты, заброшенные шахты, логово черного дракона, логово черного дракона 2
secretgarden — Сад Эдель
darkswamp — Темная топь
abandonedcity — Забытый Город
abandonedcity2 — Забытый Город 2
abandonedcity3 — Забытый Город 3
puzzleworld — Мир Демонов
puzzleworld2 — Мир Демонов 2
teampk — Арена
jialebi — Небеса, база флота, остров сокровищ, остров скелетов
garner2 — Серебряный Хаос
hell* — абаддоны
guildwar — Священная война
guildwar2 — Маленькая священная война
leiting2 — Мираж Громограда
shalan2 — Мираж Шайтана
binglang2 — Мираж Ледыни
yschurch — Церковь
07xmas — 2007 Новогодняя деревня
sdBoss — Остров Боссов
07xmas2 — Снежная война
prisonisland — Тюрьма
winterland — Остров Зимы
mjing1 — 1-ый край Аврор
mjing2 — 2-ой край Аврор
mjing3 — 1-ый край Тьмы
mjing4 — 2-ой край Тьмы
starena* — Арены
heilong — Сундук черного дракона
darkhouse — Дом тьмы
mingyun — Комната судьбы
PKmap — Новая арена
Для примера, я сделаю полные карты местности для Острова Зимы (winterland), Темной топи (darkswamp) и Забытого Города 1 (abandonedcity)
Выделите достаточное количество байт. Например, для того, чтобы закодировать "winterland" нужно 11 байт (10 байт символы; 1 байт - нулевой, конец строки).
Затем в контекстном меню выберите команду Binary => Edit (CTRL + E)
Появится окошко "Edit code at 005B25A4". В нем введите "winterland" и нажмите кнопку "ОК"
В результате получится что-то вроде этого:
Проанализируйте код (Analysis => Analyse code или сочетание клавиш ALT + A):
Выполните данное действие для всех требуемых карт:
5) Итак, мы записали 3 строки:
winterland по адресу 0x005B25A4
darkswamp по адресу 0x005B25AF
abandonedcity по адресу 0x005B25B9
Запомните эти адреса. У Вас они могут отличаться.
6) Теперь Вам для каждой карты надо написать код, который добавит ее в список карт, имеющих полную карту местности:
PUSH Ширина карты (x)
PUSH Длина карты (y)
PUSH Адрес строки, в которой находится название карты
MOV ECX,DWORD PTR SS:[EBP-14]
ADD ECX,10A4
CALL 0x005551A0
(!) Ширина и длина карты в шестнадцатеричной (HEX) системе счисления.
Например, для Острова Зимы код будет выглядеть так:
PUSH 898
PUSH 708
PUSH 0x005B25A4
MOV ECX,DWORD PTR SS:[EBP-14]
ADD ECX,10A4
CALL 0x005551A0
Для Темной топи:
PUSH 220
PUSH 5D8
PUSH 0x5B25AF
MOV ECX,DWORD PTR SS:[EBP-14]
ADD ECX,10A4
CALL 0x005551A0
Для Забытого города:
PUSH 180
PUSH 180
PUSH 0x005B25B9
MOV ECX,DWORD PTR SS:[EBP-14]
ADD ECX,10A4
CALL 0x005551A0
Q: Как узнать размер карты? A: Открываем клиентский .map файл в HEX-редакторе:
4 байта, начиная с 4-го, отвечают за ширину, а 4 байта, начиная с 8-го, - за длину.
0000089816 = 220010 0000070816 = 180010
Получается, что карта "Остров Зимы" (winterland) имеет размеры 2200 x 1800
Итак, записываем код. Я буду записывать его с адреса 0x005B25CA. Этот адрес так же надо запомнить. Щелкаем двойным кликом по строке, которая соответствует данному адресу. Появляется окошко "Assemble at 5B25CA". В него забиваем первую инструкцию:
PUSH 898
и нажимаем кнопку "ОК"
Получаем:
затем
PUSH 708
и так далее:
Выполняем данное действие для всех требуемых карт:
7) Затем нужно задействовать наш код. Идем по адресу 0x004ED656 и заменяем
PUSH 1000
на
JMP 0x005B25CA
Помните я просил запомнить адрес 0x005B25CA? У Вас он может отличаться.
Было:
Стало:
8) Далее нужно вернуться к нашему коду в конце и дописать
PUSH 1000
JMP 0x004ED65B
На этом редактирование GameServer.exe закончено
9) Теперь Вам нужно сохранить изменения. Для этого вызовите команду контекстного меню Copy to executable => All modifications:
Появится окошко "Copy selection to executable file". В нем нажимаем кнопку "Copy all". После этого появится окно "File <Путь до Вашего GameServer.exe>". Закрываем его. В окне "File changed" нажимаем кнопку "Yes" и указываем название файла, в который нужно сохранить. 10) После этого нужно протестировать модифицированный GameServer.exe и убедиться, что все работает как надо.