Jump to content
Korean Random
goodman

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

Recommended Posts

Да, только к камере применяется данный параметр.

Edited by night_dragon_on

Share this post


Link to post

Short link
Share on other sites

Да, только к камере применяется данный параметр.

а на сам ручник есть планы?

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

чета я запутался, то есть выходит, что если я в настройках поставлю "full", то точно так же смогу с правой зажатой клавишей шевелить камеру так, чтобы танк не шевелился... а смысл тогда вообще в разных настройках? х.з., может я торможу чего-то... но имхо, без отключения ручника это неполноценная фича и pmod использовать в таком случае удобнее (ну для меня по крайней мере)

Share this post


Link to post

Short link
Share on other sites

night_dragon_on

а на сам ручник есть планы?

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

я просил ShuruBB реализовать это в своём моде, он добавил в список КТТС.  

Share this post


Link to post

Short link
Share on other sites
имхо, без отключения ручника это неполноценная фича
// "full" - отключение ограничения камеры и фиксации корпуса (включается вручную клавишей "x");

Добавил.

Edited by night_dragon_on
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
// "full" - отключение ограничения камеры и фиксации корпуса (включается вручную клавишей "x");

 

по возможности  желательно добавить параметр только для камеры (как было первоначально), чтобы клавиши не искать да и назначениями не заниматься. На данный момент искать и нажимать х  не удобно.

Share this post


Link to post

Short link
Share on other sites

Так реализовано в ПМОД-е, опираясь на который подкидывали "хотелки".

Так и сделал.

Edited by night_dragon_on

Share this post


Link to post

Short link
Share on other sites

Так реализовано в ПМОД-е, опираясь на который подкидывали "хотелки".

Так и сделал.

 

может сейчас и так сделано в пмоде, но вот откопал  старую версию мода - всё раздельно было. 

// Тип отключения ручного тормоз на ПТ-САУ.
// full - полное отключение тормоза, custom - только открепление камеры.
// Type of deactivating of manual brake on Tank Destroyers.
// full - completely off the brake, custom - just detach the camera.
"TDSniperMovementMode": "custom"

ну и естественно отдельная отключалка для модуля

Share this post


Link to post

Short link
Share on other sites

ну и естественно отдельная отключалка для модуля

 

Отдельный выключатель для опции сделать можно.

Edited by night_dragon_on

Share this post


Link to post

Short link
Share on other sites

отдельный выключатель для камеры обязателен.


может так как-нибудь сделать:


"cameraLimit": {
  "enable":   false,   
  "по выбору": full,   full (по умолчанию) полное отключение тормоза, custom - только открепление камеры. 
  "hotkey":    true
},

да и польза от клавиши х тоже сомнительная - кто в бою клавиши искать будет. (я попробовал и больше нет желания :) имхо.

Share this post


Link to post

Short link
Share on other sites

да и польза от клавиши х тоже сомнительная - кто в бою клавиши искать будет. (я попробовал и больше нет желания :) имхо.

 

Клавиша "X" включает обратно фиксацию корпуса.

 

может так как-нибудь сделать

 

Нельзя отключить фиксацию корпуса (ручник) без открепления камеры. Они взаимосвязаны.

В отдельном параметре в конфиге "hotkey": true тоже нет смысла.

Edited by night_dragon_on

Share this post


Link to post

Short link
Share on other sites

Нельзя отключить фиксацию корпуса (ручник) без открепления камеры. Они взаимосвязаны. 

 

да я знаю, комент не полностью написал, так как сейчас в дефолте всё правильно ручник с камерой вместе

отключение ограничения камеры и фиксации корпуса

это для full

а для custom - только открепление камеры.

Share this post


Link to post

