Описание
Наработка позволяет создать плавающий текст, прикреплённый к юниту, который будет отображать время действия способности, каста и чего придёт в голову. Плавающий текст меняется в зависимости от оставшегося времени и меняет цвет от зелённого до красного.
Вызов
Временной
    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Для работы необходимо добавить библиотеку в код карты и всё.
Примечания
При смерти юнита, текст будет удаляться, однако, если юнит будет удалён из игры текст останется, поэтому во избежание проблем рекомендую убивать юнита перед его удалением.
 
                        
                        
                    
 WC3
                                WC3
                            



 
                    
                
Ред. ArhiMEN
Обновление
Обновление