Нестандартные полоски здоровья и маны v1.4b

» опубликован
» Способ реализации: cJass
» Тип: Наработка
» Версия Warcraft: 1.26а

Описание

» MUI: да
» Импорт: да
» Утечки: нет
» Требования: JNGP
Простая наработка, которая позволяет отображать полоски здоровья и маны для всех или определённых юнитов.
Автор идеи и моделей: Jack-of-shadow.
Если вам не нравится стандартная текстура хп/мпбаров, то вы можете импортировать свою. Пропишите новой текстуре путь UI\Feedback\XPBar\human-bigbar-fill.blp. Текстуры можете найти здесь.

Сравнение

Подробности

» Скачать
Основной файл загружать внизу по кнопке "Скачать".
Модели от Jack-of-shadow.
Модели с заданными путями для быстрого импорта.
» Перенос в свою карту (вручную)
Этот способ не рекомендуется.
  • Триггеры:
Скопируйте триггер CustomBar в свою карту:
  • Импорт:
Импортировать модели из архива в свою карту.
  • Способности:
Скопируйте способности, или создайте свои, аналогичные этим:
» Перенос в свою карту (автоматически)
Этот способ рекомендуется.
Способ был предоставлен NazarPunk, за что ему спасибо.
  • Триггеры:
Скопируйте триггеры в свою карту:
  • CustomBar
  • CustomBar ObjectMerger
  • Импорт:
1. Скачайте и распакуйте архив с моделями.
2. Импортируйте директорию в свою карту. Extensions -> Import Derictory -> CustomBar_ImportFiles. (из архива)
3. Сохраните карту и переоткройте её.
  • Способности:
1. Отключаем AdicParser и AdicOptimizer..
2. Копируем в свою карту триггер CustomBar ObjectMerger.
3. Включаем CustomBar ObjectMerger.
4. Сохраняем свою карту.
5. Ожидаем сохранения.
6. Закрываем JNGP.
7. Открываем свою карту.
8. Удаляем или отключаем CustomBar ObjectMerger.
» Код

