Jump to content
Korean Random

SoprachevAK

User
  • Posts

    207
  • Joined

  • Last visited

  • Days Won

    9

Everything posted by SoprachevAK

  1. Таких выстрелов по всей бд 4%, из них 2.3% с дистанции < 50м, и 0.6% с дистанции < 10м, выстрелы полетевшие вне круга исключены из аналитических графиков. Причин их появления может быть 5 Не совсем корректная формула расчёта точки попадания, сейчас круг параллелен плоскости монитора в снайперском прицеле, а надо немного не так Пулемётные танки, когда на одно нажатие ЛКМ вылетает более 1 снаряда, причём первый летит правильно, а остальные хрен знает как, и прицел можно отвести, и сидение может поменяться Рассинхрон между сервером и клиентом, сейчас я записываю трассер снаряда и току в которую человек целился в момент нажатия ЛКМ, если мод записал снаряд непонятно куда, значит человек на клиенте увидел, что он летит непонятно куда, и как говорил Панков "Это нормально" (когда играл часто замечал, что такое случается при стрельбе в упор, круг сведения не совпадает с местом куда смотрит пушка, и не совпадает с тем, куда попадает выстрел) Выстрелы со старой версии мода на серверном прицеле (был баг с его записью, из за этого распределение арты отличается от верного, тк большинство боёв на арте сделано на старой версии) Неверная отрисовка трассера, в новой версии буду считать по точке попадания Забыл добавить, обновил. https://github.com/SoprachevAK/wot-stat
  2. Было бы круто если бы вы покидали сюда функций для хукания (как ссылку на исходный код) которые могли бы быть интересны, на основе их параметров соберу таблицы Я многого могу просто не знать, например как в текущей версии я не знал, что можно через код включить получение серверного прицела, оставив при этом отрисовку клиентского у игрока, и из за этого писал костыли для работы с любым прицелом
  3. Оглавление (актуально для старой версии < 1.0) Прошлая тема с техническими вопросами Не доказательство подкрутки Генератор случайных чисел как в танках
  4. Мод по сбору внутриигровой статистики Версия 1.0 Сервис который собирает события боя и сохраняет их в базу данных. Любой бой будет начинаться с события загрузки боя, заканчиваться его результатом. Сайт со всей информацией: wotstat.info, там же актуальная версия мода. Просмотр инфографики. Что собирается Событие входа в бой. Время в очереди, в загрузке Выстрел и его результат. Откуда, куда, как полетел трассер, какой результат у выстрела (это урон, куда и в кого попал, поджог ли кого то) Результаты боя. Подробная информация о результатах боя с результатами каждого игрока, его командой Интересная инфографика Распределение выстрелов для серверного и клиентского прицела. 67% снарядов попадает в первую половину сведения. Анализ времени боя по картам, в среднем бои на 8-10 уровнях длятся 7 минут В среднем в ожидании боя (очередь + загрузка + таймер) игроки тратят 36 секунд, что целых 9% от времени игры Анализ урона. Распределение, как будто бы, нормальное, в отличии от выстрелов урон по шотным танкам проходит так же нормально, без подкруток в пользу засейвить шотного. В любом случае на больших дистанциях танки с 1хп остаются так же часто как и с 2хп, так и с 3хп. При победах, топ1 по фрагам делает в среднем 3.5 фрага Турбобои (я определил как бой быстрее 5 минут с разницей во фрагах более 10) случаются, бывает что 4 боя из 10, но в среднем 1 бой из 10 Можно посмотреть лично для себя разбивку по картам, сколько времени вы на них выживаете, сколько урона/фрагов/света делаете Анализ "стримснайперов" даже обычным игрокам довольно часто в бои попадаются одни и те-же люди, но больше полезно конечно стримерам. Исходные данные База данных со всеми актуальными исходными данными открыта на чтение, так что кому интересно, можно прямо на SQL писать любые запросы. А интересных графиков из этих данных можно ещё много построить Подробнее про подключение на сайте, а поиграться можно тут: db.wotstat.info/play?user=public Немного скриншотов графиков Микросервисная архитектура полностью в опенсорс. Список событий github.com/WOT-STAT/Description. (возможно частично устарел) Исходник мода github.com/WOT-STAT/WOTMOD. Чтоб не потерялось Пересечение трассера и разброса url url url Связь выстрела и попадания url Механика отрисовки сведения url
  5. Думаю так и сделаю, когда допишу всё и появится время В этом преимущество проекта, на сайте ты можешь посмотреть график по любой выборке, в том числе и исключая низкие уровни и САУ, как например настроено здесь https://wotstat.soprachev.com/analytics/61065e454c2ef064639d3004 Ну а лично мне тут интересно управление высокими нагрузками, для этого конечно надо бд заполнить побольше
  6. Делать привязку к аккаунту я точно не буду, потому что это крайне некомфортно для пользователей, а вот ratelimit думаю есть смысл, хотя бы на бои, потому что выстрелы могут быть с пулемётного танка по 400 за бой Ну и если делать ограничение по ip, нет никакого смысла делать привязку к аккаунту И всё таки, даже детская защита, способная отбить 95% хакеров (детей), лучше чем её отсутствие. Если оставлять только защиту по ip, то будет много желающих 400 раз за 8 минут поспамить. И получается, что делать защиту от детей надо, а делать защиту от хакеров бессмысленно, её всё равно найдут способ обойти, а я не банковский сервис делаю, и деньги не потеряю, так на кой тогда черт париться и усложнять пользователям жизнь
  7. Самое смешное в этой ситуации, что все расчёты вынесены на сервер. Мод всего лишь хукает и отправляет исходные данные Я подумаю как можно открыть проект. Сейчас он состоит из 4х частей 1. Мод который просто получает и отправляет данные 2. C# веб сервер, задача которого получить данные от мода и положить их в бд, попутно досчитав недостающие значения. Его код писал не я, и лично мне крайне не нравится что там получилось, как по мне оверархитектура, разбитая ещё на 3 подпроекта, да ещё и с отсутствием стилистики, но человек хотел попробовать и грех отказываться от бесплатной рабочий силы 3. VueJS сайт 4. NodeJS кеш веб сервер, достаёт данные из бд, все графики считаются напрямую на бд, и этот веб сервер просто формирует SQL запрос и сохраняет его в кеш бд, а ещё занимается всякой дополнительной работой необходимой для обеспечения работы сайта *5. Продет на Unity для визуализации записанной модом инфы, просто потому что самый простой 3д рендер. Вот например выстрел арты по записи трассера. И по хорошему для автономного существования и развития проекта надо публиковать всё, что весьма долго
  8. Ну насколько я понял, он как раз показал, что сервер НЕ оперирует распределение Релея, в отличие от новости на портале. Тк распределение Релея = 0 в центре круга, а в танках оно нулю не равно, что видно из его же графика ниже. Что неправильно, но "Зачем ломать то, что и так приносит неплохой доход" Судя по моим данным, с 2015 года ничего так и не поменялось
  9. Считается в 15 элементарных операций и 3 корня, и считается на сервере. Клиент отправляет только исходные данные static float intersectTime(Vector3 velosity, Vector3 start, Vector3 marker, float gravity) { Vector3 norm = marker - start; double C1 = norm.magnitude * norm.magnitude; double C2 = Vector3.Dot(norm, velosity); double C3 = norm.y * -gravity / 2.0; double time = (-C2 + System.Math.Sqrt(C2 * C2 + 4 * C1 * C3)) / (2.0 * C3); return (float)time; } Ну а дальше по времени находилась точка на траектории трассера, что вообще легко Если так, то согласен, трассёр использовать плохо. Думаю можно считать, что для игрока точка попадания снаряда пришедшая с сервера, это и есть фактический "разброс" выстрела. Что если строить обратную траекторию, как параболу через опорную точку и место попадания, зная скорость снаряда и гравитацию это можно сделать. Так можно избавиться от векторов присланных сервером. Ближе к вечеру попробую сравнить разные способы. Из того что я тестил, и трассер даёт приемлемый результат (визуально)
  10. Так я переживаю не за привязанность данных к человеку, а за среднесерверные показатели, которые можно испортить спамя данными со своего аккаунта. И система с активацией через сайт, как раз и , которые будут хотеть просто играть. И вот людей которые хотят просто и легко играть, в сотни раз больше, чем людей которые хотят бесплатно писать чужой мод. Я привык судить по себе, лично я его взломать не смогу (быстрее чем за несколько часов, а это уже нерационально долго), а имея исходный код или же без шифрования на клиенте, смог бы напакостить за 5 минут, и сделал бы, записав на сервер серию боёв с посланием о плохой защите. Вот мод, вот сайт который в реалтайм отображает состояние бд, более чем уверен, что не сможешь взломать быстрее, чем пропадёт энтузиазм, именно для 95% таких взломщиков и существует защита mod.wotStat_0.0.7.wotmod
  11. Ну я же там в скобочках написал, что если так сделать, найдут модель данных, которая в этот модуль передаётся. Ну или придётся делать функцию Send на 100500 параметров и собирать модель уже внутри, что мне конечно не очень нравится Но если есть жалеющие улучшать и допиливать, тогда подумаю как там можно правильно декомпозировать
  12. Ну слушай, сделать защиту от данных, которые пользователи должны отправлять сами -- невозможно никак. Можно только усложнить жизнь злоумышленникам, это как кодовый замок на сейфе, взломать можно, но если не выкладывать его код в открытый доступ на гитхаб, это будет сильно сложнее. В качестве такого усложнения у меня шифрование отправляемых данных, а значит просто перехватив их, злоумышленник не получит желаемого результата и ему придётся разбираться в декомпиляция мода
  13. Проверю, попробую, добавлю Тут есть проблема: снаряд мог попасть по траектории сильно дальше или сильно ближе EndPos, а мог и в целом улететь очень далеко (например при выстреле по танку на холме, промазать и улететь в скайбокс, тут ещё отдельный вопрос о попадание по скайбоксу) Ты уверен, что плоскость разброса (зелёная полоска на картинке) ортогональна вектору скорости снаряда (производной траектории)? Если да, deviation можно найти аналитически двумя способами 1. найти nearestPoint, как точку траектории EndPos, лежащую на плоскости заданной hitPoint и нормалью = производной от траектории 2. найти пересечение траектории hitPoint с плоскостью через EndPos Я сейчас использую второй способ, но беру траекторию трассера, однако с плоскостью разброса вопрос остаётся открытым
  14. Реквизиты сервера легко можно считать монитором http трафика, ровно как содержание запроса, однако имея эти данные, можно только отправить их повторно, что проигнорируется сервером и никак на статистику не повлияет. Мод от примитивной декомпиляии защищён обфускацией и протекцией Следующий шаг "хакера" найти исходник мода и посмотреть что он там вообще отправляет, и найдя на гитхабе мод, где он увидит и полный запрос и алгоритм шифрования (если вынести алгоритм шифрования в отдельный модуль, то имея модель запроса и результат её шифрования, можно вычислить алгоритм) Думаю такие шаги защиты отбросят 90% взломщиков. Если человек специалист и очень будет хотеть взломать, он взломает при любых защитах, но есть люди которые хотят взломать по приколу, напакостить, сломать статистику, вот от них, я надеюсь, мод защищён
  15. Есть повторяемая проблема обфускации кода. Шаги: Иерархия папок: -modTest --res\scripts\client\gui\mods ---mod_test.py --meta.xml mod_test.py: # -*- coding: utf-8 -*- print('Hello world') Через PjOrion делаю Bytecode->Obfuscate->Compile py-file и выбираю mod_test.py >>> Obfuscating... Please wait the completion message! >>> Compile obfuscated file 'mod_test.py' [0.03 seconds] Собираю в .wotmod файл, кидаю в mods чистого клиент танков. Запускаю игру, в лог выводится /------------------------------------------------------------------------------------------\ WorldOfTanks(x86) 0.0.0.0 (compiled at 07:18:44 Jul 8 2021) starting on Sat Jul 31 02:15:09 2021 2021-07-31 02:15:09.864: INFO: [Config] Command line: C:/Games/World_of_Tanks_RU/win32/WorldOfTanks.exe "" 2021-07-31 02:15:11.778: INFO: [SOUND] Start loading Main task 2021-07-31 02:15:11.778: INFO: [SOUND] Start loading Mod task 2021-07-31 02:15:11.779: INFO: [Scaleform] Create Scaleform Manager... 2021-07-31 02:15:11.854: INFO: Scaleform initialized 2021-07-31 02:15:11.867: INFO: [Scaleform] Scaleform Manager created. 2021-07-31 02:15:11.867: INFO: Unbound initialized 2021-07-31 02:15:12.469: INFO: WOT-Transmission initialization completed! 2021-07-31 02:15:12.471: INFO: You are in the __main__ module, use a WOT-Transmission menu command to work with the client 2021-07-31 02:15:12.472: INFO: ===================================================================================== 2021-07-31 02:15:12.568: TRACE: monkeyPatchOpen: BWUtil.monkeyPatchOpen: Patching open() True 2021-07-31 02:15:12.570: INFO: [Config] Default encoding set to utf-8 2021-07-31 02:15:12.572: TRACE: revertPatchedOpen: BWUtil.revertPatchedOpen: Reverting open() 2021-07-31 02:15:12.610: INFO: [PY_DEBUG] Release Client - Content Type: sd 2021-07-31 02:15:12.610: INFO: [PY_DEBUG] Checking C:/Games/World_of_Tanks_RU/res_mods/1.13.0.1/: mods not found 2021-07-31 02:15:12.610: INFO: [PY_DEBUG] Checking C:/Games/World_of_Tanks_RU/mods/1.13.0.1/: mods found 2021-07-31 02:15:12.611: INFO: [PY_DEBUG] Mod package 'c:/games/world_of_tanks_ru/mods/1.13.0.1/mod.testmod_0.0.1.wotmod' loaded 2021-07-31 02:15:14.530: INFO: [Scaleform] Create GUI Component: 'empty' 2021-07-31 02:15:14.530: INFO: [Scaleform] Change Owner on GUI Component: 'empty' -> 'loading_screen.gui' 2021-07-31 02:15:14.542: INFO: [Scaleform] Create GUI Component: 'FlashGUIComponent' 2021-07-31 02:15:14.542: INFO: [Scaleform] Change Owner on GUI Component: 'FlashGUIComponent' -> 'gui/flash/gameLoadingApp.swf' 2021-07-31 02:15:14.543: INFO: [gui.Scaleform.game_loading] Build: RELEASE 07:18:44 Jul 8 2021. Version: 2.8.0 2021-07-31 02:15:14.544: INFO: [gui.Scaleform.game_loading] App Startup 2021-07-31 02:15:14.616: DEBUG: [helpers.uniprof.regions] Region is entered: label=offline.game_loading, color=0xCE2606 2021-07-31 02:15:14.730: INFO: [gui.Scaleform.game_loading] Registering graphics settings 2021-07-31 02:15:14.747: INFO: [gui.Scaleform.game_loading] Preloading Resources 2021-07-31 02:15:23.843: WARNING: [web.web_client_api] Do not use "required" and "default" at the same time! 2021-07-31 02:15:23.844: WARNING: [web.web_client_api] Do not use "required" and "default" at the same time! 2021-07-31 02:15:23.845: WARNING: [web.web_client_api] Do not use "required" and "default" at the same time! 2021-07-31 02:15:23.846: WARNING: [web.web_client_api] Do not use "required" and "default" at the same time! 2021-07-31 02:15:24.022: INFO: [Scaleform] Create GUI Component: 'FlashGUIComponent' 2021-07-31 02:15:24.022: INFO: [Scaleform] Change Owner on GUI Component: 'FlashGUIComponent' -> 'gui/flash/waitingTransitionsApp.swf' 2021-07-31 02:15:24.745: INFO: Hello world После чего игра крашится без каких либо дополнительных ошибок. Тот же самый мод скомпиленный без обфускации игру не крашит, hello world выводит В чём может быть проблема?
  16. Если у кого то будет интерес к моду и желание чёнить допилить, могу пригласить в гитхаб. Публичным делать не буду из соображений защиты от мамкиных хацкеров, которые захотят заспамить сервер левыми пакетами
  17. Весьма интересная инфа, спасибо. Однако, сведение который отрисовывается в игре, и которое по факту на сервере весьма разные вещи. Моя задачам -- определить насколько выстрел отклонился от маркера относительно разброса на момент выстрела. Я вижу 2 пути: Запоминать состояние маркера на момент выстрела и в момент попадания искать пересечение плоскости маркера с лучом от опорной точки до попадания Запоминать состояние маркера на момент выстрела, хукать трасер, после чего искать пересечение параболы с плоскостью маркера. Так я делаю сейчас, не самый простой способ, зато даёт больше информации для дебага Где плоскость маркера это плоскость ортогональная направлению от маркера к опорной точки танка Ну и вопрос в том, насколько это корректно для всех типов танков.
  18. Ну тут вопрос в архитектуре и в его задумке. Если идея юзать C или C++ обусловленна просто хотелкой, то это конечно ошибка, никто не разрабатывает такие комплексные системы привязываясь к одному языку. Если вопрос в совместимости с оборудованием и производительности, то Юнити компилит C# в IL код, Burst проходится по нему и заменяет циклы на векторные вычисления на ассемблере, после чего il2cpp конвертирует IL code в C++ и компилирует этот C++ в бинарник. По производительности написать такой же код сразу на плюсах практически невозможно Из своих знаний, серверная архитектура таких игр выглядит так Есть мастер сервер который распределяет нагрузку и отвечает за связь с клиентом Есть игровой сервер который считает непосредственно саму игру Мастер сервер собирает арену и запускает для этой арены инстанс игрового сервера, который уже отвечает за просчёт одной конкретной арены. Конкретно у BigWorld инстансы делят не полные арены, а отдельные части внутри одной карты, балансирую эти части по нагрузке Есть ещё отдельный сервер для чата и экономики Из С# можно вызывать extern "C" функции, но твой мастер сервер можно просто общаться с инстансом для арены через любой протокол, хоть через iostream текст отправлять, в одну сторону действия игроков, в другую стороны просчитанное состояние мира. Если у тебя есть рабочий способ общения с клиентом, а как мне кажется именно это самое сложное, то почему бы не попробовать. Сетевую часть будет тяжело, тк писать нормальный предикшен с учётом физики весьма нетривиальная задача, но на неё можно положить на ранних версиях
  19. Клиент оставить (рендер, оптимизация, ui, возможность модов, пиар)
  20. @Dragon armor Неужели тема живёт и всё ещё разрабатывается из последних нескольких страниц понял, что проблема в сервере как в процессе обсчёта арены, по сему предлагаю заюзать в качестве такого сервера -- Unity3D, полноценный игровой движок, на котором можно считать и физику и рейкасты и любую другую игровую логику, имеет сервер билд (опция специально для серверов, компилируется в консольное приложение без графических модулей), есть ESC + Burst система, которая на обычном компе в 60фпс считает Havok'ом 30к физических тел. Если со стороны клиентской части нет проблем, могу предложить свою помощь с Unity, опыт у меня там большой. Хотя бы попробовать демку и если всё ок, можно будет в танковое ММО РПГ развить, с прокачкой и донатами)
  21. @MoD @StranikS_Scan, за материалы спасибо, однако я ооочень сомневаюсь, что ленивые программисты в 2012 году писали для артиллерии новую уникальную механику, причём весьма сложную с точки зрения математики. Я на выходных тестировал, и у меня появилось предположение, что берётся координата маркера, на ней строится плоскость перпендикулярная вектору от САУ до маркера, на этой плоскости строится круг разброса и в нём рандомится точка, через которую пойдёт траектория снаряда (пока что ровно так же как и у обычных танков), а уже потом, в арт прицеле, этот круг проецируется на рельеф продолжая траекторию трассера. Если так, то это даже не конус получается, это получается банан (не знаю как по науке называется конус с параболической осью) Если так, то на сервере вообще не надо считать ничего, там просто дискретно летит трассер по простой траектории пока не пересечётся с препятствием, причём арта ничем не отличается от других танков в этом случае в таком случае полностью игнорируются пулемётные танки, хотя они у меня и так не работают, потому что корректно считывать разброс для них я не смог И надо ещё проверить когда именно вызывается функция, и не считаются ли всякие тараны, пожары или расходники DamageFromShot'ом, потому что я тут недавно узнал, что дымы в спецрежимах являются трассером, который принадлежит игроку который их запустил Вообще да, решение простое и скорее всего действенное, о словаре я чёт не подумал)
  22. Тыкался тут тыкался и уже сам начал сомневаться, новая версия покажет, возможно реально 1 в 1 как у обычных танков, а не работало из-за другого бага Конечно это было бы интересно, однако я не нашел как связать нанесённый урон с выстрелом, что в данной концепции хотелось бы. Типа список выстрелов и рядом с каждым результат выстрела. def showTracer(self, attackerID, shotID, isRicochet, effectsIndex, refStartPoint, velocity, gravity, maxShotDist, *a, **k) def showDamageFromShot(self, attackerID, points, effectsIndex, damageFactor, *a, **k) showTracer я юзаю для записи выстрела, showDamageFromShot можно было бы использовать для подсчёта дамага, но к сожалению у неё нет shotID и я не нашел как связать по другому. Так что отложу на неопределённое время, если будет большой интерес к модику, обновлю и допишу
  23. А я да, сама актуальность) О подписях к кругам много кто говорил, но я постоянно ленюсь добавить их красиво, некрасиво добавлять нет смысла, тк понять какой круг за что отвечает можно потыкав галочки в настройках Квантиль считаю не теоретическую, а практическую по текущей выборке. Например выбрано 100 попаданий, сортирую их по расстоянию до центра относительно разброса на момент выстрела, и беру радиус от выстрела с индексом желаемой квантили. Для 60% квантили будет R = shots.sort()[count * 0.6], что означает: 60% выстрелов попали в радиус <= R при нормализации разброса на момент выстрела. Круги не помню как раньше, а сейчас по умолчанию включен 1 — базовый разброс на момент старта боя. Для группового выбора выстрелов отображается ещё круг выбранной квантили. Ну и советы с критикой всегда важны. Сейчас вот появилось время/желание и запилил аналитический раздел, можешь глянуть мб будет интересно. Взглянув на график распределения снарядов от класса техники возникает предположение, что я неправильно считаю арту https://wotstat.soprachev.com/analytics/60fa42ff8149f07093332402 Собственно внимание вопрос, как к человеку, куда лучше знакомому с игровыми механиками, как расположен конус разброса у САУ? Кажется что не так, как у обычных танков, и если да, то ещё от какого расстояния у них зависит фактический размер круга разброса? Сейчас я нахожу точку пересечения траектории трассера с плоскостью заданной нормалью от маркера до пушки в момент выстрела. Для арты это не работает.
  24. @StranikS_Scan а почему скорость трассера меньше ттх скорости снаряда? Ты в своём моде делишь её на 0.8, что видимо было посчитано эмпирически, тк в движке я никаких упоминаний об этих магических константах я не нашел ps. Если интересно вот что получилось, пока в альфа версии https://soprachev.com/wot-shoot/
  25. Ну если предположить, что ProjectileMover.add получает refVelocity достаточную для вычисления траектории, то да, остальное вроде бы гладко И судя по всему это то что надо
×
×
  • Create New...