anatoly999 Posted August 13, 2016 Share Posted August 13, 2016 Нигде пока что не видел ни одного мода где при расчёте калибра кто то делал такую проверку. Этот, если не ошибаюсь, проверяет. @ Quote Link to comment Short link Share on other sites More sharing options...
Kapany3uk Posted August 13, 2016 Share Posted August 13, 2016 (edited) Нигде пока что не видел ни одного мода где при расчёте калибра кто то делал такую проверку. но вот здесь такая проверка делается (хотя бы игнор тимдамага) ########################################## # Главный калибр # neLeax + Ekspoint edited import BigWorld from Avatar import PlayerAvatar from Vehicle import Vehicle from gui.Scaleform.Battle import Battle from xfw import * import xvm_battle.python.fragCorrelationPanel as panel class Battle_Info(object): def __init__(self): self.damage = 0 self.enemy_hp = {} self.start_enemy_hp = 0 self.actual_arenaUniqueID = None battle_info = Battle_Info() @registerEvent(Battle, 'beforeDelete') def beforeDelete(self): battle_info.damage = 0 battle_info.enemy_hp.clear() battle_info.start_enemy_hp = 0 battle_info.actual_arenaUniqueID = None def IsLive(vehicleID): player = BigWorld.player() vehicles = player.arena.vehicles return vehicles[vehicleID]['isAlive'] if player is not None else None def IsFriendly(vehicleID): player = BigWorld.player() vehicles = player.arena.vehicles return vehicles[player.playerVehicleID]['team'] == vehicles[vehicleID]['team'] if player is not None else None def getVehicleHealth(): for vehicleID in BigWorld.entities.values(): if type(vehicleID) is Vehicle: if IsLive(vehicleID.id) and not IsFriendly(vehicleID.id): battle_info.enemy_hp[vehicleID.id] = vehicleID.health def New_onEnterWorld(self, vehicle): Old_onEnterWorld(self, vehicle) getVehicleHealth() Old_onEnterWorld = PlayerAvatar.vehicle_onEnterWorld PlayerAvatar.vehicle_onEnterWorld = New_onEnterWorld @registerEvent(Vehicle, 'onHealthChanged') def onHealthChanged(self, newHealth, attackerID, attackReasonID): if self.id in battle_info.enemy_hp.keys(): if attackerID == BigWorld.player().playerVehicleID: battle_info.damage += battle_info.enemy_hp[self.id] - newHealth battle_info.enemy_hp[self.id] = newHealth getVehicleHealth() return battle_info.damage BigWorld.callback(0.5, lambda: onHealthChanged()) @xvm.export('main_gun_text', deterministic=False) def mainGunText(): arenaUniqueID = BigWorld.player().arenaUniqueID if battle_info.actual_arenaUniqueID != arenaUniqueID: battle_info.actual_arenaUniqueID = arenaUniqueID battle_info.start_enemy_hp = panel.teams_totalhp[1] battletype = BigWorld.player().arena.guiType if battletype != 1: return else: result = int(max(round(battle_info.start_enemy_hp * 0.2), 1000)) - battle_info.damage if result <= 0: result = "<font face='xvm' color='#80d580' size='21'>x</font>" return "<img src='img://gui/maps/icons/achievement/32x32/mainGun.png' vspace='-12'>%s" % (result) Edited August 13, 2016 by Kapany3uk @ Quote Link to comment Short link Share on other sites More sharing options...
TornadoCat Posted August 14, 2016 Share Posted August 14, 2016 "hitlog": { "enabled": true, "hotKeyCode": 35, // клавиша 'h' (ничего другого не придумал) "visibleOnHotKey": false, // по-умолчанию отображается "onHold": false, // переключение однократным нажатием Влад, а почему бы не впилить ту же конструкцию, только на LAlt ?тогда будет, типа, что по левому альту включаются ХП и ОДНОВРЕМЕННО выключается хитлог ?ну конечно "onHold": true здесь нужно .Как думаешь ? 1 @ Quote Link to comment Short link Share on other sites More sharing options...
demon2597 Posted August 14, 2016 Share Posted August 14, 2016 (edited) по левому альту включаются ХП и ОДНОВРЕМЕННО выключается хитлог в чем смысл включать одну фичу и выключать другую, когда они абсолютно никак не связаны и, как правило, нужны обе одновременно? к тому же я уже писал, что убирание полосок для полного хит-лога не панацея- он всё равно будет накладываться на широкие уши. чего вы к нему вообще привязались? раньше была одна шапка и всех всё устраивало, теперь то же самое, но уже не устраивает. имхо, для дефолта пойдет как есть, а там себе уже пользователи могут как угодно включать хит-лог или двигать его куда им надо. Edited August 14, 2016 by demon2597 @ Quote Link to comment Short link Share on other sites More sharing options...
Nekonome Posted August 14, 2016 Share Posted August 14, 2016 (edited) в чем смысл включать одну фичу и выключать другую, когда они абсолютно никак не связаны и, как правило, нужны обе одновременно? к тому же я уже писал, что убирание полосок для полного хит-лога не панацея- он всё равно будет накладываться на широкие уши. чего вы к нему вообще привязались? раньше была одна шапка и всех всё устраивало, теперь то же самое, но уже не устраивает. имхо, для дефолта пойдет как есть, а там себе уже пользователи могут как угодно включать хит-лог или двигать его куда им надо. vlad_cs_sr разделил заголовок и тело хитлога. На этом я себе настроил скрываемый хитлог. Раньше показывались остатки ХП по удержанию альт и это было удобно. Подсмотреть много времени не надо, а постоянно наблюдать не требуется. В итоге сделал по альту отображение ХП, а в остальное время показывает хитлог. Заодно убрал "нет данных" и оставил пустые полоски. Информативно. Одно неудобство. Я постоянно играю с полноразмерными ушами и то ширина этих ушей скачет от боя к бою, смещаясь относительно хитлога. Простое привязывание к иконке по иксу не прокатило. Можно придумать как привязать положение хитлога по иксу к ширине ушей? Как видно по скрину у меня засветы в ушах по-старинке сделаны, потому отличается от дефолтного положение ХП на 20 пикселей. До засвета в начале боя без альта хитлог с альтом ХП на месте хитлога playersPanel.xc battleLabelsTemplates.xc battleLabels.xc Edited August 14, 2016 by Nekonome 1 @ Quote Link to comment Short link Share on other sites More sharing options...
demon2597 Posted August 14, 2016 Share Posted August 14, 2016 Я постоянно играю с полноразмерными ушами и то ширина этих ушей скачет от боя к бою, смещаясь относительно хитлога. Простое привязывание к иконке по иксу не прокатило так я про что и говорил. такая подстройка катит только для фиксированной ширины ушей, а по дефолту она переменная @ Quote Link to comment Short link Share on other sites More sharing options...
Kapany3uk Posted August 15, 2016 Share Posted August 15, 2016 (edited) Нужно как обычно обсудить вариант оформления. не смог впихнуть картинку вместо текста в ('header') - имхо оч. неудобно - вот так не работает: "format": {{py:xvm.total_hp.mainGun('<img src='img://gui/maps/icons/achievement/32x32/mainGun.png' vspace='-12'> ', '{{hitlog.dmg-total}}')}} далее, если к примеру, мне надо заключить цифру среднего урона в скобки, причем так, чтобы в реплеях ничего не отображалось (в т.ч. и скобки) - как сделать? пока не нашел иного варианта, кроме как добавить "footer" return '%s%s%s' % (header, high_caliber, footer) но (имхо) громоздко и для ЦА почти "высшая математика"... Возможно, стоит вообще "упростить" вывод результата и вместо return '%s%s' % (header, ...) выводить просто return '%s' % (...) и все "форматирование" вывода вынести за пределы ру-макроса в любимый и привычный "format"? Как по мне, необходимость вписывать "описание-заголовок" внутрь ру-макроса излишне усложняет восприятие, ведь если фичу отключить - так и так не будет отображаться, зачем мудрить? (и если все-таки оставлять так - каким образом текст на картинку заменить?) Edited August 15, 2016 by Kapany3uk @ Quote Link to comment Short link Share on other sites More sharing options...
Kapany3uk Posted August 15, 2016 Share Posted August 15, 2016 При достижении указанного порога к излишкам дописывается "+" Для основного калибра соблюдаются следующие условия: Нанесённый урон должен составлять не менее 20% от суммарной прочности техники противника. Нанесённый урон должен составлять не менее 1000 единиц. немного доработал формулу (добавил вывод для низкоуровневых боев, где общее ХП вражеской команды не ниже 1000) else: threshold = int(max_hp_enemy * 0.2) if int(max_hp_enemy) > 5000 else 1000 high_caliber = threshold - int(dmg_total) if high_caliber <= 0: high_caliber = '+%s' % (abs(high_caliber)) else: high_caliber return '%s%s' % (header, high_caliber) if threshold <= int(max_hp_enemy) else '' и вариант для вывода не "+ цифра" а "зеленая галочка" :)) при нанесении урона, достаточного для достижения "основного калибра" if high_caliber <= 0: high_caliber = "<font face='xvm' color='#80d580' size='21'>x</font>" @ Quote Link to comment Short link Share on other sites More sharing options...
night_dragon_on Posted August 15, 2016 Share Posted August 15, 2016 (edited) немного доработал формулу (добавил вывод для низкоуровневых боев, где общее ХП вражеской команды не ниже 1000) Это то я уже сделал вчера (хотя твой оставлю, понятнее выглядит), сейчас вот освободился ищу реплей с тим-дамагом для теста. Если есть у кого, скидываем. Да кстати что делать то с отображением калибра после попадания в союзника, окрашивать в голубой цвет значение или вовсе прятать? и вариант для вывода не "+ цифра" а "зеленая галочка" :)) при нанесении урона, достаточного для достижения "основного калибра" Так же как вариант к предыдущему вопросу, достиг планки галочка отображается; попал в союзника - крестик. Edited August 15, 2016 by night_dragon_on @ Quote Link to comment Short link Share on other sites More sharing options...
Kapany3uk Posted August 15, 2016 Share Posted August 15, 2016 окрашивать в голубой цвет значение или вовсе прятать? имхо в случае невозможности достижения (тимдамаг, ХП "не дотягивает") - убирать вообще (и тут становится сильно актуален мой предыдущий вопрос про картинку в 'header'). @ Quote Link to comment Short link Share on other sites More sharing options...
ktulho Posted August 15, 2016 Share Posted August 15, 2016 Да кстати что делать то с отображением калибра после попадания в союзника, окрашивать в голубой цвет значение или вовсе прятать? имхо в случае невозможности достижения (тимдамаг, ХП "не дотягивает") - убирать вообще , все таки лучше что-нибудь писать. А то не понятно, то ли баг какой-то, то ли попал в кого-то. @ Quote Link to comment Short link Share on other sites More sharing options...
vlad_cs_sr Posted August 15, 2016 Author Share Posted August 15, 2016 (edited) Так же как вариант к предыдущему вопросу, достиг планки галочка отображается; попал в союзника - крестик. Голубой крестик при тим-дамаге а счётчик урона при ещё не набитом калибре можно покрасить, но не убирать │ │ allowed events: │ │ ON_BATTLE_STATE_CHANGED // ? │ │ ON_PLAYERS_HP_CHANGED // обновляется при изменении хит-поинтов какой-либо техники │ │ ON_VEHICLE_DESTROYED // обновляется при уничтожении какой-либо техники │ │ ON_CURRENT_VEHICLE_DESTROYED // ? │ │ ON_MODULE_CRITICAL // ? │ │ ON_MODULE_DESTROYED // ? │ │ ON_MODULE_REPAIRED // ? │ │ ON_DAMAGE_CAUSED // обновляется при нанесении своего урона │ │ ON_TARGET_CHANGED // обновляется при смене цели ? │ │ ON_PANEL_MODE_CHANGED // ? │ │ ON_EVERY_FRAME * can reduce performance // обновляется покадрово ? │ │ ON_EVERY_SECOND * can reduce performance // обновляется ежесекундно ? прошу комментов к событиям Edited August 15, 2016 by vlad_cs_sr @ Quote Link to comment Short link Share on other sites More sharing options...
sirmax Posted August 15, 2016 Share Posted August 15, 2016 Голубой крестик при тим-дамаге а счётчик урона при ещё не набитом калибре можно покрасить, но не убирать │ │ allowed events: │ │ ON_BATTLE_STATE_CHANGED // ? │ │ ON_PLAYERS_HP_CHANGED // обновляется при изменении хит-поинтов какой-либо техники │ │ ON_VEHICLE_DESTROYED // обновляется при уничтожении какой-либо техники │ │ ON_CURRENT_VEHICLE_DESTROYED // ? │ │ ON_MODULE_CRITICAL // ? │ │ ON_MODULE_DESTROYED // ? │ │ ON_MODULE_REPAIRED // ? │ │ ON_DAMAGE_CAUSED // обновляется при нанесении своего урона │ │ ON_TARGET_CHANGED // обновляется при смене цели ? │ │ ON_PANEL_MODE_CHANGED // ? │ │ ON_EVERY_FRAME * can reduce performance // обновляется покадрово ? │ │ ON_EVERY_SECOND * can reduce performance // обновляется ежесекундно ? прошу комментов к событиям пишите комментарии сами, я могу объяснить то, что не понятно вроде все названия вполне интуитивны │ │ ON_TARGET_CHANGED // обновляется при смене цели ? при наведении на цель, или убирании прицела с цели, но пока не работает, не могу в питоне найти подходящее событие @ Quote Link to comment Short link Share on other sites More sharing options...
night_dragon_on Posted August 15, 2016 Share Posted August 15, 2016 (edited) все таки лучше что-нибудь писать. А то не понятно, то ли баг какой-то, то ли попал в кого-то. Вот проверка на повреждение союзника, теперь нужно ее нормально впихнуть. Сейчас особо времени нет, да и реплея для проверки. 'Code' # Addons: "avgDamage" and "mainGun" # night_dragon_on <http://www.koreanrandom.com/forum/user/14897-night-dragon-on/> import BigWorld from CurrentVehicle import g_currentVehicle from gui.Scaleform.daapi.view.lobby.hangar.Hangar import Hangar from gui.shared import g_itemsCache from xfw import * import traceback playerAvgDamage = None actual_arenaUniqueID = None max_hp_enemy = 0 @registerEvent(Hangar, '_Hangar__updateParams') def Hangar__updateParams(self): try: global playerAvgDamage playerAvgDamage = g_itemsCache.items.getVehicleDossier(g_currentVehicle.item.intCD).getRandomStats().getAvgDamage() playerAvgDamage = 0 if not playerAvgDamage else playerAvgDamage return playerAvgDamage except: err(traceback.format_exc()) def avgDamage(header, dmg_total): global playerAvgDamage if playerAvgDamage == None: return else: avgDamage = int(playerAvgDamage) - int(dmg_total) if avgDamage <= 0: avgDamage = '<font color="#96FF00">+%s</font>' % (abs(avgDamage)) else: avgDamage return '%s%s' % (header, avgDamage) ####################### from Avatar import PlayerAvatar from Vehicle import Vehicle class PlayerDamages(object): def __init__(self): self.teamHits = True def reset(self): self.teamHits = True def onHealthChanged(self, vehicle, newHealth, attackerID, attackReasonID): if vehicle.isStarted: player = BigWorld.player() if attackerID == player.playerVehicleID: attacked = player.arena.vehicles.get(vehicle.id, dict()) if attacked.get('team') == player.team: self.teamHits = False data = PlayerDamages() @registerEvent(Vehicle, 'onHealthChanged') def onHealthChanged(self, newHealth, attackerID, attackReasonID): data.onHealthChanged(self, newHealth, attackerID, attackReasonID) @registerEvent(PlayerAvatar, '_PlayerAvatar__destroyGUI') def destroyGUI(self): data.reset() ####################### def mainGun(header, dmg_total): global actual_arenaUniqueID, max_hp_enemy arenaUniqueID = BigWorld.player().arenaUniqueID if actual_arenaUniqueID != arenaUniqueID: actual_arenaUniqueID = arenaUniqueID max_hp_enemy = panel.teams_totalhp[1] battletype = BigWorld.player().arena.guiType if battletype != 1: return else: threshold = int(max_hp_enemy * 0.2) if int(max_hp_enemy) > 5000 else 1000 high_caliber = threshold - int(dmg_total) #print 'Test: ' + str(data.teamHits) if data.teamHits: if high_caliber <= 0: high_caliber = '<font color="#96FF00">+%s</font>' % (abs(high_caliber)) else: if high_caliber <= 0: high_caliber = '<font color="#00EAFF">+%s</font>' % (abs(high_caliber)) else: high_caliber = '<font color="#00EAFF">%s</font>' % (high_caliber) return '%s%s' % (header, high_caliber) if max_hp_enemy >= 1000 else '' 1) нанес урон показатель белый 2) нанес урон союзнику показатель белый 3) нанес урон показатель голубой Т.е. данные обновятся при следующем нанесении урона. Хотя могу ошибаться ведь сам не прогонял на реплее. Edited August 16, 2016 by night_dragon_on @ Quote Link to comment Short link Share on other sites More sharing options...
ktulho Posted August 15, 2016 Share Posted August 15, 2016 Вот проверка на повреждение союзника, теперь нужно ее нормально впихнуть , думаю можно проще сделать, у нас же есть событие "ON_DAMAGE_CAUSED". @ Quote Link to comment Short link Share on other sites More sharing options...
Kapany3uk Posted August 16, 2016 Share Posted August 16, 2016 (edited) ведь сам не прогонял на реплее. к вопросу спама в лог при прогонке реплея 2016-08-16 18:15:42: [ERROR] Traceback (most recent call last): File "xvm_main/python_macro.py", line 155, in process_python_macro File "xvm_main/python_macro.py", line 148, in <lambda> File "res_mods/configs/xvm/py_macro\z_custom.py", line 66, in avgDamage avgDamage = int(avgDmg) - int(dmg_total) TypeError: int() argument must be a string or a number, not 'NoneType' arg='xvm_avgDamage('Ср. урон: ', '0')' можно от этого как-то избавиться? (от спама, так-то не отображает - и ладно) вот тут было три поста с "обсуждением" этого и по Upd v2: avgDamage_mainGun.zip вот тут нет ли ошибки? threshold = int(max_hp_enemy * 0.2) high_caliber = threshold - int(dmg_total) if int(max_hp_enemy) > 5000 else 1000 получается, что при ХП вражеской команды менее 5000 будет неизменяемая 1000 (без уменьшения), наверное, надо так :)) threshold = int(max_hp_enemy * 0.2) if int(max_hp_enemy) > 5000 else 1000 high_caliber = threshold - int(dmg_total) Edited August 16, 2016 by Kapany3uk @ Quote Link to comment Short link Share on other sites More sharing options...
ktulho Posted August 16, 2016 Share Posted August 16, 2016 можно от этого как-то избавиться? , покажи функцию avgDamage из файла z_custom.py. вроде как получается, что при ХП вражеской команды менее 5000 будет неизменяемая 1000 (без уменьшения) , наверно надо так threshold = int(max_hp_enemy * 0.2) high_caliber = threshold - int(dmg_total) if int(max_hp_enemy) > 5000 else 1000 - int(dmg_total) @ Quote Link to comment Short link Share on other sites More sharing options...
Kapany3uk Posted August 16, 2016 Share Posted August 16, 2016 (edited) , покажи функцию avgDamage из файла z_custom.py. ну так просто перекинул предложенное @night_dragon_on чтобы не затиралось при накатывании ночника (с минимальными правками :)) import BigWorld from gui.Scaleform.daapi.view.lobby.hangar.Hangar import Hangar from gui.shared import g_itemsCache from CurrentVehicle import g_currentVehicle avgDmg = None actual_arenaUniqueID = None max_hp_enemy = 0 from xfw import * import traceback from xvm_battle.python.fragCorrelationPanel import teams_totalhp @registerEvent(Hangar, '_Hangar__updateParams') def Hangar__updateParams(self): try: global avgDmg avgDmg = g_itemsCache.items.getVehicleDossier(g_currentVehicle.item.intCD).getRandomStats().getAvgDamage() avgDmg = 0 if not avgDmg else avgDmg return avgDmg except: err(traceback.format_exc()) @xvm.export('xvm_avgDamage', deterministic=False) def avgDamage(header, dmg_total): global avgDmg avgDamage = int(avgDmg) - int(dmg_total) if avgDamage <= 0: avgDamage = '+%s' % (abs(avgDamage)) else: avgDamage return '%s%s%s' % (header, avgDamage) @xvm.export('xvm_mainGun', deterministic=False) def mainGun(header, dmg_total): global actual_arenaUniqueID, max_hp_enemy arenaUniqueID = BigWorld.player().arenaUniqueID if actual_arenaUniqueID != arenaUniqueID: actual_arenaUniqueID = arenaUniqueID max_hp_enemy = teams_totalhp[1] battletype = BigWorld.player().arena.guiType if battletype != 1: return else: threshold = int(max_hp_enemy * 0.2) if int(max_hp_enemy) > 5000 else 1000 high_caliber = threshold - int(dmg_total) if high_caliber <= 0: high_caliber = "<font face='xvm' color='#80d580' size='21'>x</font>" else: high_caliber return '%s%s' % (header, high_caliber) if threshold <= int(max_hp_enemy) else '' вроде как надо делать проверку на реплей, и @Ekspoint предложил, но @0kosmo отказался и аргументировал. И хоть аргументы отказа для меня не очень понятны, но я "забоялся" совать это к себе... Edited August 16, 2016 by Kapany3uk @ Quote Link to comment Short link Share on other sites More sharing options...
ktulho Posted August 16, 2016 Share Posted August 16, 2016 А есть реплей с тимдамагом? @Kapany3uk, пропустил @xvm.export('xvm_avgDamage', deterministic=False) def avgDamage(header, dmg_total): global avgDmg if avgDmg== None: return else: avgDamage = int(avgDmg) - int(dmg_total) if avgDamage <= 0: avgDamage = '+%s' % (abs(avgDamage)) else: avgDamage return '%s%s%s' % (header, avgDamage) Можно короче: @xvm.export('xvm_avgDamage', deterministic=False) def avgDamage(header, dmg_total): global avgDmg if avgDmg == None: return else: avgDamage = int(avgDmg) - int(dmg_total) if avgDamage <= 0: avgDamage = '+%s' % (abs(avgDamage)) return '%s%s%s' % (header, avgDamage) 1 @ Quote Link to comment Short link Share on other sites More sharing options...
night_dragon_on Posted August 16, 2016 Share Posted August 16, 2016 (edited) наверное, надо так :)) Ага, причем у меня в папке на ПК нормальный вариант, а тут как то намудрил при выкладывании (недосып сказывается). к вопросу спама в лог при прогонке реплея В v2 уже есть проверка на запущенный реплей (точнее при отсутствие данных). if playerAvgDamage == None: return Edited August 16, 2016 by night_dragon_on @ 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.