Short link
Share on other sites
а на сам ручник есть планы?
а для custom - только открепление камеры.
отдельный выключатель
// TODO: English comments
// Отключение предела вращения камеры в снайперском прицеле для техники с ограниченными УГН (углами горизонтальной наводки) орудия. 
"noCameraLimit": {
  // true - enable.
  // true - включить.
  "enabled": false, 
  // "custom" - отключение ограничения камеры;
  // "hotkey" - отключение ограничения камеры с зажатой правой кнопкой мыши;
  // "full" - отключение ограничения камеры и фиксации корпуса (включается вручную клавишей "x");
  "mode": "hotkey"
}

Первый режим - отключаем ограничение вращения камеры, в процессе перемещения корпус техники следует за прицелом на всем протяжении движения; второй режим - отключаем ограничение вращения камеры, в процессе перемещения орудие следует за прицелом до ограничения УГН-ов, далее вращаться будет только камера; ну и третий режим - будет фиксироваться положение ствола и отключится ограничение вращения камеры (режим работы камеры как на технике без ограничения УГН).

Edited by night_dragon_on
  • Upvote 3

Share this post


Link to post

Short link
Share on other sites

@night_dragon_on, спасибо большое. правда даже постестить еще не успел, сильно нет времени 

Share this post


Link to post

Short link
Share on other sites

в общем есть такой код:

#####################################################################
# imports

import BigWorld
import xvm_battle.python.fragCorrelationPanel as panel
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

#####################################################################
# constants

actual_arenaUniqueID = None
playerAvgDamage = None
max_hp_enemy = 0

#####################################################################
# handlers

@xvm.export('high_сaliber', deterministic=False)
def high_caliber(dmg_total):
    global actual_arenaUniqueID, max_hp_enemy
    arenaUniqueID = BigWorld.player().arenaUniqueID
    if actual_arenaUniqueID != arenaUniqueID:
        actual_arenaUniqueID = arenaUniqueID
        max_hp_enemy = 0
    if panel.teams_totalhp[1] > max_hp_enemy:
        max_hp_enemy = panel.teams_totalhp[1]
    battletype = BigWorld.player().arena.guiType
    if (battletype != 1) or (max_hp_enemy == 0):
        return
    else:
        symbol = '<img src="img://gui/maps/icons/achievement/32x32/mainGun.png" width="26" height="26" align="middle" vspace="-9">'
        done = '<img src="img://gui/maps/icons/library/done.png" width="20" height="20" align="middle" vspace="-9">'
        threshold = max_hp_enemy * 0.2 if max_hp_enemy > 5000 else 1000
        high_caliber = int(threshold - dmg_total)
        if high_caliber <= 0:
            high_caliber = done
    return '%s%s' % (symbol, high_caliber) if max_hp_enemy >= 1000 else ''

@registerEvent(Hangar, '_Hangar__updateParams')
def Hangar__updateParams(self):
    try:
        global playerAvgDamage
        playerAvgDamage = g_itemsCache.items.getVehicleDossier(g_currentVehicle.item.intCD).getRandomStats().getAvgDamage()
        return playerAvgDamage
    except:
        err(traceback.format_exc())

@xvm.export('avg_damage', deterministic=False)
def avg_damage(dmg_total):
    global playerAvgDamage
    battletype = BigWorld.player().arena.guiType
    if battletype != 1:
        return
    elif playerAvgDamage == None:
        return
    else:
        color = 'FFFFFF'
        symbol = '<img src="img://gui/maps/icons/achievement/32x32/winnerLaurels1.png" width="26" height="26" align="middle" vspace="-9">'
        none = '<img src="img://gui/maps/icons/achievement/32x32/winnerLaurels3.png" width="26" height="26" align="middle" vspace="-9">'
        avgDamage = int(playerAvgDamage - dmg_total)
        if avgDamage <= 0:
            avgDamage = abs(avgDamage)
            if avgDamage > 1:
                color = 'FE7903'
            if avgDamage > 300:
                color = 'FFC103'
            if avgDamage > 500:
                color = 'F8F400'
            if avgDamage > 750:
                color = 'B2F800'
            if avgDamage > 1000:
                color = '60FF00'
            if avgDamage > 1500:
                color = '00FF77'
            if avgDamage > 2500:
                color = '02C9B3'
            if avgDamage > 3000:
                color = 'D042F3'
            return '%s<font color="#%s">%s</font>' % (symbol, color, avgDamage)
        else:
            return '%s%s' % (none, avgDamage)

