Jump to content
Korean Random
goodman

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

Recommended Posts

 

 

то это может сказаться на производительности (весь бой 10 раз секунду будет обновляться поле)
а если вывести перезарядку в отдельное поле + обновление только при получении дамага/выстрела (а уж потом раз в 10 сек) ?

Share this post


Link to post

Short link
Share on other sites

 

 

а если вывести перезарядку в отдельное поле + обновление только при получении дамага/выстрела (а уж потом раз в 10 сек) ?
, так и надо сделать, вопрос только как? 

P.S. Интересно, если поле пустое, его обновление снижает производительность?

Share this post


Link to post

Short link
Share on other sites

@sirmax, и еще вопрос, есть возможность проверять пустое поле или нет? И если пустое, то не обновлять?

Таким способом можно было бы частично управлять обновлением поля из py_macros.

Edited by ktulho

Share this post


Link to post

Short link
Share on other sites

Это все кривая логика. Нужно как-то по-другому делать. Нужны какие-то события из питона.

Share this post


Link to post

Short link
Share on other sites

Это все кривая логика. Нужно как-то по-другому делать. Нужны какие-то события из питона.

Это было бы намного лучше. 

Share this post


Link to post

Short link
Share on other sites

Было бы неплохо, чтоб новые релизные файлы не затирали измененные. Тобишь, если можно - положить их в папочку со своим конфигом. Я намекаю на xvm.py.

Share this post


Link to post

Short link
Share on other sites

Было бы неплохо, чтоб новые релизные файлы не затирали измененные. Тобишь, если можно - положить их в папочку со своим конфигом. Я намекаю на xvm.py.

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

Share this post


Link to post

Short link
Share on other sites

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

А можно подробней? Что значит "как хочешь"? За дамаг лог отвечают файла четыре. И что будет если я их все переименую?

  • Upvote 1
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

А можно подробней? Что значит "как хочешь"? За дамаг лог отвечают файла четыре. И что будет если я их все переименую?

в корне папки ру-macro можешь переименовать как угодно, хоть 1, 2, 3 и т.п. В подпапках - если переименуешь, то надо будет код править. Файлы .хс переименовывать не нужно (да и не про них печь)

Тебе надо было только чтобы xvm.py не затирался - вот его и переименуй, к примеру my_xvm.py

Остальное не трогай

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

в корне папки ру-macro можешь переименовать как угодно, хоть 1, 2, 3 и т.п. В подпапках - если переименуешь, то надо будет код править. Файлы .хс переименовывать не нужно (да и не про них печь)

Тебе надо было только чтобы xvm.py не затирался - вот его и переименуй, к примеру my_xvm.py

Остальное не трогай

Да! Попробовал - всё работает, спасибо! Никогда бы не подумал, что так можно.

Share this post


Link to post

Short link
Share on other sites

, с временем перезарядки сложнее. Обновление раз в секунду таймера (ON_EVERY_SECOND) - это редко, а если введут обновление 10 раз в секунду, то это может сказаться на производительности (весь бой 10 раз секунду будет обновляться поле).

Добавил события из питона. Еще одна мощная универсальная штука получилась.

 

В конфиге указываем событие "PY(event_name)", где event_name - произвольное название, которое мы будем отправлять из питона:

  "updateEvent": "PY(test)",

В питоне изпользуем метод as_event из модуля xfw:

import xfw
xfw.as_event('test')

Вызываем, соответственно, тогда, когда необходимо обновить поле.

 

Можно в py_macro добавить что-то типа events.py, который будет отправлять какие-то типовые события, и кто угодно сможет их использовать в своем конфиге. На производительность они практически не будут влиять, если вхолостую будут отправляться, если, конечно, не отправлять их слишком часто (чаще нескольких раз в секунду).

Edited by sirmax
  • Upvote 6

Share this post


Link to post

Short link
Share on other sites

 

 

Можно в py_macro добавить что-то типа events.py, который будет отправлять какие-то типовые события
НУЖНО!

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

Share this post


Link to post

Short link
Share on other sites

НУЖНО!

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

 

Думаю, тут вы без меня справитесь пока. Могу разве что на паре каких-нибудь событий показать. Говори, что тебя интересует.

