Jump to content
Korean Random
SoprachevAK

[WOT STAT] Мод для анализа подкруток

Recommended Posts

9 часов назад, SoprachevAK сказал:

Так ещё и разные игроки, на разных серверах, в разных регионах
Вообще не представляю как так вышло, может баг внутри игры с получением результатов
Потому что я беру результат по arenaID, который, насколько я понимаю, уникальный на всю игру

Но ситуация забавная)

 

Не могло так получиться, что из-за обновлений игры поменялись какие-то ID у разработчиков, а у тебя все данные в кучу без учета версий игры.

3 часа назад, SoprachevAK сказал:

Сейчас нечестно добитых всегда будет больше, потому что противников с ХП > 1.0 альфы встречается чаще чем с ХП < 1.0 альфы. А это связано с наличием арты, которая респится с 450-490 хп 

 

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

Share this post


Link to post

Short link
Share on other sites
8 часов назад, StranikS_Scan сказал:

Не могло так получиться, что из-за обновлений игры поменялись какие-то ID у разработчиков, а у тебя все данные в кучу без учета версий игры.

Не не, там прикол в том, что одно и тоже событие которое прямо ушло с мода имеет один танк, а прикреплённый к нему результат боя имеет другой танк, в обычном рандоме
То есть как то перемешались внутри сессии клиента результаты боёв, которые я беру строго по arenaID. Но таких случаев 10 на 5 миллионов, так что можно сделать вид, что их нет
 

 

8 часов назад, StranikS_Scan сказал:

Дык тут не только дело в арте

Там был прямо вот такой перекос)
Это график количества ХП у танков по которым стреляли с альфой в 390 обрезанный по минималке/максималке
image.thumb.png.3215be930119be1a2ae6a4702e663ea9.png


------
Мои вчерашние оптимизации положили сервер на запись. Судя по всему по оператвике, так что накинул 2гб, посмотрим что будет

Share this post


Link to post

Short link
Share on other sites
58 минут назад, SoprachevAK сказал:

Не не, там прикол в том, что одно и тоже событие которое прямо ушло с мода имеет один танк, а прикреплённый к нему результат боя имеет другой танк, в обычном рандоме
То есть как то перемешались внутри сессии клиента результаты боёв, которые я беру строго по arenaID. Но таких случаев 10 на 5 миллионов, так что можно сделать вид, что их нет

 

Ну есть режимы такие в игре - Генеральное сражение, например, можно начать бой на одном танке, а закончить на другом. Возможно косяк был в определении типа боя.

1 час назад, SoprachevAK сказал:

Там был прямо вот такой перекос)

 

Дык и остальными танками такая же беда. Просто не ярко выраженная, но на статистику она влияет. У ЛТ например хп в 1,5-2 раза меньше чем у ТТ на десятых уровнях.

 

image.thumb.png.1a25837823fc090d96268609089d87a1.png

Share this post


Link to post

Short link
Share on other sites

Не понимаю почему взрыв БК и дожог пожаром не должны входить в "нечестно добитых"

Это даже ещё более "нечестно", чем урон выше среднего

Share this post


Link to post

Short link
Share on other sites
2 минуты назад, KPOT2338 сказал:

Не понимаю почему взрыв БК и дожог пожаром не должны входить в "нечестно добитых"

Это даже ещё более "нечестно", чем урон выше среднего

 

А в чем нечестность? Нечестно, это когда распределение должно быть симметричным по определению механики игры, а выходит - несимметричным. 

Share this post


Link to post

Short link
Share on other sites
18 минут назад, StranikS_Scan сказал:

 

А в чем нечестность? Нечестно, это когда распределение должно быть симметричным по определению механики игры, а выходит - несимметричным. 

Ну, если в таком смысле, то понятно

А вот когда от одного попадания с потенциальным средним уроном в треть хп улетаешь в ангар со взрывом БК, то вот именно это ощущается нечестным/несправедливым

----------------------------------------------------------------------------------------

results.flags - это код крита?

Если да, то по-моему там больше значений должно быть, а не 216

По крайней мере в 2018 году

(Файл с расшифровкой не нашёл)

 

 

биш2018.jpg

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
5 часов назад, StranikS_Scan сказал:

Возможно косяк был в определении типа боя