library CustomBar initializer InitSetBar

    native UnitAlive takes unit u returns boolean

    globals
        constant real br_updatePeriod = 1. / 6. //период обновления баров.
        constant integer br_abilityHP = 'BHPA' //равкод HP 00.
        constant integer br_abilityMP = 'BMPA' //равкод MP 00.
        integer array br_indHP //сохраняет текущий индекс модели хпбара,  чтобы сравнить изменился ли он.
        integer array br_indMP //сохраняет текущий индекс модели мпбара,  чтобы сравнить изменился ли он.
        integer br_unitCounter = 0 //счётчик обрабатываемых юнитов.
        region br_mapArea = null //игровая область карты.
        unit array br_unit //массив обрабатываемых юнитов.
    endglobals
    
    nothing addIDUnit (unit u) {//Занесение юнита в массив обробатываемых юнитов.
        if (true) { //Добавив условие, можно указать тех, над кем не будут отображаться нестандартные хп/мпбары. Вместо (true) вставтье свои условия, проверяемый юнит u.
            br_unitCounter++
            br_unit[br_unitCounter] = u
        }
        u = null
    }
    
    nothing SetBar( ){ //Обновляет хп/мпбары. Если юнит мёртв или процент (хп или мп)/5 не поменялось, то пропускает действия.
        integer i = 1
        integer iend = br_unitCounter
        integer indHP
        integer indMP
        loop{
            exitwhen i > iend
            if (UnitAlive(br_unit[i])) {
                indHP = R2I(GetWidgetLife(br_unit[i]) / GetUnitState(br_unit[i], UNIT_STATE_MAX_LIFE) * 20.0)
                if (br_indHP[i] != indHP)  {
                    UnitRemoveAbility(br_unit[i], br_abilityHP + br_indHP[i])
                    UnitAddAbility   (br_unit[i],  br_abilityHP + indHP)
                    br_indHP[i] = indHP
                }
                if  (GetUnitState(br_unit[i], UNIT_STATE_MAX_MANA) > 0) {
                    indMP = R2I(GetUnitState(br_unit[i], UNIT_STATE_MANA) / GetUnitState(br_unit[i], UNIT_STATE_MAX_LIFE) * 20.0)
                    if (br_indMP[i] != indMP) {
                        UnitRemoveAbility(br_unit[i], br_abilityMP + br_indMP[i])
                        UnitAddAbility   (br_unit[i],  br_abilityMP + indMP)
                        br_indMP[i] = indMP
                    }
                }
            }
            i++
        }
    }

    nothing ClearRemoteUnits() { //Очистка удалённых юнитов из массива обрабатываемых юнитов. Для того чтобы не обрабатывать удалённых юнитов, а также не превысить максимальный размер массива.
        integer i = 1                        //По-этому, если нет специальных условий, количество обрабатываемых юнитов всегда равно количеству юнитов на карте + мёртвые герои.
        loop{
            exitwhen i > br_unitCounter
            if (GetUnitTypeId(br_unit[i]) == 0) {
                br_unit[i] = br_unit[br_unitCounter]
                br_indHP[i] = br_indHP[br_unitCounter]
                br_indMP[i] = br_indMP[br_unitCounter]
                br_unit[br_unitCounter] = null
                br_indHP[br_unitCounter] = 0
                br_indMP[br_unitCounter] = 0
                br_unitCounter--
            }
            i++
        }
    } 

    nothing IDEntrance ( ){ //Заносит юнита в массив обрабатываемых юнитов при входе в игровую область карты.
        addIDUnit(GetTriggerUnit())
    }

    nothing IDInit_Group(){//Заносит юнитов в массив обрабатываемых юнитов при инициализации карты.
        addIDUnit(GetEnumUnit())
    }
    
    nothing InitSetBar(){ //Функция инициализации.
        EnablePreSelect(false, false) //скрывает полоски здоровья и информацию при наведении на юнита.
        br_mapArea = CreateRegion()
        RegionAddRect(br_mapArea, GetWorldBounds())
        integer i = 0
        integer iend = 20
        unit u = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 'hfoo' , 0, 0, 0) //Прелоад способностей.
        loop {
            exitwhen i > iend
            UnitAddAbility(u, br_abilityHP + i)
            UnitAddAbility(u, br_abilityMP + i)
            i++
        }
        RemoveUnit(u)
        u = null
        TimerStart(CreateTimer(), br_updatePeriod, true, function SetBar )
        TimerStart(CreateTimer(), 10, true, function ClearRemoteUnits)
        trigger t = CreateTrigger( )
        TriggerRegisterEnterRegion( t, br_mapArea, null)
        TriggerAddAction( t, function IDEntrance )
        t= null
        group g = CreateGroup()
        GroupEnumUnitsInRect( g, bj_mapInitialPlayableArea, null)
        ForGroup( g, function IDInit_Group )
        DestroyGroup(g)
        g = null
    } 

endlibrary
» История обновлений
v1.1
  • Небольшое изменения в коде.
  • Теперь не использует SetUnitUserData().
v1.2
  • Добавлено отображения полосок маны.
  • Изменены модели полосок.
  • Оптимизация кода, улучшение "читабельности". Код был написан с нуля.
  • Очищение переменной при разложении юнита. Теперь переменная br_unit[] не засоряется.
v1.2a
  • Изменен немного код.
  • Исправлены модели.
v1.3c
  • Оптимизация кода.
  • Теперь полоски отображаются через добавление способностей, что позволяет избегать багов.
v1.4
  • Исправление бага, который возникал при очистки массива обрабатываемых юнитов.
  • Полное изменение системы очистки массива обрабатываемых юнитов.
  • Доработка кода.
v1.4b
  • Упрощение и оптимизация кода.
  • Добавление автоматического способа переноса в карту. Предоставлен NazarPunk.


