Server modification to support more than 2 billions of gold coins
Author: Vladimir Chebotarev aka ex-lend
Categories: RoM 2, Technical
Пришел в голову простой способ реализации хранения более 2G денег.
Суть в следующем:
1) Делаем программу с базой, которая будет хранить соответствие (login name, char id) <-> money
2) Добавляем команды:
#money_get XXX
- забирает из вышеперечисленной программы деньги данного персонажа
#money_put XXX
- делает обратный процесс, то есть добавляет деньги в программу и убавляет у персонажа
#money_info
- пишет на экране баланс дополнительного счета персонажа
В итоге можно создавать для каждого персонажа бесконечное хранилище бабла.
Правда использовать единовременно можно не больше 2G.
Но зато все будет работать без глюков и не нужно модифицировать клиент (в отличие от реализации нативного варианта).
Возможные трудности реализации:
- Как вставить код в сервер?
Нужно сделать dll, экспортировать в ней подпрограмму. C помощью программы add_dll
из раздела Файлы можно воткнуть вызов подпрограммы из dll
в любое место.
- Как добавить новую команду?
Ищем в дизассемблере #ready
/#set latency
/#show latency
. Эти коды доступны клиентам. Потом идем по обращениям к ним. Оказываемся в месте,
где обрабатываются коды. То куда идет команда - функция поиска подстроки в строчке, пришедшей от клиента. Добавьте свою команду аналогичным образом.
- Откуда вытащить char id и имя логина?
В упомянутой подпрограмме обработки команд arg_0
- указатель на экземпляр класса Player. Имя логина лежит по адресу [[arg_0] + 0xA78]
.
Идентификатор персонажа - два двойных слова: [[arg_0] + 0x10]
, [[arg_0] + 0x14]
.
- Как работать с количеством денег игрока?
Метод Player'а - a2server.exe:00534AC1
, типа вызова stdcall
, аргумент 1 - число добавляемых денег, аргумент 2 - флаг, если 1, то клиент не увидит
сообщения "Вы подняли сколько-то там бабла". В ecx
само собой записывается указатель на Player. Если посмотреть на его внутренности, то выяснится, что
деньги лежат по адресу +0x3C относительно Player.
- Как отправить игроку сообщение?
Метод a2server.exe:0051CD89
. В ecx
нужно записать 006C3A08
. Тип вызова stdcall
. Аргумент 1 - указатель на указатель на строку (char **
),
аргумент 2 - Player, которому написать сообщение, или 0, если нужно отправить его всем.
Discussion (0)