Jump to content
Korean Random

Добавить слой на миникарту


Recommended Posts

Я хочу сделать мод с динамическими позициями на миникарте. То есть в бою будет отправляться запрос на сервер, а тот вернёт наилучшие позиции. (Знаю звучит как чит на ВХ, но я таким не занимаюсь)

И собственно встал вопрос, как добавить что то на миникарту. Меня наверное интересует возможность программно из питона нарисовать линии и квадратики. В качестве упрощения, пойдёт просто отрисовать на миникарте слой картинки с прозрачным фоном. Слой между основными маркерами и подложной, чтоб не закрывал танки

Я прочёл кучу тем посвящённые UI (из популярных наверное все), поползал по исходникам GPCracker, попытался поползать по XVM, но не осилил. Общее понимание у меня появилось, но чего то не хватает. Везде код и статьи очень старые 8+ лет назад, глобально наверное ничего не поменялось, но всё равно тяжело

В исходниках танков нашел всякие ClassicMinimapPingPlugin и прочие плагины, и вот они выглядят приемлемо. 

Собственно вопрос в том, насколько это всё тяжко, и стоит ли вообще пытаться вникнуть? Как будто бы самое близкое к моей задаче это направление орудий на миникарте https://github.com/GPCracker/MinimapGunMarkers/tree/v0.1.12, если маркером сделать нужный мне квадратик, как будто бы можно будет заспавнить кучу и программно задать ему цвет

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

Пример того, как хочу отображать
image.thumb.png.26dd0cf7cacce5ac78728d519dc5e691.png

Link to comment
Short link
Share on other sites

Posted (edited)

Я понимаю, что делать за меня никто ничего не будет, но если вдруг кто нибудь верит в коммерческую успешность, и хочет продавать его вместе со мной, то я готов взять в долю. Я хочу продавать такую штуку по подписке, и верю, что покупатели найдутся. Я попробовал сам, строил позиции вручную во время отсчёта, и оно сильно помогает, особенно когда я года три не играл. 

А ВГ (леста) не должны забанить, если продвигать это под лозунгом "поможем старым игрокам адаптироваться в игре" 

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

Edited by SoprachevAK
  • Upvote 1
Link to comment
Short link
Share on other sites

А динамически нужно, тк хочу несколько раз за бой менять позиции в зависимости от таймера. В начале показывать позиции актуальные на первые 2-3 минуты, потом на 4-6 (там появляются позиции для дефа)

Хорошо видно на степях, хотя сами тепловые карты пока прототип 
582543987_2024-03-1007_03_44.thumb.png.b05b77872edc55d4f70131d70874c893.png618380967_2024-03-1007_05_42.thumb.png.5a36c9bf73feaf5ef47bc61c06329b52.png

  • Upvote 1
Link to comment
Short link
Share on other sites

Я бы копал в сторону того как в XVM реализовано рисование точек и стрелочек на карте (кейворд: XMQP). Заодно чтобы сразу понимать, как сделать всё совместимым с XVM.

  • Upvote 1
Link to comment
Short link
Share on other sites

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 сказал:

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

 

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

 

image.png.5eb1aa21f069b2ef80de2fd9e87b8ba1.png

 

Код вот такой:

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 by StranikS_Scan
  • Upvote 2
Link to comment
Short link
Share on other sites

Я в этом не разбираюсь, но появился вопрос.

Надо именно на миникарту или просто на соответствующую область экрана?

Link to comment
Short link
Share on other sites

12 часов назад, yepev сказал:

XVM реализовано рисование точек и стрелочек на карте (кейворд: XMQP)

Благодарю за наводку, гляну
 

 

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

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

Тонкий момент. Я хочу в реальном времени, на основе информации мгновенно доступной игроку (хп команд, таймер боя, счёт), отображать рекомендации, статически просчитанные на ранее полученных данных)  Шансы есть)
Так то никакой информации недоступной игроку, или для которой нужно сделать дополнительные действия, я не планирую использовать.

 

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

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

Да, это определённо подойдёт для прототипа, спасибо большое! И код даже выглядит совсем не страшно. А потом с прототипом пойду к протанкам, если сам не разберусь в xvm. 

Я тут ещё подумал, что через DAAPI должен быть способ заменить саму картинку миникарту на свою, а значит можно на питоне отрендерить bitmap'у которую накладывать на текущую картинку миникарты и отправлять во флеш. Если конечно миникарты на каждую карту не вкомпилины во флеш 

