Сейчас на форуме: localhost1, vsv1, asfa, tyns777 (+5 невидимых) |
eXeL@B —› Вопросы новичков —› Как автоматизировать процесс. |
Посл.ответ | Сообщение |
|
Создано: 05 мая 2020 21:30 · Личное сообщение · #1 В игре есть рубка деревьев. Дерево рубится 5 секунд. 1.Если во время рубки первого дерева нажать в последние 10 миллисекунды(напр 4990) на второе дерево, то срубится последнее, как можно автоматизировать это действие? WPE Pro не помогает из-за скачущего пинга. Пробовал заменять ID первого дерева на ID второго в Cheat Engine в итоге персонаж сразу бежит рубить второе. 2. Как подменить ID или выполнить пакет рубки второго дерева именно в нужный момент? |
|
Создано: 06 мая 2020 03:04 · Личное сообщение · #2 |
|
Создано: 07 мая 2020 00:05 · Личное сообщение · #3 |
|
Создано: 07 мая 2020 00:35 · Личное сообщение · #4 Simcher пишет: Дерево рубится 5 секунд P.S. Инфы мало чтобы внятно ванговать, да и упоминания "сабжа" нет | Сообщение посчитали полезным: ELF_7719116 |
|
Создано: 07 мая 2020 00:50 · Поправил: Illuzion · Личное сообщение · #5 Simcher пишет: Пробовал менять все Recv пакеты - не помогло. А send только один пакет - на начало действия, т.е замена в нём приводит к тому, что персонаж бежит к дереву чей ID указан. Это дота?) Там вроде деревья есть. С первого взгяда выглядит так, что пакет отправляется только тогда, когда ты у себя на компьютере "дорубил" дерево. Т.е. начало и сам процесс это делается локально, а итог - отправляется пакет. Что вряд ли, т.к. остальные игроки должны видеть твоё действие. Но ты говоришь что только один пакет - начало действия. Как же он тогда узнаёт, что ты поменял дерево в конце? Если пакет дейтвительно один, то возникает вопрос: а может это только в клиенте второе дерево рубится, а на сервере первое? Ресурс же ты в любом случае получаешь, т.к. дерево срублено, но просто клиент запомнил какого дерева нет. Может есть Wireshark логи, например? |
|
Создано: 07 мая 2020 06:27 · Личное сообщение · #6 |
|
Создано: 07 мая 2020 22:51 · Личное сообщение · #7 |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 08 мая 2020 09:49 · Личное сообщение · #8 Simcher пишет: результат не визуальный. Полагаю, игровой движок выводит text message, типа "вы срубили %d количество деревьев, поздравляем вы - браконьер года". Опишите более подробно игровой процесс рубки дерева - это похоже, как рубят деревья рабочие в Warcraft? Смысл - срубить два дерева сразу? Почему именно 10 мс? Это опытным путем было получено?? Типа игра за 10мс до момента, когда дерево свалится уже знает об этом и разрешает рубить другое автоматом?! Счётчик срубленных деревьев в игре существует? Полагаю, здесь не обойтись без мин рабочего набора - попробуйте выложить основные exe и dll. Для начала можно просто поискать в engine игры текстовые строки "tree", "chop", "item" и text message, указанный выше. Строки - это самый быстрый путь. Может в отдельных ресурсах игры они быть, потом через парсер погружаться. Сайт простой, игрушка по скринам довольно примитивная - ваша задача должна несложно решаться. |
|
Создано: 08 мая 2020 15:08 · Поправил: Illuzion · Личное сообщение · #9 ELF_7719116 пишет: Полагаю, игровой движок выводит text message, типа "вы срубили %d количество деревьев, поздравляем вы - браконьер года". Опишите более подробно игровой процесс рубки дерева - это похоже, как рубят деревья рабочие в Warcraft? Очень похоже на Lineage. Протокол вроде не шифруется, во всяком случае текстовые сообщения все в открытом виде отправляются. Ну и если действительно из-за нажатия кнопки в клиенте рубится другое дерево, тогда должен быть пакет, который что-то меняет. Собственно, пакет для рубки так выглядит: Code:
Структура примерно такая: Code:
[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 |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 08 мая 2020 18:49 · Личное сообщение · #10 Illuzion пишет: Дерево - внешний вид Illuzion пишет: С кодировкой какая-то ерунда, всё в вопросах main.exe не в Delphi 6 написано часом??! Если немножко переформулировать: в клиенте всё готово для рубки деревьев, необходимо попасть в узкий промежуток между начало рубки №1 + 5,333(3) ... начало рубки дерева №1 + 10 мс т.е. меньше чем за 5 мс успеть отправить пакет на сервер о начале рубки №2. Узнаем, что дерево (любое) свалилось только из полученного пакета, который должен через 10 мс придти после начала рубки №1. Так? Что будет если отправить два пакета с TREE_ID == дерево №1? |
|
Создано: 09 мая 2020 15:31 · Личное сообщение · #11 |
|
Создано: 09 мая 2020 15:43 · Поправил: Illuzion · Личное сообщение · #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 в комплетке. Не причёсанная и не ухоженная. e8f3_09.05.2020_EXELAB.rU.tgz - dllmain.cpp | Сообщение посчитали полезным: Simcher |
|
Создано: 09 мая 2020 16:17 · Личное сообщение · #13 |
|
Создано: 09 мая 2020 16:43 · Личное сообщение · #14 Simcher пишет: Есть идея в настройках роутера подкрутить интернет, чтобы пинг всегда был стабильно высоким и проще было с таймером. Дак время рубки на сервере считается. Не важно какой у тебя пинг, как только сервер получил пакет рубки, все - процесс пошёл. Он рассчитал расстояние до дерева, посчитал сколько тебе идти надо, отправил тебе пакет рубки и сказал когда дерево срублено. |
|
Создано: 13 мая 2020 20:34 · Личное сообщение · #15 |
eXeL@B —› Вопросы новичков —› Как автоматизировать процесс. |