Jump to content
Korean Random
goodman

Динамические макросы в Python

Recommended Posts

- Параметры маскировки техники
# маскировка в движении без учета перков экипажа, %
def invisibilityMove():
    return "%.1f" % (typeDescriptor().type.invisibility[0] * 50)

# маскировка стоя на месте без учета перков экипажа, %
def invisibilityStand():
    return "%.1f" % (typeDescriptor().type.invisibility[1] * 50)

P.S. Поправил код.

Edited by ktulho

Share this post


Link to post

Short link
Share on other sites
абсолютные значения

 

Если сравнивать с клиентом в характеристиках в ангаре они там с припиской, %

Там в параметрах, откуда вы их берете, нет маскировки после выстрела.

 


Скорость поворота башни так же считать как и гусениц?

degrees(typeDescriptor().turret['rotationSpeed'])

Теперь осталость для полноты параметров относительно данных выводимых в ангаре:

* Скорость горизонтального наведения
* Углы вертикальной наводки
* Углы горизонтальной наводки
Пока искал про маскировку, наткнулся на следующие параметры

 

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

Edited by yan-polonov

Share this post


Link to post

Short link
Share on other sites
Если сравнивать с клиентом в характеристиках в ангаре они там с припиской, % Там в параметрах, откуда вы их берете, нет маскировки после выстрела.

, а я думал процент это то что через дробь выводиться.

 

Скорость поворота башни так же считать как и гусениц?

, скорее всего да.

 

Вот бы мне их на своем клиенте выводить (логировать ну или как вы там выдираете их), можно было бы в трене проверить меняются ли значения при установке / снятии оборудования.
def miscAttrsLog():
    return log('miscAttrs= %s' % (typeDescriptor().miscAttrs.items())) 
Если сравнивать с клиентом в характеристиках в ангаре они там с припиской, % Там в параметрах, откуда вы их берете, нет маскировки после выстрела.

 

Только сейчас дошло:

незаметность неподвижной машины (до и после выстрела);

незаметность машины в движении (до и после выстрела);

 

Поправил код в этом посте.

 

Там в параметрах, откуда вы их берете, нет маскировки после выстрела.
# маскировка после выстрела в движении без учета перков экипажа, %
def invisibilityAtShotMove():
    return "%.2f" % (typeDescriptor().type.invisibility[0] * typeDescriptor().gun['invisibilityFactorAtShot'] * 50)

# маскировка после выстрела стоя на месте без учета перков экипажа, %
def invisibilityAtShotStand():
    return "%.2f" % (typeDescriptor().type.invisibility[1] * typeDescriptor().gun['invisibilityFactorAtShot'] * 50) 
* Углы вертикальной наводки
#угол подъема орудия, градусы
def anglePitchUp():
    return "%i" % (degrees(-typeDescriptor().gun['pitchLimits']['absolute'][0]))

#угол склонения орудия, градусы
def anglePitchDown():
    return "%i" % (degrees(-typeDescriptor().gun['pitchLimits']['absolute'][1])) 
* Углы горизонтальной наводки
#угол отклонения орудия влево, градусы
def anglePitchLeft():
    return "%i" % (degrees(-typeDescriptor().gun['turretYawLimits'][0]))

#угол отклонения орудия вправо, градусы
def anglePitchRight():
    return "%i" % (degrees(typeDescriptor().gun['turretYawLimits'][1])) 
* Скорость горизонтального наведения
Скорость поворота башни так же считать как и гусениц?

degrees(typeDescriptor().turret['rotationSpeed'])

Это одно и тоже.

Edited by ktulho
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
а тут у нас более кастомизируемый и удобный функционал пришел на замену
Это одно и тоже.

 

В итоге у нас такой список выводимых данных набрался: macros-info_panel.txt

 

'Перезарядка'

 

Перезарядка с учетом установленного оборудования:

@xvm.export('gun_reload_equip', deterministic=False)
def gun_reload_equip():
    reload_orig = typeDescriptor().gun['reloadTime']
    crew = 0.95 if typeDescriptor().miscAttrs['crewLevelIncrease'] != 0 else 1
    if (typeDescriptor().gun['clip'][0] == 1) and (typeDescriptor().miscAttrs['gunReloadTimeFactor'] != 0):
      rammer = typeDescriptor().miscAttrs['gunReloadTimeFactor']
    else:
      rammer = 1
    return "%.2f" % (round(reload_orig * crew * rammer, 2))

Для примера взял Т-34-85

 

Оборудование: досылатель + вентиль

Экипаж: 100% без ББ

Перезарядка в ангаре: 5,1

Подсчитанная в бою: 5,13

Выводимая в прицеле: 5,06

 

Что то еще повлияло на конечный расчет при ВГ-шном расчете выведенном в прицеле.

