-
Posts
203 -
Joined
-
Last visited
-
Days Won
8
Posts posted by SoprachevAK
-
-
Подскажите пожалуйста, есть ли в игре возможность запросить у пользователя ввести текст.
Раньше были такие всплывающие окна при продаже танков и демобилизации экипажей, с просьбой ввести их цену, но сейчас их переделали под кастомные флешки для каждой задачи
Хочется что то по типу стандартного диалога, но с полоской для ввода текста
Если такого нет, то какие ещё есть способы запросить у пользователя текст? Желательно без создания своих флешек
-
3 часа назад, KPOT2338 сказал:
Откуда информация, что клиентский точнее?
Вроде на форуме всегда рекомендуют включать серверный, чтоб лучше видеть куда направлен прицел
Сервер отстаёт от действий пользователя на один ping
Серверный прицел отстаёт от сервера на один ping
=> Серверный прицел отстаёт от действий пользователя на два пинга
Клиентский прицел старается "предугадывать" состояние сервера и реагировать на действия пользователя мгновенно
И дальше вопрос что хуже: двойной пинг или ошибки предугадывания
WotStat показывает, что в среднем, по клиентскому летит точнее (это для натиска. В рандоме тоже точнее, но там разница намного меньше)- 2
-
4 минуты назад, KPOT2338 сказал:
Т.е. в идеальных условиях получается круг
Ну вообще, так то совсем не круг, оно очень вверх сдвинуто
Я вот ещё вспомнил, что надо арту исключать
И я да, я всегда смотрю на клиентском, тк он точнее
7 минут назад, KPOT2338 сказал:А вот средний (avg) разброс от угла для клиентского
Разброс это сведение или то куда полетел снаряд (ballisticResultClient_r)?
Я попробовал, и в идеальных условиях, и там и то и то прямо идеальный круг
PS. Если брать выстрелы в движении, то там тоже другое получается, не круг, но другое. Да и это логично, как ты сам писал, горизонтальные рассинхроны чащеwith abs(2 * pi() + ballisticResultClient_theta) as t, degrees(t) as deg select round(deg / 5) * 5 as d, avg(clientShotDispersion), avg(ballisticResultClient_r) from Event_OnShot where battleMode = 'REGULAR' and tankType != 'SPG' -- and clientShotDispersion / gunDispersion between 0.9999 and 1.00001 and clientMarkerDistance between 100 and 500 -- and abs(vehicleRotationSpeed) < 0.01 -- and abs(vehicleSpeed) < 0.01 -- and abs(turretSpeed) < 0.01 and ballisticResultClient_r between 0.2 and 1 group by d order by d;
-
@KPOT2338
Нашел как визуализировать ещё более наглядно
По всем выстрелам:
С полным сведением, дистанция 100+:
С полным сведением, дистанция 100+, нулевая скорость, пинг менее 30:
И тоже самое, но обрезанное снизу не по 0, а по минимальному значению, чтоб нагляднее были видны перепады:
Тоже самое, но дистанция от центра между 0.4 и 1
- 1
-
Я тут чего то решил потыкаться в браузер, kr открылся
У них тамChrome/73.0.3683.75
, так что надо билдить сайт под старые браузеры
Способ немного незаконный
Как я понял, whitelist по url проверяется в нативномBigWorld.createWebView
, скорее всего, его можно найти как dll (я не нашел), и наверняка там тупо стрингами хранится список вайтлиста
НО, если переходить по сайтам внутри браузера, всё работает. Я в hosts подменил ip дляigb-trading-caravan-ru.tanki.su
, а он в вайтлисте. По ip хожу на свой сервер, откуда можно уже куда угодно хоть в гугл.
К сожалению, я не нашел как выполнить на сайте произвольный JS, чтоб изнутри браузера перейти на другой url. (ну как, нашел, WebBrowser.executeJavascript, но кажется его выпилили: AttributeError: 'WebRender.WebBrowserProvider' object has no attribute 'executeJavascript')
В теории, можно в прод пустить используя поддомен, напримерwotstat.igb-trading-caravan-ru.tanki.su
, и в хостс соответственно тоже поддомен, и оно работет, однако редачить пользовательский hosts звучит не очень правильно. Может можно как то подменить dns изнутри игры, но как то я хз как оно в винде, чатгпт говорит нельзя.
Если кто то захочет повторить, вот код:from helpers import dependency from adisp import adisp_process from skeletons.gui.game_control import IBrowserController class Demo(): browserCtrl = dependency.descriptor(IBrowserController) @adisp_process def __init__(self): yield self.browserCtrl.load('http://wotstat.igb-trading-caravan-ru.tanki.su') Demo()
C:\Windows\System32\drivers\etc\hosts
84.38.183.104 wotstat.igb-trading-caravan-ru.tanki.su
- 3
-
-
5 часов назад, KPOT2338 сказал:
В игре горизонтальная скорость встречается чаще, чем вертикальная
Да, действительно. Видимо всё таки стоит все эти вычисления проводить только для выстрелов с полным клиентским сведением, они автоматически неподвижны
5 часов назад, KPOT2338 сказал:Больше интересно почему вверх летит больше, чем вниз
Тоже построил подобные графики, если расстояние близкое к центру ещё можно списать на погрешность вычислений, то вот график для длины плеча > 0.2, и это уже не вычислительная погрешность
Я бы мог предположить, что это может как то быть связано с дальномером, когда маркер вроде бы вблизи, а снаряд берёт сильно вверх, чтоб по параболе полететь очень далеко, но вообще снаряд всегда летит по маркеру, а мод который это исправляет, делает это в противоположную сторону.
select floor(ballisticResultClient_theta * 20) / 20 as ugol, count() from Event_OnShot where battleMode = 'REGULAR' and tankType != 'SPG' and ballisticResultClient_r > 0.2 and clientShotDispersion / gunDispersion between 0.99999 and 1.00001 group by ugol order by ugol;
-
14.04.2024 в 11:29, maxim23rus сказал:
а можно сделать вариант мода который бы не создавал папки с номером будущих патчей и свои копии в них?
Сделал возможность отключить это копирование в конфиге мода. Кроме того, папка 2.0.0.0 создаваться теперь не будет.
Если папка 2.0.0.0 уже существует, и в ней только мой мод, папка будет удалена.
Из папок на будущие версии будут удалятся старые неактуальные версии мода. Например у меня в папке 1.26.0.0 лежало пять разных версий wotstat'a, каждый себя когда то скопировал. Теперь старые удалятся и будет лежать только одна актуальная. Из текущей версии, к сожалению, удалять нельзя, тк они все используются процессом танков
По пути/mods/configs/wot_stat
поместить текстовый файлconfig.cfg
со следующим содержимым:{ "disableAutoUpdate": true }
-
10 часов назад, KPOT2338 сказал:
На самом деле, сам факт того, что распределение угла неравномерно – это немного странно
Я как то ожидал другого
select floor(ballisticResultClient_theta * 10) / 10 as ugol, count() from Event_OnShot where battleMode = 'REGULAR' group by ugol;
Окружность классическая тригонометрическая, 0 и 180 на горизонтали, 90 и -90 на вертикали.
Получается, что вверх/вниз летит на 30% реже. Думаю это где нибудь ошибка в расчетах, но странно конечно -
6 часов назад, yepev сказал:
Прям таки любой апдейт? Даже апдейт питона до 3 версии?
Эх, если бы)
Но на самом деле, возможно ничего страшного не случится.
Мод либо не запустится и ничего не хукнет, либо хукнет, но внутренний код будет обёрнут в try catch, что в любом случае не остановит логику игры. Циклов которые могут бесконечно зациклиться тоже нет. -
7 часов назад, maxim23rus сказал:
а можно сделать вариант мода который бы не создавал папки с номером будущих патчей и свои копии в них?
А нужно?
Как минимум нужно убрать версию 2.0.0.0, это я конечно был слишком оптимистичным) Ещё можно на будущие версии не добавлять, а перезаписывать мод, чтоб не было кучи разных версий мода в папке 1.26.0.0но прямо полностью отключать не знаю, оно же нужно чтоб при апдейтах просадок по пользователям/статистики не было, а мод сейчас уже так написан, что он не будет влиять на игру, даже если апдейт его сломает
-
3 минуты назад, KPOT2338 сказал:
Это для tracerStart или gunPoint?
А то даже round((tracerStart_x-gunPoint_x) ступенчатая
это round(ballisticResultServer_r * 500) / 500 расстояние от центра круга сведения, до места где снаряд его пересёк
-
-
Взялся значит я за 2к исключений в час на сервере, посмотреть что вообще и откуда
Оказалось, что проблема в моём баллистическом калькуляторе, который за скорость снаряда брал длину вектора скорости трассера, а оказывается, скорость трассера не постоянна по его траектории (кинетическая энергия переходит в потенциальную с повышением высоты -> скорость понижается), а снаряд в танках появляется на прямо из дула, а где то по траектории, у арты вот например обычно в середине траектории (там где он должен попасть в камеру игрока)
Получается, что мой баллистический калькулятор работал неправильно всё это время. Я его исправил, и пересчитал все 160 миллионов старых выстрелов
Жёлтое – до, красное – после. На арте.
В общем то, сказ о потерянном времени) На обычных танках там вообще разницы нет. Зато теперь на душе спокойно и есть навык обновления 160 миллионов строк.- 1
-
Добавил на сайт соответствующий раздел
Выглядит немного перегруженным, но оно хорошо структурировано, а главное есть процентики всего, и даже нормализированные
https://wotstat.info/session/lootbox
Шанс на Барона 0.039% это 2.5к коробок на танк, а открывать их можно только по 10, прикиньте как это запарно- 1
-
Такс, готово.
В новой версии мода добавил сбор инфы о контейнерах. Постарался по максимуму распарсить что из них падает, но всё равно осталось несколько проигнорированных (dogtags, Enhancements, Tankmen, Entitlements). Всё кроме Tankmen я вообще хз что это такое. Всё основное распаршено
Полный список, пока только SQL. В ближайшее время добавлю в инфографику
Кроме того есть raw поле, куда сохраняется исходный json- 1
-
Тут поступило предложение собирать инфу о том, что выпадает из контейнеров. Методом тыка я сходу попал в нужную функцию https://github.com/StranikS-Scan/WorldOfTanks-Decompiled/blob/a073ff6fab4bdb9a915560cb3c774e645ea9ed64/source/res/scripts/client/gui/shared/gui_items/processors/loot_boxes.py#L25
И она в ctx имеет следующий результат для получения другого контейнера и 40к кредитов{ 'bonus': [ { 'tokens': { 'lootBox:310032': { 'count': -1, 'expires': {} }, 'lootBox:310031': { 'count': 1, 'expires': { 'at': 2524608000L } } }, 'credits': 40000 } ], 'extData': {} }
Вот результат для кофе с выпечкой
{ 'bonus': [ { 'tokens': { 'lootBox:310032': { 'count': -1, 'expires': {} } }, 'items': { 16123: 3 } } ], 'extData': {} }
Подскажите, как превратить 16123 в кофе с выпечкой? Скорее всего это опять какой нибудь дескриптор который надо как то кастануть к описанию
И ещё вопрос, как по id контейнера получить его описание?Вроде бы можно через
itemsCache = dependency.descriptor(IItemsCache)
itemsCache.items.tokens.getLootBoxes()['lootBox:310031']['category']
Но насколько можно быть уверенным что они есть в кеше, и может у кого то уже есть готовая реализация)
___________
Ну судя по всему я нашел все интересующие меня ответы тут https://github.com/StranikS-Scan/WorldOfTanks-Decompiled/blob/a073ff6fab4bdb9a915560cb3c774e645ea9ed64/source/res/scripts/client/messenger/formatters/service_channel.py#L2691 и мне надо просто реализовать такую же парсер функцию, но не в стринги, а в свой словарь
Но хранить исходные результаты всё равно буду отдельно как JSON прямо в бд- 1
-
14 часов назад, KPOT2338 сказал:
Народ переживает, что что-то не работает
Спасибо за наводку, как то думал что форум мёртв, а он жив)
Создал там тоже отдельную тему
Вообще должен работать, просадок по игрокам не наблюдал, скорее всего у него индивидуальная проблема -
20 часов назад, StranikS_Scan сказал:
Чтобы создать 3D маркер на игровом поле можно так делать
Спасибо, получилось. Если последним параметром передать
CommonMarkerType.LOCATION
, то там можно ещё много других классных маркеров
Интересно, что упоминание 'eye' в проекте в принципе не встречается, кроме пары автосгенерированных мест)canvas.markerSetSticky
ещё добавляет в UI стрелочку до маркера, если он не на экране, аmarkerSetMarkerObjectInFocus
автоматически рассчитывает и отображает дистанцию
В рандоме тоже работает.
Есть идеи куда копать для пунктирной обводки на земле?
Кажется я слишком сильно парюсь для потенциально временного решения, но почему бы и не сделать хорошо, если это не сложно- 1
-
15 минут назад, StranikS_Scan сказал:
На падение фпс и фризы проверь эти пуления. А еще там вроде были ограничения на число объектов, но это легко выявить банальной проверкой.
Проверял ещё на старых маркерах, динамически двигаются раз в 5 секунд
1к – вообще никакой разницы
2к – фризов нет, но фпс уже начинает понижаться
10к – фпс падает до 15, появляются микрофризы, но скорее всего не от отрисовки, а от того что я там в цикле 10к раз invoke вызываю
Учитывая, что я тестирую через виртуалку, как будто бы без видеокарты, думаю более чем пойдет.
Само собой, нативно рисовать в спрайт внутри флеша будет оптимальнее, но это уже потом
- 1
-
11 часов назад, StranikS_Scan сказал:
Нужно смотреть и проверять, что где доступно. Возможны ограничения
Вот этого я не учёл, спасибо
11 часов назад, StranikS_Scan сказал:Это не для миникарты, это в бою GUI маркеры-индикаторы
Да, действительно перепутал когда писал, имел ввиду эти два
SHOOTING_POINT_MARKER
NAVIGATION_POINT_MARKER
, в обычных боях работают
Точечки тоже получились, я понял в чём проблема была, там name это не имя, а название вида точечки. В рандоме работаетsettings.ENTRY_SYMBOL_NAME.VEHICLE settings.CONTAINER_NAME.ALIVE_VEHICLES minimap.invoke(handle, 'setVehicleInfo', 777, 'mediumTank', '', 'enemy', '') minimap.invoke(handle, 'setVehicleInfo', 777, 'mediumTank', '', 'ally', '')
А там где можно рисовать точечки, можно ими закрашивать области) К тому же, если их пуллить, очень даже оптимально -
10.03.2024 в 21:44, StranikS_Scan сказал:
Никак. Миникарта это скомпилированная флэшка с фиксированным функционалом. Из питона можно только вызывать те маркеры, вызов которых предусмотрен во флэшке. Потому тут либо флэшку надо модифицировать, либо к неё что-то приинжектить. Я во флэшках не разбираюсь, потому подробностей не расскажу. Обратись к протанкам, если их заинтересует твой мод может и с флэшкой помогут.
В XVM-моде вроде бы вот эти файлы отвечают за миникарту:
xvm_11.0.0_0037_....zip\
lesta\mods\1.25.0.0\com.modxvm.xfw\com.modxvm.xfw.actionscript_11.0.0.0037.wotmod\
res\gui\flash\battle.swf
lesta\res_mods\mods\xfw_packages\xvm_battle_minimap\python\minimap.py
Однозначно забанят, если твой мод будет в реальном времени показывать игроку куда ему ехать и что ему делать, исходя из текущей обстановки в игре. И скорее всего не забанят, если твой мод будет в начале боя загружать и показывать статически некие рекомендации игроку, основанные на анализе ранее собранных данных.
На первых порах можно просто сделать рабочий колхоз, путем вызова стандартных маркеров. Вот есть два красивых маркера, это зеленая лампочка и оранжевый треугольник :
Код вот такой:
import BigWorld from gui.shared.personality import ServicesLocator from account_helpers.AccountSettings import AccountSettings from gui.Scaleform.daapi.view.battle.shared.minimap import settings, plugins from gui.Scaleform.genConsts.BATTLE_VIEW_ALIASES import BATTLE_VIEW_ALIASES from frameworks.wulf import WindowLayer from Math import Matrix, Vector3, createTranslationMatrix def __calcMarkerScale(self, markerScales, minimapSizeIndex): p = float(minimapSizeIndex - plugins._MINIMAP_MIN_SCALE_INDEX) / float(plugins._MINIMAP_MAX_SCALE_INDEX - plugins._MINIMAP_MIN_SCALE_INDEX) return p * markerScales[0] + (1 - p) * markerScales[1] #Параметры карты boundingBox = BigWorld.player().arena.arenaType.boundingBox x_min, y_min = boundingBox[0] x_max, y_max = boundingBox[1] __mapSize = [abs(x_max - x_min), abs(y_max - y_min)] #Миникарта battle = ServicesLocator.appLoader.getDefBattleApp() __minimap = battle.containerManager.getContainer(WindowLayer.VIEW).getView().components[BATTLE_VIEW_ALIASES.MINIMAP] #Выведем маркер по ценру карты markerPos = (0,0,0) markerType = settings.ENTRY_SYMBOL_NAME.LOCATION_MARKER #Зеленая лампочка #settings.ENTRY_SYMBOL_NAME.ATTENTION_MARKER #Оранжевый треугольник markerEffect = 'reply' #белое свечение внутри #'idle' свечение только контура markerScales = [0.8,1.1] markerOffset = [0,0] #Масштаб маркеров minimapSizeIndex = settings.clampMinimapSizeIndex(AccountSettings.getSettings('minimapSize')) currentScale = __calcMarkerScale(markerScales, minimapSizeIndex) #Формируем матрицы scaleMatrix = Matrix() scaleMatrix.setScale(Vector3(currentScale, 1.0, currentScale)) #Смещение определяется от верхнего левого угла маркера до кончика стрелки и выражается в долях от длины и высоты миникарты, мм #масштаб миникарты при этом не влияет entryMatrix = createTranslationMatrix(markerPos + Vector3(markerOffset[0]*__mapSize[0]*currentScale, 0, markerOffset[1]*__mapSize[1]*currentScale)) entryMatrix.preMultiply(scaleMatrix) __handle = __minimap.addEntry(markerType, settings.CONTAINER_NAME.ICONS, matrix=entryMatrix, active=True, transformProps=settings.TRANSFORM_FLAG.FULL) __minimap.invoke(__handle, 'setState', markerEffect) #Удаляем маркер __minimap.delEntry(__handle)
Благодарю, всё получилось, там есть ещё много разных интересных маркеров, напримерNAVIGATION_MARKER
иSHOOTING_MARKER
, которые из топографии как раз для указания позиции куда ехать
_____
Есть пара вопросов. В топографии есть вот такие вот красные точечки, судя по всему этоVEHICLE_MARKER
для пропавшей из засвета техники с пустым названием, но создать что то подобное у меня не получилось, может есть пример.
Вопрос 2. В топографии есть два вот таких вот 3д маркера, как делать их? Искал по maps training, но чего то простого не нашел. Я понимаю, что скорее всего можно вручную через добавление модельки, но наверняка есть готовый механизм, так же как и с миникартой
-
10 часов назад, KPOT2338 сказал:
Скорее всего это действительно так, но этому есть объяснение – в натиске сражения очень близко и часто люди заходят в борта друг другу. Там в принципе и процент пробитий выше.
Вот график % пожаров (красным) и взрывов бк (синим) по категориям боёв, но я брал только ББ. Пожаров почти в 2 раза больше -
5 часов назад, Kurzdor сказал:
забудь про наследование этого класса без флешки
Даа, я так и подумал, что оно точку входа в UI имеет. Спасибо за разъяснение)
Input Dialog
in ActionScript & Python
Posted
Спасибо, но оно явно на кастомных флешках. Видимо буду решать свою задачу по другому