1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
  2. Are you planning to upload your awesome spell or system to Hive? Please review the rules here.
    Dismiss Notice
  3. We need your help nominating resources for or next YouTube video. Post here now.
    Dismiss Notice
  4. The winners of the 27th Texturing Contest have been announced. Congratulations to the winners!
    Dismiss Notice
  5. The Terraining Mini Contest Reload #2 - Machinery has began! Create a scene centered around a piece of machinery. Get creative tinker boys and girls!
    Dismiss Notice
  6. Join us on our next Custom Game Night, on Saturday, February the 24th at 7:00pm UTC! We'll see you all on our Discord and on Battle.net!
    Dismiss Notice
  7. The Cinematic Contest #7 - Time has began! Create a cinematic about Time!
    Dismiss Notice
  8. The Team Member Contest has ended! Check out Hive's created heroes and who could win the challenge here!
    Dismiss Notice

[System] (vJass) CustomBar

Submitted by Anachron
This bundle is marked as approved. It works and satisfies the submission rules.
Hey.

I have made a little system that can configure custom bars for units.

Requires ARGB by Vex.

ADDONS:
SpellBar -> Displays SpellCast progress bar.

Library

Code (vJASS):

//******************************************************************************
//*
//* CustomBar 1.0 (Initial Release)
//* ====
//*  For your CustomBar needs. / Thanks Vex for this sentence <3
//*
//* This library is used to give a fully functional Bar System
//* that provides you interfaces for setting the bar state and
//* for letting you fade the bar, and even let you decide which
//* fade Condition to use.
//*
//* If a Bar is fading (out) and its condition becomes false, its
//* changing its fading (to in).
//*
//* You can also disable fading, if you want.
//*
//* PLEASE NOTE: MY FADING OF MY SYSTEM DOES !NOT! USE
//* WC3S FADE SYSTEM! IT SIMPLY CHANGES THE COLOR OF THE
//* TEXTTAG WITH LESS ALPHA! YOU CAN USE BOTH TOGETHER,
//* BUT I DOUBT ITS A GOOD IDEA!
//*
//*
//* by dhk_undead_lord / aka Anachron
//*
//******************************************************************************
library CustomBar initializer init requires ARGB

    //=!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#
    //: Change anything below to what you need!
    //=!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#

    //: The customizeable constants.
    //: I hope the names are self-explaining.
    //: (If not, check the CustomBar Documentation!
    globals
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        //: Texttag defaults.
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        public  constant string  FADE_TYPE_IN               = "IN"
        public  constant string  FADE_TYPE_OUT              = "OUT"
        private constant real    FADE_MIN                   = 0.
        private constant real    FADE_MAX                   = 1.00
        private constant real    TT_DEFAULT_AGE             = 0.
        private          ARGB    TT_DEFAULT_COLOR
        private constant real    TT_DEFAULT_FADEPOINT       = 0.
        private constant boolean TT_DEFAULT_FADES           = true
        private constant real    TT_DEFAULT_FADE_STATE      = FADE_MIN
        private constant real    TT_DEFAULT_FADE_STRENGH    = 0.75
        private constant string  TT_DEFAULT_FADE_TYPE       = FADE_TYPE_OUT
        private constant boolean TT_DEFAULT_FADING          = false
        private constant texttag TT_DEFAULT_HANDLE          = null
        private constant real    TT_DEFAULT_LIFESPAN        = 0.
        private constant boolean TT_DEFAULT_PERMANENT       = true
        private constant real    TT_DEFAULT_OFFSETX        = 0.
        private constant real    TT_DEFAULT_OFFSETY        = 0.
        private constant real    TT_DEFAULT_OFFSETZ        = 0.
        private constant real    TT_DEFAULT_POSX            = 0.
        private constant real    TT_DEFAULT_POSY            = 0.
        private constant real    TT_DEFAULT_POSZ            = 0.
        private constant real    TT_DEFAULT_SIZE            = 7.5 * 0.023 / 10
        private constant boolean TT_DEFAULT_SUSPENDED       = false
        private constant string  TT_DEFAULT_TEXT            = ""
        private constant real    TT_DEFAULT_VELX            = 0.
        private constant real    TT_DEFAULT_VELY            = 0.
        private constant boolean TT_DEFAULT_VISIBILITY      = true
       
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        //: TextBar defaults.
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        private constant string     TB_DEFAULT_CHAR                 = "I"
        private constant integer    TB_DEFAULT_CHAR_AMOUNT          = 25
        private constant string     TB_DEFAULT_CHAR_EMPTY           = "*"
        private          ARGB       TB_DEFAULT_CHAR_COLOR
        private constant string     TB_DEFAULT_FINISHEDBAR          = ""
        private          ARGB       TB_DEFAULT_LIMITER_COLOR
        private constant string     TB_DEFAULT_LIMITER_SYMBOL_LEFT  = "["
        private constant string     TB_DEFAULT_LIMITER_SYMBOL_RIGHT = "]"
        private constant boolean    TB_DEFAULT_LIMITER_VISIBLE      = true
        private constant real       TB_DEFAULT_PERCENTAGE           = 100.
        private constant integer    TB_MAX_CHAR_AMOUNT              = 100
   
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        //: CustomBar defaults.
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        private constant boolean    CB_DEFAULT_LOCKED           = true
        private constant unit       CB_DEFAULT_TARGET           = null
        private constant force      CB_DEFAULT_SHOW_FORCE       = bj_FORCE_ALL_PLAYERS
   
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        //: TextBarStack defaults.
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        private constant timer  CBS_TIMER   = CreateTimer()
        private constant real   CBS_TICK    = 0.0375
       
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        //: Information.
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        //: For the ARGB declaration check the function init,
        //: at the total bottom of this library.
    endglobals
   
    //: The interfaces for the system
    public function interface iChange takes CustomBar cb returns nothing
    public function interface iFade takes CustomBar cb returns boolean
    public function interface iShow takes player owner, player cur returns boolean
   
    //: Default functions for this system
    public function defaultFadeCondition takes CustomBar cb returns boolean
        return GetUnitState(cb.target, UNIT_STATE_LIFE) == 0.
    endfunction
   
    public function defaultShowCondition takes player owner, player cur returns boolean
        return true
    endfunction
   
    //=!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#
    //: I don't recommend changing code below this!
    //=!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#
   
    //==-=-=-=-=-=-=-
    //: Textmacros
    //==-=-=-=-=-=-=-
    //! textmacro varOp takes name, fname, type, method
    method operator $fname$ takes nothing returns $type$
        return .$name$
    endmethod
   
    method operator $fname$= takes $type$ val returns nothing
        set .$name$ = val
        $method$
    endmethod
    //! endtextmacro
    //==-=-=-=-=-=-=-
       
    //: A struct which contains all
    //: TextTag methods and members
    private struct TextTag
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: TextTag members. Sorted by name.
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        private real    Age         = TT_DEFAULT_AGE
        private ARGB    Color       = TT_DEFAULT_COLOR
        private boolean Fades       = TT_DEFAULT_FADES
        private real    FadeState   = TT_DEFAULT_FADE_STATE
        private real    FadeStrengh = TT_DEFAULT_FADE_STRENGH
        private string  FadeType    = TT_DEFAULT_FADE_TYPE
        private real    Fadepoint   = TT_DEFAULT_FADEPOINT
        private boolean Fading      = TT_DEFAULT_FADING
        private iFade   FadeCond    = defaultFadeCondition
        private real    Lifespan    = TT_DEFAULT_LIFESPAN
        private texttag Handle      = TT_DEFAULT_HANDLE
        private boolean Permanent   = TT_DEFAULT_PERMANENT
        private real    OffsetX     = TT_DEFAULT_OFFSETX
        private real    OffsetY     = TT_DEFAULT_OFFSETY
        private real    OffsetZ     = TT_DEFAULT_OFFSETZ
        private real    PosX        = TT_DEFAULT_POSX
        private real    PosY        = TT_DEFAULT_POSY
        private real    PosZ        = TT_DEFAULT_POSZ
        private boolean Suspended   = TT_DEFAULT_SUSPENDED
        private string  Text        = TT_DEFAULT_TEXT
        private real    Size        = TT_DEFAULT_SIZE
        private real    VelX        = TT_DEFAULT_VELX
        private real    VelY        = TT_DEFAULT_VELY
        private boolean Visibility  = TT_DEFAULT_VISIBILITY
   
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: TextTag methods.
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        public static method create takes nothing returns thistype
            local thistype this = thistype.allocate()
           
            set .Handle = CreateTextTag()
            call .updAge()
            call .updColor()
            call .updFadepoint()
            call .updLifespan()
            call .updPermanent()
            call .updPos()
            call .updSuspended()
            call .updText()
            call .updVelocity()
           
            return this
        endmethod
       
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: Update Methods.
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        private method updAge takes nothing returns nothing
            call SetTextTagAge(.Handle, .Age)    
        endmethod
       
        private method updColor takes nothing returns nothing
            if not .fading then
                call SetTextTagColor(.Handle, .Color.red, .Color.green, .Color.blue, .Color.alpha)
            endif
        endmethod
       
        private method updFadepoint takes nothing returns nothing
            call SetTextTagFadepoint(.Handle, .Fadepoint)
        endmethod
       
        private method updLifespan takes nothing returns nothing
            call SetTextTagLifespan(.Handle, .Lifespan)    
        endmethod
       
        private method updPermanent takes nothing returns nothing
            call SetTextTagPermanent(.Handle, .Permanent)  
        endmethod
       
        private method updPos takes nothing returns nothing
            call SetTextTagPos(.Handle, .PosX, .PosY, .PosZ)  
        endmethod
       
        private method updSuspended takes nothing returns nothing
            call SetTextTagSuspended(.Handle, .Suspended)
        endmethod
       
        private method updText takes nothing returns nothing
            call SetTextTagText(.Handle, .Text, .Size)
        endmethod
       
        private method updVelocity takes nothing returns nothing
            call SetTextTagVelocity(.Handle, .VelX, .VelY)  
        endmethod
       
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: Member setting / getting
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: Variables that should update the texttag
        //==----------------------------------------
        //! runtextmacro varOp("Age",        "age",          "real",     "call .updAge()")
        //! runtextmacro varOp("Color",      "color",        "ARGB",     "call .updColor()")
        //! runtextmacro varOp("Fadepoint",  "fadepoint",    "real",     "call .updFadepoint()")
        //! runtextmacro varOp("Lifespan",   "lifespan",     "real",     "call .updLifespan()")
        //! runtextmacro varOp("Permanent",  "permanent",    "boolean",  "call .updPermanent()")
        //! runtextmacro varOp("Suspended",  "suspended",    "boolean",  "call .updSuspended()")
        //! runtextmacro varOp("Visibility", "visiblity",    "boolean",  "")
       
        //==--------------------------------------------
        //: Variables that shouldn't update the texttag
        //==--------------------------------------------
        //! runtextmacro varOp("Fades",         "fades",        "boolean",  "")
        //! runtextmacro varOp("FadeCond",      "fadeCond",     "iFade",    "")
        //! runtextmacro varOp("FadeState",     "fadeState",    "real",     "")
        //! runtextmacro varOp("FadeStrengh",   "fadeStrengh",  "real",     "")
        //! runtextmacro varOp("FadeType",      "fadeType",     "string",   "")
        //! runtextmacro varOp("Fading",        "fading",       "boolean",  "")
        //! runtextmacro varOp("Handle",        "handle",       "texttag",  "")
        //! runtextmacro varOp("OffsetX",       "offsetX",      "real",     "")
        //! runtextmacro varOp("OffsetY",       "offsetY",      "real",     "")
        //! runtextmacro varOp("OffsetZ",       "offsetZ",      "real",     "")
       
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: Advanced members and their settings.
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        public method pos takes real x, real y, real z returns nothing
            set .PosX = x + .OffsetX
            set .PosY = y + .OffsetY
            set .PosZ = z + .OffsetZ
            call .updPos()
        endmethod
       
        public method posUnit takes unit u, real z returns nothing
            call .pos(GetUnitX(u), GetUnitY(u), z)
        endmethod
       
        public method text takes string t, real s returns nothing
            set .Text = t
            set .Size = s * 0.023 / 10
            call .updText()
        endmethod
       
        method operator textText takes nothing returns string
            return .Text
        endmethod
       
        method operator textText= takes string t returns nothing
            set .Text = t
            call .updText()
        endmethod
       
        method operator textSize takes nothing returns real
            return .Size
        endmethod
       
        method operator textSize= takes real s returns nothing
            set .Size = s
            call .updText()
        endmethod
       
        public method velocity takes real s, real angle returns nothing
            local real vel = s * 0.071 / 128
            set .VelX = vel * Cos(angle * bj_DEGTORAD)
            set .VelY = vel * Sin(angle * bj_DEGTORAD)
            call .updVelocity()
        endmethod
       
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: Advanced Methods
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        public method showPlayer takes player p returns nothing
            if GetLocalPlayer() == p then
                call SetTextTagVisibility(.Handle, .Visibility)
            endif
        endmethod
       
        public method fade takes CustomBar cb returns nothing
            local boolean c = false
            local boolean r = false
            local ARGB color = 0
           
            if .Fades then
                set c = .fadeCond.evaluate(cb)
               
                if c and .FadeState < FADE_MAX then
                    set .FadeType = FADE_TYPE_OUT
                    set .Fading = true
                    set r = true
                elseif not(c) and .FadeState > FADE_MIN then
                    set .FadeType = FADE_TYPE_IN
                    set .Fading = true
                    set r = true
                endif
               
                if .Fading then
                    //: Lets calculate the fading!
                    if .FadeType == FADE_TYPE_OUT then
                        set .FadeState = .FadeState + .FadeStrengh * CBS_TICK
                        if .FadeState >= FADE_MAX then
                            set .FadeState = FADE_MAX
                            set .Fading = false
                        endif
                    elseif .FadeType == FADE_TYPE_IN then
                        set .FadeState = .FadeState - .FadeStrengh * CBS_TICK
                        if .FadeState <= FADE_MIN then
                            set .FadeState = FADE_MIN
                            set .Fading = false
                        endif
                    endif
                   
                    if .Fading then
                        call SetTextTagAge(.Handle, .FadeState)
                    endif
                endif
               
                if r then
                    if .Fading then
                        call SetTextTagAge(.Handle, .FadeState)
                        call SetTextTagFadepoint(.Handle, 0.)
                        call SetTextTagLifespan(.Handle, FADE_MAX + CBS_TICK * 2)
                        call SetTextTagPermanent(.Handle, false)
                        call cb.showCB()
                    else
                        call SetTextTagAge(.Handle, .Age)
                        call SetTextTagLifespan(.Handle, .Lifespan)
                        call SetTextTagFadepoint(.Handle, .Fadepoint)
                        call SetTextTagPermanent(.Handle, .Permanent)
                       
                        if  .FadeType == FADE_TYPE_OUT then
                            call SetTextTagVisibility(.Handle, false)
                        endif
                    endif
                endif
            endif
        endmethod
       
        private method onDestroy takes nothing returns nothing
            call DestroyTextTag(.Handle)
        endmethod
    endstruct
   
    //: A struct which contains all
    //: Textbar methods and members
    private struct TextBar
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: TextBar members. Sorted by name.
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        private string          Char                = TB_DEFAULT_CHAR
        private integer         CharAmount          = TB_DEFAULT_CHAR_AMOUNT
        private ARGB            CharColor           = TB_DEFAULT_CHAR_COLOR
        private ARGB    array   CharColors          [TB_MAX_CHAR_AMOUNT]
        private string          CharEmpty           = TB_DEFAULT_CHAR_EMPTY  
        private string          FinishedBar         = TB_DEFAULT_FINISHEDBAR
        private ARGB            LimiterColor        = TB_DEFAULT_LIMITER_COLOR
        private string          LimiterSymbolLeft   = TB_DEFAULT_LIMITER_SYMBOL_LEFT
        private string          LimiterSymbolRight  = TB_DEFAULT_LIMITER_SYMBOL_RIGHT
        private boolean         LimiterVisible      = TB_DEFAULT_LIMITER_VISIBLE
        private real            Percentage          = TB_DEFAULT_PERCENTAGE
       
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: TextBar methods
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        public static method create takes nothing returns thistype
            local thistype this = thistype.allocate()
           
            return this
        endmethod
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: Member setting / getting
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: Variables that should'nt update the texttag
        //==--------------------------------------------
        //! runtextmacro varOp("Char",                  "char",                 "string",   "")
        //! runtextmacro varOp("CharAmount",            "charAmount",           "integer",  "")
        //! runtextmacro varOp("CharEmpty",             "charEmpty",            "string",   "")
        //! runtextmacro varOp("FinishedBar",           "finishedBar",          "string",   "")
        //! runtextmacro varOp("LimiterColor",          "limiterColor",         "ARGB",     "")
        //! runtextmacro varOp("LimiterSymbolLeft",     "limiterSymbolLeft",    "string",   "")
        //! runtextmacro varOp("LimiterSymbolRight",    "limiterSymbolRight",   "string",   "")
        //! runtextmacro varOp("LimiterVisible",        "limiterVisible",       "boolean",  "")
        //! runtextmacro varOp("Percentage",            "percentage",           "real",     "")
       
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: Advanced Methods
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        public method addGradient takes ARGB left, ARGB right, integer start, integer end returns nothing
            local integer i = start - 1
            local boolean e = false
            local real s = 0.
            local string test = ""
            local real m = 100 / .CharAmount
            set m = m / 100
           
            loop
                exitwhen e
               
                if i < end then
                    set s = i * m
                    set test = "i :" + I2S(i) + "\n" + " 1 / " + I2S(.CharAmount) + " = " + R2S(s)
                    set .CharColors[i] = ARGB.mix(left, right, s)
                   
                    set i = i + 1
                else
                    set e = true
                endif
            endloop
        endmethod
       
        public method generateBar takes nothing returns nothing
            local integer i = 0
            local string char = ""
           
            set .FinishedBar = ""
           
            loop
                exitwhen i >= .CharAmount
               
                if i < (.Percentage / 100) * .CharAmount then
                    if .CharColors[i] != 0 then
                        set char = .CharColors[i].str(.Char)
                    else
                        set char = .CharColor.str(.Char)
                    endif
                else
                    set char = .CharEmpty
                endif
               
                set .FinishedBar = .FinishedBar + char
               
                set i = i + 1
            endloop
           
            if .LimiterVisible then
                set .FinishedBar = .LimiterColor.str(.LimiterSymbolLeft) + .FinishedBar + .LimiterColor.str(.LimiterSymbolRight)
            endif
        endmethod
    endstruct
   
    //: A struct which contains all
    //: Custom methods and members
    struct CustomBar
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: CustomBar members
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        private unit    Target      = CB_DEFAULT_TARGET
        private boolean Locked      = CB_DEFAULT_LOCKED
        private iChange UpdateMethod
       
        private iShow   ShowCond    = defaultShowCondition
        private force   ShowForce   = CB_DEFAULT_SHOW_FORCE
       
        private TextBar TxtBar
        private TextTag TxtTag
       
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: CustomBar methods
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        public static method create takes unit target, iChange updMeth returns thistype
            local thistype this = thistype.allocate()
           
            set .Target = target
            set .TxtBar = TextBar.create()
            set .TxtTag = TextTag.create()
            set .UpdateMethod = updMeth
           
            call CBStack.addCustomBar(this)
           
            return this  
        endmethod
       
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: Member setting / getting
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: Variables that should'nt update the texttag
        //==--------------------------------------------
        //! runtextmacro varOp("Locked",        "locked",       "boolean",  "")
        //! runtextmacro varOp("ShowCond",      "showCond",     "iShow",    "")
        //! runtextmacro varOp("ShowForce",     "showForce",    "force",    "")
        //! runtextmacro varOp("Target",        "target",       "unit",     "")
        //! runtextmacro varOp("TxtTag",        "txtTag",       "TextTag",  "")
        //! runtextmacro varOp("TxtBar",        "txtBar",       "TextBar",  "")
        //! runtextmacro varOp("UpdateMethod",  "updateMethod", "iChange",  "")
       
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: Advanced methods.
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        public method Show takes force f, iShow c returns nothing
            set .ShowForce = f
            set .ShowCond = c
        endmethod
       
        public method checkP takes player p returns nothing
            if .ShowCond.evaluate(GetOwningPlayer(.Target), p) then
                call .TxtTag.showPlayer(p)    
            endif  
        endmethod
       
        public method showCB takes nothing returns nothing
            local integer i = 0
            local boolean e = false
           
            loop
                exitwhen e
               
                if i < 15 then
                    if IsPlayerInForce(Player(i), .ShowForce) then
                        call .checkP(Player(i))
                    endif
               
                    set i = i + 1
                else
                    set e = true
                endif
            endloop
        endmethod
       
        public method updateBar takes nothing returns nothing
            if .Locked then
                call .TxtTag.posUnit(.Target, 0.)
            endif
           
            call .UpdateMethod.execute(this)
            call .TxtBar.generateBar()
            set .TxtTag.textText = .TxtBar.finishedBar
        endmethod
       
        public method update takes nothing returns nothing
            call .updateBar()
            call .TxtTag.fade(this)
        endmethod
       
        private method onDestroy takes nothing returns nothing
            call CBStack.remCustomBar(this)
            call .TxtTag.destroy()
            call .TxtBar.destroy()
        endmethod
    endstruct
   
    //: A struct which is used to
    //: update CustomBars
    struct CBStack
        static CustomBar array CBars
        static integer index = 0
       
        public static method addCustomBar takes CustomBar cb returns nothing
            set thistype.CBars[thistype.index] = cb
            set thistype.index = thistype.index + 1
           
            if thistype.index == 1 then
                call TimerStart(CBS_TIMER, CBS_TICK, true, function thistype.updateBars)
            endif
        endmethod
       
        public static method remCBByIndex takes integer i returns nothing
            set thistype.CBars[i] = thistype.CBars[thistype.index]
            set thistype.index = thistype.index - 1
           
            if thistype.index <= 0 then
                call PauseTimer(CBS_TIMER)
            endif    
        endmethod
       
        public static method remCustomBar takes CustomBar cb returns nothing
            local integer i = 0
            local boolean e = false
           
            loop
                exitwhen e
               
                if i < thistype.index then
                    if thistype.CBars[i] == cb then
                        call .remCBByIndex(i)
                        set e = true
                    else
                        set i = i + 1
                    endif
                else
                    set e = true
                endif
            endloop
        endmethod
       
        public static method updateBars takes nothing returns nothing
            local integer i = 0
            local boolean e = false
       
            loop
                exitwhen e
               
                if i < thistype.index then
               
                    if thistype.CBars[i] == 0 then
                        call thistype.remCBByIndex(i)
                        set i = i - 1
                    else
                        call thistype.CBars[i].update()
                    endif
                   
                    set i = i + 1
                else
                    set e = true
                endif
            endloop
        endmethod
    endstruct

    //: The init method, initialisates
    //: a few default objects
    private function init takes nothing returns nothing
        set TB_DEFAULT_CHAR_COLOR       = ARGB.create(255,  255,    255,    255)
        set TB_DEFAULT_LIMITER_COLOR    = ARGB.create(255,  255,    255,    255)  
        set TT_DEFAULT_COLOR            = ARGB.create(255,  255,    255,    255)
    endfunction
