Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
vJass
Тип:
Наработка
Версия Warcraft:
1.26 (default)

Описание

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

Вызов

Временной

    call CastingTime(unit, time)
Вызов функции создания плавающего текста, где unit - юнит, на которого крепится плавающий текст, time - время существования плавающего текста.
	call CastingTimeRemove(unit)
Вызов функции уничтожения плавающего текста, где unit - юнит с которого снимается плавающий текст.

Числовой

Так же можно создать числовой показатель, который будет изменяться не от времени, а от самостоятельного изменения числа.
	call Count(unit, count)
Вызов функции создания плавающего текста, где unit - юнит, на которого крепится плавающий текст, count - изначальное количество, хранимое в плавающем тексте.
Для изменения числа, используются две функции:
	call AddCount(unit, count, "sign")
Функция для изменения числа, где unit - юнит, на котором закреплён нужный плавающий текст, count - число, на которое изменяем, sign - знак - или + (в зависимости от того, отнимаете вы или прибавляете).
	call SetCount(unit, count)
Функция для установления числа, где unit - юнит, на котором закреплён нужный плавающий текст, count - число, на которое устанавливаем.
Кроме этого можно узнать максимальное и нынешнее количество
	call GetCount(unit, "countstring")
Где unit - юнит, на котором закреплён нужный плавающий текст, countstring - одно из двух значений: max, now.
	call CountRemove(unit)
Вызов функции уничтожения плавающего текста, где unit - юнит с которого снимается плавающий текст.
Код
library Duration