@xvm.export('dmg_per_min_equip', deterministic=False)
def dmg_per_min_equip():
    reload_orig = typeDescriptor().gun['reloadTime']
    crew = 0.95 if typeDescriptor().miscAttrs['crewLevelIncrease'] != 0 else 1
    if (typeDescriptor().gun['clip'][0] == 1) and (typeDescriptor().miscAttrs['gunReloadTimeFactor'] != 0):
      rammer = typeDescriptor().miscAttrs['gunReloadTimeFactor']
    else:
      rammer = 1
    reload_equip = reload_orig * crew * rammer 
    time = reload_equip + typeDescriptor().gun['clip'][0] * typeDescriptor().gun['clip'][1]
    return "%i" % (round(typeDescriptor().gun['clip'][0] / time * 60 * typeDescriptor().gun['shots'][0]['shell']['damage'][0], 0))

Как раз этой разницы в 0,05 сек нехватает для полного расчета урона в минуту

 

Урон в минуту в ангаре: 2133

Подсчитанный в бою: 2105

 

Edited by night_dragon_on
  • Upvote 3

Share this post


Link to post

Short link
Share on other sites

@night_dragon_on, вот это систематизация.+ 

 

 

Что то еще повлияло на конечный расчет при ВГ-шном расчете выведенном в прицеле.
 

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

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

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

 

Общая прибавка от командира и вентиля - 6% (0,94)

 

Подсчитанная в бою: 5,076 (урон в минуту подсчитанный в бою: 2127)

Выводимая в прицеле: 5,06 (урон в минуту в ангаре: 2133)

 

Уже лучше

Edited by night_dragon_on

Share this post


Link to post

Short link
Share on other sites
Подсчитанная в бою: 5,076 Выводимая в прицеле: 5,06

так может у нас точнее )). 

 

 

Подсчитанная в бою: 5,076 (урон в минуту подсчитанный в бою: 2127) Выводимая в прицеле: 5,06 (урон в минуту в ангаре: 2133)

Надо на арте, с большой перезарядкой проверить.

Вот еще не много полезной информации:

target.publicInfo=
            [('name', 'LeBwa'),
             ('compDescr', 'A\x18,\x00"\x00\xcd\x00\x0b\x00$\x00\x16\x00\x87\x19\x00\x1f\x00\x13\x00/\x00\xa7\x9b\n\x00)\x00\xa8\x9b\n\x00\x05\x00\xa8\x9b\n\x00'),
             ('index', 0), 
             ('team', 2), 
             ('prebattleID', 0), 
             ('marksOnGun', 3)] 

@night_dragon_on, так не проверял:

 

 

Надо на арте, с большой перезарядкой проверить.
  Edited by ktulho
  • Upvote 2

Share this post


Link to post

Short link
Share on other sites
так не проверял

 

Нет такого "добра" в ангаре :ok:  

Edited by night_dragon_on

Share this post


Link to post

Short link
Share on other sites
Нет такого "добра" в ангаре   

Вот видишь, и от нее может быть польза :gg:  

Может есть КВ-2, Т-30 или японцы на фугасах?

Edited by ktulho

Share this post


Link to post

Short link
Share on other sites

Вот видишь, и от нее может быть польза :gg:  

Может есть КВ-2, Т-30 или японцы на фугасах?

А что нужно,у меня все топовые арты за исключением Т92 с 4-6 перковым экипажем есть,могу помочь.

Share this post


Link to post

Short link
Share on other sites
Может есть КВ-2

 

'reload'

 

кв-2

 

ангар кд: 20,3

ангар дпм: 2074

в прицеле: 20,29

бой кд: 24,0 (20,30) - ориг (с модулями)

бой дпм: 2069

 

ис

 

ангар кд: 10,4

ангар дпм: 2255

в прицеле: 10,38

бой кд: 12,3 (10,41) - ориг (с модулями)

бой дпм: 2249

 

 

Думаю вполне сойдет, если и есть погрешность то она не критичная.

Edited by night_dragon_on
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

кв-2

 

ангар кд: 20,3

ангар дпм: 2074

в прицеле: 20,29

бой кд: 24,0 (20,30) - ориг (с модулями)

бой дпм: 2069

 

ис

 

ангар кд: 10,4

ангар дпм: 2255

в прицеле: 10,38

бой кд: 12,3 (10,41) - ориг (с модулями)

бой дпм: 2249

 

Ну вроде все нормально, небольшая погрешность из-за округлений.

WG вроде округляет до 3 знака после запятой, типа:

reload_orig = round(typeDescriptor().gun['reloadTime'], 3)

Share this post


Link to post

Short link
Share on other sites
Думаю вполне сойдет, если и есть погрешность то она не критичная.
Ну вроде все нормально, небольшая погрешность из-за округлений.

 