endlibrary
 




Documentation

Code (vJASS):

//******************************************************************************
//  =-=-=-=-=-=-=-
//  THE CONSTANTS
//  =-=-=-=-=-=-=-
/*
    //: Sets the identifier
    //: for the fade type in.
    FADE_TYPE_IN               = "IN"
   
    //: Sets the identifier
    //: for the fade type out.
    FADE_TYPE_OUT              = "OUT"
   
    //: Sets the boundaries
    //: for the fading
    FADE_MIN                   = 0.
    FADE_MAX                   = 1.00
   
    //: Sets the default age
    //: of the texttag.
    TT_DEFAULT_AGE             = 0.
   
    //: Sets the default angle
    //: of the texttag.
    TT_DEFAULT_ANGLE           = 90.
   
    //: Sets the default color
    //: of the texttag.
    //: (INITIALIZED IN INIT METHOD)
    TT_DEFAULT_COLOR
   
    //: Sets the default fadepoint
    //: of the texttag.
    TT_DEFAULT_FADEPOINT       = 0.
   
    //: Sets the default boolean
    //: of the texttag if its able
    //: to fade.
    TT_DEFAULT_FADES           = true
   
    //: Sets the default fade color
    //: of the texttag.
    //: (INITIALIZED IN INIT METHOD)
    TT_DEFAULT_FADE_COLOR
   
    //: Sets the default fadestate
    //: of the texttag.
    TT_DEFAULT_FADE_STATE      = FADE_MIN
   
    //: Sets the default fadestrengh
    //: of the texttag.
    TT_DEFAULT_FADE_STRENGH    = 0.75
   
    //: Sets the default fade type
    //: of the texttag.
    TT_DEFAULT_FADE_TYPE       = FADE_TYPE_OUT
   
    //: Sets the default boolean
    //: of the texttag if its fading
    //: or not.
    TT_DEFAULT_FADING          = false
   
    //: Sets the default handle
    //: of the texttag.
    TT_DEFAULT_HANDLE          = null
   
    //: Sets the default lifespan time
    //: of the texttag.
    TT_DEFAULT_LIFESPAN        = 0.
   
    //: Sets the default boolean
    //: of the texttag if its permanent.
    TT_DEFAULT_PERMANENT       = true
   
    //: Sets the default offsets
    //: of the texttag.
    TT_DEFAULT_OFFSETX         = 0.
    TT_DEFAULT_OFFSETY         = 0.
    TT_DEFAULT_OFFSETZ         = 0.
   
    //: Sets the default location
    //: of the texttag.
    TT_DEFAULT_POSX            = 0.
    TT_DEFAULT_POSY            = 0.
    TT_DEFAULT_POSZ            = 0.
   
    //: Sets the default textsize
    //: of the texttag.
    //: Note: This is the wc3 size,
    //:       not the normal word one,
    //:       so we recalculate it with
    //:       the formula.
    TT_DEFAULT_SIZE            = 7.5 * 0.023 / 10
   
    //: Sets the default boolean
    //: of the texttag if its suspended
    //: or not.
    TT_DEFAULT_SUSPENDED       = false
   
    //: Sets the default speed
    //: of the texttag.
    TT_DEFAULT_SPEED           = 10 * (0.071 / 128)
 
    //: Sets the default text
    //: of the texttag.
    TT_DEFAULT_TEXT            = ""
   
    //: Sets the default velocity
    //: of the texttag.
    TT_DEFAULT_VELX            = TT_DEFAULT_SPEED * Cos(TT_DEFAULT_ANGLE * bj_DEGTORAD)
    TT_DEFAULT_VELY            = TT_DEFAULT_SPEED * Sin(TT_DEFAULT_ANGLE * bj_DEGTORAD)
   
    //: Sets the default boolean
    //: of the texttag if its shown
    //: or not.
    TT_DEFAULT_VISIBILITY      = true
*/