Share this post


Link to post

Short link
Share on other sites

Добавил события из питона. Еще одна мощная универсальная штука получилась.

 

В конфиге указываем событие "PY(event_name)", где event_name - произвольное название, которое мы будем отправлять из питона:

  "updateEvent": "PY(test)",

В питоне изпользуем метод as_event из модуля xfw:

import xfw
xfw.as_event('test')

Вызываем, соответственно, тогда, когда необходимо обновить поле.

Вот это круто.

Share this post


Link to post

Short link
Share on other sites

 

 

Могу разве что на паре каких-нибудь событий показать. Говори, что тебя интересует.
 

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

Возможно, это не совсем "события" (а вероятно "совсем не события" :)) про которые ведется речь, но именно такого не хватает. Как вариант - использовать PY(test) в поле "enabled" если это вообще осуществимо...

Share this post


Link to post

Short link
Share on other sites

по событиям можно только текст обновлять.

в таком случае вариант: есть событие - есть текст, нет события (+ задержка) - нет текста. Так возможно?

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

возможно имеет смысл добавить параметр/макрос этой самой задержки, по типу, к примеру, sixthSenseDuration

Share this post


Link to post

Short link
Share on other sites

Так можно. Но эта логика не подходит под общий случай, тут необходимо as_event() отправлять там же, где и py_macro реализован.

Share this post


Link to post

Short link
Share on other sites

Доброго времени суток! 
Есть кто шарящий, кто подскажет, как набросать макрос, чтобы возвращал значение на единицу меньше {{battletier}}, это же не сложно должно быть?
Хотя возможно стоит еще сделать с ограничением, чтобы для одиннадцатого уровня боя выдавал девять, как для десятого.


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

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

UPD: Пролистал эту тему, под конец понял, что все уже есть и мне нужно всего лишь использовать {{py:math.sub({{battletier}},1)}}
Впрочем, возможно лучше написать новый макрос в несколько строк на случай 11 лвл, чтобы просто в него {{battletier}} передавать, только завтра, а то ночь уже...

'UPD2:'


 А вот уже вопрос по теме, хотел сократить вот эту запись в "labelsData" "vtype"
"HT":  "<font face='vtype'>{{battletier<11?{{level={{battletier}}?u|{{level={{py:math.sub({{battletier}},1)}}?m|g}}}}|{{level=10?u|{{level=9?m|g}}}}}}</font>",

До макроса вроде

# Символ по положению танка в команде. a,b,c - символы, d - уровень боя, e - уровень танка.
@xvm.export('tankPosition')
def tank_position(a, b, c, d, e):
	if d == 11 d = 10
	if e == d return a
	elif e == d - 1 return b
	else return c

и строку сделать например такой

"HT":  "<font face='vtype'>{{py:tankPosition('u','m','g',{{battletier}},{{level}})}}</font>",

Но в итоге получаю null
Какую очевидную вещь я не понимаю? Нужно что-то писать не так, не там или что?
Разобрался, синтаксис не тот.

'Сделал так:'

# Символ по положению танка в команде. a,b,c - символы, d - уровень боя, e - уровень танка.
@xvm.export('tankRank')
def tank_rank(a, b, c, d, e):
if d > 10:
  d = 10
if e == d:
  return a # топ
elif e == d - 1:
  return b # середина
else:
  return c # дно
    "labelsData": {
    // Текст для макроса {{.minimap.labelsData.vtype.{{vtype-key}}}}
	  "vtype": {
		"LT":  "<font face='vtype'>i</font>",
		"MT":  "<font face='vtype'>{{py:tankRank('l','n','h',{{battletier}},{{level}})}}</font>",	// l,n,h
		"HT":  "<font face='vtype'>{{py:tankRank('u','m','g',{{battletier}},{{level}})}}</font>",	// u,m,g
		"TD":  "<font face='vtype'>{{py:tankRank('V','o','j',{{battletier}},{{level}})}}</font>",	// V,o,j
		"SPG": "<font face='vtype'>{{py:tankRank('X','p','k',{{battletier}},{{level}})}}</font>"	// X,p,k
	  } 

Edited by RealVoid
  • Upvote 1

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