Ну как будто бы правильно player.arena.bonusType, к тому же это 10 случаев из 5 миллионов, ультра редкий баг, так что можно списать на радиацию из космоса) А может сервер что то криво отправил битым, потому что из кеша результатов, мод вытаскивает даже когда в игре пишет "Результаты недоступны", может они неспроста они так пишут
 

 

5 часов назад, StranikS_Scan сказал:

Дык и остальными танками такая же беда

Ну так я же учитываю не базовое ХП, а на момент выстрела. У всяких ЛТ, к моменту выстрела, относительно урона, думаю рандомится. Хотя есть гипотеза, что в среднем уроны в игре кратны максимальному ХП, и после трёх тычек, будет оставаться чуть больше максималки.
Но там надо всё равно переделывать и график и счётчик на относительные показатели. Что то типа процента нечестно добитых относительно выстрелов по шотным  

 

2 часа назад, KPOT2338 сказал:

улетаешь в ангар со взрывом БК, то вот именно это ощущается нечестным/несправедливым

Ну такое надо сравнивать тогда ты взорвал/тебе взорвали, а я пока не записываю получаемый урон, хотя конечно мог бы, но потом
 

 

2 часа назад, KPOT2338 сказал:

results.flags - это код крита?

Не совсем, это вот это https://github.com/StranikS-Scan/WorldOfTanks-Decompiled/blob/a073ff6fab4bdb9a915560cb3c774e645ea9ed64/source/res/scripts/common/constants.py#L1309
Вроде бы там можно вытащить крит пушки/гусеницы, но я вообще с этими флагами не взаимодействовал. В кликхаусе есть битовые операции, так что можешь попробовать что нибудь bitAnd(a, b)
ps. Возможно я в принципе указал слишком маленький тип столбика, тогда конечно косяк, но вроде бы норм

Share this post


Link to post

Short link
Share on other sites
2 часа назад, KPOT2338 сказал:

results.flags - это код крита?

Если да, то по-моему там больше значений должно быть, а не 216

По крайней мере в 2018 году

(Файл с расшифровкой не нашёл)

 

Это как я понимаю не просто код, а комбинация кодов критов через X or Y. И максимальный номер там пока 2^24 согласно исходнику VEHICLE_HIT_FLAGS. Это значит, что размер типа должен быть 2^32 = 4 294 967 296 это long int. Ну и по факту это не crits а flags. А какие в нем криты, это надо перебором проверять, как тут это делается.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
37 минут назад, StranikS_Scan сказал:

 

Это как я понимаю не просто код, а комбинация кодов критов через X or Y. И максимальный номер там пока 2^24 согласно исходнику VEHICLE_HIT_FLAGS. Это значит, что размер типа должен быть 2^32 = 4 294 967 296 это long int. Ну и по факту это не crits а flags. А какие в нем криты, это надо перебором проверять, как тут это делается.

Реально 2^32
Ну значит начиная с текущего момента, флаги записываются корректно, всё что раньше – UInt16 мусор

Спасибо за наводку

Edited by SoprachevAK

Share this post


Link to post

Short link
Share on other sites

Мод 1.3.0.0

  • Канареечное обновление – следующие версии смогут устанавливаться не сразу всем игрокам, а раскатываться постепенно, например по 10% игроков в день, критические баги затронут не всю аудиторию. В случае важных обнов, можно будет указать установку сразу всем. На сайте и гитхабе всегда можно будет скачать последнюю версию
  • ModListApi – теперь открыть сайт с персональной инфографикой можно из интерфейса modList'a, если такой установлен. Уведомление в ангаре стало немного более навязчивым (вылезает при входе в игру, а не просто там находится)
  • События
    • Ко всем событиям и результатам добавлен tankRole который описывает роль танка (это как тип, но подтип, например чтоб отличать САУ от огнемёта)
    • Ко всем событиям добавлен сбор текущего счёта боя (сумма фрагов команды на момент события), суммарное ХП команд и суммарное максимальное ХП команд 
      • Для результата боя, это событие собирается в момент начала боя

Судя по логам ошибок, ХП могут собираться не всегда правильно, но я думаю пойдёт. 

1491228057_2024-03-2819_01_12.png.e688217d641ffcbbec00b2027e5435ec.png

 

Edited by SoprachevAK

Share this post


Link to post

Short link
Share on other sites

