Page about Rage of Mages

[ru] [en]  
[0] [1] [2]

 
  

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)