Jump to content
Korean Random
GPCracker

Улучшенная система прицеливания / Advanced Aiming System

Recommended Posts

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

подтверждаю, прицел залипает на грунт и не реагирует. Использую  AdvancedAimingSystem-NOLF в связке модпаком от протанки. питон приложил

python.log 32 kB · 1 скачивание

 

Там картоха в ганрораторе из __avatar сделал _avatar. Починю.

  • Upvote 2

Share this post


Link to post

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

 

Там картоха в ганрораторе из __avatar сделал _avatar. Починю.

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

Share this post


Link to post

Short link
Share on other sites

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

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 час назад, BuSH сказал:

Поправил тот плагинчик.

ты же вот это хотел вроде

Share this post


Link to post

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

Поправил тот плагинчик.
ПО ходу надо с гитом разбираться чтобы туда запулить правочку.

 

Правку покажи, исправлю в репо

Share this post


Link to post

Short link
Share on other sites

@Slava7572 та шо ты оффтопишь?! я уже тестю катаю )

@StranikS_Scan вот нашёл у себя 1.4.0.1

такой был класс когда ещё работала фича

class _GunMarkersFactories(object):

    def __init__(self, *factories):
        super(_GunMarkersFactories, self).__init__()
        self.__factories = factories

    def create(self, markersInfo, vehicleInfo):
        return self._create(markersInfo, vehicleInfo, components=None)

    def override(self, components, markersInfo, vehicleInfo):
        return self._create(markersInfo, vehicleInfo, components=components)

    def _create(self, markersInfo, vehicleInfo, components=None):
        markers = ()
        for factory in self.__factories:
            result = factory().create(markersInfo, vehicleInfo, components=components)
            if result:
                markers = markers + result

        return _components.GunMarkersComponents(markers)


class _GunMarkersFactory(object):

    def create(self, markersInfo, vehicleInfo, components=None):
        raise NotImplementedError

    @staticmethod
    def _findComponent(markerType, dataProvider, components, name):
        component = None
        if components is not None:
            component = components.popComponent(name)
            if component is not None:
                component.setDataProvider(markerType, dataProvider)
        return component


class _ControlMarkersFactory(_GunMarkersFactory):

    def create(self, markersInfo, vehicleInfo, components=None):
        if vehicleInfo.isSPG():
            markers = self._createSPGMarkers(markersInfo, components=components)
        else:
            markers = self._createDefaultMarkers(markersInfo, components=components)
        return markers

    def _createDefaultMarkers(self, markersInfo, components=None):
        if markersInfo.isServerMarkerActivated:
            dataProvider = markersInfo.serverMarkerDataProvider
            markerType = GUN_MARKER_TYPE.SERVER
        elif markersInfo.isClientMarkerActivated:
            dataProvider = markersInfo.clientMarkerDataProvider
            markerType = GUN_MARKER_TYPE.CLIENT
        else:
            dataProvider = None
            markerType = GUN_MARKER_TYPE.UNDEFINED
        return (self._createArcadeMarker(markerType, dataProvider, components=components), self._createSniperMarker(markerType, dataProvider, components=components))

    def _createSPGMarkers(self, markersInfo, components=None):
        if markersInfo.isServerMarkerActivated:
            dataProvider = markersInfo.serverMarkerDataProvider
            spgDataProvider = markersInfo.serverSPGMarkerDataProvider
            markerType = GUN_MARKER_TYPE.SERVER
        elif markersInfo.isClientMarkerActivated:
            dataProvider = markersInfo.clientMarkerDataProvider
            spgDataProvider = markersInfo.clientSPGMarkerDataProvider
            markerType = GUN_MARKER_TYPE.CLIENT
        else:
            dataProvider = None
            spgDataProvider = None
            markerType = GUN_MARKER_TYPE.UNDEFINED
        return (self._createArcadeMarker(markerType, dataProvider, components=components), self._createSPGMarker(markerType, spgDataProvider, components=components))

    def _createArcadeMarker(self, markerType, dataProvider, components=None, name=_CONSTANTS.ARCADE_GUN_MARKER_NAME, linkage=_CONSTANTS.GUN_MARKER_LINKAGE):
        component = self._findComponent(markerType, dataProvider, components, name)
        if component is None:
            component = _components.DefaultGunMarkerComponent(markerType, _VIEW_ID.ARCADE, name, linkage, dataProvider)
        return component

    def _createSniperMarker(self, markerType, dataProvider, components=None, name=_CONSTANTS.SNIPER_GUN_MARKER_NAME, linkage=_CONSTANTS.GUN_MARKER_LINKAGE):
        component = self._findComponent(markerType, dataProvider, components, name)
        if component is None:
            component = _components.DefaultGunMarkerComponent(markerType, _VIEW_ID.SNIPER, name, linkage, dataProvider)
        return component

    def _createSPGMarker(self, markerType, dataProvider, components=None, name=_CONSTANTS.SPG_GUN_MARKER_NAME, linkage=_CONSTANTS.GUN_MARKER_SPG_LINKAGE):
        component = self._findComponent(markerType, dataProvider, components, name)
        if component is None:
            component = _components.SPGGunMarkerComponent(markerType, _VIEW_ID.STRATEGIC, name, linkage, dataProvider)
        return component

 

