Русский / Russian English / Английский

Сейчас на форуме: stimix, spinz (+4 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Вопросы новичков —› Как автоматизировать процесс.
Посл.ответ Сообщение

Ранг: 7.2 (гость)
Статус: Участник

Создано: 5 мая 2020 21:30 New!
Цитата · Личное сообщение · #1

В игре есть рубка деревьев.
Дерево рубится 5 секунд.
1.Если во время рубки первого дерева нажать в последние 10 миллисекунды(напр 4990) на второе дерево, то срубится последнее, как можно автоматизировать это действие?
WPE Pro не помогает из-за скачущего пинга. Пробовал заменять ID первого дерева на ID второго в Cheat Engine в итоге персонаж сразу бежит рубить второе.
2. Как подменить ID или выполнить пакет рубки второго дерева именно в нужный момент?

Ранг: 40.1 (посетитель)
Статус: Участник

Создано: 6 мая 2020 03:04 New!
Цитата · Личное сообщение · #2

словить пакет что дерево срублено и менять ид нового дерева в пакете рубки дерева.

Ранг: 7.2 (гость)
Статус: Участник

Создано: 7 мая 2020 00:05 New!
Цитата · Личное сообщение · #3

Пробовал менять все Recv пакеты - не помогло.
А send только один пакет - на начало действия, т.е замена в нём приводит к тому, что персонаж бежит к дереву чей ID указан.

Ранг: 168.8 (ветеран)
Статус: Участник

Создано: 7 мая 2020 00:35 New!
Цитата · Личное сообщение · #4

Simcher пишет:
Дерево рубится 5 секунд



P.S.
Инфы мало чтобы внятно ванговать, да и упоминания "сабжа" нет

| Сообщение посчитали полезным: ELF_7719116


Ранг: 6.8 (гость)
Статус: Участник

Создано: 7 мая 2020 00:50 · Поправил: Illuzion New!
Цитата · Личное сообщение · #5

Simcher пишет:
Пробовал менять все Recv пакеты - не помогло.
А send только один пакет - на начало действия, т.е замена в нём приводит к тому, что персонаж бежит к дереву чей ID указан.


Это дота?) Там вроде деревья есть.
С первого взгяда выглядит так, что пакет отправляется только тогда, когда ты у себя на компьютере "дорубил" дерево. Т.е. начало и сам процесс это делается локально, а итог - отправляется пакет. Что вряд ли, т.к. остальные игроки должны видеть твоё действие.
Но ты говоришь что только один пакет - начало действия. Как же он тогда узнаёт, что ты поменял дерево в конце? Если пакет дейтвительно один, то возникает вопрос: а может это только в клиенте второе дерево рубится, а на сервере первое? Ресурс же ты в любом случае получаешь, т.к. дерево срублено, но просто клиент запомнил какого дерева нет. Может есть Wireshark логи, например?

Ранг: 40.1 (посетитель)
Статус: Участник

Создано: 7 мая 2020 06:27 New!
Цитата · Личное сообщение · #6

Simcher пишет:
Пробовал менять все Recv пакеты - не помогло.

зачем их менять то - нужно найти пакет который либо клиент либо сервер высылает когда дерево срублено - и если этот пакет пришёл то меняй таргет в своём пакете который рубит дерево.
кстати какая игра ?

Ранг: 7.2 (гость)
Статус: Участник

Создано: 7 мая 2020 22:51 New!
Цитата · Личное сообщение · #7

arena.ru игра, результат не визуальный.
Дерево реально исчезает и у других игроков, так можно рубить с другой локации, не находясь там.
Я подозреваю, что по истечению 5 секунд открывается доступ к получению итема с дерева и я могу взять его из последнего, которое рубил.

Ранг: 415.8 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 8 мая 2020 09:49 New!
Цитата · Личное сообщение · #8

Simcher пишет:
результат не визуальный.

Полагаю, игровой движок выводит text message, типа "вы срубили %d количество деревьев, поздравляем вы - браконьер года". Опишите более подробно игровой процесс рубки дерева - это похоже, как рубят деревья рабочие в Warcraft?
Смысл - срубить два дерева сразу?
Почему именно 10 мс? Это опытным путем было получено?? Типа игра за 10мс до момента, когда дерево свалится уже знает об этом и разрешает рубить другое автоматом?! Счётчик срубленных деревьев в игре существует?
Полагаю, здесь не обойтись без мин рабочего набора - попробуйте выложить основные exe и dll. Для начала можно просто поискать в engine игры текстовые строки "tree", "chop", "item" и text message, указанный выше. Строки - это самый быстрый путь. Может в отдельных ресурсах игры они быть, потом через парсер погружаться. Сайт простой, игрушка по скринам довольно примитивная - ваша задача должна несложно решаться.