Теперь такой вопрос. Как мод защищен от подмены данных?

Share this post


Link to post

Short link
Share on other sites
1 час назад, StranikS_Scan сказал:

Теперь такой вопрос. Как мод защищен от подмены данных?

Ну тут технически то его никак не защитить, в конечном то итоге всё равно с клиента данные идут

Там вообще был предусмотрен механизм обфускации трафика, чтоб пришлось хотя бы в моде разбираться, но судя по тому, что на сервере я деобфускатор не писал, обфускатор я включить забыл

По хорошему надо вытащить из клиента токен, чтоб авторизовывать пользователя на сервере, тогда подменить можно будет только свои данные, а это во первых не поднасрёт другим, во вторых легко удалить будет. Я посмотрел на этот token2, понял что он похож на jwt, но им не является, и пока отложил эту затею

Но вообще в ближайшее время придётся разбираться для платных тепловых карт на миникарте 

Share this post


Link to post

Short link
Share on other sites
1 минуту назад, SoprachevAK сказал:

Ну тут технически то его никак не защитить, в конечном то итоге всё равно с клиента данные идут

Там вообще был предусмотрен механизм обфускации трафика, чтоб пришлось хотя бы в моде разбираться, но судя по тому, что на сервере я деобфускатор не писал, обфускатор я включить забыл

По хорошему надо вытащить из клиента токен, чтоб авторизовывать пользователя на сервере, тогда подменить можно будет только свои данные, а это во первых не поднасрёт другим, во вторых легко удалить будет. Я посмотрел на этот token2, понял что он похож на jwt, но им не является, и пока отложил эту затею

Но вообще в ближайшее время придётся разбираться для платных тепловых карт на миникарте 

 

Тут две проблемы. Первая - это сбор данных через хуки и эвенты в пайтоне. Подменить их целенаправленно будет сложно, если в моде будут добавлены разные механизмы и проверки среды исполнения мода, а сами файлы мода будут обфусцированы с контролем их целостности. Вторая проблема - это передача данных на сервер. Она решается очевидным способом путем шифрования двойным ключом передаваемой инфы до её отправки по протоколу.

 

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

Share this post


Link to post

Short link
Share on other sites
2 минуты назад, StranikS_Scan сказал:

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

Это действительно так, и это радует) Я мониторю сервер и пока что там аномальных пиков не было
 

3 минуты назад, StranikS_Scan сказал:

обфусцированы с контролем их целостности

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

Тут ещё влияет, что у меня никакой соревновательности нет, и заниматься вбросами нет смысла, кроме как поднасрать. А если защитить по пользователю, то поднасрать получится только себе и в среднесерверную. Таких можно будет удалять вручную
 

Share this post


Link to post

Short link
Share on other sites
14 минут назад, SoprachevAK сказал:

Тут ещё влияет, что у меня никакой соревновательности нет, и заниматься вбросами нет смысла, кроме как поднасрать. А если защитить по пользователю, то поднасрать получится только себе и в среднесерверную. Таких можно будет удалять вручную

 

Из всех решений сейчас - это самое стоящее. Надо на сайте прикрутить авторизацию с запросом данных через сайт игры, и выдавать токен с лайвтаймом каждому авторизованному. Мод сможет токен запрашивать и скачивать, а затем подписывать данные отправляемые на сервер. Ну и на сервере раз данные персонофицированные станут можно будет их проверять и если что футболить, а БД чистить.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites
7 минут назад, StranikS_Scan сказал:

Надо на сайте прикрутить авторизацию с запросом данных через сайт игры, и выдавать токен с лайвтаймом каждому авторизованному

Погоди, то есть просто из игры токен вытащить нельзя? Авторизация через сайт звучит так, как будто бы этим никто не будет пользоваться. Как будто бы должен быть способ как то авторизовать пользователя изнутри игры

Если нет, это печально конечно

Share this post


Link to post

Short link
Share on other sites

Вычисление подставушников

Взял результаты из рандома на танках 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 боях:
image.thumb.png.77eaf6a0c33be6ba5c5a4b32388ea47e.png


Запрос кому интересно

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


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

Но заниматься таким я пока не готов, слишком неприятный процесс который явно не принесёт денег. 

Если вдруг кому интересно повторить и покопаться:

 


