SoprachevAK Posted March 10 Share Posted March 10 Я хочу сделать мод с динамическими позициями на миникарте. То есть в бою будет отправляться запрос на сервер, а тот вернёт наилучшие позиции. (Знаю звучит как чит на ВХ, но я таким не занимаюсь) И собственно встал вопрос, как добавить что то на миникарту. Меня наверное интересует возможность программно из питона нарисовать линии и квадратики. В качестве упрощения, пойдёт просто отрисовать на миникарте слой картинки с прозрачным фоном. Слой между основными маркерами и подложной, чтоб не закрывал танки Я прочёл кучу тем посвящённые UI (из популярных наверное все), поползал по исходникам GPCracker, попытался поползать по XVM, но не осилил. Общее понимание у меня появилось, но чего то не хватает. Везде код и статьи очень старые 8+ лет назад, глобально наверное ничего не поменялось, но всё равно тяжело В исходниках танков нашел всякие ClassicMinimapPingPlugin и прочие плагины, и вот они выглядят приемлемо. Собственно вопрос в том, насколько это всё тяжко, и стоит ли вообще пытаться вникнуть? Как будто бы самое близкое к моей задаче это направление орудий на миникарте https://github.com/GPCracker/MinimapGunMarkers/tree/v0.1.12, если маркером сделать нужный мне квадратик, как будто бы можно будет заспавнить кучу и программно задать ему цвет Но даже эти исходники выглядят очень сложными для такой задачи, плюс используют другой его же мод-ядро, что сильно усложняет понимание. Возможно стоит заюзать XVM, он же вроде бы делался, чтоб упростить разработку графических модов. Пример того, как хочу отображать @ Quote Link to comment Short link Share on other sites More sharing options...
SoprachevAK Posted March 10 Author Share Posted March 10 (edited) Я понимаю, что делать за меня никто ничего не будет, но если вдруг кто нибудь верит в коммерческую успешность, и хочет продавать его вместе со мной, то я готов взять в долю. Я хочу продавать такую штуку по подписке, и верю, что покупатели найдутся. Я попробовал сам, строил позиции вручную во время отсчёта, и оно сильно помогает, особенно когда я года три не играл. А ВГ (леста) не должны забанить, если продвигать это под лозунгом "поможем старым игрокам адаптироваться в игре" Основаная идея в том, что позиции могут строиться для конкретного танка, а если данных мало, то для роли/класса/уровня. А ещё позиции обновляются динамически, и если случится новая мета, вручную перерисовывать их не придётся, а значит легко поддерживать будет потом. Очень многие игроки хотят такой мод. Edited March 10 by SoprachevAK 1 @ Quote Link to comment Short link Share on other sites More sharing options...
SoprachevAK Posted March 10 Author Share Posted March 10 А динамически нужно, тк хочу несколько раз за бой менять позиции в зависимости от таймера. В начале показывать позиции актуальные на первые 2-3 минуты, потом на 4-6 (там появляются позиции для дефа) Хорошо видно на степях, хотя сами тепловые карты пока прототип 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Scharfhobel Posted March 10 Share Posted March 10 Вроде есть же сейчас в самой игре маркеры, может можно от них оттолкнуться? @ Quote Link to comment Short link Share on other sites More sharing options...
yepev Posted March 10 Share Posted March 10 Я бы копал в сторону того как в XVM реализовано рисование точек и стрелочек на карте (кейворд: XMQP). Заодно чтобы сразу понимать, как сделать всё совместимым с XVM. 1 @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted March 10 Share Posted March 10 (edited) 14 часов назад, SoprachevAK сказал: И собственно встал вопрос, как добавить что то на миникарту. Никак. Миникарта это скомпилированная флэшка с фиксированным функционалом. Из питона можно только вызывать те маркеры, вызов которых предусмотрен во флэшке. Потому тут либо флэшку надо модифицировать, либо к неё что-то приинжектить. Я во флэшках не разбираюсь, потому подробностей не расскажу. Обратись к протанкам, если их заинтересует твой мод может и с флэшкой помогут. В 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 14 часов назад, SoprachevAK сказал: А ВГ (леста) не должны забанить, если продвигать это под лозунгом "поможем старым игрокам адаптироваться в игре" Однозначно забанят, если твой мод будет в реальном времени показывать игроку куда ему ехать и что ему делать, исходя из текущей обстановки в игре. И скорее всего не забанят, если твой мод будет в начале боя загружать и показывать статически некие рекомендации игроку, основанные на анализе ранее собранных данных. 14 часов назад, SoprachevAK сказал: если маркером сделать нужный мне квадратик, как будто бы можно будет заспавнить кучу и программно задать ему цвет На первых порах можно просто сделать рабочий колхоз, путем вызова стандартных маркеров. Вот есть два красивых маркера, это зеленая лампочка и оранжевый треугольник : Код вот такой: 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) Edited March 10 by StranikS_Scan 2 @ Quote Link to comment Short link Share on other sites More sharing options...
KPOT2338 Posted March 10 Share Posted March 10 Я в этом не разбираюсь, но появился вопрос. Надо именно на миникарту или просто на соответствующую область экрана? @ Quote Link to comment Short link Share on other sites More sharing options...
SoprachevAK Posted March 10 Author Share Posted March 10 12 часов назад, yepev сказал: XVM реализовано рисование точек и стрелочек на карте (кейворд: XMQP) Благодарю за наводку, гляну 2 часа назад, StranikS_Scan сказал: Однозначно забанят, если твой мод будет в реальном времени показывать игроку куда ему ехать и что ему делать, исходя из текущей обстановки в игре. И скорее всего не забанят, если твой мод будет в начале боя загружать и показывать статически некие рекомендации игроку, основанные на анализе ранее собранных данных. Тонкий момент. Я хочу в реальном времени, на основе информации мгновенно доступной игроку (хп команд, таймер боя, счёт), отображать рекомендации, статически просчитанные на ранее полученных данных) Шансы есть) Так то никакой информации недоступной игроку, или для которой нужно сделать дополнительные действия, я не планирую использовать. 2 часа назад, StranikS_Scan сказал: На первых порах можно просто сделать рабочий колхоз, путем вызова стандартных маркеров. Вот есть два красивых маркера, это зеленая лампочка и оранжевый треугольник : Да, это определённо подойдёт для прототипа, спасибо большое! И код даже выглядит совсем не страшно. А потом с прототипом пойду к протанкам, если сам не разберусь в xvm. Я тут ещё подумал, что через DAAPI должен быть способ заменить саму картинку миникарту на свою, а значит можно на питоне отрендерить bitmap'у которую накладывать на текущую картинку миникарты и отправлять во флеш. Если конечно миникарты на каждую карту не вкомпилины во флеш @ Quote Link to comment Short link Share on other sites More sharing options...
SoprachevAK Posted March 10 Author Share Posted March 10 1 час назад, KPOT2338 сказал: Я в этом не разбираюсь, но появился вопрос. Надо именно на миникарту или просто на соответствующую область экрана? По хорошему на миникарту, тк во первых она может двигаться и увеличиваться, так ещё и надо между подложкой и основными маркерами, чтоб не мешалась @ Quote Link to comment Short link Share on other sites More sharing options...
SoprachevAK Posted March 20 Author Share Posted March 20 (edited) 10.03.2024 в 11:36, yepev сказал: Я бы копал в сторону того как в XVM реализовано рисование точек и стрелочек на карте (кейворд: XMQP). Заодно чтобы сразу понимать, как сделать всё совместимым с XVM. Прототип делать ещё не начинал, но пошел перед сном полистать 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 мне не нужен, но и конфликтовать я с ним не должен Edited March 20 by SoprachevAK 1 @ Quote Link to comment Short link Share on other sites More sharing options...
SoprachevAK Posted April 1 Author Share Posted April 1 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, но чего то простого не нашел. Я понимаю, что скорее всего можно вручную через добавление модельки, но наверняка есть готовый механизм, так же как и с миникартой @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted April 1 Share Posted April 1 (edited) 5 часов назад, SoprachevAK сказал: В топографии Это доступно только в топографии. В рандоме и других боях - это скорее всего нет. Нужно смотреть и проверять, что где доступно. Возможны ограничения. 5 часов назад, SoprachevAK сказал: там есть ещё много разных интересных маркеров, например NAVIGATION_MARKER и SHOOTING_MARKER, Это не для миникарты, это в бою GUI маркеры-индикаторы, например индикатор ХП над танком - VEHICLE_MARKER. У миникарты константы - вот. От ALLY_TEAM_BASE до FLAG_POINT_MARKER. Что из этого в рандоме сработает надо проверять вручную. И надо искать примеры вызова в исходниках чтоб было понятно какие аргументы передавать. Чтобы создать 3D маркер на игровом поле можно так делать import BigWorld from gui.shared.personality import ServicesLocator from gui.Scaleform.locale.INGAME_GUI import INGAME_GUI from frameworks.wulf import WindowLayer from helpers import i18n from Math import Vector3, createTranslationMatrix #Менеджер маркеров в бою battle = ServicesLocator.appLoader.getDefBattleApp() __markersManager = battle.containerManager.getContainer(WindowLayer.VIEW).getView()._external[1] markerPos = (0,0,0) #<--- координаты точки на игровом поле на уровне земли markerCurrentDistance = BigWorld.player().getOwnVehiclePosition().distTo(markerPos) MERKERS_ONWORLDMAP_TYPE = 'arrow' #Зеленая стрелка, еще вариант 'eye' - глаз MARKER_ONWORLDMAP_SCALE = 0.4 #Масштаб маркера MARKER_ONWORLDMAP_OFFSET = Vector3(0.0, 6.0, 0.0) #Смещение маркера относительно markerPos: +6 метров над землей #Создать маркер __canvas = __markersManager._MarkersManager__canvas if __canvas: matrixProv = createTranslationMatrix(markerPos + MARKER_ONWORLDMAP_OFFSET) __marker = __canvas.addMarker(matrixProv, 'StaticObjectMarker', True) #Предельные диапазоны где-то от 10 до 100, масштаб по умолчанию __canvas.markerSetMinScale(__marker, 100 * MARKER_ONWORLDMAP_SCALE) __canvas.markerInvoke(__marker, ('init', [MERKERS_ONWORLDMAP_TYPE, 50, 720, markerCurrentDistance, i18n.makeString(INGAME_GUI.MARKER_METERS), 'green'])) #Обновить цифры дистанции __canvas.markerInvoke(__marker, ('setDistance', [BigWorld.player().getOwnVehiclePosition().distTo(markerPos)])) #Удалить маркер __canvas.delMarker(__marker) В самой игре есть разные готовые классы, которые делают тоже самое - тыц. Edited April 1 by StranikS_Scan 1 @ Quote Link to comment Short link Share on other sites More sharing options...
SoprachevAK Posted April 1 Author Share Posted April 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', '') А там где можно рисовать точечки, можно ими закрашивать области) К тому же, если их пуллить, очень даже оптимально @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted April 1 Share Posted April 1 1 час назад, SoprachevAK сказал: А там где можно рисовать точечки, можно ими закрашивать области) К тому же, если их пуллить, очень даже оптимально На падение фпс и фризы проверь эти пуления. А еще там вроде были ограничения на число объектов, но это легко выявить банальной проверкой. @ Quote Link to comment Short link Share on other sites More sharing options...
SoprachevAK Posted April 1 Author Share Posted April 1 15 минут назад, StranikS_Scan сказал: На падение фпс и фризы проверь эти пуления. А еще там вроде были ограничения на число объектов, но это легко выявить банальной проверкой. Проверял ещё на старых маркерах, динамически двигаются раз в 5 секунд 1к – вообще никакой разницы 2к – фризов нет, но фпс уже начинает понижаться 10к – фпс падает до 15, появляются микрофризы, но скорее всего не от отрисовки, а от того что я там в цикле 10к раз invoke вызываю Учитывая, что я тестирую через виртуалку, как будто бы без видеокарты, думаю более чем пойдет. Само собой, нативно рисовать в спрайт внутри флеша будет оптимальнее, но это уже потом 1 @ Quote Link to comment Short link Share on other sites More sharing options...
SoprachevAK Posted April 2 Author Share Posted April 2 20 часов назад, StranikS_Scan сказал: Чтобы создать 3D маркер на игровом поле можно так делать Спасибо, получилось. Если последним параметром передать CommonMarkerType.LOCATION, то там можно ещё много других классных маркеров Интересно, что упоминание 'eye' в проекте в принципе не встречается, кроме пары автосгенерированных мест) canvas.markerSetSticky ещё добавляет в UI стрелочку до маркера, если он не на экране, а markerSetMarkerObjectInFocus автоматически рассчитывает и отображает дистанцию В рандоме тоже работает. Есть идеи куда копать для пунктирной обводки на земле? Кажется я слишком сильно парюсь для потенциально временного решения, но почему бы и не сделать хорошо, если это не сложно 1 @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted April 2 Share Posted April 2 5 часов назад, SoprachevAK сказал: Есть идеи куда копать для пунктирной обводки на земле? Через маркеры не знаю, не пользовался. А отдельным классом можно добавить гибкий круг на земле. См. from vehicle_systems.components.terrain_circle_component import TerrainCircleComponent from dyn_objects_cache import _TerrainCircleSettings 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Recommended Posts
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.