Просмотров: 604



» Лучшие комментарии


KaneThaumaturge #51 - 4 дня назад 0
quq_CCCP, там 6 способностей.
NazarPunk #52 - 4 дня назад (отредактировано ) 0
мне дефолтные нравятся больше
Мне тоже, только c текстурой из пака.

Сравнение бы в один скриншот запихнуть, неудобно листать.
прикреплены файлы
KaneThaumaturge #53 - 4 дня назад 0
Сравнение бы в один скриншот запихнуть, неудобно листать.
Со следующим обновлением сделаю.
NazarPunk #54 - 4 дня назад 0
» Тоже самое, только через перебор группы
//! nocjass
native UnitAlive takes unit u returns boolean

//! zinc
library CustomBar {
    constant real TIMER_PERIOD = 0.25;
    constant integer HP_START_ID = 'Bara';
    constant integer HP_HT_ID = 0;
    constant integer MP_START_ID = 'BarA';
    constant integer MP_HT_ID = 1;
    
    group UNITS = CreateGroup();
    hashtable HT = InitHashtable();
    
    function redraw(){
        unit target = GetEnumUnit();
        integer pk = GetHandleId(target);
        integer currentID, savedID;
        
        if (UnitAlive(target)){
            // hp
            currentID = R2I(GetWidgetLife(target) / GetUnitState(target, UNIT_STATE_MAX_LIFE) * 20.0);
            savedID = LoadInteger(HT, pk, HP_HT_ID);
            if (currentID != savedID){
                UnitRemoveAbility(target, HP_START_ID + savedID);
                SaveInteger(HT, pk, HP_HT_ID, currentID);
                UnitAddAbility(target, HP_START_ID + currentID);
            }
            
            // mp
            if(GetUnitState(target, UNIT_STATE_MAX_MANA) > 0){
                currentID = R2I(GetUnitState(target, UNIT_STATE_MANA) / GetUnitState(target, UNIT_STATE_MAX_MANA) * 20.0);
                savedID = LoadInteger(HT, pk, MP_HT_ID);
                if (currentID != savedID){
                    UnitRemoveAbility(target, MP_START_ID + savedID);
                    SaveInteger(HT, pk, MP_HT_ID, currentID);
                    UnitAddAbility(target, MP_START_ID + currentID);
                }
            }
        }
        target = null;
    }
    
    function onInit(){
        trigger trg = CreateTrigger();
        region rgn = CreateRegion();
        EnablePreSelect(false, false);
        
        // add to group
        RegionAddRect(rgn, bj_mapInitialPlayableArea);
        TriggerRegisterEnterRegion(trg, rgn, null);
        TriggerAddCondition(trg, Filter(function() -> boolean {
            GroupAddUnit(UNITS, GetFilterUnit());
            return false;
        }));
        GroupEnumUnitsInRect(UNITS, bj_mapInitialPlayableArea, null);
        
        // start timer
        TimerStart(CreateTimer(), TIMER_PERIOD, true, function(){
            ForGroup(UNITS, function redraw);
        });

        // leaks
        trg = null;
        rgn = null;
    }
}
//! endzinc
//! endnocjass
прикреплены файлы
KaneThaumaturge #55 - 4 дня назад 0
NazarPunk, Если юнитов больше 2000, то они уже просто не могут выполнять приказы. Точнее задержка приказа секунд 10-15. Я нигде не видел карты с таки количеством юнитов. А тут максимальное количество 8к+. Действительно нужно менять на перебор группы?
KaneThaumaturge #56 - 4 дня назад 0
В общем, сначала я переделал под структуры, потом под timer exploit, но обнаружил баги. В общем, теперь все хорошо работает, я очищаю ненужных юнитов по-другому.
NazarPunk #57 - 4 дня назад 0
Действительно нужно менять на перебор группы?
С группой работать удобно, не нужно с индексами массива манипулировать. А ненужных юнитов можно просто убирать из группы.
KaneThaumaturge #58 - 4 дня назад (отредактировано ) 0
NazarPunk, неудобно хранить индекс (хп/мп) / 5
NazarPunk, да и использование хэш-таблицы медленнее.
Если кто-то сделает тимколорные модельки, то сделаю вариант для тимколора.
Или если кто объяснит как это сделать
UPD. Я уже сам себе объяснил.
NazarPunk #59 - 4 дня назад 0
да и использование хэш-таблицы медленнее.
настолько, что это как-то сказывается на производительности?