Ранг: 6.8 (гость)
Статус: Участник

Создано: 8 мая 2020 15:08 · Поправил: Illuzion New!
Цитата · Личное сообщение · #9

ELF_7719116 пишет:
Полагаю, игровой движок выводит text message, типа "вы срубили %d количество деревьев, поздравляем вы - браконьер года". Опишите более подробно игровой процесс рубки дерева - это похоже, как рубят деревья рабочие в Warcraft?


Очень похоже на Lineage.
Протокол вроде не шифруется, во всяком случае текстовые сообщения все в открытом виде отправляются. Ну и если действительно из-за нажатия кнопки в клиенте рубится другое дерево, тогда должен быть пакет, который что-то меняет.

Дерево - внешний вид

Собственно, пакет для рубки так выглядит:

Code:
  1. 0000   88 d7 f6 5d c1 0c a8 5e 45 10 f3 a6 08 00 45 00   ...]...^E.....E.
  2. 0010   00 33 04 3d 40 00 80 06 7d fb c0 a8 01 c8 b9 4c   .3.=@...}......L
  3. 0020   fc cf ed 85 9c 41 2f f7 b6 90 86 87 48 14 50 18   .....A/.....H.P.
  4. 0030   02 02 fe 12 00 00 3a 29 00 00 04 00 d4 2a d5 e0   ......:).....*..
  5. 0040   10
  6.  


Структура примерно такая:

Code:
  1. MagicBytes DWORD 0x3A, 0x29, 0x00, 0x00
  2. PACKET_LENGTH_AFTER_ACTION WORD 0x04, 0x00
  3. ACTION BYTE tree_cut // Для дерева тут 0xD4
  4. TREE_ID DWORD ... //id дерева


Но срубить не могу, надо квест пройти на топор С кодировкой какая-то ерунда, всё в вопросах

[UPDATED]

Попробовали с ТС срубить дерево. Все как в варкрафте/доте. Только тут в руки надо сначала топор из инвентаря взять. Алгоритм такой:
1. Берём топор.
2. Нажимаем дерево №1. Отправляется пакет на рубку дерева (см. выше структуру).
3. Ждём 5,3333(3) удара персонажа по дереву.
4. Нажимаем дерево №2. Отправляется пакет на рубку дерева № 2.
5. И в этот момент дерево №2 моментально падает, а дерево №1, которое мы долго рубили, продолжает стоять. Т.е. гипотетически мы можем всегда стоять на месте и рубить дерево №1, а будут падать деревья вокруг, особенно актуально, если стоят монстры рядом с далекими деревьями.

Проблема:

Проблема находится между п. 3 и 4, а именно, нужно подождать 5,3333(3) удара и отправить второй пакет рубки. Т.е. на клиентской стороне мы действительно можем достаточно точно тайминг словить, но потом, когда отправляешь пакет и он доходит до сервера - получается лаг во времени примерно около 50-200 мс. И, соответвенно, дерево может не срубиться, может так оказаться что мы срубили дерево №1 и т.п.

ТС хочет:
Всегда точно в тайминг сервера отправлять пакет рубки, чтобы падало в 100% случаев дерево №2, а он стоял на месте и собирал лут.

| Сообщение посчитали полезным: Simcher


Ранг: 415.8 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 8 мая 2020 18:49 New!
Цитата · Личное сообщение · #10

Illuzion пишет:
Дерево - внешний вид



Illuzion пишет:
С кодировкой какая-то ерунда, всё в вопросах

main.exe не в Delphi 6 написано часом??!

Если немножко переформулировать:
в клиенте всё готово для рубки деревьев, необходимо попасть в узкий промежуток между
начало рубки №1 + 5,333(3)
...
начало рубки дерева №1 + 10 мс
т.е. меньше чем за 5 мс успеть отправить пакет на сервер о начале рубки №2.
Узнаем, что дерево (любое) свалилось только из полученного пакета, который должен через 10 мс придти после начала рубки №1.
Так?
Что будет если отправить два пакета с TREE_ID == дерево №1?

Ранг: 7.2 (гость)
Статус: Участник

Создано: 9 мая 2020 15:31 New!
Цитата · Личное сообщение · #11

