ktulho Posted February 1, 2019 Share 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 Link to comment Short link Share on other sites More sharing options...
sirmax Posted February 1, 2019 Share Posted February 1, 2019 (edited) может просто массив с допустимыми режимами сделать? а проверку уже каждый в своем скрипте сделает, если нужно. Edited February 1, 2019 by sirmax @ Quote Link to comment Short link Share on other sites More sharing options...
night_dragon_on Posted February 1, 2019 Share 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 Link to comment Short link Share on other sites More sharing options...
ktulho Posted February 1, 2019 Author Share 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 Link to comment Short link Share on other sites More sharing options...
night_dragon_on Posted February 1, 2019 Share 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 Link to comment Short link Share on other sites More sharing options...
ktulho Posted February 1, 2019 Author Share Posted February 1, 2019 13 минут назад, night_dragon_on сказал: Так должны избавится от фонового исполнения кода "py_macro" Все что под декораторами @registerEvent и @overrideMethod всё равно будет выполняться. @ Quote Link to comment Short link Share on other sites More sharing options...
night_dragon_on Posted February 1, 2019 Share Posted February 1, 2019 @ktulho , хотя бы частично. Тогда без: 45 минут назад, ktulho сказал: придется в каждом скрипте прописывать Не обойтись. @ Quote Link to comment Short link Share on other sites More sharing options...
ktulho Posted February 1, 2019 Author Share Posted February 1, 2019 (edited) @night_dragon_on если сделать как я предлагаю, то в функциях под декораторами нужно будет писать: @декоратор def a(): if isBLSupported: код По моему это самый короткий вариант. Ну или проверку опционально включить в сам декоратор. Edited February 1, 2019 by ktulho @ Quote Link to comment Short link Share on other sites More sharing options...
sirmax Posted February 2, 2019 Share Posted February 2, 2019 ок, можно. @ Quote Link to comment Short link Share on other sites More sharing options...
ktulho Posted February 2, 2019 Author Share Posted February 2, 2019 38 минут назад, sirmax сказал: ок, можно. Какой вариант? Если первый, то в какой файл? utils.py? Или этот вариант: 13 часов назад, ktulho сказал: Ну или проверку опционально включить в сам декоратор. @ Quote Link to comment Short link Share on other sites More sharing options...
ktulho Posted February 6, 2019 Author Share 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 Link to comment Short link Share on other sites More sharing options...
ktulho Posted February 14, 2019 Author Share Posted February 14, 2019 В общем, если возражений не будет, запулю вариант с глобальной переменной isBattleModeSupported, в файле xvm_battle/python/battle.py. 2 @ Quote Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted February 14, 2019 Share Posted February 14, 2019 (edited) 36 minutes ago, ktulho said: isBattleModeSupported Думаю, вместо "mode" лучше использовать "type". Edited February 14, 2019 by Kotyarko_O @ Quote Link to comment Short link Share on other sites More sharing options...
ktulho Posted February 14, 2019 Author Share Posted February 14, 2019 35 минут назад, Kotyarko_O сказал: Думаю, вместо "mode" лучше использовать "type". Ок. @ Quote Link to comment Short link Share on other sites More sharing options...
HEKPOMAHT Posted February 14, 2019 Share 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 Link to comment Short link Share on other sites More sharing options...
Arni Ex Posted February 17, 2019 Share Posted February 17, 2019 В 14.02.2019 в 18:48, ktulho сказал: запулю вариант с глобальной переменной isBattleModeSupported, в файле xvm_battle/python/battle.py. А в каком билде это реализовано, в Build: 8791? @ Quote Link to comment Short link Share on other sites More sharing options...
night_dragon_on Posted February 17, 2019 Share Posted February 17, 2019 @Arni Ex Build: 8790 (branch default) Это последнее исправление, начальный билд: Build: 8788 (branch default) 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.