//Функции для отображения временного показателя

    function CastingTimeRemove takes unit u returns nothing
        local integer id = GetHandleId(u)
        local timer Timer = LoadTimerHandle(udg_hash, id, StringHash("Timer"))
        local texttag Texttag = LoadTextTagHandle(udg_hash, id, StringHash("CastingTimeTexxtag"))
        local texttag Texttag2 = LoadTextTagHandle(udg_hash, id, StringHash("CastingTimeTexxtagBlack"))
        
        call DestroyTimer(Timer)
        call DestroyTextTag(Texttag)
        call DestroyTextTag(Texttag2)
        
        set Timer = null
        set Texttag = null
        set Texttag2 = null
    endfunction

    function RemoveTexttagTriggerCasting takes nothing returns nothing
        local unit u = GetTriggerUnit()
        local integer id = GetHandleId(u)
        local trigger t = LoadTriggerHandle(udg_hash, id, StringHash("Remove Texttag Casting"))
        
        call DestroyTrigger(t)
        call CastingTimeRemove(u)
        
        set u = null
        set t = null
    endfunction
    
    function CastingTimeString takes unit u, real ctn returns string
        local integer id = GetHandleId(u)
        local real CastingTimeStartCD = LoadReal(udg_hash, id, StringHash("CastingTimeStartCD")) 
        local integer StringLoop = 0
        local string CastingTimeCDString = ""
        local real CastingTimeStartCDNow
        local real LoopCountR
        local integer LoopCountI
        
        set CastingTimeStartCDNow = CastingTimeStartCD - ctn
        set LoopCountR = 100.0 * CastingTimeStartCDNow / CastingTimeStartCD
        set LoopCountI = R2I(LoopCountR) / 10
        
        loop
            exitwhen StringLoop > LoopCountI
            set CastingTimeCDString = CastingTimeCDString + "I"
            set StringLoop = StringLoop + 1
        endloop
        
        return CastingTimeCDString
    endfunction

    function MoveAndSetTexttagCasting takes nothing returns nothing
        local timer Timer = GetExpiredTimer()
        local integer tid = GetHandleId(Timer)
        local unit CastingTimeUnit = LoadUnitHandle(udg_hash, tid, StringHash("CastingTimeUnit"))
        local integer id = GetHandleId(CastingTimeUnit)
        local texttag CastingTimeTexxtag = LoadTextTagHandle(udg_hash, id, StringHash("CastingTimeTexxtag"))
        local texttag CastingTimeTexxtagBlack = LoadTextTagHandle(udg_hash, id, StringHash("CastingTimeTexxtagBlack"))
        local real CastingTimeStartCD = LoadReal(udg_hash, id, StringHash("CastingTimeStartCD"))
        local real CastingTimeNowCD = LoadReal(udg_hash, id, StringHash("CastingTimeNowCD"))
        local real ColorRed
        local real ColorGreen
        local real LoopCountR
        local integer LoopCountI
        
        set CastingTimeNowCD = CastingTimeNowCD - 0.01
            
        if CastingTimeNowCD <= 0.00 then
            call DestroyTimer(Timer)
            call DestroyTextTag(CastingTimeTexxtag)
            call DestroyTextTag(CastingTimeTexxtagBlack)
        else
        endif
        
        call SaveReal(udg_hash, id, StringHash("CastingTimeNowCD"), CastingTimeNowCD)
            
        set CastingTimeNowCD = CastingTimeStartCD - CastingTimeNowCD
        call SetTextTagText(CastingTimeTexxtag, CastingTimeString(CastingTimeUnit, CastingTimeNowCD), 5 * 0.023 / 10)
        
        set LoopCountR = 100.0 * (CastingTimeNowCD - 0.01) / CastingTimeStartCD
        set LoopCountI = 10 - R2I(LoopCountR) / 10
                                
        if LoopCountI > 5 then
            set ColorRed = 20 * (LoopCountI - 6)
            set ColorRed = 100 - ColorRed
            call SetTextTagColor(CastingTimeTexxtag, R2I(ColorRed * I2R(255) * 0.01), 255, 0, 0)
        elseif LoopCountI == 5 then
            call SetTextTagColor( CastingTimeTexxtag, 255, 255, 0, 0 )
        elseif LoopCountI < 5 then
            set ColorGreen = 20 * (LoopCountI - 1)
            call SetTextTagColor( CastingTimeTexxtag, 255, R2I(ColorGreen * I2R(255) * 0.01), 0, 0 )
        endif
            
        call SetTextTagPos(CastingTimeTexxtag, GetUnitX(CastingTimeUnit) - 50, GetUnitY(CastingTimeUnit), 50)
        call SetTextTagPos(CastingTimeTexxtagBlack, GetUnitX(CastingTimeUnit) - 50, GetUnitY(CastingTimeUnit), 50)
        
        set Timer = null
        set CastingTimeUnit = null
        set CastingTimeTexxtag = null
        set CastingTimeTexxtagBlack = null
    endfunction

    function CastingTime takes unit u, real ct returns nothing
        local integer id = GetHandleId(u)
        local texttag Tekst
        local texttag Tekst2
        local real CastingTimeStartCD = ct 
        local timer Timer = CreateTimer()
        local integer tid = GetHandleId(Timer)
        local trigger RemoveTexttag = LoadTriggerHandle(udg_hash, id, StringHash("Remove Texttag Casting"))
        
        call SaveReal(udg_hash, id, StringHash("CastingTimeStartCD"), CastingTimeStartCD)
        call SaveReal(udg_hash, id, StringHash("CastingTimeNowCD"), ct)
        
        set bj_lastCreatedTextTag = CreateTextTag()
        call SetTextTagText(bj_lastCreatedTextTag, "IIIIIIIIII!", 5.00)
        call SetTextTagColor(bj_lastCreatedTextTag,  0, 255, 0, 0)
        call SetTextTagPos(bj_lastCreatedTextTag, GetUnitX(u), GetUnitY(u), 10.00)
        call SaveTextTagHandle(udg_hash, id, StringHash("CastingTimeTexxtag"), bj_lastCreatedTextTag)
        
        set bj_lastCreatedTextTag = CreateTextTag()
        call SetTextTagText(bj_lastCreatedTextTag, "IIIIIIIIII!", 5.00)
        call SetTextTagColor(bj_lastCreatedTextTag,  R2I(15 * I2R(255) * 0.01), R2I(15 * I2R(255) * 0.01), R2I(15 * I2R(255) * 0.01), 0)
        call SetTextTagPos(bj_lastCreatedTextTag, GetUnitX(u), GetUnitY(u), 10.00)
        call SaveTextTagHandle(udg_hash, id, StringHash("CastingTimeTexxtagBlack"), bj_lastCreatedTextTag)
            
        call TimerStart( Timer, 0.01, true, function MoveAndSetTexttagCasting)
        call SaveUnitHandle(udg_hash, tid, StringHash("CastingTimeUnit"), u)
                
        call SaveTimerHandle(udg_hash, id, StringHash("Timer"), Timer)
        
        call DestroyTrigger(RemoveTexttag)
        set RemoveTexttag = CreateTrigger()
        call TriggerRegisterUnitEvent(RemoveTexttag, u, EVENT_UNIT_DEATH)
        call TriggerAddAction(RemoveTexttag, function RemoveTexttagTriggerCasting)
        call SaveTriggerHandle(udg_hash, id, StringHash("Remove Texttag Casting"), RemoveTexttag)
        
        set Tekst = null
        set Tekst2 = null
        set Timer = null
        set RemoveTexttag = null
    endfunction
    
