Jump to content
Korean Random

SoprachevAK

User
  • Posts

    203
  • Joined

  • Last visited

  • Days Won

    8

Everything posted by SoprachevAK

  1. Вычисление подставушников Взял результаты из рандома на танках 10 уровня с сервера RU9, вставил их в графовую Neo4J со следующей схемой: Вершины (node): - :Player { name } – Игрок с ником name не обязательно пользователь WotStat - :Arena { [id], [reporter] } – Бой с id из базы WotStat, отправленный игроком с ником reporter. Одну и туже арену могли зарепортить несколько игроков, по этому id и reporter это массивы - :Squad { name } – Взвод с уникальным именем name, которое состоит из упорядоченных по алфавиту ников совзводных. Связи (relationship): - :Player -[:PLAY_ON { damage, mileage }]-> :Arena – Игрок играл на арете и нанёс damage урона, проехал mileage расстояния - :Squad -[:PLAY_ON]-> :Arena – Взвод играл на арене - :Player -[PLAY_IN]-> :Squad – Игрок играл во взоде Интересно было найти игроков, которые играли друг с другом чаще остальных, при этом в общих боях не состояли во взводе. И отдельно поискать взводы которые играли друг с другом чаще остальных Звучит многообещающе, но как то не получилось. Инструментарий взаимодействия с графовыми базами отвратительный. Куча неочевидных подводных камней. Запрос на игроков я устал ждать выполнения. Голубой – арены Фиолетовый – взводы Оранжевый – игроки На картинке два взвода которые играли вместе в 13 боях: Запрос кому интересно MATCH (sq1:Squad)-[:PLAY_ON]->(a:Arena)<-[:PLAY_ON]-(sq2:Squad), (p1:Player)-[:PLAY_IN]->(sq1), (p2:Player)-[:PLAY_IN]->(sq2) WHERE sq1 <> sq2 WITH sq1, sq2, COLLECT(DISTINCT a) AS sharedArenas, COLLECT(DISTINCT p1) AS players1, COLLECT(DISTINCT p2) AS players2 WHERE SIZE(sharedArenas) > 10 UNWIND players1 AS player1 CALL apoc.create.vNode(['Player'], {name: player1.name}) YIELD node as vp1 CALL apoc.create.vRelationship(vp1, 'PLAY_IN', {}, sq1) YIELD rel AS rel1 RETURN sq1, sq2, sharedArenas, vp1, rel1 Технически можно развить, оптимизировать, и отправлять уведомления в мод, игроку который зарепортил эти арены, чтоб загрузил реплей на вотреплейс, тк в нём потенциальные подставушники. Ещё можно смотреть на арены, где эти игроки играли не вместе. Но заниматься таким я пока не готов, слишком неприятный процесс который явно не принесёт денег. Если вдруг кому интересно повторить и покопаться: Ещё одна красивая картинка случайного куска базы DATA.csv
  2. Погоди, то есть просто из игры токен вытащить нельзя? Авторизация через сайт звучит так, как будто бы этим никто не будет пользоваться. Как будто бы должен быть способ как то авторизовать пользователя изнутри игры Если нет, это печально конечно
  3. Это действительно так, и это радует) Я мониторю сервер и пока что там аномальных пиков не было Возможно мне недостаточно квалификации вот в таких клиентских штуках, но как будто бы всё равно будет точка входа в функцию отправки данных на сервер, и в эту точку можно явно передать что угодно, и как будто бы делать любые защиты вокруг неё смысла нет Тут ещё влияет, что у меня никакой соревновательности нет, и заниматься вбросами нет смысла, кроме как поднасрать. А если защитить по пользователю, то поднасрать получится только себе и в среднесерверную. Таких можно будет удалять вручную
  4. Ну тут технически то его никак не защитить, в конечном то итоге всё равно с клиента данные идут Там вообще был предусмотрен механизм обфускации трафика, чтоб пришлось хотя бы в моде разбираться, но судя по тому, что на сервере я деобфускатор не писал, обфускатор я включить забыл По хорошему надо вытащить из клиента токен, чтоб авторизовывать пользователя на сервере, тогда подменить можно будет только свои данные, а это во первых не поднасрёт другим, во вторых легко удалить будет. Я посмотрел на этот token2, понял что он похож на jwt, но им не является, и пока отложил эту затею Но вообще в ближайшее время придётся разбираться для платных тепловых карт на миникарте
  5. Мод 1.3.0.0 Канареечное обновление – следующие версии смогут устанавливаться не сразу всем игрокам, а раскатываться постепенно, например по 10% игроков в день, критические баги затронут не всю аудиторию. В случае важных обнов, можно будет указать установку сразу всем. На сайте и гитхабе всегда можно будет скачать последнюю версию ModListApi – теперь открыть сайт с персональной инфографикой можно из интерфейса modList'a, если такой установлен. Уведомление в ангаре стало немного более навязчивым (вылезает при входе в игру, а не просто там находится) События Ко всем событиям и результатам добавлен tankRole который описывает роль танка (это как тип, но подтип, например чтоб отличать САУ от огнемёта) Ко всем событиям добавлен сбор текущего счёта боя (сумма фрагов команды на момент события), суммарное ХП команд и суммарное максимальное ХП команд Для результата боя, это событие собирается в момент начала боя Судя по логам ошибок, ХП могут собираться не всегда правильно, но я думаю пойдёт.
  6. Ирония в том, что прямо в момент сообщения я нашел в коде именно эту строчку) Но всё равно спасибо большое! Пойду пробовать
  7. Не не, не думал, очевидно что не пришлёт Я имел ввиду событие Dead когда противник умирает за кругом отрисовки. Его тоже нет в фидбеке А про инстанс Vehicle, я думал, что он кеширует в себе инфу на время боя. Как будто бы нет смысла каждый засвет аллоцировать память с нуля, так ещё и потом каждая подсистема кеширует одну и туже информацию локально
  8. Ну я вот сейчас тестировал, инстанс Vehicle меняется каждый раз когда танк пропадает и появляется заново. Ну типа каждый засвет инстанс новый, id не меняется и можно через BigWorld.entity() получать, но это другое Это выглядело очень многообещающе, но у меня всё равно ничего не получилось, хотя я уже неприлично много времени на эту задачу потратил Фидбеки приходят только в радиусе отрисовки, даже Dead Ещё я надеялся, что мне поможет IBattleFieldListener https://github.com/StranikS-Scan/WorldOfTanks-Decompiled/blob/a073ff6fab4bdb9a915560cb3c774e645ea9ed64/source/res/scripts/client/gui/battle_control/controllers/battle_field_ctrl.py#L18, но я не нашел как его регистрировать, чтоб в него приходили вызовы. По сути сейчас я беру максимальные ХП из player().arena.vehicles['maxHealth'], и на Vehicle.onEnterWorld и Vehicle.onHealthChanged обновляю текущие хп каждого танка по ID Но оно всё работает только в радиусе отрисовки. Остаётся только обнулять ХП умерших за отрисовкой танков. Ну и мечтаю, чтоб это хоть как то работало во всяких режимах с хилом и воскрешениями
  9. Реально 2^32 Ну значит начиная с текущего момента, флаги записываются корректно, всё что раньше – UInt16 мусор Спасибо за наводку
  10. Ну как будто бы правильно player.arena.bonusType, к тому же это 10 случаев из 5 миллионов, ультра редкий баг, так что можно списать на радиацию из космоса) А может сервер что то криво отправил битым, потому что из кеша результатов, мод вытаскивает даже когда в игре пишет "Результаты недоступны", может они неспроста они так пишут Ну так я же учитываю не базовое ХП, а на момент выстрела. У всяких ЛТ, к моменту выстрела, относительно урона, думаю рандомится. Хотя есть гипотеза, что в среднем уроны в игре кратны максимальному ХП, и после трёх тычек, будет оставаться чуть больше максималки. Но там надо всё равно переделывать и график и счётчик на относительные показатели. Что то типа процента нечестно добитых относительно выстрелов по шотным Ну такое надо сравнивать тогда ты взорвал/тебе взорвали, а я пока не записываю получаемый урон, хотя конечно мог бы, но потом Не совсем, это вот это https://github.com/StranikS-Scan/WorldOfTanks-Decompiled/blob/a073ff6fab4bdb9a915560cb3c774e645ea9ed64/source/res/scripts/common/constants.py#L1309 Вроде бы там можно вытащить крит пушки/гусеницы, но я вообще с этими флагами не взаимодействовал. В кликхаусе есть битовые операции, так что можешь попробовать что нибудь bitAnd(a, b) ps. Возможно я в принципе указал слишком маленький тип столбика, тогда конечно косяк, но вроде бы норм
  11. Не не, там прикол в том, что одно и тоже событие которое прямо ушло с мода имеет один танк, а прикреплённый к нему результат боя имеет другой танк, в обычном рандоме То есть как то перемешались внутри сессии клиента результаты боёв, которые я беру строго по arenaID. Но таких случаев 10 на 5 миллионов, так что можно сделать вид, что их нет Там был прямо вот такой перекос) Это график количества ХП у танков по которым стреляли с альфой в 390 обрезанный по минималке/максималке ------ Мои вчерашние оптимизации положили сервер на запись. Судя по всему по оператвике, так что накинул 2гб, посмотрим что будет
  12. Апдейтики 25.03.2024 С одной стороны ничего интересного, а с другой тотальная оптимизация всего. Последнее время, каждый день, общая инфографика грузилась всё медленнее и медленнее. В общем то пофиксил. Добавил materialized view и projection в базу данных. Это такие отдельные таблицы, в которых хранятся предрассчитанные метрики и инкрементально обновляются на каждую вставку. (что это значит? – все данные всё ещё актуальным секунда в секунду по любым фильтрам). Единственная проблема – это запросы стали немного странными специфичными, тк projection'ы выбираются автоматически, запросы должны по выбираемым выражениям соответствовать заранее подготовленным projection'ам. Заодно пока переписывал запросы, исправил в них несколько неточностией. Из явно видного – графики мест в команде теперь строго детерминированны и считают сколько человек было ЛУЧШЕ игрока (одинаковые показатели трактуются в пользу игрока). Так что теперь выгдядят интереснее, особенно на арте Про нечестно добитых/спасённых. Во первых убрал из выборки взрывы БК, во вторых мне подсказали как её полностью передалать на относительные значения, но пока что думать тяжело. Сейчас нечестно добитых всегда будет больше, потому что противников с ХП > 1.0 альфы встречается чаще чем с ХП < 1.0 альфы. А это связано с наличием арты, которая респится с 450-490 хп Если исключать арту из целей, всё равно есть небольшой перекос, но сильно меньше, пока не знаю почему Время загрузки До/После на одним и том же сервере, на одной и той же БД. Страница результатов для случайных боёв
  13. Так ещё и разные игроки, на разных серверах, в разных регионах Вообще не представляю как так вышло, может баг внутри игры с получением результатов Потому что я беру результат по arenaID, который, насколько я понимаю, уникальный на всю игру Но ситуация забавная)
  14. Насколько я помню, инстанс класса Vehicle существует только когда танк виден и известен игроку А в начале боя пока они ещё не светились, или за кругом отрисовки, или во всяких режимах где они вообще скрыты как быть? Может я просто неправильно хожу до этих Vehicles
  15. Подскажите откуда можно вытащить закешированные текущие ХП танков союзников и противников. В player().vehicles лежат только максимальные. Понятное дело, что можно самому посчитать на onHealthChanged, но в игре уже должно быть что то подобное, для ХП команд в шапке, да и на миникарте отображаются Я нашел что то похожее в from vehicle_systems.appearance_cache import VehicleAppearanceCacheInfo , но оно как то нигде не используется нормально
  16. В точку! Исключил взрывы БК, стало лучше, но не совсем 69/64. Откуда то лишние 3% фрагов Уничтожение по модулям у меня не учитывается, у меня фраг это когда осталось 0 хп после выстрела Пожар тоже идёт отдельным счётчиком, и тоже не влияет на урон/фраг от выстрела. хп после пожара и хп после выстрела записываются отдельно
  17. Интересная ситуация Как будто бы надо завтра попробовать нарисовать распределение ХП при стрельбе по танкам с ХП от 0.75 до 1.25 альфы. Но на такой большой выборке, как будто бы должно быть симметричным
  18. Прототип делать ещё не начинал, но пошел перед сном полистать xvm, и XMQP прямо супер наводка Вот место в AS где просто поверх спрайта императивно рисуется что угодно. Причём Sprite, судя по всему, дефолтный AS https://gitlab.com/xvm/xvm/-/blob/master/src/swf_xvm/xvm_battle/com/xvm/battle/shared/minimap/UI_Minimap.as#L463 XVM делает буквально то что я и хотел, они объявляют несколько своих слоёв просто спрайтами и помещают их в нужные места по порядку, а потом в них рисуют (для стрелочек создаётся новый слой на каждую, но мне такое не нужно) (Sprite это как Canvas2D в js, зарезервированный массив пикселей в который можно через API рисовать примитивы, типа кружочки, линии, заливки, полигоны) и всё звучит круто, но вопрос как в этот процесс вклиниться вообще, оно же компилируемое и в него так просто не сходить А так как будто бы вот так же добавить ещё один слой в нужную мне позицию из своего AS, и в нём работать https://gitlab.com/xvm/xvm/-/blob/master/src/swf_xvm/xvm_battle/com/xvm/battle/shared/minimap/UI_Minimap.as#L79 Но я вообще не представляю что нужно сделать, чтоб мой AS оказался на в игре миникарте. В плане как это всё скомпилировать и инжектнуть в игру. Куда должно быть точка входа. Как будто бы, сама тема со слоями это нативная игра и они расширяют minimapUI и XVM мне не нужен, но и конфликтовать я с ним не должен
  19. You also should select 32bit game version in PjOrion, wot.exe inside \win32 directory May be exists simplest way, but it works for me
  20. Но такой же мод есть и все крупные стримеры с ним играют единственное я как то не нашел его в интернете, но либо плохо искал, либо можно просто на стриме задать вопрос
  21. Да да, я знаю, но локи тоже уже был, да и общепринятое решение для логов, и на проектах раньше прекрасно себя показывал (но там я с фронта не писал) Вчера вот уже переписал на кликхаус, пока что полёт нормальный. По 5к строк логов в минуту
  22. Тем временем уже 43771 пользователей, и я уже третий день трачу всё свободное время на борьбу с Grafana Loki (это общепринятая штука для сбора логов), и я в неё пишу все логи мода. И внезапно, сервер который спокойно выдерживает сложные аналитические запросы по 20М+ строк, не тянет выборку логов за прошлый час. Скорее всего она не совсем предназначена для логов с фронта (хотя её точно так используют), а может, просто для проекта на 40к пользователей я слишком мало плачу за сервера. А ещё общий охват достиг 2.5 миллиона игроков, для тех кто думает, что игра вот вот умрёт)
  23. Можно Но тут оно же не непрерывное, и из-за особенностей округления могут быть разные границы (у меня нет теоретических выкладок, но кажется что да). Хотя по идеи если у меня каждый столбик выровнен по количеству, может и нормально будет Ну и ещё эксперименты понятнее пользователю, чем какая то там математика. Там бы по хорошему пересчитать коэффициенты для гаусса, они у меня сейчас по очень маленькой выборке, да и ещё вроде бы не симметричны относительно Наверное надо будет заняться, но потом
  24. Ну стоит отдать должно, у меня на компе сильно быстрее, но я понимаю, это не аргумент)) Вообще этот расчёт имеет смысл для малого числа выстрелов, когда распределение выглядит "кривым", и хочется понять насколько сильно это плохо А так расчёт на клиенте, просто в отдельном потоке. Его можно сделать многопоточным и вообще сильно оптимизировать, но сейчас явно не до этого Сейчас сделал кнопочку "отменить", на случай если расчёт слишком долгий и возможность самостоятельно задать число выстрелов
  25. Ещё раз огромное спасибо за исправления. Текст действительно стал сильно лучше. Обновил сайт
×
×
  • Create New...