отвалилось вроде в 1.6... но сейчас он выглядит так

class _GunMarkersFactory(object):
    __slots__ = ('_components', '_markersInfo', '_vehicleInfo')

    def __init__(self, markersInfo, vehicleInfo, components=None):
        super(_GunMarkersFactory, self).__init__()
        self._components = components
        self._markersInfo = markersInfo
        self._vehicleInfo = vehicleInfo

    def create(self):
        raise NotImplementedError

    def _findMarker(self, name):
        marker = None
        if self._components is not None:
            marker = self._components.popComponent(name)
        return marker

    def _createMarker(self, componentClass, viewId, markerType, dataProvider, name, isActive=False):
        marker = self._findMarker(name)
        if marker is not None:
            marker.setDataProvider(markerType, dataProvider)
            return marker
        else:
            linkage = _GUN_MARKER_LINKAGES[name]
            return componentClass(markerType, viewId, name, linkage, dataProvider, isActive)

    def _getMarkerDataProvider(self, markerType):
        if markerType is GUN_MARKER_TYPE.SERVER:
            return self._markersInfo.serverMarkerDataProvider
        else:
            return self._markersInfo.clientMarkerDataProvider if markerType is GUN_MARKER_TYPE.CLIENT else None

    def _getSPGDataProvider(self, markerType):
        if markerType is GUN_MARKER_TYPE.SERVER:
            return self._markersInfo.serverSPGMarkerDataProvider
        else:
            return self._markersInfo.clientSPGMarkerDataProvider if markerType is GUN_MARKER_TYPE.CLIENT else None


class _ControlMarkersFactory(_GunMarkersFactory):

    def create(self):
        if self._vehicleInfo.isSPG():
            markers = self._createSPGMarkers()
        elif self._vehicleInfo.isDualGunVehicle():
            markers = self._createDualGunMarkers()
        else:
            markers = self._createDefaultMarkers()
        return markers

    def _getMarkerType(self):
        if self._markersInfo.isServerMarkerActivated:
            return GUN_MARKER_TYPE.SERVER
        return GUN_MARKER_TYPE.CLIENT if self._markersInfo.isClientMarkerActivated else GUN_MARKER_TYPE.UNDEFINED

    def _createDualGunMarkers(self):
        markerType = self._getMarkerType()
        return (self._createArcadeMarker(markerType, name=_CONSTANTS.DUAL_GUN_ARCADE_MARKER_NAME), self._createSniperMarker(markerType, name=_CONSTANTS.DUAL_GUN_SNIPER_MARKER_NAME))

    def _createDefaultMarkers(self):
        markerType = self._getMarkerType()
        return (self._createArcadeMarker(markerType, name=_CONSTANTS.ARCADE_GUN_MARKER_NAME), self._createSniperMarker(markerType, name=_CONSTANTS.SNIPER_GUN_MARKER_NAME))

    def _createSPGMarkers(self):
        markerType = self._getMarkerType()
        return (self._createArcadeMarker(markerType, name=_CONSTANTS.ARCADE_GUN_MARKER_NAME), self._createSPGMarker(markerType, name=_CONSTANTS.SPG_GUN_MARKER_NAME))

    def _createArcadeMarker(self, markerType, name):
        dataProvider = self._getMarkerDataProvider(markerType)
        return self._createMarker(DefaultGunMarkerComponent, _VIEW_ID.ARCADE, markerType, dataProvider, name)

    def _createSniperMarker(self, markerType, name):
        dataProvider = self._getMarkerDataProvider(markerType)
        return self._createMarker(DefaultGunMarkerComponent, _VIEW_ID.SNIPER, markerType, dataProvider, name)

    def _createSPGMarker(self, markerType, name):
        dataProvider = self._getSPGDataProvider(markerType)
        return self._createMarker(SPGGunMarkerComponent, _VIEW_ID.STRATEGIC, markerType, dataProvider, name)

