Jump to content
Korean Random
vlad_cs_sr

Предложения по стандартному конфигу / Suggestions for default config

Recommended Posts

Нигде пока что не видел ни одного мода где при расчёте калибра кто то делал такую проверку.

Этот, если не ошибаюсь, проверяет.

Share this post


Link to post

Short link
Share on other sites
Нигде пока что не видел ни одного мода где при расчёте калибра кто то делал такую проверку.

но вот здесь такая проверка делается (хотя бы игнор тимдамага)

##########################################
# Главный калибр
# 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 by Kapany3uk

Share this post


Link to post

Short link
Share on other sites

 

 

"hitlog": { "enabled": true, "hotKeyCode": 35, // клавиша 'h' (ничего другого не придумал) "visibleOnHotKey": false, // по-умолчанию отображается "onHold": false, // переключение однократным нажатием
 
Влад, а почему бы не впилить ту же конструкцию, только на LAlt ?
тогда будет, типа, что по левому альту включаются ХП и ОДНОВРЕМЕННО выключается хитлог ?
ну конечно "onHold": true здесь нужно .

Как думаешь ?

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
по левому альту включаются ХП и ОДНОВРЕМЕННО выключается хитлог

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

к тому же я уже писал, что убирание полосок для полного хит-лога не панацея- он всё равно будет накладываться на широкие уши.

чего вы к нему вообще привязались? раньше была одна шапка и всех всё устраивало, теперь то же самое, но уже не устраивает.

имхо, для дефолта пойдет как есть, а там себе уже пользователи могут как угодно включать хит-лог или двигать его куда им надо.

Edited by demon2597

Share this post


Link to post

Short link
Share on other sites

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

к тому же я уже писал, что убирание полосок для полного хит-лога не панацея- он всё равно будет накладываться на широкие уши.

чего вы к нему вообще привязались? раньше была одна шапка и всех всё устраивало, теперь то же самое, но уже не устраивает.

имхо, для дефолта пойдет как есть, а там себе уже пользователи могут как угодно включать хит-лог или двигать его куда им надо.

 

vlad_cs_sr разделил заголовок и тело хитлога. На этом я себе настроил скрываемый хитлог.

Раньше показывались остатки ХП по удержанию альт и это было удобно. Подсмотреть много времени не надо, а постоянно наблюдать не требуется.

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

 

Заодно убрал "нет данных" и оставил пустые полоски. Информативно.

Одно неудобство. Я постоянно играю с полноразмерными ушами и то ширина этих ушей скачет от боя к бою, смещаясь относительно хитлога. Простое привязывание к иконке по иксу не прокатило. Можно придумать как привязать положение хитлога по иксу к ширине ушей?

 

Как видно по скрину у меня засветы в ушах по-старинке сделаны, потому отличается от дефолтного положение ХП на 20 пикселей.

 

До засвета в начале боя

noreveal.1471179034.png

 

без альта хитлог

noalt.1471179085.png

 

с альтом ХП на месте хитлога

alt.1471179115.png

playersPanel.xc

battleLabelsTemplates.xc

battleLabels.xc

Edited by Nekonome
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

 

 

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

Share this post


Link to post

Short link
Share on other sites
Нужно как обычно обсудить вариант оформления.

не смог впихнуть картинку вместо текста в ('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 by Kapany3uk

Share this post


Link to post

Short link
Share on other sites

При достижении указанного порога к излишкам дописывается "+"

  • Для основного калибра соблюдаются следующие условия:
  • Нанесённый урон должен составлять не менее 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>"

post-24956-0-02899300-1471269754_thumb.jpg

Share this post


Link to post

Short link
Share on other sites
немного доработал формулу (добавил вывод для низкоуровневых боев, где общее ХП вражеской команды не ниже 1000)

 

Это то я уже сделал вчера (хотя твой оставлю, понятнее выглядит), сейчас вот освободился ищу реплей с тим-дамагом для теста.

Если есть у кого, скидываем.

 

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

 

и вариант для вывода не "+ цифра" а "зеленая галочка" :)) при нанесении урона, достаточного для достижения "основного калибра"

 

Так же как вариант к предыдущему вопросу, достиг планки галочка отображается; попал в союзника - крестик.

Edited by night_dragon_on

Share this post


Link to post

Short link
Share on other sites

 

 

окрашивать в голубой цвет значение или вовсе прятать?
имхо в случае невозможности достижения (тимдамаг, ХП "не дотягивает") - убирать вообще (и тут становится сильно актуален мой предыдущий вопрос про картинку в 'header').

Share this post


Link to post

Short link
Share on other sites

 

 

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

 

имхо в случае невозможности достижения (тимдамаг, ХП "не дотягивает") - убирать вообще
, все таки лучше что-нибудь писать. А то не понятно, то ли баг какой-то, то ли попал в кого-то.

Share this post


Link to post

Short link
Share on other sites

Так же как вариант к предыдущему вопросу, достиг планки галочка отображается; попал в союзника - крестик.

Голубой крестик при тим-дамаге

а счётчик урона при ещё не набитом калибре можно покрасить, но не убирать

     │                            │ 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 by vlad_cs_sr

Share this post


Link to post

Short link
Share on other sites

Голубой крестик при тим-дамаге

а счётчик урона при ещё не набитом калибре можно покрасить, но не убирать

     │                            │ 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             // обновляется при смене цели ?

при наведении на цель, или убирании прицела с цели, но пока не работает, не могу в питоне найти подходящее событие

Share this post


Link to post

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

 

Вот проверка на повреждение союзника, теперь нужно ее нормально впихнуть.

Сейчас особо времени нет, да и реплея для проверки.

 

'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 by night_dragon_on

Share this post


Link to post

Short link
Share on other sites

 

 

Вот проверка на повреждение союзника, теперь нужно ее нормально впихнуть
, думаю можно проще сделать, у нас же есть событие "ON_DAMAGE_CAUSED". 

Share this post


Link to post

Short link
Share on other sites
ведь сам не прогонял на реплее.

к вопросу спама в лог при прогонке реплея

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 by Kapany3uk

Share this post


Link to post

Short link
Share on other sites

 

 

можно от этого как-то избавиться?
, покажи функцию 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)

Share this post


Link to post

Short link
Share on other sites

, покажи функцию 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 by Kapany3uk

Share this post


Link to post

Short link
Share on other sites

А есть реплей с тимдамагом?


@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) 
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
наверное, надо так :))

 

Ага, причем у меня в папке на ПК нормальный вариант, а тут как то намудрил при выкладывании (недосып сказывается).

 

к вопросу спама в лог при прогонке реплея

 

В v2 уже есть проверка на запущенный реплей (точнее при отсутствие данных).

 

if playerAvgDamage == None:
        return

Edited by night_dragon_on

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