/*
    //: Sets the default char symbol
    //: of the TextBar.
    TB_DEFAULT_CHAR                 = "||"
   
    //: Sets the default char amount
    //: of the TextBar.
    TB_DEFAULT_CHAR_AMOUNT          = 25
   
    //: Sets the default empty char symbol
    //: of the TextBar.
    TB_DEFAULT_CHAR_EMPTY           = " "
   
    //: Sets the default char color
    //: of the TextBar.
    //: (INITIALIZED IN INIT METHOD)
    TB_DEFAULT_CHAR_COLOR
   
    //: Sets the default bar string
    //: of the TextBar.
    TB_DEFAULT_FINISHEDBAR          = ""
   
    //: Sets the default limiter color
    //: of the TextBar.
    //: (INITIALIZED IN INIT METHOD)
    TB_DEFAULT_LIMITER_COLOR
   
    //: Sets the default limiter symbol
    //: on the left of the TextBar.
    TB_DEFAULT_LIMITER_SYMBOL_LEFT  = "["
   
    //: Sets the default limiter symbol
    //: on the right of the TextBar.
    TB_DEFAULT_LIMITER_SYMBOL_RIGHT = "]"
   
    //: Sets the default boolean if limiters
    //: are shown in the TextBar.
    TB_DEFAULT_LIMITER_VISIBLE      = true
   
    //: Sets the default percentage
    //: of the TextBar.
    TB_DEFAULT_PERCENTAGE           = 100.
   
    //: Sets the maximum amount of chars
    //: in a TextBar.
    TB_MAX_CHAR_AMOUNT              = 100
*/