типичный рефакторинг при введении двустволок и хукнутый метод раздербанили на мелкие

 

ну я просто  выкинул то что стало лишним

 

from gui.Scaleform.genConsts.GUN_MARKER_VIEW_CONSTANTS import GUN_MARKER_VIEW_CONSTANTS as _CONSTANTS

def new_ControlMarkersFactory_createSPGMarkers(old_ControlMarkersFactory_createSPGMarkers, self):
	result = old_ControlMarkersFactory_createSPGMarkers(self)
	if self._markersInfo.isServerMarkerActivated:
		markerType = aih_constants.GUN_MARKER_TYPE.SERVER
	elif self._markersInfo.isClientMarkerActivated:
		markerType = aih_constants.GUN_MARKER_TYPE.CLIENT
	else:
		markerType = aih_constants.GUN_MARKER_TYPE.UNDEFINED
	return result + (self._createSniperMarker(markerType, name=_CONSTANTS.SNIPER_GUN_MARKER_NAME), )

 

этот же метод в текущей версии мода
 

def new_ControlMarkersFactory_createSPGMarkers(old_ControlMarkersFactory_createSPGMarkers, self, markersInfo, components=None):
	result = old_ControlMarkersFactory_createSPGMarkers(self, markersInfo, components=components)
	if markersInfo.isServerMarkerActivated:
		dataProvider = markersInfo.serverMarkerDataProvider
		markerType = aih_constants.GUN_MARKER_TYPE.SERVER
	elif markersInfo.isClientMarkerActivated:
		dataProvider = markersInfo.clientMarkerDataProvider
		markerType = aih_constants.GUN_MARKER_TYPE.CLIENT
	else:
		dataProvider = None
		markerType = aih_constants.GUN_MARKER_TYPE.UNDEFINED
	return result + (self._createSniperMarker(markerType, dataProvider, components=components), )

https://github.com/StranikS-Scan/AdvancedAimingSystem-NOLF/blob/1.7.x/source/res/scripts/client/gui/mods/.submodules/source/plugins/SniperModeSPGExtension.py

ну и забыл импорт
тупо картохин без самодеятельности
from gui.Scaleform.genConsts.GUN_MARKER_VIEW_CONSTANTS import GUN_MARKER_VIEW_CONSTANTS as _CONSTANTS

Edited by BuSH
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
On 1/4/2020 at 3:08 AM, Coluchiy said:

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

Это не глюк. В режиме корректировки дальномера препятствия не учитываются (в противном случае теряется основной смысл корректировки дальномера - вертикальная стабилизация орудия на границе перекрывающего цель объекта). Вся интересующая тебя математика расчетов прописана здесь. За маркер орудия отвечает отдельный алгоритм интегрального (рассчитывается по точкам) баллистического (с учетом траектории полета снаряда) теста на столкновения, там учитываются все влияющие на полет снаряда объекты.

On 1/4/2020 at 3:08 AM, Coluchiy said:

Что именно исправляет участок, включаемый по Ctrl+K, и опция "fixGunMarker" ?

Когда удаленная цель перекрыта близким объектом, маркер орудия отображается выше перекрестия прицела. Когда близкая цель маячит на фоне неба или далекого ландшафта, маркер орудия будет проваливаться существенно ниже перекрестия прицела, поскольку точками прерывания баллистического коллижн-теста могут быть только твердые (влияющие на полет снаряда) объекты или же граница локации. Первую проблему без кучи костылей и велосипедов решить нереально, да и смысла особого в этом нет, поскольку это своего рода маркер, показывающий игроку, что какой-то близкий суслик (его вроде не видно, а он есть) мешает стрелять. Для второй проблемы есть плагин AimCorrectionGunMarkerFix, подключаемый в нужном режиме прицеливания как раз таки через этот самый параметр.