ELF, если отправить два пакета:
5.333(3) это секунд именно.
первый пакет заставит персонажа выполнять действие, а после отправки второго это действие начнётся заново.

Ранг: 6.8 (гость)
Статус: Участник

Создано: 9 мая 2020 15:43 · Поправил: Illuzion New!
Цитата · Личное сообщение · #12

ELF_7719116 пишет:
main.exe не в Delphi 6 написано часом??!


Нет, чистый VS. Там сообщения с сервера приходят в кириллице, а вывод на экран в Unicode происходит. Соответственно и все файлы игры в кириллице, потому и кодировка лагает.

ELF_7719116 пишет:
Что будет если отправить два пакета с TREE_ID == дерево №1?


а) если стоим рядом с деревом, то в ответ придёт 2 пакета: (1) остановить рубку дерева TREE_ID и (2) начать рубку дерева TREE_ID. Соответственно рубка начинается заного.
б) если стоим далеко, то в ответ придёт 2 пакета, сообщающие куда необходимо двигаться персонажу. Соответственно, когда по расчётам сервера персонаж будет у дерева, он [сервер] отправит 2 пакета: (1) готовность к действию и (2) начать рубку дерева.

Стандартный процесс рубки выглядит так:

1. Отправляем пакет на рубку дерева TREE_ID_1.
2. Если стоим далеко, сервер присылает пакет MOVE_TO - начать движение к дереву (персонаж начинает движение)
3. Если мы уже подошли к дереву сервер отправляет пакет о готовности к рубке дерева (визуально персонаж вздрагивает).
4. Сервер отправляет пакет о начале рубки дерева.
5. Сервер отправляет пакет о том, что дерево срублено.
6. Если получены какие-либо ресурсы, то сервер отправляет пакет с полученными ресурсами, где указано с какого дерева были получены ресурсы.

Идея такая: если между пунктами 4 и 5 отправить пакет на рубку другого дерева TREE_ID_2, то первое дерево (TREE_ID_1), которое рубили, останется стоять, а второе дерево (TREE_ID_2) будет срублено.
Проблема: нужно попасть в тайминг сервера и отправить пакет TREE_ID_2 за несколько миллисекунд до завершения рубки TREE_ID_1.

Что у меня получилось и как пробовал:

Я поставил таймер после получения пакета о начале рубки дерева (после п.4). Интервал таймера пробовал в диапазоне 0x12DD - 0x12E4 (разница 8 мс.). По callback отправлял пакет на рубку нового дерева TREE_ID_2.
Работает нестабильно. В среднем срабатывает в 1 из 5 случаев (понятно, что руками такого не повторить). Бывает, что 4-5 подряд, а бывает редко.
Также в п. 5 сервер всегда присылает TREE_ID_1, даже если мы успешно срубили TREE_ID_2. А вот в п.6 сервер уже присылает именно то дерево с которого получили ресурс.

Вообще, выглядит так, что там можно попробовать дюпать предметы, поднимая/убирая в инвентарь за счёт лага сервера.

P.S. если вдруг кому нужно, исходник dll в комплетке. Не причёсанная и не ухоженная.

{ Атач доступен только для участников форума } - dllmain.cpp

| Сообщение посчитали полезным: Simcher


Ранг: 7.2 (гость)
Статус: Участник

Создано: 9 мая 2020 16:17 New!
Цитата · Личное сообщение · #13

Есть идея в настройках роутера подкрутить интернет, чтобы пинг всегда был стабильно высоким и проще было с таймером.

Ранг: 6.8 (гость)
Статус: Участник

Создано: 9 мая 2020 16:43 New!
Цитата · Личное сообщение · #14

Simcher пишет:
Есть идея в настройках роутера подкрутить интернет, чтобы пинг всегда был стабильно высоким и проще было с таймером.


Дак время рубки на сервере считается. Не важно какой у тебя пинг, как только сервер получил пакет рубки, все - процесс пошёл. Он рассчитал расстояние до дерева, посчитал сколько тебе идти надо, отправил тебе пакет рубки и сказал когда дерево срублено.

Ранг: 7.2 (гость)
Статус: Участник

Создано: 13 мая 2020 20:34 New!
Цитата · Личное сообщение · #15

Спасибо большое участнику Illuzion, с помощью dll удалось свести 1 к 5 из-за лага сервера, однако это не плохой результат.
 eXeL@B —› Вопросы новичков —› Как автоматизировать процесс.

Видеокурс ВЗЛОМ