Ну лучше чем сейчас в инфо панельке по стандарту, да тут еще и определяется стоит модуль или нет.

 

Вот еще не много полезной информации

 

Видимо не так прописываю

@xvm.export('nickName', deterministic=False)
def nickName():
player = BigWorld.player()
target = BigWorld.target()
return target.publicInfo['name']

AttributeError: 'NoneType' object has no attribute 'publicInfo'

 

 

Попробуйте так:

 

Так норм

 

А вообще я бы не рекомендовал пихать все в xvm.py

 

Я не все туда прописываю, только броню, кд с параметрами сняряда, обзор

Все остальное закомментировано через # (на будущее)

Edited by yan-polonov

Share this post


Link to post

Short link
Share on other sites

Видимо не так прописываю  

@xvm.export('nickName', deterministic=False)
def nickName():
player = BigWorld.player()
target = BigWorld.target()
return target.publicInfo['name']

 

Попробуйте так:

@xvm.export('nickName', deterministic=False)
def nickName():
    target = BigWorld.target() if BigWorld.target() else BigWorld.player().getVehicleAttached()
    return target.publicInfo['name']

А вообще я бы не рекомендовал пихать все в xvm.py.

Share this post


Link to post

Short link
Share on other sites

Попытаюсь оживить тему. Добавил макросы необходимые для информационной панели.

Картинки

Код

import BigWorld

def typeDescriptor():
    target = BigWorld.target()
    return target.typeDescriptor if target else BigWorld.player().getVehicleAttached().typeDescriptor

# Название теники
def nameTank():
    return typeDescriptor().type.userString

# Название файла иконки теники
def nameICOTank():
    return typeDescriptor().name.replace(':', '-')

# Время перезарядки
def reloadTimeGun():
    return "%.1f" % (typeDescriptor().gun['reloadTime'] * 0.8631)

# Обзор
def visionRadius():
    return "%i" % (typeDescriptor().turret['circularVisionRadius'])

# лобовая броня корпуса
def armorTankHullFront():
    return "%i" % (typeDescriptor().hull['primaryArmor'][0])

# боковая броня корпуса
def armorTankHullSide():
    return "%i" % (typeDescriptor().hull['primaryArmor'][1])

# кормовая броня корпуса
def armorTankHullBack():
    return "%i" % (typeDescriptor().hull['primaryArmor'][2])

# лобовая броня башни
def armorTankTurretFront():
    return "%i" % (typeDescriptor().turret['primaryArmor'][0])

# боковая броня башни
def armorTankTurretSide():
    return "%i" % (typeDescriptor().turret['primaryArmor'][1])

# кормовая броня башни
def armorTankTurretBack():
    return "%i" % (typeDescriptor().turret['primaryArmor'][2])

def gunShots():
    return typeDescriptor().gun['shots']

# урон первым типом снаряда
def damageFirstTypeShell():
    return '' if len(gunShots()) < 1 else "%i" % (gunShots()[0]['shell']['damage'][0])

# урон вторым типом снаряда
def damageSecondTypeShell():
    return '' if len(gunShots()) < 2 else "%i" % (gunShots()[1]['shell']['damage'][0])

# урон третьим типом снаряда
def damageThirdTypeShell():
    return '' if len(gunShots()) < 3 else "%i" % (gunShots()[2]['shell']['damage'][0])

# пробитие первым типом снаряда
def powerFirstTypeShell():
    return '' if len(gunShots()) < 1 else "%i" % (gunShots()[0]['piercingPower'][0])

# пробитие вторым типом снаряда
def powerSecondTypeShell():
    return '' if len(gunShots()) < 2 else "%i" % (gunShots()[1]['piercingPower'][0])

# пробитие третьим типом снаряда
def powerThirdTypeShell():
    return '' if len(gunShots()) < 3 else "%i" % (gunShots()[2]['piercingPower'][0])

typeShell = {
    'ARMOR_PIERCING': 'ББ',
    'HIGH_EXPLOSIVE': 'ОФ',
    'ARMOR_PIERCING_CR': 'БП',
    'ARMOR_PIERCING_HE': 'ХФ',
    'HOLLOW_CHARGE': 'КС',
}

# первый тип снаряда
def firstTypeShell():
    return '' if len(gunShots()) < 1 else typeShell[gunShots()[0]['shell']['kind']]

# второй тип снаряда
def secondTypeShell():
    return '' if len(gunShots()) < 2 else typeShell[gunShots()[1]['shell']['kind']]

# третий тип снаряда
def thirdTypeShell():
    return '' if len(gunShots()) < 3 else typeShell[gunShots()[2]['shell']['kind']]

 

P.S. Ждем введения события "наведение на цель." И хотелось бы введение задержки показа поля, после окончания события.

P.P.S. Поправил код. Оказывается не у всех танков по три типа снаряда )).

 