On 1/4/2020 at 3:33 AM, Coluchiy said:

А опции fixGunMarker и arcadeAimCorrection/targetMode - есть простое их разъяснение? Чтобы понять что это и нужно ли оно мне...

Есть два режима выбора дистанции для корректировки дальномера - ручной, когда удерживается клавиша, и автоматический, когда дистанция определяется с учетом выбранной игроком цели в автоматическом режиме. За целеуказание (механизм определения наиболее вероятной цели игрока) отвечает модуль TargetScanner, его параметры настраиваются здесь. В некоторых ситуациях скрипты модификации могут не совсем корректно понимать интересы игрока, поэтому отключать информационные панели не рекомендуется. Параметры графического интерфейса настраиваются здесь, сам интерфейс на работу модулей целеуказания и корректировки дальномера влияет так же, как линейка на размер... монитора, то есть никак, информационные панели нужны исключительно для контроля за текущим состоянием (которое иногда может отличаться от ожидаемого игроком).

On 1/4/2020 at 3:26 AM, Scharfhobel said:

Мод ничего не корректирует и ничего не наводит никуда. Он вообще не управляет пушкой, иначе это был бы чит.

Точка прицеливания (куда именно наводится орудие) трехмерная, а прицел у игрока двухмерный (вверх-вниз, влево-вправо). Параметром дальности управляет система прицеливания в игре в автоматическом режиме, причем незаметно для игрока. Корректировка дальномера влияет лишь на выбор расчетной дальности, определяющей угол возвышения орудия (для понимания сути вопроса настоятельно рекомендую ознакомиться со старой советской литературой), в само же прицеливание, то есть наведение орудия на цель (то, что игрок обычно делает мышкой), модификация не вмешивается (заранее оставлю специальное отдельное пояснение для особо одаренных - модификация ни на слабые точки, ни на танки в целом орудие не наводит, на упреждение никого не берет). По сути Advanced Aiming System делает то же самое, что и BalCalcMod от Ktod, только в автоматическом режиме. По умолчанию орудие в игре наводится на ближайшее твердое препятствие (линейный коллижн-тест в точке перекрестия прицела), влияющее на полет снаряда (ландшафт, элементы окружения локации, танки противника, граница локации). Стандартный алгоритм прост и примитивен, но у него есть существенные проблемы, вызывающие регулярное адское воспламенение пятых точек танкистов, у которых руки не под хрен заточены. Во-первых, нереально нормально выстрелить в точку, где танка противника еще пока нет, но он там будет в момент подлета снаряда. Иными словами, проблематична стрельба из любых бревнометов (орудий с низкой скоростью полета снаряда) по любому движущемуся или играющему от башни противнику, стрельба на упреждение на фоне далекого ландшафта или границы локации. Во-вторых, выбивание разного рода сусликов (которые вроде как и не светятся, но они там есть, ибо ваша лампочка не может срабатывать сама по себе) из кустов на фоне неба тоже порой вызывает, мягко выражаясь, проблемы (происходят регулярные так называемые перелеты, когда снаряд пролетает аккуратно над целью вместо попадания в нее). В-третьих, стоять и отхватывать откровенно излишних проблем со здоровьем в ожидании нормализации орудия по дистанции стрельбы после выезда из-за угла (а иначе вместо выстрела происходит какой-то плевок в землю) тоже мало кого прикалывает. А собственно, весь этот приход белого пушного зверька происходит по одной лишь простой причине - нарисованные танкисты не в курсе, что адекватный игрок принципиально не собирается обстреливать ландшафт, здания, границу локации и прочие статичные объекты, у него только одна цель - танки противника. А потому и дальномер нужно выставлять согласно дальности до противника, а не до хрен знает чего (не, ну логично же, блин). Почему этого до сих пор не поняла картошка, спросите вы? Ну так адекватные товарищи, которые изначально занимались разработкой системы прицеливания в игре, это понимали, но нормально решить данную проблему автоматического дальномера можно только лишь отказавшись от автоматического дальномера вовсе, то есть реализовав прицеливание по принципу снайперских винтовок в Battlefield 4 или Sniper Ghost Warrior, но любой подобный вариант был бы слишком сложным для целевой аудитории, а еще бы негативно влиял на динамичность игры. А если же решать эту проблему в рамках автоматического дальномера, то все сводится к сложной системе целеуказания, для нормальной работы которой без прямого вмешательства игрока (вроде нажимания и зажимания кнопок на клавиатуре и тому подобной фигни, совершенно неприемлемой для большого проекта, ориентированного на домохозяев) необходимо написать кода на несколько тысяч строк как минимум, если не больше (примерно столько же, сколько сейчас занимают основные модули модификации и все необходимые функции из библиотеки). И еще при этом каким-то образом объяснить целевой аудитории, как это все работает. Учитывая относительно незначительный процент людей с мозгами (замечающих данную проблему) и элементарным чувством собственного достоинства (не привыкших жрать кактус), все это дело совершенно никак с точки зрения большого бизнеса не оправдано, а потому на исправление данного косяка успешно и невообразимо надолго забили болт и положили еще один сверху. А те разработчики, что пришли уже позже, так и вообще не понимают толком, о чем там речь идет, и чего старожилы и редкие новички до сих пор периодически бомбят в профильных темах. В общем, данная проблема изначально решалась (и до сих пор решается) исключительно силами сообщества.

