Jump to content
Korean Random
ktulho

Предложение по py_macro

Recommended Posts

Так как, большинство 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.

Вопрос в каком файле разместить этот или более оптимальный код ?

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

может просто массив с допустимыми режимами сделать? а проверку уже каждый в своем скрипте сделает, если нужно.

Edited by sirmax

Share this post


Link to post

Short link
Share on other sites
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 by night_dragon_on

Share this post


Link to post

Short link
Share on other sites
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 by ktulho

Share this post


Link to post

Short link
Share on other sites
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 by night_dragon_on

Share this post


Link to post

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

Так должны избавится от фонового исполнения кода "py_macro"

Все что под декораторами @registerEvent и @overrideMethod всё равно будет выполняться.

Share this post


Link to post

Short link
Share on other sites

@ktulho , хотя бы частично. Тогда без:

 

45 минут назад, ktulho сказал:

придется в каждом скрипте прописывать

 

Не обойтись.

Share this post


Link to post

Short link
Share on other sites

@night_dragon_on если сделать как я предлагаю, то в функциях под декораторами нужно будет писать:

@декоратор
def a():
    if isBLSupported:
      код

По моему это самый короткий вариант. Ну или проверку опционально включить в сам декоратор.

Edited by ktulho

Share this post


Link to post

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

ок, можно.

 

Какой вариант? Если первый, то в какой файл? utils.py? 

Или этот вариант:

13 часов назад, ktulho сказал:

Ну или проверку опционально включить в сам декоратор.

 

Share this post


Link to post

Short link
Share on other sites

Еще один вариант.

В 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 by ktulho
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

В общем, если возражений не будет, запулю вариант с глобальной переменной isBattleModeSupported, в файле xvm_battle/python/battle.py.

  • Upvote 2

Share this post


Link to post

Short link
Share on other sites
36 minutes ago, ktulho said:

isBattleModeSupported

Думаю, вместо "mode" лучше использовать "type".

Edited by Kotyarko_O

Share this post


Link to post

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

Думаю, вместо "mode" лучше использовать "type".

Ок.

Share this post


Link to post

Short link
Share on other sites
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'

 

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
В 14.02.2019 в 18:48, ktulho сказал:

запулю вариант с глобальной переменной isBattleModeSupported, в файле xvm_battle/python/battle.py.

А в каком билде это реализовано, в Build: 8791?

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