ktulho Posted June 18, 2016 Share 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 Link to comment Short link Share on other sites More sharing options...
yan-polonov Posted June 18, 2016 Share Posted June 18, 2016 (edited) абсолютные значения Если сравнивать с клиентом в характеристиках в ангаре они там с припиской, % Там в параметрах, откуда вы их берете, нет маскировки после выстрела. Скорость поворота башни так же считать как и гусениц? degrees(typeDescriptor().turret['rotationSpeed']) Теперь осталость для полноты параметров относительно данных выводимых в ангаре: * Скорость горизонтального наведения * Углы вертикальной наводки * Углы горизонтальной наводки Пока искал про маскировку, наткнулся на следующие параметры Вот бы мне их на своем клиенте выводить (логировать ну или как вы там выдираете их), можно было бы в трене проверить меняются ли значения при установке / снятии оборудования. Edited June 18, 2016 by yan-polonov @ Quote Link to comment Short link Share on other sites More sharing options...
ktulho Posted June 18, 2016 Share 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 Link to comment Short link Share on other sites More sharing options...
night_dragon_on Posted June 19, 2016 Share 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 Link to comment Short link Share on other sites More sharing options...
ktulho Posted June 19, 2016 Share Posted June 19, 2016 @night_dragon_on, вот это систематизация.+ Что то еще повлияло на конечный расчет при ВГ-шном расчете выведенном в прицеле. думаю, необходимо учитывать влияние командира на экипаж, если стоит вентилятор или/и братство. 1 @ Quote Link to comment Short link Share on other sites More sharing options...
night_dragon_on Posted June 19, 2016 Share Posted June 19, 2016 (edited) думаю, необходимо учитывать влияние командира на экипаж, если стоит вентилятор или/и братство. Общая прибавка от командира и вентиля - 6% (0,94) Подсчитанная в бою: 5,076 (урон в минуту подсчитанный в бою: 2127) Выводимая в прицеле: 5,06 (урон в минуту в ангаре: 2133) Уже лучше Edited June 19, 2016 by night_dragon_on @ Quote Link to comment Short link Share on other sites More sharing options...
ktulho Posted June 19, 2016 Share 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 Link to comment Short link Share on other sites More sharing options...
night_dragon_on Posted June 19, 2016 Share Posted June 19, 2016 (edited) так не проверял Нет такого "добра" в ангаре Edited June 19, 2016 by night_dragon_on @ Quote Link to comment Short link Share on other sites More sharing options...
ktulho Posted June 19, 2016 Share Posted June 19, 2016 (edited) Нет такого "добра" в ангаре Вот видишь, и от нее может быть польза Может есть КВ-2, Т-30 или японцы на фугасах? Edited June 19, 2016 by ktulho @ Quote Link to comment Short link Share on other sites More sharing options...
Slava7572 Posted June 19, 2016 Share Posted June 19, 2016 Вот видишь, и от нее может быть польза Может есть КВ-2, Т-30 или японцы на фугасах? А что нужно,у меня все топовые арты за исключением Т92 с 4-6 перковым экипажем есть,могу помочь. @ Quote Link to comment Short link Share on other sites More sharing options...
night_dragon_on Posted June 19, 2016 Share 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 Link to comment Short link Share on other sites More sharing options...
ktulho Posted June 19, 2016 Share 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 Link to comment Short link Share on other sites More sharing options...
yan-polonov Posted June 19, 2016 Share 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 Link to comment Short link Share on other sites More sharing options...
ktulho Posted June 19, 2016 Share 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 Link to comment Short link Share on other sites More sharing options...
anatoly999 Posted June 19, 2016 Share 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 Link to comment Short link Share on other sites More sharing options...
ktulho Posted June 19, 2016 Share 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 Link to comment Short link Share on other sites More sharing options...
Kapany3uk Posted June 19, 2016 Share Posted June 19, 2016 Хочу в маркеры техники вывести вывести время перезарядки а не будет ли это читом?имхо очень переживаю, что разрабы хвм "закроют" питон-макросы для кастомизации как раз из-за возможных (по мнению ЦП) читов... @ Quote Link to comment Short link Share on other sites More sharing options...
anatoly999 Posted June 19, 2016 Share 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 Link to comment Short link Share on other sites More sharing options...
ktulho Posted June 19, 2016 Share Posted June 19, 2016 (edited) По идее, отображение примерного времени перезарядки не будет являться читом, имхо. Думаю это надо обсудить. В принципе я согласен с neLeax, но все таки хотелось бы услышать мнение разработчиков XVM. Edited June 19, 2016 by ktulho @ Quote Link to comment Short link Share on other sites More sharing options...
Ekspoint Posted June 19, 2016 Share 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 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.