Спасибо за труды:)

Назрел вопрос. Хочу в маркеры техники вывести вывести время перезарядки. Такое возможно сделать?

Насколько я понял, нужно этот фрагмент править:

def typeDescriptor():
    target = BigWorld.target()
    return target.typeDescriptor if target else BigWorld.player().getVehicleAttached().typeDescriptor
Не подскажешь, как это реализовать?

Share this post


Link to post

Short link
Share on other sites
Хочу в маркеры техники вывести вывести время перезарядки

через кастомные поля это не сделать, ИМХО.

Ааа сразу не понял.

@xvm.export('gun_reload_equip', deterministic=False)
def gun_reload_equip():
    reload_orig = typeDescriptor().gun['reloadTime']
    crew = 0.95 if typeDescriptor().miscAttrs['crewLevelIncrease'] != 0 else 1
    if (typeDescriptor().gun['clip'][0] == 1) and (typeDescriptor().miscAttrs['gunReloadTimeFactor'] != 0):
      rammer = typeDescriptor().miscAttrs['gunReloadTimeFactor']
    else:
      rammer = 1
    return "%.2f" % (round(reload_orig * crew * rammer, 2))
Edited by ktulho

Share this post


Link to post

Short link
Share on other sites

 

 

Хочу в маркеры техники вывести вывести время перезарядки
а не будет ли это читом?

имхо очень переживаю, что разрабы хвм "закроют" питон-макросы для кастомизации как раз из-за возможных (по мнению ЦП) читов... 

Share this post


Link to post

Short link
Share on other sites

через кастомные поля это не сделать, ИМХО.

Ааа сразу не понял.

 

@xvm.export('gun_reload_equip', deterministic=False)
def gun_reload_equip():
    reload_orig = typeDescriptor().gun['reloadTime']
    crew = 0.95 if typeDescriptor().miscAttrs['crewLevelIncrease'] != 0 else 1
    if (typeDescriptor().gun['clip'][0] == 1) and (typeDescriptor().miscAttrs['gunReloadTimeFactor'] != 0):
      rammer = typeDescriptor().miscAttrs['gunReloadTimeFactor']
    else:
      rammer = 1
    return "%.2f" % (round(reload_orig * crew * rammer, 2))

 

Так у всех в маркерах отображается мое время перезарядки. Насколько я понял, это из-за того что typeDescriptor() все так же берет данные либо свои, либо данные того, на кого наведен прицел.

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

 

а не будет ли это читом?

имхо очень переживаю, что разрабы хвм "закроют" питон-макросы для кастомизации как раз из-за возможных (по мнению ЦП) читов...

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

К тому же, в моде DamageLog есть обратный таймер с момента последнего попадания. Мод не нарушает правила, что подтверждает ответ разработчика, прикрепленный в теме этого мода.

Edited by neLeax

Share this post


Link to post

Short link
Share on other sites
По идее, отображение примерного времени перезарядки не будет являться читом, имхо.

Думаю это надо обсудить. В принципе я согласен с neLeax, но все таки хотелось бы услышать мнение разработчиков XVM.

Edited by ktulho

Share this post


Link to post

Short link
Share on other sites

мне кажется что так правильней

def typeDescriptor():
    target = BigWorld.target()
    return target.typeDescriptor if target is not None else BigWorld.entity(BigWorld.player().playerVehicleID).typeDescriptor
    # если наблюдаешь за союзником и хочешь видеть его ттх то пишем BigWorld.entity(BigWorld.player().inputHandler.ctrl.curVehicleID).typeDescriptor, так же это подходит и для себя

кд с расчетом перков и тд

def isOptionalEquipped(vehicle, optional_name):
    for item in vehicle.optionalDevices:
        if item is not None and optional_name in item.name:
            return True

    return False
    
    
def getVehicleHealth(vehicleId):
    player = BigWorld.player()
    if hasattr(BigWorld.entity(vehicleId), 'health'):
        return BigWorld.entity(vehicleId).health
    else:
        vehicle = player.arena.vehicles.get(vehicleId)
        if player is not None:
            return vehicle['vehicleType'].maxHealth
            
           
def reload_gun(entity):
    loader_skill = 126.5
    if isOptionalEquipped and isOptionalEquipped(entity.typeDescriptor, 'improvedVentilation'):
        loader_skill = 132.0
    other_bonus = 1.0
    if getVehicleHealth(entity.id) < entity.typeDescriptor.maxHealth * 0.1:
        other_bonus *= 0.909
    if isOptionalEquipped and isOptionalEquipped(entity.typeDescriptor, 'TankRammer'):
        other_bonus *= 0.9
    return '{0:.2f}'.format(entity.typeDescriptor.gun['reloadTime'] * 0.875 / (0.00375 * loader_skill + 0.5) * other_bonus) 

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