@xvm.export('sign_color', deterministic=False)
def sign_color():
    return panel.total_hp_color

@xvm.export('sign_hp', deterministic=False)
def sign_hp():
    result = panel.teams_totalhp[0] - panel.teams_totalhp[1]
    return result

@xvm.export('sign_hp_color', deterministic=False)
def sign_hp_color():
    result = panel.teams_totalhp[0] - panel.teams_totalhp[1]
    return "<font color='#%s'>%s</font>" % (sign_color(), result)

Это когда то Рома помог немного изменить его дополнение к ХП по тимам,показывает разницу в цифрах по ХП между тимами(с цветовой дифференциацией),все прекрасно работает уже несколько патчей,но есть один маленький нюанс.Вот эту секцию:

@xvm.export('sign_hp', deterministic=False)
def sign_hp():
    result = panel.teams_totalhp[0] - panel.teams_totalhp[1]
    return result

@xvm.export('sign_hp_color', deterministic=False)
def sign_hp_color():
    result = panel.teams_totalhp[0] - panel.teams_totalhp[1]
    return "<font color='#%s'>%s</font>" % (sign_color(), result)

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

Собственно вопрос,можно ли как то убрать эту особенность и оптимизировать код,чтоб значение сразу появлялось,при отсчете?

Код самой панели такой(возможно они связаны):

#####################################################################
# imports

from xfw import *
import BigWorld
import xvm_battle.python.fragCorrelationPanel as panel

#####################################################################
# constants

actual_arenaUniqueID = None
max_hp_team = [0, 0]
percent_filling = 5
section = 20
maxRatio = 95
minRatio = 65

#####################################################################
# handlers

@registerEvent(panel, 'update_hp')
def update_hp(vehicleID, hp):
    as_event('ON_UPDATE_HP')

@xvm.export('str_replace', deterministic=True)
def str_replace(str, old, new, max=-1):
    return str.replace(old, new, max)

@xvm.export('current_hp', deterministic=False)
def current_hp(current_team):
    return panel.teams_totalhp[current_team]

@xvm.export('percent_hp', deterministic=False)
def percent_hp(current_team):
    global actual_arenaUniqueID, max_hp_team
    arenaUniqueID = BigWorld.player().arenaUniqueID
    if actual_arenaUniqueID != arenaUniqueID:
        actual_arenaUniqueID = arenaUniqueID
        max_hp_team = [0, 0]
    if panel.teams_totalhp[current_team] > max_hp_team[current_team]:
        max_hp_team[current_team] = panel.teams_totalhp[current_team]
    return round((100. * current_hp(current_team)) / max_hp_team[current_team], 0) if max_hp_team[current_team] != 0 else None

@xvm.export('percent_hp_section', deterministic=False)
def percent_hp_section(current_team):
    return int(round(percent_hp(current_team) / percent_filling, 0)) if percent_hp(current_team) is not None else None

@xvm.export('current_hp_symbols', deterministic=False)
def current_hp_symbols(current_team, symbol):
    return percent_hp_section(current_team) * str(symbol) if percent_hp_section(current_team) is not None else section

@xvm.export('max_hp_symbols', deterministic=True)
def max_hp_symbols(symbol):
    return str(symbol) * section

@xvm.export('sign_hp', deterministic=False)
def sign_hp(): 
    if current_hp(0) > current_hp(1):
        return '>'
    elif current_hp(0) < current_hp(1):
        return '<'
    elif current_hp(0) == current_hp(1):
        return '='
    else:
        return ''

