ktulho 5,791 Posted February 1, 2019 Так как, большинство py_macro используется в battleLabels, предлагаю вынести в какой-либо файл переменную, которая будет возвращать True, если в данном режиме боев поддерживаются battleLabels. Пример кода: import BigWorld from Avatar import PlayerAvatar from Vehicle import Vehicle from constants import ARENA_GUI_TYPE isBLSupported = True def _isBLSupported(player): global isBLSupported isBLSupported = player.arenaGuiType not in [ARENA_GUI_TYPE.EPIC_BATTLE, ARENA_GUI_TYPE.EVENT_BATTLES] @registerEvent(PlayerAvatar, 'onBecomePlayer') def PlayerAvatar_onBecomePlayer(self): _isBLSupported(self) @registerEvent(Vehicle, 'onEnterWorld') def Vehicle_onEnterWorld(self, prereqs): if self.isPlayerVehicle: _isBLSupported(BigWorld.player()) Это позволит централизовано отключать py_macro для режимов боев, в которых не поддерживаются battleLabels. Вопрос в каком файле разместить этот или более оптимальный код ? 1 Quote Share this post Link to post Short link Share on other sites
sirmax 5,499 #449362 Posted February 1, 2019 (edited) может просто массив с допустимыми режимами сделать? а проверку уже каждый в своем скрипте сделает, если нужно. Edited February 1, 2019 by sirmax Quote Share this post Link to post Short link Share on other sites
night_dragon_on 5,601 #449363 Posted February 1, 2019 (edited) 2 часа назад, ktulho сказал: или более оптимальный код ? Зачем получать тип боя из клиента когда нам он и так известен. Мы полноценно можем использовать то что нам отдает макрос {{battletype-key}} Достаточно отправить тип боя: {{py:check('{{battletype-key}}')}} Сравнить с предполагаемым списком исключений: @xvm.export('check', deterministic=True) def check(battletype): if battletype not in ['tutorial', 'event_battles', 'bootcamp', 'epic_random', 'epic_random_training']: return True else: return False И получить результат относительно которого оперировать с тем что прописано в battleLabels/battleLabelsTemplates Эта проверка врятли будет нужна т.к. если режим боя "battleLabels" не поддерживает, например "Линия фронта" то и соответствующая секция конфига по идее не задействуется и все что в ней прописано ("py_macro" в том числе) не должно в фоне работать без возможности отображения. Edited February 1, 2019 by night_dragon_on Quote Share this post Link to post Short link Share on other sites
ktulho 5,791 #449364 Posted February 1, 2019 (edited) 50 минут назад, night_dragon_on сказал: Достаточно отправить тип боя: {{py:check('{{battletype-key}}')}} Сравнить с предполагаемым списком исключений: @xvm.export('check', deterministic=True) def check(battletype): if battletype not in ['tutorial', 'event_battles', 'bootcamp', 'epic_random', 'epic_random_training']: return True else: return False И получить результат относительно которого оперировать с тем что прописано в battleLabels/battleLabelsTemplates Что-то не очень понял. Как-то это кривовато. Да и зачем эту проверку взваливать на пользователя (создателя конфига)? 50 минут назад, night_dragon_on сказал: Эта проверка врятли будет нужна т.к. если режим боя battleLabels не поддерживает, например "Линия фронта" то и соответствующая секция конфига не задействуется и все что в ней прописано не должно по идее в фоне работать без возможности отображения. О том и речь. Ни чего не отображается, а код все равно исполняется. 1 час назад, sirmax сказал: может просто массив с допустимыми режимами сделать? а проверку уже каждый в своем скрипте сделает, если нужно. Этот вариант мне тоже нравиться. Но придется в каждом скрипте прописывать что-то вроде (предположим что массив называется listBL): import BigWorld from Avatar import PlayerAvatar from Vehicle import Vehicle isBLSupported = True def _isBLSupported(player): global isBLSupported isBLSupported = player.arenaGuiType not in listBL @registerEvent(PlayerAvatar, 'onBecomePlayer') def PlayerAvatar_onBecomePlayer(self): _isBLSupported(self) @registerEvent(Vehicle, 'onEnterWorld') def Vehicle_onEnterWorld(self, prereqs): if self.isPlayerVehicle: _isBLSupported(BigWorld.player()) Edited February 1, 2019 by ktulho Quote Share this post Link to post Short link Share on other sites
night_dragon_on 5,601 #449366 Posted February 1, 2019 (edited) 41 минуту назад, ktulho сказал: О том и речь. Ни чего не отображается, а код все равно исполняется. 41 минуту назад, ktulho сказал: Но придется в каждом скрипте прописывать что-то вроде Может можно будет обойтись: 2 часа назад, sirmax сказал: просто массив с допустимыми режимами сделать Далее проверку добавить в: xvm\src\xvm\xvm_battle\com\xvm\battle\battleLabels\BattleLabels.as private function createExtraFields():void { try { var cfg:CBattleLabels = Config.config.battleLabels; Если режим поддерживает их вывод (тип боя имеется в массиве), то подгружаем все что в секции конфига "battleLabels", в противном случае - нет. Edited February 1, 2019 by night_dragon_on Quote Share this post Link to post Short link Share on other sites
ktulho 5,791 #449368 Posted February 1, 2019 13 минут назад, night_dragon_on сказал: Так должны избавится от фонового исполнения кода "py_macro" Все что под декораторами @registerEvent и @overrideMethod всё равно будет выполняться. Quote Share this post Link to post Short link Share on other sites
night_dragon_on 5,601 #449369 Posted February 1, 2019 @ktulho , хотя бы частично. Тогда без: 45 минут назад, ktulho сказал: придется в каждом скрипте прописывать Не обойтись. Quote Share this post Link to post Short link Share on other sites
ktulho 5,791 #449370 Posted February 1, 2019 (edited) @night_dragon_on если сделать как я предлагаю, то в функциях под декораторами нужно будет писать: @декоратор def a(): if isBLSupported: код По моему это самый короткий вариант. Ну или проверку опционально включить в сам декоратор. Edited February 1, 2019 by ktulho Quote Share this post Link to post Short link Share on other sites
sirmax 5,499 #449385 Posted February 2, 2019 ок, можно. Quote Share this post Link to post Short link Share on other sites
ktulho 5,791 #449388 Posted February 2, 2019 38 минут назад, sirmax сказал: ок, можно. Какой вариант? Если первый, то в какой файл? utils.py? Или этот вариант: 13 часов назад, ktulho сказал: Ну или проверку опционально включить в сам декоратор. Quote Share this post Link to post Short link Share on other sites
ktulho 5,791 #449718 Posted February 6, 2019 (edited) Еще один вариант. В xvm_battle/python/battle.py добавить ( + отметил новые строчки): + # Battle modes in which BattleLabels are not supported. + NOT_SUPPORT_BATTLE_MODE = [constants.ARENA_GUI_TYPE.EPIC_BATTLE, constants.ARENA_GUI_TYPE.EVENT_BATTLES] + + _isBLSupported = True + + def overrideMethodInBattle(func): + + def decorator(*a, **k): + if _isBLSupported: + return func(*a, **k) + else: + base, _a = a[0], a[1:] + return base(*_a, **k) + + decorator.__name__ = func.__name__ + return decorator + + def registerEventInBattle(func): + + def decorator(*a, **k): + if _isBLSupported: + return func(*a, **k) + + decorator.__name__ = func.__name__ + return decorator + @overrideMethod(PlayerAvatar, 'onBecomePlayer') def _PlayerAvatar_onBecomePlayer(base, self): + global _isBLSupported base(self) try: arena = avatar_getter.getArena() if arena: + _isBLSupported = arena.guiType not in NOT_SUPPORT_BATTLE_MODE ... В py_macro использовать: from xvm_battle.python.battle import registerEventInBattle, overrideMethodInBattle @overrideMethod(a, 'func') @overrideMethodInBattle def b(): ... @registerEvent(a, 'func') @registerEventInBattle def c(): ... Edited February 6, 2019 by ktulho 1 Quote Share this post Link to post Short link Share on other sites
ktulho 5,791 #450706 Posted February 14, 2019 В общем, если возражений не будет, запулю вариант с глобальной переменной isBattleModeSupported, в файле xvm_battle/python/battle.py. 2 Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #450710 Posted February 14, 2019 (edited) 36 minutes ago, ktulho said: isBattleModeSupported Думаю, вместо "mode" лучше использовать "type". Edited February 14, 2019 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
ktulho 5,791 #450713 Posted February 14, 2019 35 минут назад, Kotyarko_O сказал: Думаю, вместо "mode" лучше использовать "type". Ок. Quote Share this post Link to post Short link Share on other sites
HEKPOMAHT 2,169 #450777 Posted February 14, 2019 11 часов назад, ktulho сказал: Ок. по миникарте возникли вопросы. Новую тему создавать или тут описать? засыпано: 2019-02-15 00:17:16: [ERROR] Traceback (most recent call last): File "res_mods/mods/xfw_packages\xvm_battle\python\battle.py", line 332, in updatePlayerState data['spottedStatus'] = self.getSpottedStatus(vehicleID) File "res_mods/mods/xfw_packages\xvm_battle\python\battle.py", line 272, in getSpottedStatus return self._spotted_cache.get(vehicleID, SPOTTED_STATUS.NEVER_SEEN) AttributeError: 'Battle' object has no attribute '_spotted_cache' 2019-02-15 00:17:24: [ERROR] Traceback (most recent call last): File "res_mods/mods/xfw_packages\xvm_battle\python\battle.py", line 186, in _ArenaVehiclesPlugin__setInAoI g_battle.updateSpottedStatus(vehicleID, isInAoI) File "res_mods/mods/xfw_packages\xvm_battle\python\battle.py", line 323, in updateSpottedStatus if self.getSpottedStatus(vehicleID) != spotted_status: File "res_mods/mods/xfw_packages\xvm_battle\python\battle.py", line 272, in getSpottedStatus return self._spotted_cache.get(vehicleID, SPOTTED_STATUS.NEVER_SEEN) AttributeError: 'Battle' object has no attribute '_spotted_cache' 1 Quote Share this post Link to post Short link Share on other sites
Arni Ex 95 #450915 Posted February 17, 2019 В 14.02.2019 в 18:48, ktulho сказал: запулю вариант с глобальной переменной isBattleModeSupported, в файле xvm_battle/python/battle.py. А в каком билде это реализовано, в Build: 8791? Quote Share this post Link to post Short link Share on other sites
night_dragon_on 5,601 #450922 Posted February 17, 2019 @Arni Ex Build: 8790 (branch default) Это последнее исправление, начальный билд: Build: 8788 (branch default) 1 Quote Share this post Link to post Short link Share on other sites