Умножение же быстрее деления, но вас же это не останавливает))
indHP = R2I(GetUnitLifePercent(br_unit[i])/5)
indHP = R2I(GetWidgetLife(br_unit[i]) / GetUnitState(br_unit[i], UNIT_STATE_MAX_LIFE) * 20.0)
Bergi_Bear #60 - 4 дня назад 0
Экономисты на "спичках" подбежали
KaneThaumaturge #61 - 4 дня назад 0
NazarPunk, я хотел избавиться от BJ функции, но было лень, спасибо. Мне удобнее работать так. Но если будут существенные причины перейти на группу, я перейду. Пока я просто не понимаю зачем мне это.
Bergi_Bear #62 - 4 дня назад 0
KaneThaumaturge, а ты WideScreen используешь? как себя ведут эффекты с и без него?
KaneThaumaturge #63 - 4 дня назад 0
Bergi_Bear, нет, не использую. Когда-то запускал WFE с WideScreen, но мне почему-то не понравилось, как-то странно всё. Может просто не привычно. Думаю, нормально будут вести себя эффекты, но не проверял.
NazarPunk #64 - 4 дня назад (отредактировано ) 1
Экономисты на "спичках" подбежали
» А за ними экономисты на строчках)
constant integer HP_RAW = 'Bara'
constant integer MP_RAW = 'BarA'

indHP = R2I(GetUnitLifePercent(br_unit[i])/5) // 0-20
	if (br_indHP[i] != indHP)  {
		UnitRemoveAbility(br_unit[i], HP_RAW + br_indHP[i])
		UnitAddAbility   (br_unit[i],  HP_RAW + indHP)
		br_indHP[i] = indHP
	}
	indMP = R2I(GetUnitManaPercent(br_unit[i])/5) // 0-20
	if (br_indMP[i] != indMP) and (GetUnitState(br_unit[i], UNIT_STATE_MAX_MANA) > 0) {
		UnitRemoveAbility(br_unit[i], MP_RAW + br_indMP[i])
		UnitAddAbility   (br_unit[i],  MP_RAW + indMP)
		br_indMP[i] = indMP
	}

» ...и ненавидящие war3mapImported
прикреплены файлы
KaneThaumaturge #65 - 3 дня назад (отредактировано ) 0
HP_RAW + br_indHP[i]
Как это работает? Тоесть 'Bara' + 1 = 'Barb'?
NazarPunk #66 - 3 дня назад 0
Тоесть 'Bara' + 1 = 'Barb'?
Равкод же число, а вы чего ожидали от 'Bara' + 1 = ?

Если лень переименовывать равкоды, держите.
прикреплены файлы
KaneThaumaturge #67 - 3 дня назад 0
NazarPunk, спасибо, чуть позже ещё немного код переделаю.
Rusvermilion #68 - 3 дня назад 0
Полоска маны годная идея, если сделать ее вкл\выкл командой в чате например.
KaneThaumaturge #69 - 3 дня назад 0
Rusvermilion, да, это будет корректно работать только в одиночной игре. Потому-что я могу отключить отображение только для всех игроков. А голосование за отображение мпбаров не особо нужно.
Jack-of-shadow #70 - 3 дня назад 0
KaneThaumaturge:
Rusvermilion, да, это будет корректно работать только в одиночной игре.
Либо все таки вернуться к эфектам избавивившись от создания кучи способностей обвесов, отлавливая каст проблемных абилок.
NazarPunk #71 - 3 дня назад 1
Настроил вам Object Merger, чтоб способности вручную не переносить)
» код
// Инструкция : https://www.thehelper.net/threads/how-to-use-the-object-merger.111693
// Алфавит: abcdefghijklmnopqrstuvwxyz