@xvm.export('color_sign_hp', deterministic=False)
def color_sign_hp():
    if current_hp(0) < current_hp(1):
        ratio = max(min((100. * current_hp(0) / current_hp(1) - minRatio) / (maxRatio - minRatio), 1), 0)
        color_sign_hp = panel.color_gradient(panel.hp_colors['neutral'], panel.hp_colors['bad'], ratio)
    elif current_hp(0) > current_hp(1):
        ratio = max(min((100. * current_hp(1) / current_hp(0) - minRatio) / (maxRatio - minRatio), 1), 0)
        color_sign_hp = panel.color_gradient(panel.hp_colors['neutral'], panel.hp_colors['good'], ratio)
    else:
        color_sign_hp = panel.color_gradient(panel.hp_colors['neutral'], panel.hp_colors['neutral'], 1)
    return color_sign_hp 

Заранее благодарен всем!

Share this post


Link to post

Short link
Share on other sites

@Slava7572, а в battleLabelsTemplates.xc как прописано? 

на всякий пожарный всю секцию скопирую,нужная sign_hp

 // Панель HP(союзники).
    "panel_hp_ally": {
      "enabled": true,
      "updateEvent": "PY(ON_UPDATE_HP)",
      "x": -163,
      "y": 5,
      "width": 240,
      "height": 22,
      "alpha": 100,
      "align": "center",
      "screenHAlign": "center",
      "antiAliasType": "advanced",
      "shadow": { "enabled": true, "distance": 1, "angle": 90, "color": "0x000000", "alpha": 80, "blur": 5, "strength": 1.5 },
      "textFormat": { "font": "NDO", "size": 18, "color": "0xFCFCFC", "align": "right", "marginRight": 6, "leading": -19 },
      "format": "{{battletype!=event_battles?<font size='17'><b>{{py:current_hp(0)}}</b></font> <font alpha='#CC'>{{py:max_hp_symbols('Q')}}</font><br/><font color='{{py:str_replace('{{.colors.system.ally_alive}}', '0x', '#')}}'>{{py:current_hp_symbols(0, 'Q')}}</font>}}"
    },
    // Панель HP(противники).
    "panel_hp_enemy": {
      "enabled": true,
      "updateEvent": "PY(ON_UPDATE_HP)",
      "x": 160,
      "y": 5,
      "width": 240,
      "height": 22,
      "alpha": 100,
      "align": "center",
      "screenHAlign": "center",
      "antiAliasType": "advanced",
      "shadow": { "enabled": true, "distance": 1, "angle": 90, "color": "0x000000", "alpha": 80, "blur": 5, "strength": 1.5 },
      "textFormat": { "font": "NDO", "size": 18, "color": "0xFCFCFC", "align": "left", "marginLeft": 2, "leading": -19 },
      "format": "{{battletype!=event_battles?<font alpha='#CC'>{{py:max_hp_symbols('R')}}</font> <font size='17'><b>{{py:current_hp(1)}}</b></font><br/><font color='{{py:str_replace('{{.colors.system.enemy_alive}}', '0x', '#')}}'>{{py:current_hp_symbols(1, 'R')}}</font>}}"
    },
    // Основной калибр.
    "high_сaliber": {
      "enabled": true,
      "updateEvent": "PY(ON_UPDATE_HP)",
      "hotKeyCode": 56,
      "onHold": true,
      "visibleOnHotKey": true,
      "x": 321,
      "y": 1,
      "width": 90,
      "height": 30,
      "alpha": 100,
      "align": "center",
      "screenHAlign": "center",
      "antiAliasType": "advanced",
      "shadow": { "enabled": true, "distance": 1, "angle": 90, "color": "0x000000", "alpha": 80, "blur": 5, "strength": 1.5 },
      "textFormat": { "font": "NDO", "size": 17, "color": "0xFFFFFF", "align": "left" },
      "format": "{{battletype!=event_battles?<b>{{py:high_сaliber({{hitlog.dmg-total}})}}</b>}}"
    },
    // Средний урон.
    "avg_damage": {
      "enabled": true,
      "updateEvent": "ON_DAMAGE_CAUSED",
      "hotKeyCode": 56,
      "onHold": true,
      "visibleOnHotKey": false,
      "x": 321,
      "y": 1,
      "width": 90,
      "height": 30,
      "alpha": 100,
      "align": "center",
      "screenHAlign": "center",
      "antiAliasType": "advanced",
      "shadow": { "enabled": true, "distance": 1, "angle": 90, "color": "0x000000", "alpha": 80, "blur": 5, "strength": 1.5 },
      "textFormat": { "font": "NDO", "size": 17, "color": "0xFFFFFF", "align": "left" },
      "format": "{{battletype!=event_battles?<b>{{py:avg_damage({{hitlog.dmg-total}})}}</b>}}"
    },
    // Разница по HP между командами.
    "sign_hp": {
      "enabled": true,
      "updateEvent": "ON_PLAYERS_HP_CHANGED",
      "x": -323,
      "y": 1,
      "width": 90,
      "height": 30,
      "screenHAlign": "center",
      "shadow": { "enabled": true, "distance": 1, "angle": 90, "color": "0x000000", "alpha": 80, "blur": 5, "strength": 1.5 },
      "textFormat": { "font": "NDO", "size": 17, "align": "right" },
      "format": "<b>{{py:sign_hp_color}}</b> <img src='img://gui/maps/icons/achievement/32x32/champion.png' width='26' height='26' vspace='-9'>"
    }, 