Link to comment
Short link
Share on other sites

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

Я в этом не разбираюсь, но появился вопрос.

Надо именно на миникарту или просто на соответствующую область экрана?

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

Link to comment
Short link
Share on other sites

  • 2 weeks later...
Posted (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 by SoprachevAK
  • Upvote 1
Link to comment
Short link
Share on other sites

  • 2 weeks later...
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

 

 

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

 

 

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

 

image.png.5eb1aa21f069b2ef80de2fd9e87b8ba1.png

 

Код вот такой:


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 для пропавшей из засвета техники с пустым названием, но создать что то подобное у меня не получилось, может есть пример. 
image.thumb.png.d436988bdcaea6e932438bce0ef7bbd1.png

Вопрос 2. В топографии есть два вот таких вот 3д маркера, как делать их? Искал по maps training, но чего то простого не нашел. Я понимаю, что скорее всего можно вручную через добавление модельки, но наверняка есть готовый механизм, так же как и с миникартой
image.thumb.png.4b9ff250585242ec94249b1dadfa55bc.pngimage.thumb.png.f77100ea51f5d59282f6392a4409e641.png

Link to comment
Short link
Share on other sites

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 by StranikS_Scan
  • Upvote 1
Link to comment
Short link
Share on other sites

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

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

Вот этого я не учёл, спасибо
 

 

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

Это не для миникарты, это в бою GUI маркеры-индикаторы

Да, действительно перепутал когда писал, имел ввиду эти два SHOOTING_POINT_MARKER NAVIGATION_POINT_MARKER, в обычных боях работают
image.png.2fa286159565c243ab6909828bf3bb27.png

Точечки тоже получились, я понял в чём проблема была, там 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', '')

image.png.5a687674b7882c24602df4cea8d47bf5.png

А там где можно рисовать точечки, можно ими закрашивать области) К тому же, если их пуллить, очень даже оптимально

Link to comment
Short link
Share on other sites

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

А там где можно рисовать точечки, можно ими закрашивать области) К тому же, если их пуллить, очень даже оптимально

 

На падение фпс и фризы проверь эти пуления. А еще там вроде были ограничения на число объектов, но это легко выявить банальной проверкой.

Link to comment
Short link
Share on other sites

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

 

На падение фпс и фризы проверь эти пуления. А еще там вроде были ограничения на число объектов, но это легко выявить банальной проверкой.

Проверял ещё на старых маркерах, динамически двигаются раз в 5 секунд
1к – вообще никакой разницы
2к – фризов нет, но фпс уже начинает понижаться
10к – фпс падает до 15, появляются микрофризы, но скорее всего не от отрисовки, а от того что я там в цикле 10к раз invoke вызываю

Учитывая, что я тестирую через виртуалку, как будто бы без видеокарты, думаю более чем пойдет. 
Само собой, нативно рисовать в спрайт внутри флеша будет оптимальнее, но это уже потом

image.thumb.png.bd50855895fcaeac21e31b58165336f7.png
image.thumb.png.0647a574385357c403d944612665c2f0.png

  • Upvote 1
Link to comment
Short link
Share on other sites

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

Чтобы создать 3D маркер на игровом поле можно так делать

Спасибо, получилось. Если последним параметром передать CommonMarkerType.LOCATION, то там можно ещё много других классных маркеров
Интересно, что упоминание 'eye' в проекте в принципе не встречается, кроме пары автосгенерированных мест)

canvas.markerSetSticky ещё добавляет в UI стрелочку до маркера, если он не на экране, а markerSetMarkerObjectInFocus автоматически рассчитывает и отображает дистанцию 

В рандоме тоже работает. 
image.thumb.png.78a5d14807969092dc43981dd6d3888a.png

Есть идеи куда копать для пунктирной обводки на земле?
image.png.7f2208ab4d24618b904d50290a18c17c.png

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

  • Upvote 1
Link to comment
Short link
Share on other sites

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

Есть идеи куда копать для пунктирной обводки на земле?

 

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

 

from vehicle_systems.components.terrain_circle_component import TerrainCircleComponent
from dyn_objects_cache import _TerrainCircleSettings

 

 

  • Upvote 1
Link to comment
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...