/*
    //: Sets the default boolean
    //: of the CustomBar if its locked
    //: to the unit or not.
    CB_DEFAULT_LOCKED           = true
   
    //: Sets the default target
    //: of the CustomBar.
    CB_DEFAULT_TARGET           = null
   
    //: Sets the default force
    //: of the CustomBar to which its
    //: displayed.
    CB_DEFAULT_SHOW_FORCE       = bj_FORCE_ALL_PLAYERS
   
*/

/*
    //: Sets the timer for the CBStack.
    CBS_TIMER   = CreateTimer()
   
    //: Sets the update interval
    //: for timer above.
    CBS_TICK    = 0.0375
*/

//******************************************************************************
 



Example

Code (vJASS):

library CustomBarExample initializer init requires CustomBar
   
    //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    //: Update Functions
    //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public function setLifePer takes CustomBar cb returns nothing
        set cb.txtBar.percentage = GetUnitStatePercent(cb.target, UNIT_STATE_LIFE, UNIT_STATE_MAX_LIFE)
    endfunction
   
    public function setManaPer takes CustomBar cb returns nothing
        set cb.txtBar.percentage = GetUnitStatePercent(cb.target, UNIT_STATE_MANA, UNIT_STATE_MAX_MANA)
    endfunction
   
    public function showCheck takes player owner, player cur returns boolean
        return IsPlayerAlly(owner, cur) or owner == cur
    endfunction
   
    private function init takes nothing returns nothing
        local CustomBar cb = 0
        local unit u = CreateUnit(Player(0), 'Hamg', 0., 0., 0.)
        local ARGB left = 0
        local ARGB right = 0
       
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: CustomBar Creation  -   Hitpoint Bar
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: Lets initialize colors!
        //: Parameters: Alpha, red, green, blue
        set left = ARGB.create(255, 8, 74, 16)
        set right = ARGB.create(255, 214, 255, 230)
       
        //: Create a new CustomBar!
        //: Parameters:
        //:     u -> Unit that actually owns the bar
        //:     setLifePer -> Function that changes the par Percentage
        set cb = CustomBar.create(u, CustomBar_iChange.setLifePer)
       
        //: Add a few offsets
        set cb.txtTag.offsetX = -92.
        set cb.txtTag.offsetY = -32.
       
        //: Add Gradients
        //: Parameters:
        //:     left -> Left Gradient
        //:     right -> Right Gradient
        //:     1 -> Start from position
        //:     25 -> End at position
        call cb.txtBar.addGradient(left, right, 1, 25)
       
        //: Set the texttag showing for players
        //: Parameters:
        //:     bj_FORCE_ALL_PLAYERS -> A player force that could see the textag
        //:     CustomBar_iShow.showCheck -> Method that must return true
        //:         in order that player is allowed to see the texttag.
        call cb.Show(bj_FORCE_ALL_PLAYERS, CustomBar_iShow.showCheck)
       
        //: This actually shows it.
        call cb.showCB()
       
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: CustomBar Creation  -   Mana Bar
        //==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        //: Lets initialize colors!
        //: Parameters: Alpha, red, green, blue
        set left = ARGB.create(255, 8, 66, 90)
        set right = ARGB.create(255, 239, 239, 239)
       
        //: Create a new CustomBar!
        //: Parameters:
        //:     u -> Unit that actually owns the bar
        //:     setLifePer -> Function that changes the par Percentage
        set cb = CustomBar.create(u, CustomBar_iChange.setManaPer)
       
        //: Add a few offsets
        set cb.txtTag.offsetX = -92.
        set cb.txtTag.offsetY = -64.
       
        //: Add Gradients
        //: Parameters:
        //:     left -> Left Gradient
        //:     right -> Right Gradient
        //:     1 -> Start from position
        //:     25 -> End at position
        call cb.txtBar.addGradient(left, right, 1, 25)
       
        //: Set the texttag showing for players
        //: Parameters:
        //:     bj_FORCE_ALL_PLAYERS -> A player force that could see the textag
        //:     CustomBar_iShow.showCheck -> Method that must return true
        //:         in order that player is allowed to see the texttag.
        call cb.Show(bj_FORCE_ALL_PLAYERS, CustomBar_iShow.showCheck)
       
        //: This actually shows it.
        call cb.showCB()
       
        //: Finished! Can life be easier?
    endfunction