// Макрос
//! textmacro CustomBar takes NAME, RAWCODE, NUM
//! external ObjectMerger w3a Aasl Bar$RAWCODE$ anam "$NAME$" ansf "$NUM$" atat UI\CustomBar\$NAME$\$NUM$.mdx ata0 overhead Slo1 1 0.0 abuf 1 "" aare 1 0.0 atar 1 none
//! endtextmacro

// HP
//! runtextmacro CustomBar("HP", "a", "00")
//! runtextmacro CustomBar("HP", "b", "01")
//! runtextmacro CustomBar("HP", "c", "02")
//! runtextmacro CustomBar("HP", "d", "03")
//! runtextmacro CustomBar("HP", "e", "04")
//! runtextmacro CustomBar("HP", "f", "05")
//! runtextmacro CustomBar("HP", "g", "06")
//! runtextmacro CustomBar("HP", "h", "07")
//! runtextmacro CustomBar("HP", "i", "08")
//! runtextmacro CustomBar("HP", "j", "09")
//! runtextmacro CustomBar("HP", "k", "10")
//! runtextmacro CustomBar("HP", "l", "11")
//! runtextmacro CustomBar("HP", "m", "12")
//! runtextmacro CustomBar("HP", "n", "13")
//! runtextmacro CustomBar("HP", "o", "14")
//! runtextmacro CustomBar("HP", "p", "15")
//! runtextmacro CustomBar("HP", "q", "16")
//! runtextmacro CustomBar("HP", "r", "17")
//! runtextmacro CustomBar("HP", "s", "18")
//! runtextmacro CustomBar("HP", "t", "19")
//! runtextmacro CustomBar("HP", "u", "20")

// MP
//! runtextmacro CustomBar("MP", "A", "00")
//! runtextmacro CustomBar("MP", "B", "01")
//! runtextmacro CustomBar("MP", "C", "02")
//! runtextmacro CustomBar("MP", "D", "03")
//! runtextmacro CustomBar("MP", "E", "04")
//! runtextmacro CustomBar("MP", "F", "05")
//! runtextmacro CustomBar("MP", "G", "06")
//! runtextmacro CustomBar("MP", "H", "07")
//! runtextmacro CustomBar("MP", "I", "08")
//! runtextmacro CustomBar("MP", "J", "09")
//! runtextmacro CustomBar("MP", "K", "10")
//! runtextmacro CustomBar("MP", "L", "11")
//! runtextmacro CustomBar("MP", "M", "12")
//! runtextmacro CustomBar("MP", "N", "13")
//! runtextmacro CustomBar("MP", "O", "14")
//! runtextmacro CustomBar("MP", "P", "15")
//! runtextmacro CustomBar("MP", "Q", "16")
//! runtextmacro CustomBar("MP", "R", "17")
//! runtextmacro CustomBar("MP", "S", "18")
//! runtextmacro CustomBar("MP", "T", "19")
//! runtextmacro CustomBar("MP", "U", "20")

// ВНИМАНИЕ! Последняя строчка должна быть комметарием.
» инструкция
  • Снимаем галки
  • копируем в свою карту триггер CustomBar_ObjectMerger
  • сохраняем свою карту
  • включаем CustomBar_ObjectMerger
  • сохраняем свою карту
  • долго ждём
  • закрываем JNGP
  • открываем свою карту
  • отключаем CustomBar_ObjectMerger
  • наслаждаемся скопированными способностями...
