Старая, но все еще актуальная ммо
Сегодня рассмотрим старую, но все еще актуальную ммо под названием Perfect World
Берем конечно же не актуальную версию официального клиента, а пиратский сервер с его старенькой версией 1.5.3 (Summer PW)
Официальная версия 1.6+
На данном пвп сервере изменены некоторые полеты для персонажа, введены некоторые, так называемые "рисованные" вещи которые довольно плохо влияют на баланс сервера
Да к тому же сервер заточен еще и под донат, т.к статы вещей могут быть рандомными (Классно...)
Как раз 4 стата и считаются рандомными, выпадают с некоторым шансом из общего пула.
Ну и начнем собственно, посмотрим что можно сделать в этой игре интересного
Начнем копать от локального игрока
Ищем его указатель. Это довольно просто, не возникает никаких трудностей
Указатель имеет всего одно смещение по типу *(LocalPlayer*) + 0x4
И собственно так мы вышли на структуру персонажа
Далее нашли оффсеты до координат и прочего.
Самое интересное оказалось то, что можно изменить скорость персонажа прямо с клиента, а сервер будет воспринимать это как действительную скорость персонажа
Обычная скорость игроков на сервере порядка 5-6 м/с в зависимости от класса персонажа, довольно обычная расстановка в ммо играх
Изменив скорость персонажа с клиента у сервера не возникло вопросов, а легально ли это и просто съело это.
Путем проб и ошибок я подобрал значение скорости [м/с] которое допустимо записью в адрес. Это 15 м/с
Скорость 15 м/с считается максимальной скоростью передвижения персонажа на сервере (Когда мы передвигаемся пешочком)
Но скорости в 15 м/с ведь мало , без каких либо бафов на ускорение и пр.
Поэтому пробуем увеличить до 20 м/с простой записью и персонажа начинает откидывать назад при перемещении
Тут у меня есть предположение исходя из пошаговой отладки, что переходе через порог допустимого значения, сервер начинает сбрасывать скорость персонажа до 5-6 м/с опять же в зависимости от класса
Но на сервере есть всякие плюшки на ускорение персонажа, этим мы и воспользуемся
Установлено что максимальная скорость без бафов 5-6 м/с. С бафами 15-20 м/с
Опять же путем проб и ошибок было выяснено что можно преодолеть эти 15 м/с
А преодолеть их можно путем наложения бафа ускорения на персонажа, которое работает примерно по такому принципу
curSpeed = (15.0*2)
Значит мы можем это легко использовать и нас не будет откидывать. Звучит неплохо
Делаем бинд на запись значения в адрес скорости. Пусть это будет 30 м/с, включаем баф на ускорение и радуемся скорости в 30 м/с без каких-либо откидываний назад
Правда такое будет работать только пока на нас весит баф на ускорение, т.е ровно 15 сек
А после окончания действия бафа нам придется довольствоваться скоростью в 15 м/с, но все равно это скорость останется постоянной и уже превышает скорость обычных игроков примерно в 2-3 раза
Вопрос остается в том, как же обойти или сделать так, чтобы значение подстраивалось в нужное когда на нас висит нужный баф
Делается довольно просто, путем чтения ID бафа на ускорение и его проверки на существование
Необходимо найти какой-то список бафов и после читать его каждые допустим 20 мс
А при нужном ID бафа просто менять значение скорости персонажа. Все довольно примитивно
Выйти на массив бафов нам поможет счетчик кол-ва бафов персонажа, который должен быть где-то в памяти игры
*Стандартные процедуры в СЕ. 1-2-3-4 бафа, сканируем, потом находим указатель на этот счетчик*
И в итоге оказывается что этот счетчик лежит прямо в структуре персонажа, хотя мб и логично
В некоторых играх может быть и иначе
Выше над счетчиком и лежит наш список бафов, смещение между бафами ровно в 0x12
Узнаем наш ID ускорения и запоминаем
Остается теперь написать программу которая поможет нам делать все манипуляции с памятью
Запускаем, проверяем
-
1
-
2
9 Комментариев
Рекомендуемые комментарии
Пожалуйста, войдите, чтобы комментировать
Вы сможете оставить комментарий после входа в
Войти