endlibrary
 



v. 1.00
Please give credits if you use this.


Keywords:
Custom, Bar, Hp, Mana, Rage, Stat, Texttag, Float, ...
Contents

UserBar v. 1.00 (Map)

Reviews
Moderator
21:33, 9th Oct 2009 The_Reborn_Devil: This system is really nice and useful. Couldn't see any leaks and the coding looks very good. I'm afraid I'll need to Approve this... I also give this system the rating Recommended.
  1. 21:33, 9th Oct 2009
    The_Reborn_Devil:

    This system is really nice and useful.
    Couldn't see any leaks and the coding looks very good.
    I'm afraid I'll need to Approve this...
    I also give this system the rating Recommended.
     
  2. arafor

    arafor

    Joined:
    Jul 22, 2008
    Messages:
    281
    Resources:
    0
    Resources:
    0
    Thats really cool, I will definately have to try this out in one of my maps. (credit of course) Keep up the good work.
     
  3. Anachron

    Anachron

    Joined:
    Sep 9, 2007
    Messages:
    6,148
    Resources:
    66
    Icons:
    49
    Packs:
    2
    Tools:
    1
    Maps:
    3
    Spells:
    9
    Tutorials:
    1
    JASS:
    1
    Resources:
    66
    Tell me if you find bugs, please.

    Thanks.

    All have, its an ASCII Symbol.
     
  4. arafor

    arafor

    Joined:
    Jul 22, 2008
    Messages:
    281
    Resources:
    0
    Resources:
    0
    Will do.
     
  5. eleljrk

    eleljrk

    Joined:
    Aug 27, 2009
    Messages:
    461
    Resources:
    4
    Maps:
    1
    Spells:
    3
    Resources:
    4
    Ive not downloaded, but i guess you use |?
    Dont do, use the i / I.. Not all contries does have | on their keyboard.. :s
     
  6. Reaper2008

    Reaper2008

    Joined:
    Jul 27, 2008
    Messages:
    1,118
    Resources:
    1
    Spells:
    1
    Resources:
    1
    Alt + 124 = |

    (Numpad 124 only).
     
  7. eleljrk

    eleljrk

    Joined:
    Aug 27, 2009
    Messages:
    461
    Resources:
    4
    Maps:
    1
    Spells:
    3
    Resources:
    4
    OFF TOPIC:

    Omg, thats freaked awesome. You learned me something new, thats so cool:
    ☼ÍÌ╩┼E←┘£═Æì2◙♦?>¼▄ç┤rÆÁº³┴..┴µ{»ÂAA♀-Nb|MAÎQ▓ u ÂB*rcÊ╝█Mﵧ╚{AUE♀4╩R█┤g«·¨´µ

    Ok, ok.. I can do this the whole day xD But over to the system:
    You should add this symbols to a // comment over the "Insert Symbol" place:
    ◄ (Alt + 785) or • (Alt + 7) or █ (Alt + 475)
    There is also many other very good symbols.. ;) I got alot that i forgot the code of, but just test around :D Dubble click, switching, and multiple numpads works.. :D
     
  8. Anachron

    Anachron

    Joined:
    Sep 9, 2007
    Messages:
    6,148
    Resources:
    66
    Icons:
    49
    Packs:
    2
    Tools:
    1
    Maps:
    3
    Spells:
    9
    Tutorials:
    1
    JASS:
    1
    Resources:
    66
    Users should either use || or I, the others are just additional crap I don't want to put in my library.

    Users are free to use any ASCII Symbol.
     
  9. Diehard@Azeroth

    Diehard@Azeroth

    Joined:
    Sep 21, 2007
    Messages:
    484
    Resources:
    1
    Spells:
    1
    Resources:
    1
    hey man, how come the bar flashes? else the system is really good man, cus im planning to use in a map
     
  10. Anachron

    Anachron

    Joined:
    Sep 9, 2007
    Messages:
    6,148
    Resources:
    66
    Icons:
    49
    Packs:
    2
    Tools:
    1
    Maps:
    3
    Spells:
    9
    Tutorials:
    1
    JASS:
    1
    Resources:
    66
    Flashes?
    It has an fade system by default.

    You can disable it with disabling it by default:
    Code (vJASS):

    //: Setting this line to false
    private constant boolean TT_DEFAULT_FADES = true
     


    or by setting your instance fade to false:
    Code (vJASS):

    set $instanceVariable$.fades = false
     
     
  11. BlackKnightTGS

    BlackKnightTGS

    Joined:
    Jun 21, 2009
    Messages:
    318
    Resources:
    3
    Maps:
    3
    Resources:
    3
    This is very useful! One of the best systems I've seen!
     
  12. Cpt.ZnacK

    Cpt.ZnacK

    Joined:
    Oct 11, 2009
    Messages:
    189
    Resources:
    1
    Tutorials:
    1
    Resources:
    1
    Dude you are EPIC
     
  13. Anachron

    Anachron

    Joined:
    Sep 9, 2007
    Messages:
    6,148
    Resources:
    66
    Icons:
    49
    Packs:
    2
    Tools:
    1
    Maps:
    3
    Spells:
    9
    Tutorials:
    1
    JASS:
    1
    Resources:
    66
    Thanks. Glad you like all my systems.
     
  14. 88WaRCraFT3

    88WaRCraFT3

    Joined:
    Jun 9, 2009
    Messages:
    1,144
    Resources:
    1
    Spells:
    1
    Resources:
    1
    Man, what i need to use to show up these bar on other unit?
     
  15. Anachron

    Anachron

    Joined:
    Sep 9, 2007
    Messages:
    6,148
    Resources:
    66
    Icons:
    49
    Packs:
    2
    Tools:
    1
    Maps:
    3
    Spells:
    9
    Tutorials:
    1
    JASS:
    1
    Resources:
    66
    If you don't know that you really shouldn't use this system.
     
  16. UnMi

    UnMi

    Joined:
    Feb 16, 2006
    Messages:
    149
    Resources:
    1
    Maps:
    1
    Resources:
    1
    Bug

    Not sure if anyone cares at this point.
    The system has a tiny bug which prevents player level filtering. It is fixed by
    replacing CheckP with
    Code (vJASS):
    public method checkP takes player p returns nothing
                call .TxtTag.showPlayer(p,.ShowCond.evaluate(GetOwningPlayer(.Target), p))    
            endmethod

    and the showPlayer with
    Code (vJASS):
    public method showPlayer takes player p , boolean show returns nothing
                if GetLocalPlayer() == p then
                    call SetTextTagVisibility(.Handle,show)
                endif
            endmethod

    10/5 for the system btw, will do use
    @Author
    Edit: the cause is texttags are shown by default unless explitly turned off using SetTextTagVisibility