прикреплены файлы
KaneThaumaturge #72 - 3 дня назад 0
NazarPunk, добавлю твою инструкция.
NazarPunk #73 - 3 дня назад 1
» только учтите, что он настроен на такие пути
KaneThaumaturge #74 - 3 дня назад 0
Спасибо
Да, я увидел
NazarPunk #75 - 3 дня назад (отредактировано ) 1
Можете ещё архив с папками для импорта прикрепить, что-б вручную пути не прописывать.
» инструкция
  • распаковать архив
Вариант 1
Вариант 2
  • указать папку CustomBar_ImportFiles (из архива)
  • сохранить карту
  • закрыть JNGP
  • открыть карту и наслаждаться красивым импортом...
прикреплены файлы
KaneThaumaturge #76 - 3 дня назад (отредактировано ) 0
Если лень переименовывать равкоды, держите.
Кстати, твоя версия почему-то не работает.
прикреплены файлы
NazarPunk #77 - 3 дня назад 0
Кстати, твоя версия почему-то не работает.
У меня такое было из-за Adic*. Галки убирали?
KaneThaumaturge #78 - 3 дня назад 0
NazarPunk, Отображает вместо хп баров мп бары.
Мне кажется что-то тут работает не так, как ты думаешь br_abilityHP + i
Смотри
NazarPunk, Я имею ввиду сама наработка некорректно отображает бары.
В общем, ошибка была в том, что 'Bara' + 1 = 'BarB', а не 'Barb'. Ну а может и нет.
Исправил тем, что прописал другие равкоды. Для мп 'BMPA', а для хп 'BHPA'.
прикреплены файлы
NazarPunk #79 - 3 дня назад (отредактировано ) 0
Мне кажется что-то тут работает не так, как ты думаешь br_abilityHP + i
Математика не может неправильно работать, а движок игры не видел разницу между Bara и BarA. Изменил равкоды
constant integer br_abilityHP = 'BHPa' //равкод HP 00.
constant integer br_abilityMP = 'BMPa' //равкод MP 00.

Object Merger также поправил.

