Jump to content
Korean Random

Кастомизируемые текстовые поля в окне боевого интерфейса


wotunion

Опрос  

22 members have voted

You do not have permission to vote in this poll, or see the poll results. Please sign in or register to vote in this poll.

Recommended Posts

  • Replies 337
  • Created
  • Last Reply

Top Posters In This Topic

Рабочий вариант в ночном билде.

 

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

 

Еще в этом варианте добавлю личные макросы и макросы статистики для текущего игрока

  • Upvote 3
Link to comment
Short link
Share on other sites

Спасибо, неплохая штука получилась.

 

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

Сделал пулл

Не за что)

Чего только стоит Ваша помощь с холдерами глубокой ночью)

Edited by wotunion
Link to comment
Short link
Share on other sites

Спасибо, неплохая штука получилась.

В продолжение развития полей.

 

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

2. Сделал глобальные макросы с шансами на победу, отдельно статик, и отдельно - динамический (тоже нужна отложенная инициализация до Defines.E_STAT_LOADED)

3. Сделал поле с шансами на победу и влючил его обновление (обновляются только поля, где, разрешено && прописано событие:

"test": {                "enabled": true,                "isUpdateable": true,                 "updateEvent": "ON_VECHICLE_DESTROYED",
Прописал вызов в нужном месте:

 

PlayersPanel

m_dead_noticed[uid] = true;                        //Logger.add("dead: " + uid);                        BIChances.UpdateBIChances();                        BattleLabels.UpdateBattleLabels("ON_VECHICLE_DESTROYED");
Все отлично работает, НО, только при первом обновлении, в данном случае, после первого фрага обновляется, после второго и дальше - уже нет.

 

Выяснил и подтвердил через лог, что строка, где есть макрос, кэшируется после первого вызова Macros.Format и при повторном вызове отдается кэш

 

Macros.as

if (cached_value !== undefined)            {                //Logger.add("cached: " + cached_value);                return cached_value;            }
Есть такой вопрос, можно ли, чтобы не изобретать велосипедов

 

вот здесь

if (isStaticMacro)            {                if (pname != null && pname != "")                {                    if (options != null)                    {                        //Logger.add("add to cache: " + format + " => " + res);                        player_cache[format] = res;                    }                }                else                {                       //==ЗДЕСЬ                    m_macros_cache_global[format] = res;                }            }
или здесь
if (cached_value !== undefined) //ЗДЕСЬ            {                //Logger.add("cached: " + cached_value);                return cached_value;            }
сделать проверку через какую-нибудь функцию на наличие в строке макроса, который в списке макросов, которые не должны кэшироваться, извините за тавтологию, и если да, то не выполнять его кеширование ?

 

//Обещаю ничего не поломать)

 

Еще есть кривой вариант(рабочий) - При каждом вызове Macros.Format именно для обновляемого поля, подставлять ей (функции) нужную строку (formats), но дописывать к ней каждый раз уникальные неотображаемые в htmText символы (спрятать в тег, например, текущее время) при выполнении обновления поля

 

Кривой вариант четко работает, задачу по обману кэша выполняет на отлично)

 

Вот, здесь уже макрос на динамический шанс на победу, находящийся в обновляемом поле, отлично работает и обновляется (подставляется текущее время в тег html):

... .f.htmlText  = ... + Macros.Format(Config.config.myPlayerName, BattleLabels._BattleLabels.formats[BattleLabels._BattleLabels.UpdateableTextFieldsIndexes[i]].formats + "<body class='" + my_date.getTime() + "'>") + "</p>");
post-27262-0-51000800-1460251176_thumb.png
Edited by wotunion
  • Upvote 1
Link to comment
Short link
Share on other sites

Макросы, которые отдают значение через функцию не кешируются.

Это да, я проверил, но мне тогда нужно предварительный парсинг строки formats делать на наличие нужных макросов, подставлять его значение и потом уже делать Macros.Format, будет ли это оптимально

Так сделать?

 

Типа

private function GetMacrosData(formats: String)): string

...

обработка formats

запрос значений макросов из списка

...

return formats с подстановленными значениями маросов из списка

 

И подставлять уже в Macros.Format, который доделает оставшиеся макросы, если они есть?

 

upd. Macros.getGlobalValue - это оно?

.

upd. Оно, проверил

 

Но все равно процент однородности строки formats после подстановки нужных значений с использованием Macros.getGlobalValue (live шанс или там хп будет менятся) будет ничтожно мал или равен 0, поэтому с Macros.Format кэширование все равно не будет работать, а получается делается уже 2 вызова по макросам вместо одного.

 

Может вариант с текущем временем?

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

 

 

 

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

 

 

Могу кинуть в пулл для теста полностью такой рабочий вариант с двумя глоб. макросами

 

Кстати, BIChances.as можно будет удалить

 

{{winstatic}} и {{winlive}}

Может достаточно только:

"updateEvent": "ON_VECHICLE_DESTROYED"
Если не надо обновлять, то писать:

"updateEvent": ""
Можно и так, неплохо
Edited by wotunion
Link to comment
Short link
Share on other sites

Это да, я проверил, но мне тогда нужно предварительный парсинг строки formats делать на наличие нужных макросов, подставлять его значение и потом уже делать Macros.Format, будет ли это оптимально

Так сделать?

Не так. Macros.Format() сам все сделает.

 

Проще показать на примерах:

 

Вот это статический макрос:

 

// {{cellsize}}
m_globals["cellsize"] = Math.round(Config.mapSize / 10);

 

А это - динамический

 

// {{my-frags}}
m_globals["my-frags"] = function(o:Object) { return isNaN(Macros.s_my_frags) || Macros.s_my_frags == 0 ? NaN : Macros.s_my_frags; }

 

Динамические не кешируются.

  • Upvote 1
Link to comment
Short link
Share on other sites

Не так. Macros.Format() сам все сделает.

 

Проще показать на примерах:

 

Вот это статический макрос:

 

// {{cellsize}}m_globals["cellsize"] = Math.round(Config.mapSize / 10);
А это - динамический

// {{my-frags}}m_globals["my-frags"] = function(o:Object) { return isNaN(Macros.s_my_frags) || Macros.s_my_frags == 0 ? NaN : Macros.s_my_frags; }
Динамические не кешируются.
Все понял, не дошло сразу, там же return есть, спасибо!
Edited by wotunion
Link to comment
Short link
Share on other sites

 

 

Кстати, BIChances.as можно будет удалить
ага, а заодно и totalHP перенести бы в экстра поля. а то на данный момент я так и не придумал вариант использования:) 
Link to comment
Short link
Share on other sites

ага, а заодно и totalHP перенести бы в экстра поля. а то на данный момент я так и не придумал вариант использования:)

 

Оно вроде на питоне, тоже дин.макрос нужен типа {{hpally}} {{hpenemy}}
Edited by wotunion
Link to comment
Short link
Share on other sites

 

 

Оно вроде на питоне, тоже дин.макрос нужен типа {{hpally}} {{hpenemy}}

и эти же макросы только в процентах, чтоб можно было рисовать 

Link to comment
Short link
Share on other sites

и разность hp тоже абсолютная и в процентах

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

Link to comment
Short link
Share on other sites

Проще показать на примерах: Вот это статический макрос: // {{cellsize}}m_globals["cellsize"] = Math.round(Config.mapSize / 10); А это - динамический // {{my-frags}}m_globals["my-frags"] = function(o:Object) { return isNaN(Macros.s_my_frags) || Macros.s_my_frags == 0 ? NaN : Macros.s_my_frags; } Динамические не кешируются.

 

 

Что я не так делаю

 

m_globals["winstatic"] = function(o:Object) { return "Test"; }

 

 

MacrosFormat 

 

отдает текстом {{winstatic}}

 

даже {{my-frags}} отдает текстом "{{my-frags}}"

 

 

m_globals["winstatic"] = "Test";

 

отдает нормально, но это не динамический

 

 

 

Нужно ли что-то писать в options Macros.Format

Edited by wotunion
  • Upvote 1
Link to comment
Short link
Share on other sites

 

 

Да, нужно опции передавать. Можно просто {}
 

Да, причина была в этом, но не проявлялась на стат. макросах


 

 

а, нужно опции передавать. Можно просто {}
 

 

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

спс.


 

 

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

Поподробнее плз

Link to comment
Short link
Share on other sites

:norm - нормализация значения, например {{hp-ratio:300}} вернет значения в диапазоне 0..300 

Для значений, у которых есть фиксированный максимум это не сложно сделать.

Link to comment
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...