Я использовал Neo4j.
Вставлял данные из подготовленного CSV тк так быстрее всего

1. Создаём индексы


CREATE INDEX arenaIdIndex FOR (a:Arena) ON (a.id);
CREATE INDEX playerNameIndex FOR (p:Player) ON (p.name);
CREATE INDEX squadNameIndex FOR (s:Squad) ON (s.name);

2. Скачиваем подготовленный файл и помещаем его в папку import внутри neo4j, ну или любым другим удобным способом
Что в CSV по столбикам:

  1. id – id из таблицы Event_OnBattleResult в WotStat
  2. arenaId – уникальный id боя из танков. Разные игроки могут играть на одной арене с одинаковым id 
  3. playerName – ник игрока которые отправил это событие
  4. name – ник игрока из результатов боя
  5. squad – уникальное название взвода
  6. damage – урон игрока по результатам боя
  7. mileageDATA.csv – пройденное расстояние  по результатам боя

3. Вставляем батчами


:auto LOAD CSV FROM 'file:///DATA.csv' AS row
CALL {
  with row
  MERGE (a:Arena {id: row[1]})
  ON CREATE SET a.reporterName = [row[2]], a.reporterId = [row[0]]
  ON MATCH SET a.reporterName = apoc.coll.toSet(a.reporterName + row[2]), a.reporterId = apoc.coll.toSet(a.reporterId + row[0])
  MERGE (p:Player {name: row[3]})
  MERGE (p)-[r:PLAY_ON]->(a)
  ON CREATE SET r.damage = row[5], r.mileage = row[6]
  WITH a, p, row
  WHERE row[4] <> ''
  MERGE (s:Squad {name: row[4]})
  MERGE (p)-[:PLAY_IN]->(s)
  MERGE (s)-[:PLAY_ON]->(a)
} IN TRANSACTIONS OF 100000 ROWS;


---------------
Если вы хотите сделать свою выгрузку, вот запрос к WotStat, чтоб не уйти в лимит идите батчами


with
    arrayFilter(t -> t.2 > 0, arrayZip(playersResults.name, playersResults.squadID)) as squads,
    arraySort(t -> t.2, squads) as sorted,
    arrayDifference(sorted.2) as dif,
    arrayFilter(t -> length(t) > 1, arraySplit((x, y) -> y != 0, sorted.1, dif)) as squadman,
    arrayFirst(t -> has(t, pName), squadman) as squad
select id,
       arenaId,
       playerName,
       pName,
       arrayStringConcat(arraySort(squad), ';') as squadName,
       pDamage,
       pMileage
from Event_OnBattleResult
array join playersResults.name as pName,
           playersResults.damageDealt as pDamage,
           playersResults.mileage as pMileage
where battleMode = 'REGULAR'
  and tankLevel = 10
  and arenaId != 0
  and serverName = 'RU9'
limit 10000;

 


Ещё одна красивая картинка случайного куска базы

image.thumb.png.97b1856c2269f7dc3ce89221b3edb106.png
 

DATA.csv

Edited by SoprachevAK

Share this post


Link to post

Short link
Share on other sites

Или я что-то напутал/недоучёл в условиях или в разных режимах и у разных снарядов разные шансы крита, если исходить из количества подорванных БК

 

разницапокритам.jpg

Share this post


Link to post

Short link
Share on other sites
10 часов назад, KPOT2338 сказал:

Или я что-то напутал/недоучёл в условиях или в разных режимах и у разных снарядов разные шансы крита, если исходить из количества подорванных БК

 

разницапокритам.jpg

Скорее всего это действительно так, но этому есть объяснение – в натиске сражения очень близко и часто люди заходят в борта друг другу. Там в принципе и процент пробитий выше.

Вот график % пожаров (красным) и взрывов бк (синим) по категориям боёв, но я брал только ББ. Пожаров почти в 2 раза большеimage.thumb.png.8503280a6d90cb3ecbd01e50d0dc908a.png

Share this post


Link to post

Short link
Share on other sites

Народ переживает, что что-то не работает

Цитата

Скажите, только у меня перестал работать мод от вотстат? Скачал последнюю версию, закинул в папки всех патчей, и ничего. 

http://forum.tanki.su/index.php?/topic/2140364-подкрутка/page__st__49440__pid__56851469#entry56851469

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...