Пропишите новой текстуре путь UI\Feedback\XPBar\human-bigbar-fill.blp
UI\Feedback\XPBar\human-bigbar-fill.blp также заменит полоску опыта у героя, лучше бы заменить на UI\Feedback\HpBarConsole\human-healthbar-fill.blp
прикреплены файлы
KaneThaumaturge #80 - 3 дня назад (отредактировано ) 0
Изменил равкоды
Да, я уже почти такие же равкоды сделал.
NazarPunk:
UI\Feedback\XPBar\human-bigbar-fill.blp также заменит полоску опыта у героя, лучше бы заменить на
Модельки то не мои, очень в лом заходить и менять текустуру, но наверное сделаю.
NazarPunk #81 - 3 дня назад 0
» перевёл на zinc, если кому нужно))
//! nocjass
native UnitAlive takes unit u returns boolean
//! zinc
library CustomBar {
    constant real br_updatePeriod = 0.125; // период обновления баров, 1/8 секунды
    constant integer br_abilityHP = 'BHPa'; // равкод HP 00.
    constant integer br_abilityMP = 'BMPa'; // равкод MP 00.
    integer br_indHP[]; //сохраняет текущий индекс модели хпбара,  чтобы сравнить изменился ли он.
    integer br_indMP[]; //сохраняет текущий индекс модели мпбара,  чтобы сравнить изменился ли он.
    integer br_unitCounter = 0; //счётчик обрабатываемых юнитов.
    region br_mapArea; //игровая область карты.
    unit br_unit[]; //массив обрабатываемых юнитов.
    
    //Заносит юнита в массив обрабатываемых юнитов при входе в игровую область карты.
    //Добавив условие, можно указать тех, над кем не будут отображаться нестандартные хп/мпбары. Вместо (true) вставтье свои условия, проверяемый юнит u.
    function addUnit(unit target){
        if (true){
            br_unitCounter = br_unitCounter + 1;
            br_unit[br_unitCounter] = target;
        }
    }
    
    //Обновляет хп/мпбары. Если юнит мёртв или процент (хп или мп)/5 не поменялось, то пропускает действия.
    function SetBar(){
        integer i, indHP, indMP;
        for(0 <= i <= br_unitCounter){
            if (UnitAlive(br_unit[i])) {
                indHP = R2I(GetWidgetLife(br_unit[i]) / GetUnitState(br_unit[i], UNIT_STATE_MAX_LIFE) * 20.0);
                if (br_indHP[i] != indHP)  {
                    UnitRemoveAbility(br_unit[i], br_abilityHP + br_indHP[i]);
                    UnitAddAbility   (br_unit[i],  br_abilityHP + indHP);
                    br_indHP[i] = indHP;
                }
                if  (GetUnitState(br_unit[i], UNIT_STATE_MAX_MANA) > 0) {
                    indMP = R2I(GetUnitState(br_unit[i], UNIT_STATE_MANA) / GetUnitState(br_unit[i], UNIT_STATE_MAX_LIFE) * 20.0);
                    if (br_indMP[i] != indMP) {
                        UnitRemoveAbility(br_unit[i], br_abilityMP + br_indMP[i]);
                        UnitAddAbility   (br_unit[i],  br_abilityMP + indMP);
                        br_indMP[i] = indMP;
                    }
                }
            }
        }
    }
    
    //Очистка удалённых юнитов из массива обрабатываемых юнитов. Для того чтобы не обрабатывать удалённых юнитов, а также не превысить максимальный размер массива.
    //По-этому, если нет специальных условий, количество обрабатываемых юнитов всегда равно количеству юнитов на карте + мёртвые герои.
    function ClearRemoteUnits() {
        integer i;
        for(0 <= i <= br_unitCounter){
            if (GetUnitTypeId(br_unit[i]) == 0) {
                br_unit[i] = br_unit[br_unitCounter];
                br_indHP[i] = br_indHP[br_unitCounter];
                br_indMP[i] = br_indMP[br_unitCounter];
                br_unit[br_unitCounter] = null;
                br_indHP[br_unitCounter] = 0;
                br_indMP[br_unitCounter] = 0;
                br_unitCounter = br_unitCounter - 1;
            }
        }
    }
    
    public {
        function CustomBarGetCounter() -> integer {
            return br_unitCounter;
        }
    }
    
    //Функция инициализации.
    function onInit(){ 
        integer i;
        trigger t;
        group g = CreateGroup();
        unit u = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 'hfoo' , 0, 0, 0);
        EnablePreSelect(false, false); //скрывает полоски здоровья и информацию при наведении на юнита.
        
        br_mapArea = CreateRegion();
        RegionAddRect(br_mapArea, bj_mapInitialPlayableArea);
        
        //Прелоад способностей.
        for(0 <= i <= 20){
            UnitAddAbility(u, br_abilityHP + i);
            UnitAddAbility(u, br_abilityMP + i);
        }
        RemoveUnit(u);
        
        //Заносит юнита в массив обрабатываемых юнитов при входе в игровую область карты.
        t = CreateTrigger();
        TriggerRegisterEnterRegion(t, br_mapArea, null);
        TriggerAddAction(t, function(){
            addUnit(GetTriggerUnit());
        });
        
        GroupEnumUnitsInRect( g, bj_mapInitialPlayableArea, null);
        while (true){
            u = FirstOfGroup(g);
            if (u == null) { break; }
            addUnit(u);
            GroupRemoveUnit(g, u);
        }
        DestroyGroup(g); g = null;
        
        TimerStart(CreateTimer(), br_updatePeriod, true, function SetBar);
        TimerStart(CreateTimer(), 10, true, function ClearRemoteUnits);
        
        t = null;
    } 
    
}
//! endzinc
//! endnocjass
прикреплены файлы
PT153 #82 - 3 дня назад (отредактировано ) 0
Bara и BarA
Вообще-то, между 'BarA' и 'Bara' разница есть.
KaneThaumaturge #84 - 3 дня назад 0
Clamp, ну, я модели не делал. Если сделает кто-то другие модели, то залью несколько вариантов. Также хотелось бы, чтоб кто-то сделал тимколорный вариант. Но вот кто будет этим "кто-то".
Clamp #85 - 3 дня назад 0
А как ты на тимколоре планируешь покраснение полоски при снижении хп делать?
pro100master #86 - 3 дня назад 0
рамка - дамми
прогресс - дамми от 0 до 20 (Тимколор)
Jack-of-shadow #87 - 3 дня назад (отредактировано ) 0
Clamp:
А как ты на тимколоре планируешь покраснение полоски при снижении хп делать?
а надо ли оно?
KaneThaumaturge:
ща гляну, почему в редакторе полосок не видно
pro100master #88 - 3 дня назад 0
если вы знаете как накладывать сверху другой цвет вот и получите тимколор но бредовый =)
Jack-of-shadow #89 - 3 дня назад (отредактировано ) 0
pro100master:
Модельки уже есть, просто я их в редакторе не проверял когда делал. Там что-то пофиксить надо.
прикреплены файлы
KaneThaumaturge #90 - 3 дня назад 0
Jack-of-shadow, только прозрачность не забудь убрать, а так огромное спасибо, если сделаешь.
Jack-of-shadow #91 - 3 дня назад (отредактировано ) 2
KaneThaumaturge:
вроде нашел в чем проблема, но modulate смешивание в редакторе как то странно отображается.
хотя издалека вроде и невидно точек.
прикреплены файлы
KaneThaumaturge #92 - 3 дня назад (отредактировано ) 0
Jack-of-shadow, это текустурка в импорте. UI\Feedback\XPBar\human-bigbar-fill.blp
Хотел показать, что можно свою текстурку прописать.
Честно говоря, стандартные выглядят намного лучше =/
А что именно не нравится, вы хоть аргументируйте.
прикреплены файлы
Jack-of-shadow #93 - 3 дня назад (отредактировано ) 1
KaneThaumaturge:
это текустурка в импорте. UI\Feedback\XPBar\human-bigbar-fill.blp Хотел показать, что можно свою текстурку прописать.
Ааа блин, а я уже себе мозг сломал.
А что именно не нравится, вы хоть аргументируйте.
Согласен. Жаль только, что система потеряла свою основную фишку - это возможность скрывать нужные бары для локального игрока, и помимо манабаров она уже не так интересна.
KaneThaumaturge #94 - 3 дня назад 0
Jack-of-shadow, все равно EnablePreSelect(false, false) нельзя использовать для локального игрока.
Clamp #95 - 3 дня назад 1
а надо ли оно?
А что именно не нравится, вы хоть аргументируйте.
Полоска здоровья нужна для того, чтобы было видно, сколько здоровья осталось у юнита. Лишние элементы в виде рамки не несут функционала, но зачем-то присутствуют, что в любом дизайне является грубейшей ошибкой.
KaneThaumaturge #96 - 3 дня назад 0
Clamp, хорошо.
Я, может, посмотрю на модельки и попробую заменить на обычную рамку.
Jack-of-shadow #97 - 3 дня назад (отредактировано ) 0

Окончательно доломал коментарий. Файлы не открепляются и новые не заливаются.
Даже в какой-то момент чужой скриншот вылез.
прикреплены файлы
KaneThaumaturge #98 - 2 дня назад 0
Jack-of-shadow, спасибо, я ещё посмотрю, может заменю текстуру рамок и сделаю выше бары. Спасибо ещё раз.
Там, кстати, ошибочка в коде.
indMP = R2I(GetUnitState(br_unit[i], UNIT_STATE_MANA) / GetUnitState(br_unit[i], UNIT_STATE_MAX_LIFE) * 20.0)
Вместо UNIT_STATE_MAX_LIFE нужно UNIT_STATE_MAX_MANA.
Ладно, сейчас на главную залью варианты моделей и исправлю код.