//Функции для отображения числового показателя

    function CountRemove takes unit u returns nothing
        local integer id = GetHandleId(u)
        local timer Timer = LoadTimerHandle(udg_hash, id, StringHash("Timer Count"))
        local texttag Texttag = LoadTextTagHandle(udg_hash, id, StringHash("CountTexxtag"))
        local texttag Texttag2 = LoadTextTagHandle(udg_hash, id, StringHash("CountTexxtagBlack"))
        
        call DestroyTimer(Timer)
        call DestroyTextTag(Texttag)
        call DestroyTextTag(Texttag2)
        
        set id = 0
        set Timer = null
        set Texttag = null
        set Texttag2 = null
    endfunction
    
    function RemoveTexttagTriggerCount takes nothing returns nothing
        local unit u = GetTriggerUnit()
        local integer id = GetHandleId(u)
        local trigger t = LoadTriggerHandle(udg_hash, id, StringHash("Remove Texttag Count"))
        
        call DestroyTrigger(t)
        call CountRemove(u)
        
        set u = null
        set id = 0
        set t = null
    endfunction
    
    function GetCount takes unit u, string countstring returns real
        local real count
        local integer id = GetHandleId(u)
        
        if countstring == "max" then
            set count = LoadReal(udg_hash, id, StringHash("PrimCount"))
        elseif countstring == "now" then
            set count = LoadReal(udg_hash, id, StringHash("NowCount"))
        endif
        
        return count
    endfunction
    
    function OverwriteCount takes unit u returns nothing
        local integer id = GetHandleId(u)
        local real MaxCount = GetCount(u, "max")
        local real NowCount = GetCount(u, "now")
        
        if NowCount > MaxCount then
            call SaveReal(udg_hash, id, StringHash("PrimCount"), NowCount)
        endif
    endfunction
    
    function AddCount takes unit u, real count, string sign returns nothing
        local integer id = GetHandleId(u)
        
        if sign == "+" then
            call SaveReal(udg_hash, id, StringHash("NowCount"), GetCount(u, "now") + count)
        elseif sign == "-" then
            call SaveReal(udg_hash, id, StringHash("NowCount"), GetCount(u, "now") + count)
        endif
    endfunction
    
    function SetCount takes unit u, real count returns nothing
        local integer id = GetHandleId(u)
        
        call SaveReal(udg_hash, id, StringHash("NowCount"), count)
    endfunction
    
    function CountTexttagSettings takes unit u returns string
        local integer id = GetHandleId(u)
        local real PrimCount = GetCount(u, "max")
        local real NowCount = GetCount(u, "now")
        local integer StringLoop = 1
        local string CountString = ""
        local real LoopCountR
        local integer LoopCountI
        local texttag CountTexxtag = LoadTextTagHandle(udg_hash, id, StringHash("CountTexxtag"))
        local real ColorRed
        local real ColorGreen
        
        call OverwriteCount(u)
         
        set LoopCountR = 100.0 * NowCount / PrimCount
        set LoopCountI = R2I(LoopCountR) / 10
                
        loop
            exitwhen StringLoop > LoopCountI
            set CountString = CountString + "I"
            set StringLoop = StringLoop + 1
        endloop
                
        if StringLoop > 5 then
            set ColorRed = 20 * (StringLoop - 6)
            set ColorRed = 100 - ColorRed
           call SetTextTagColor(CountTexxtag, R2I(ColorRed * I2R(255) * 0.01), 255, 0, 0)
        elseif StringLoop == 5 then
            call SetTextTagColor(CountTexxtag, 255, 255, 0, 0)
        elseif StringLoop < 5 then
            set ColorGreen = 20 * (StringLoop - 1)
            call SetTextTagColor(CountTexxtag, 255, R2I(ColorGreen * I2R(255) * 0.01), 0, 0)
        endif
        
        if NowCount <= 0.0 then
            call CountRemove(u)
        endif
        
        return CountString
        
        set CountString = null
        set CountTexxtag = null
    endfunction
    
    function MoveTexttagCount takes nothing returns nothing
        local timer Timer = GetExpiredTimer()
        local integer tid = GetHandleId(Timer)
        local unit CountUnit = LoadUnitHandle(udg_hash, tid, StringHash("CountUnit"))
        local integer id = GetHandleId(CountUnit)
        local texttag CountTexxtag = LoadTextTagHandle(udg_hash, id, StringHash("CountTexxtag"))
        local texttag CountTexxtagBlack = LoadTextTagHandle(udg_hash, id, StringHash("CountTexxtagBlack"))
        
        call SetTextTagPos(CountTexxtag, GetUnitX(CountUnit) - 50, GetUnitY(CountUnit), 10.00)
        call SetTextTagPos(CountTexxtagBlack, GetUnitX(CountUnit) - 50, GetUnitY(CountUnit), 10.00)
        
        call SetTextTagText(CountTexxtag, CountTexttagSettings(CountUnit), 5 * 0.023 / 10)
        
        set Timer = null
        set CountUnit = null
        set CountTexxtag = null
        set CountTexxtagBlack = null
    endfunction
    
    function Count takes unit u, real ct returns nothing
        local integer id = GetHandleId(u)
        local texttag Tekst
        local texttag Tekst2
        local timer Timer = CreateTimer()
        local integer tid = GetHandleId(Timer)
        local trigger RemoveTexttag = LoadTriggerHandle(udg_hash, id, StringHash("Remove Texttag Count"))
                
        call SaveReal(udg_hash, id, StringHash("PrimCount"), ct)
        call SaveReal(udg_hash, id, StringHash("NowCount"), ct)
        
        set bj_lastCreatedTextTag = CreateTextTag()
        call SetTextTagText(bj_lastCreatedTextTag, "IIIIIIIIII!", 5.00)
        call SetTextTagColor(bj_lastCreatedTextTag,  0, 255, 0, 0)
        call SetTextTagPos(bj_lastCreatedTextTag, GetUnitX(u), GetUnitY(u), 10.00)
        call SaveTextTagHandle(udg_hash, id, StringHash("CountTexxtag"), bj_lastCreatedTextTag)
        
        set bj_lastCreatedTextTag = CreateTextTag()
        call SetTextTagText(bj_lastCreatedTextTag, "IIIIIIIIII!", 5.00)
        call SetTextTagColor(bj_lastCreatedTextTag,  R2I(15 * I2R(255) * 0.01), R2I(15 * I2R(255) * 0.01), R2I(15 * I2R(255) * 0.01), 0)
        call SetTextTagPos(bj_lastCreatedTextTag, GetUnitX(u), GetUnitY(u), 10.00)
        call SaveTextTagHandle(udg_hash, id, StringHash("CountTexxtagBlack"), bj_lastCreatedTextTag)
        
        call TimerStart( Timer, 0.01, true, function MoveTexttagCount)
        call SaveUnitHandle(udg_hash, tid, StringHash("CountUnit"), u)
                
        call SaveTimerHandle(udg_hash, id, StringHash("Timer Count"), Timer)
        
        call DestroyTrigger(RemoveTexttag)
        set RemoveTexttag = CreateTrigger()
        call TriggerRegisterUnitEvent(RemoveTexttag, u, EVENT_UNIT_DEATH)
        call TriggerAddAction(RemoveTexttag, function RemoveTexttagTriggerCount)
        call SaveTriggerHandle(udg_hash, id, StringHash("Remove Texttag Count"), RemoveTexttag)
        
        set Tekst = null
        set Tekst2 = null
        set Timer = null
        set RemoveTexttag = null
    endfunction
