StranikS_Scan 4,210 #540809 Posted March 25 9 часов назад, SoprachevAK сказал: Так ещё и разные игроки, на разных серверах, в разных регионах Вообще не представляю как так вышло, может баг внутри игры с получением результатов Потому что я беру результат по arenaID, который, насколько я понимаю, уникальный на всю игру Но ситуация забавная) Не могло так получиться, что из-за обновлений игры поменялись какие-то ID у разработчиков, а у тебя все данные в кучу без учета версий игры. 3 часа назад, SoprachevAK сказал: Сейчас нечестно добитых всегда будет больше, потому что противников с ХП > 1.0 альфы встречается чаще чем с ХП < 1.0 альфы. А это связано с наличием арты, которая респится с 450-490 хп Дык тут не только дело в арте, у нас урон дискретный и хп игроков как и их количество в бою тоже дискретное. Отсюда получаем не перекос - а реальный факт того, с чем игрок сталкивается. Quote Share this post Link to post Short link Share on other sites
SoprachevAK 65 #540816 Posted March 25 8 часов назад, StranikS_Scan сказал: Не могло так получиться, что из-за обновлений игры поменялись какие-то ID у разработчиков, а у тебя все данные в кучу без учета версий игры. Не не, там прикол в том, что одно и тоже событие которое прямо ушло с мода имеет один танк, а прикреплённый к нему результат боя имеет другой танк, в обычном рандоме То есть как то перемешались внутри сессии клиента результаты боёв, которые я беру строго по arenaID. Но таких случаев 10 на 5 миллионов, так что можно сделать вид, что их нет 8 часов назад, StranikS_Scan сказал: Дык тут не только дело в арте Там был прямо вот такой перекос) Это график количества ХП у танков по которым стреляли с альфой в 390 обрезанный по минималке/максималке ------ Мои вчерашние оптимизации положили сервер на запись. Судя по всему по оператвике, так что накинул 2гб, посмотрим что будет Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #540818 Posted March 25 58 минут назад, SoprachevAK сказал: Не не, там прикол в том, что одно и тоже событие которое прямо ушло с мода имеет один танк, а прикреплённый к нему результат боя имеет другой танк, в обычном рандоме То есть как то перемешались внутри сессии клиента результаты боёв, которые я беру строго по arenaID. Но таких случаев 10 на 5 миллионов, так что можно сделать вид, что их нет Ну есть режимы такие в игре - Генеральное сражение, например, можно начать бой на одном танке, а закончить на другом. Возможно косяк был в определении типа боя. 1 час назад, SoprachevAK сказал: Там был прямо вот такой перекос) Дык и остальными танками такая же беда. Просто не ярко выраженная, но на статистику она влияет. У ЛТ например хп в 1,5-2 раза меньше чем у ТТ на десятых уровнях. Quote Share this post Link to post Short link Share on other sites
KPOT2338 6 #540822 Posted March 25 Не понимаю почему взрыв БК и дожог пожаром не должны входить в "нечестно добитых" Это даже ещё более "нечестно", чем урон выше среднего Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #540823 Posted March 25 2 минуты назад, KPOT2338 сказал: Не понимаю почему взрыв БК и дожог пожаром не должны входить в "нечестно добитых" Это даже ещё более "нечестно", чем урон выше среднего А в чем нечестность? Нечестно, это когда распределение должно быть симметричным по определению механики игры, а выходит - несимметричным. Quote Share this post Link to post Short link Share on other sites
KPOT2338 6 #540825 Posted March 25 18 минут назад, StranikS_Scan сказал: А в чем нечестность? Нечестно, это когда распределение должно быть симметричным по определению механики игры, а выходит - несимметричным. Ну, если в таком смысле, то понятно А вот когда от одного попадания с потенциальным средним уроном в треть хп улетаешь в ангар со взрывом БК, то вот именно это ощущается нечестным/несправедливым ---------------------------------------------------------------------------------------- results.flags - это код крита? Если да, то по-моему там больше значений должно быть, а не 216 По крайней мере в 2018 году (Файл с расшифровкой не нашёл) 1 Quote Share this post Link to post Short link Share on other sites
SoprachevAK 65 #540827 Posted March 25 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. Возможно я в принципе указал слишком маленький тип столбика, тогда конечно косяк, но вроде бы норм Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #540828 Posted March 25 2 часа назад, KPOT2338 сказал: results.flags - это код крита? Если да, то по-моему там больше значений должно быть, а не 216 По крайней мере в 2018 году (Файл с расшифровкой не нашёл) Это как я понимаю не просто код, а комбинация кодов критов через X or Y. И максимальный номер там пока 2^24 согласно исходнику VEHICLE_HIT_FLAGS. Это значит, что размер типа должен быть 2^32 = 4 294 967 296 это long int. Ну и по факту это не crits а flags. А какие в нем криты, это надо перебором проверять, как тут это делается. 1 Quote Share this post Link to post Short link Share on other sites
SoprachevAK 65 #540830 Posted March 25 (edited) 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 March 25 by SoprachevAK Quote Share this post Link to post Short link Share on other sites
SoprachevAK 65 #540866 Posted March 28 (edited) Мод 1.3.0.0 Канареечное обновление – следующие версии смогут устанавливаться не сразу всем игрокам, а раскатываться постепенно, например по 10% игроков в день, критические баги затронут не всю аудиторию. В случае важных обнов, можно будет указать установку сразу всем. На сайте и гитхабе всегда можно будет скачать последнюю версию ModListApi – теперь открыть сайт с персональной инфографикой можно из интерфейса modList'a, если такой установлен. Уведомление в ангаре стало немного более навязчивым (вылезает при входе в игру, а не просто там находится) События Ко всем событиям и результатам добавлен tankRole который описывает роль танка (это как тип, но подтип, например чтоб отличать САУ от огнемёта) Ко всем событиям добавлен сбор текущего счёта боя (сумма фрагов команды на момент события), суммарное ХП команд и суммарное максимальное ХП команд Для результата боя, это событие собирается в момент начала боя Судя по логам ошибок, ХП могут собираться не всегда правильно, но я думаю пойдёт. Edited March 28 by SoprachevAK Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #540867 Posted March 28 Теперь такой вопрос. Как мод защищен от подмены данных? Quote Share this post Link to post Short link Share on other sites
SoprachevAK 65 #540868 Posted March 28 1 час назад, StranikS_Scan сказал: Теперь такой вопрос. Как мод защищен от подмены данных? Ну тут технически то его никак не защитить, в конечном то итоге всё равно с клиента данные идут Там вообще был предусмотрен механизм обфускации трафика, чтоб пришлось хотя бы в моде разбираться, но судя по тому, что на сервере я деобфускатор не писал, обфускатор я включить забыл По хорошему надо вытащить из клиента токен, чтоб авторизовывать пользователя на сервере, тогда подменить можно будет только свои данные, а это во первых не поднасрёт другим, во вторых легко удалить будет. Я посмотрел на этот token2, понял что он похож на jwt, но им не является, и пока отложил эту затею Но вообще в ближайшее время придётся разбираться для платных тепловых карт на миникарте Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #540869 Posted March 28 1 минуту назад, SoprachevAK сказал: Ну тут технически то его никак не защитить, в конечном то итоге всё равно с клиента данные идут Там вообще был предусмотрен механизм обфускации трафика, чтоб пришлось хотя бы в моде разбираться, но судя по тому, что на сервере я деобфускатор не писал, обфускатор я включить забыл По хорошему надо вытащить из клиента токен, чтоб авторизовывать пользователя на сервере, тогда подменить можно будет только свои данные, а это во первых не поднасрёт другим, во вторых легко удалить будет. Я посмотрел на этот token2, понял что он похож на jwt, но им не является, и пока отложил эту затею Но вообще в ближайшее время придётся разбираться для платных тепловых карт на миникарте Тут две проблемы. Первая - это сбор данных через хуки и эвенты в пайтоне. Подменить их целенаправленно будет сложно, если в моде будут добавлены разные механизмы и проверки среды исполнения мода, а сами файлы мода будут обфусцированы с контролем их целостности. Вторая проблема - это передача данных на сервер. Она решается очевидным способом путем шифрования двойным ключом передаваемой инфы до её отправки по протоколу. Почему это всё нужно делать - а потому что при открытой архитектуре как сейчас легко обгадить статистику на сервере дудося его ложными данными. Просто всякие наркоманы еще не очнулись и не обратили достаточного внимания на твой проект. Quote Share this post Link to post Short link Share on other sites
SoprachevAK 65 #540871 Posted March 28 2 минуты назад, StranikS_Scan сказал: Просто всякие наркоманы еще не очнулись и не обратили достаточного внимания на твой проект Это действительно так, и это радует) Я мониторю сервер и пока что там аномальных пиков не было 3 минуты назад, StranikS_Scan сказал: обфусцированы с контролем их целостности Возможно мне недостаточно квалификации вот в таких клиентских штуках, но как будто бы всё равно будет точка входа в функцию отправки данных на сервер, и в эту точку можно явно передать что угодно, и как будто бы делать любые защиты вокруг неё смысла нет Тут ещё влияет, что у меня никакой соревновательности нет, и заниматься вбросами нет смысла, кроме как поднасрать. А если защитить по пользователю, то поднасрать получится только себе и в среднесерверную. Таких можно будет удалять вручную Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #540872 Posted March 28 (edited) 14 минут назад, SoprachevAK сказал: Тут ещё влияет, что у меня никакой соревновательности нет, и заниматься вбросами нет смысла, кроме как поднасрать. А если защитить по пользователю, то поднасрать получится только себе и в среднесерверную. Таких можно будет удалять вручную Из всех решений сейчас - это самое стоящее. Надо на сайте прикрутить авторизацию с запросом данных через сайт игры, и выдавать токен с лайвтаймом каждому авторизованному. Мод сможет токен запрашивать и скачивать, а затем подписывать данные отправляемые на сервер. Ну и на сервере раз данные персонофицированные станут можно будет их проверять и если что футболить, а БД чистить. Edited March 28 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
SoprachevAK 65 #540874 Posted March 28 7 минут назад, StranikS_Scan сказал: Надо на сайте прикрутить авторизацию с запросом данных через сайт игры, и выдавать токен с лайвтаймом каждому авторизованному Погоди, то есть просто из игры токен вытащить нельзя? Авторизация через сайт звучит так, как будто бы этим никто не будет пользоваться. Как будто бы должен быть способ как то авторизовать пользователя изнутри игры Если нет, это печально конечно Quote Share this post Link to post Short link Share on other sites
SoprachevAK 65 #540899 Posted March 29 (edited) Вычисление подставушников Взял результаты из рандома на танках 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 Технически можно развить, оптимизировать, и отправлять уведомления в мод, игроку который зарепортил эти арены, чтоб загрузил реплей на вотреплейс, тк в нём потенциальные подставушники. Ещё можно смотреть на арены, где эти игроки играли не вместе. Но заниматься таким я пока не готов, слишком неприятный процесс который явно не принесёт денег. Если вдруг кому интересно повторить и покопаться: Я использовал 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 по столбикам: id – id из таблицы Event_OnBattleResult в WotStat arenaId – уникальный id боя из танков. Разные игроки могут играть на одной арене с одинаковым id playerName – ник игрока которые отправил это событие name – ник игрока из результатов боя squad – уникальное название взвода damage – урон игрока по результатам боя 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; Ещё одна красивая картинка случайного куска базы DATA.csv Edited March 29 by SoprachevAK Quote Share this post Link to post Short link Share on other sites
KPOT2338 6 #540916 Posted March 30 Или я что-то напутал/недоучёл в условиях или в разных режимах и у разных снарядов разные шансы крита, если исходить из количества подорванных БК Quote Share this post Link to post Short link Share on other sites
SoprachevAK 65 #540931 Posted March 30 10 часов назад, KPOT2338 сказал: Или я что-то напутал/недоучёл в условиях или в разных режимах и у разных снарядов разные шансы крита, если исходить из количества подорванных БК Скорее всего это действительно так, но этому есть объяснение – в натиске сражения очень близко и часто люди заходят в борта друг другу. Там в принципе и процент пробитий выше. Вот график % пожаров (красным) и взрывов бк (синим) по категориям боёв, но я брал только ББ. Пожаров почти в 2 раза больше Quote Share this post Link to post Short link Share on other sites
KPOT2338 6 #541040 Posted April 8 Народ переживает, что что-то не работает Цитата Скажите, только у меня перестал работать мод от вотстат? Скачал последнюю версию, закинул в папки всех патчей, и ничего. http://forum.tanki.su/index.php?/topic/2140364-подкрутка/page__st__49440__pid__56851469#entry56851469 Quote Share this post Link to post Short link Share on other sites