ktulho 5,790 #333573 Posted June 18, 2016 (edited) - Параметры маскировки техники # маскировка в движении без учета перков экипажа, % def invisibilityMove(): return "%.1f" % (typeDescriptor().type.invisibility[0] * 50) # маскировка стоя на месте без учета перков экипажа, % def invisibilityStand(): return "%.1f" % (typeDescriptor().type.invisibility[1] * 50) P.S. Поправил код. Edited June 18, 2016 by ktulho Quote Share this post Link to post Short link Share on other sites
yan-polonov 2 #333580 Posted June 18, 2016 (edited) абсолютные значения Если сравнивать с клиентом в характеристиках в ангаре они там с припиской, % Там в параметрах, откуда вы их берете, нет маскировки после выстрела. Скорость поворота башни так же считать как и гусениц? degrees(typeDescriptor().turret['rotationSpeed']) Теперь осталость для полноты параметров относительно данных выводимых в ангаре: * Скорость горизонтального наведения * Углы вертикальной наводки * Углы горизонтальной наводки Пока искал про маскировку, наткнулся на следующие параметры Вот бы мне их на своем клиенте выводить (логировать ну или как вы там выдираете их), можно было бы в трене проверить меняются ли значения при установке / снятии оборудования. Edited June 18, 2016 by yan-polonov Quote Share this post Link to post Short link Share on other sites
ktulho 5,790 #333584 Posted June 18, 2016 (edited) Если сравнивать с клиентом в характеристиках в ангаре они там с припиской, % Там в параметрах, откуда вы их берете, нет маскировки после выстрела. , а я думал процент это то что через дробь выводиться. Скорость поворота башни так же считать как и гусениц? , скорее всего да. Вот бы мне их на своем клиенте выводить (логировать ну или как вы там выдираете их), можно было бы в трене проверить меняются ли значения при установке / снятии оборудования. 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 June 18, 2016 by ktulho 1 Quote Share this post Link to post Short link Share on other sites
night_dragon_on 5,601 #333623 Posted June 19, 2016 (edited) а тут у нас более кастомизируемый и удобный функционал пришел на замену Это одно и тоже. В итоге у нас такой список выводимых данных набрался: 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 June 19, 2016 by night_dragon_on 3 Quote Share this post Link to post Short link Share on other sites
ktulho 5,790 #333625 Posted June 19, 2016 @night_dragon_on, вот это систематизация.+ Что то еще повлияло на конечный расчет при ВГ-шном расчете выведенном в прицеле. думаю, необходимо учитывать влияние командира на экипаж, если стоит вентилятор или/и братство. 1 Quote Share this post Link to post Short link Share on other sites
night_dragon_on 5,601 #333626 Posted June 19, 2016 (edited) думаю, необходимо учитывать влияние командира на экипаж, если стоит вентилятор или/и братство. Общая прибавка от командира и вентиля - 6% (0,94) Подсчитанная в бою: 5,076 (урон в минуту подсчитанный в бою: 2127) Выводимая в прицеле: 5,06 (урон в минуту в ангаре: 2133) Уже лучше Edited June 19, 2016 by night_dragon_on Quote Share this post Link to post Short link Share on other sites
ktulho 5,790 #333628 Posted June 19, 2016 (edited) Подсчитанная в бою: 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 June 19, 2016 by ktulho 2 Quote Share this post Link to post Short link Share on other sites
night_dragon_on 5,601 #333632 Posted June 19, 2016 (edited) так не проверял Нет такого "добра" в ангаре Edited June 19, 2016 by night_dragon_on Quote Share this post Link to post Short link Share on other sites
ktulho 5,790 #333634 Posted June 19, 2016 (edited) Нет такого "добра" в ангаре Вот видишь, и от нее может быть польза Может есть КВ-2, Т-30 или японцы на фугасах? Edited June 19, 2016 by ktulho Quote Share this post Link to post Short link Share on other sites
Slava7572 1,685 #333635 Posted June 19, 2016 Вот видишь, и от нее может быть польза Может есть КВ-2, Т-30 или японцы на фугасах? А что нужно,у меня все топовые арты за исключением Т92 с 4-6 перковым экипажем есть,могу помочь. Quote Share this post Link to post Short link Share on other sites
night_dragon_on 5,601 #333636 Posted June 19, 2016 (edited) Может есть КВ-2 'reload' кв-2 ангар кд: 20,3 ангар дпм: 2074 в прицеле: 20,29 бой кд: 24,0 (20,30) - ориг (с модулями) бой дпм: 2069 ис ангар кд: 10,4 ангар дпм: 2255 в прицеле: 10,38 бой кд: 12,3 (10,41) - ориг (с модулями) бой дпм: 2249 Думаю вполне сойдет, если и есть погрешность то она не критичная. Edited June 19, 2016 by night_dragon_on 1 Quote Share this post Link to post Short link Share on other sites
ktulho 5,790 #333637 Posted June 19, 2016 кв-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) Quote Share this post Link to post Short link Share on other sites
yan-polonov 2 #333638 Posted June 19, 2016 (edited) Думаю вполне сойдет, если и есть погрешность то она не критичная. Ну вроде все нормально, небольшая погрешность из-за округлений. Ну лучше чем сейчас в инфо панельке по стандарту, да тут еще и определяется стоит модуль или нет. Вот еще не много полезной информации Видимо не так прописываю @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 June 19, 2016 by yan-polonov Quote Share this post Link to post Short link Share on other sites
ktulho 5,790 #333639 Posted June 19, 2016 Видимо не так прописываю @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. Quote Share this post Link to post Short link Share on other sites
anatoly999 137 #333682 Posted June 19, 2016 Попытаюсь оживить тему. Добавил макросы необходимые для информационной панели. Картинки shot_151.jpg shot_152.jpg Код 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Не подскажешь, как это реализовать? Quote Share this post Link to post Short link Share on other sites
ktulho 5,790 #333683 Posted June 19, 2016 (edited) Хочу в маркеры техники вывести вывести время перезарядки через кастомные поля это не сделать, ИМХО. Ааа сразу не понял. @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 June 19, 2016 by ktulho Quote Share this post Link to post Short link Share on other sites
Kapany3uk 948 #333684 Posted June 19, 2016 Хочу в маркеры техники вывести вывести время перезарядки а не будет ли это читом?имхо очень переживаю, что разрабы хвм "закроют" питон-макросы для кастомизации как раз из-за возможных (по мнению ЦП) читов... Quote Share this post Link to post Short link Share on other sites
anatoly999 137 #333686 Posted June 19, 2016 (edited) через кастомные поля это не сделать, ИМХО. Ааа сразу не понял. @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 June 19, 2016 by neLeax Quote Share this post Link to post Short link Share on other sites
ktulho 5,790 #333687 Posted June 19, 2016 (edited) По идее, отображение примерного времени перезарядки не будет являться читом, имхо. Думаю это надо обсудить. В принципе я согласен с neLeax, но все таки хотелось бы услышать мнение разработчиков XVM. Edited June 19, 2016 by ktulho Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #333691 Posted June 19, 2016 мне кажется что так правильней 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) Quote Share this post Link to post Short link Share on other sites