endlibrary
Для работы необходимо добавить библиотеку в код карты и всё.

Примечания

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

Видео

`
ОЖИДАНИЕ РЕКЛАМЫ...
2
26
3 года назад
2
а если мне нужно прервать это время?
0
11
3 года назад
0
Hate:
а если мне нужно прервать это время?
В скором времени изменю описание, забыл добавить несколько аспектов.
0
11
3 года назад
Отредактирован ArhiMEN
0
-> Обновление
Добавлена возможность создания плавающего текста для визуализации остатков щита или чего-либо ещё.
2
12
3 года назад
2
Почему здесь используются bj-функции и location?Карта пример будет?
2
11
3 года назад
2
Добавил карту-пример
0
14
3 года назад
0
ты это сам создал??
0
11
3 года назад
0
Гуванч:
ты это сам создал??
Да, но нужно оптимизировать.
0
14
3 года назад
0
ArhiMEN:
Гуванч:
ты это сам создал??
Да, но нужно оптимизировать.
от куда такие знания джасса??)))

ArhiMEN:
Гуванч:
ты это сам создал??
Да, но нужно оптимизировать.
и зачем обнулять цифры?))))))))))))))))))
0
11
3 года назад
0
от куда такие знания джасса??)))
Да там особо знаний и не нужно, самая большая морока была с цветом.
и зачем обнулять цифры?))))))))))))))))))
когда делал эту наработку, обнулял всё, сейчас понимаю, что смысла в этом мало.
0
11
3 года назад
0

Обновление

Код оптимизирован, утечек нет
0
11
3 года назад
0

Обновление

Добавлены новые функции
0
17
3 года назад
0
ArhiMEN, привет, добавь видео-примеры пожалуйста
0
11
3 года назад
0
Vlod, окей
1
11
3 года назад
1

Обновление

Добавил видеодемонстрацию
1
27
2 года назад
1
смотрю тут юзается хэш юнита, а если у меня будут названия совпадать с твоими стрингхэшами и будет происходить перезапись? получается эта наработка поломает челу карту
0
11
2 года назад
0
rsfghd:
смотрю тут юзается хэш юнита, а если у меня будут названия совпадать с твоими стрингхэшами и будет происходить перезапись? получается эта наработка поломает челу карту
получается так(
0
14
2 года назад
0
используй ключ в место стрингхеша
2
27
2 года назад
2
Гуванч, ключ не должен спасать положение, лол)

ArhiMEN, в чём проблема тогда было вывести стрингхэши в глобалки и сделать приватными?
ничего не сломалось бы
0
11
2 года назад
0
rsfghd:
Гуванч, ключ не должен спасать положение, лол)

ArhiMEN, в чём проблема тогда было вывести стрингхэши в глобалки и сделать приватными?
ничего не сломалось бы
сделаю
Чтобы оставить комментарий, пожалуйста, войдите на сайт.