On 1/4/2020 at 3:26 AM, Scharfhobel said:

Он просто строит плоскость на заданном расстоянии. И при вашем прицеливании точка прицеливания движется по этой плоскости.

Оставлю это здесь на всякий случай. Не стоит путать понятия "точка прицеливания" и "точка построения маркера орудия" (или просто "маркер орудия"). Маркер орудия (gun marker) - так внутри скриптов официально называется "сведение". Точка построения маркера орудия трехмерная, и является результатом интегрального баллистического коллижн-теста. Центр "сведения" - это проекция точки построения маркера орудия на экран монитора. Что касается точки прицеливания, она тоже трехмерная, но ее проекция всегда находится в середине перекрестия прицела (неподвижной части графического интерфейса). Если перевести сказанное выше на язык артиллеристов, то точка прицеливания - это место, куда пытается навести артиллерийскую батарею (танк на сервере) корректировщик (клиент игры), а точка построения маркера орудия - место, где по расчетам (теоретически) артиллеристов (серверный прицел) или корректировщика (клиентский прицел) снаряд должен столкнуться с каким-то твердым препятствием, если выстрелить прямо сейчас, не дожидаясь полноценного наведения орудия на цель.

On 1/10/2020 at 2:38 AM, •••YURASIK••• said:

Подскажите, за что отвечает параметр <aimingThreshold>?

Все дело в том, что орудие в игре сводится экспоненциально. Это пороговое отношение множителей разброса (текущего к минимальному), ниже которого можно условно считать сведение полным (математику можно посмотреть здесь).

 

#точка-прицеливания #aiming-point #маркер-орудия #gun-marker #сведение #корректировка-дальномера #aiming-correction #провал-сведения #сканер-целей #target-scanner #частые-вопросы #faq

  • Upvote 6

Share this post


Link to post

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

 

Спасибо! У меня не получилось русский поставить, всё время ошибку выдавало, хоть и паковал без сжатия!

Share this post


Link to post

Short link
Share on other sites

Может кто-то объяснить пож-та. Мод автоматически работает? Как в ручном режиме корректировать прицел? Где настраивается горячая кнопка?

Share this post


Link to post

Short link
Share on other sites
08.02.2020 в 08:51, StranikS_Scan сказал:

@BuSH  поправил плагин тыц, проверь работоспособность.

ЗЫ: Изменения - тыц.

А можно ли таким же образом поправить мод mod_sniperByScroll.py от spoter-а?

Он работает, но спамит в питон лог.

Цитата

 

 

Edited by Scharfhobel

Share this post


Link to post

Short link
Share on other sites

@Scharfhobel до того дня как я выложил исправление, его мод ничего подобного в лог не писал.

Share this post


Link to post

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

@Scharfhobel до того дня как я выложил исправление, его мод ничего подобного в лог не писал.

ок, проверю еще раз..

Share this post


Link to post

Short link
Share on other sites

It seems to work with version 1.8.0.0
Вроде работает с версией 1.8.0.0.

Edited by Scanmen
  • Upvote 1

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...