Я так думаю "updateEvent" нужно добавить,подкорректировать?

П.С:сделал пару скринов для понимания

3979e20b171e.jpg 

3735e712fb66.jpg

Правда на последней картинке почему то цвет не сработал.

Оооочень полезная фича,по большому счету не так часто на саму панель смотрю как на эту цифру))

Edited by Slava7572

Share this post


Link to post

Short link
Share on other sites

@Slava7572, измените событие ON_PLAYERS_HP_CHANGED на PY(ON_UPDATE_HP):

    // Разница по HP между командами.
    "sign_hp": {
      "enabled": true,
      "updateEvent": "PY(ON_UPDATE_HP)",
      "x": -323,
      "y": 1,
      "width": 90,
      "height": 30,
      "screenHAlign": "center",
      "shadow": { "enabled": true, "distance": 1, "angle": 90, "color": "0x000000", "alpha": 80, "blur": 5, "strength": 1.5 },
      "textFormat": { "font": "NDO", "size": 17, "align": "right" },
      "format": "<b>{{py:sign_hp_color}}</b> <img src='img://gui/maps/icons/achievement/32x32/champion.png' width='26' height='26' vspace='-9'>"
    }, 
Edited by ktulho
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

 

@Slava7572, измените событие ON_PLAYERS_HP_CHANGED на PY(ON_UPDATE_HP):

    // Разница по HP между командами.
    "sign_hp": {
      "enabled": true,
      "updateEvent": "PY(ON_UPDATE_HP)",
      "x": -323,
      "y": 1,
      "width": 90,
      "height": 30,
      "screenHAlign": "center",
      "shadow": { "enabled": true, "distance": 1, "angle": 90, "color": "0x000000", "alpha": 80, "blur": 5, "strength": 1.5 },
      "textFormat": { "font": "NDO", "size": 17, "align": "right" },
      "format": "<b>{{py:sign_hp_color}}</b> <img src='img://gui/maps/icons/achievement/32x32/champion.png' width='26' height='26' vspace='-9'>"
    }, 

Ок,попробую.Спасибо.

П.С:теперь все норм,вы лучший ;)

Edited by Slava7572

Share this post


Link to post

Short link
Share on other sites

Ок,попробую.Спасибо.

П.С:теперь все норм,вы лучший ;)

слава друг поделись данной фичей, если нетрудно, желательно какие файлы и куда что добавить, чтобы свой конфиг не ломать. Заранее благодарен))) 

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