	

    /**
     *  Progress Bar 1.3.1.0
     *  Copyright 2007-2010 Infernus' Group,
     *  Flávio Toribio (flavio_toribio@hotmail.com)
     */
     
    #if defined _progress_included
            #endinput
    #endif
     
    #if !defined _samp_included
            #tryinclude <a_samp>
            #if !defined _samp_included
                    #error could not locate a_samp.inc file, please check your server includes
            #endif
    #endif
     
    #tryinclude <foreach>
     
    #define _progress_included
    #define _progress_version       0x1310
     
    #define MAX_BARS                                (MAX_TEXT_DRAWS / 3)
    #define INVALID_BAR_VALUE               (Float:0xFFFFFFFF)
    #define INVALID_BAR_ID                  (Bar:-1)
    #define pb_percent(%1,%2,%3,%4) ((%1 - 6.0) + ((((%1 + 6.0 + %2 - 2.0) - %1) / %3) * %4))
    //pb_percent(x, width, max, value)
     
    /* Pawno/Infernus Pawn Editor function list
    native Bar:CreateProgressBar(Float:x, Float:y, Float:width=55.5, Float:height=3.2, color, Float:max=100.0);
    native DestroyProgressBar(Bar:barid);
    native ShowProgressBarForPlayer(playerid, Bar:barid);
    native HideProgressBarForPlayer(playerid, Bar:barid);
    native ShowProgressBarForAll(Bar:barid);
    native HideProgressBarForAll(Bar:barid);
    native SetProgressBarValue(Bar:barid, Float:value);
    native Float:GetProgressBarValue(Bar:barid);
    native SetProgressBarMaxValue(Bar:barid, Float:max);
    native SetProgressBarColor(Bar:barid, color);
    native UpdateProgressBar(Bar:barid, playerid=INVALID_PLAYER_ID);
    */
     
    forward Bar:CreateProgressBar(Float:x, Float:y, Float:width=55.5, Float:height=3.2, color, Float:max=100.0);
    forward Float:GetProgressBarValue(Bar:barid);
     
    enum e_bar
    {
            Float:pb_x,
            Float:pb_y,
            Float:pb_w,
            Float:pb_h,
            Float:pb_m,
            Float:pb_v,
            Text:pb_t1,
            Text:pb_t2,
            Text:pb_t3,
            pb_color,
            bool:pb_created
    }
     
    static Bars[MAX_BARS][e_bar];
     
    stock Bar:CreateProgressBar(Float:x, Float:y, Float:width=55.5, Float:height=3.2, color, Float:max=100.0)
    {
            new
                    barid;
     
            for(barid = 0; barid < sizeof Bars; ++barid)
                    if(!Bars[barid][pb_created]) break;
     
            if(Bars[barid][pb_created] || barid == sizeof Bars)
                    return INVALID_BAR_ID;
     
            new Text:in_t = Bars[barid][pb_t1] = TextDrawCreate(x, y, "_");
            TextDrawUseBox          (in_t, 1);
            TextDrawTextSize        (in_t, x + width, 0.0);
            TextDrawLetterSize      (in_t, 1.0, height / 10);
            TextDrawBoxColor        (in_t, 0x00000000 | (color & 0x000000FF));
     
            in_t = Bars[barid][pb_t2] = TextDrawCreate(x + 1.2, y + 2.15, "_");
            TextDrawUseBox          (in_t, 1);
            TextDrawTextSize        (in_t, x + width - 2.0, 0.0);
            TextDrawLetterSize      (in_t, 1.0, height / 10 - 0.35);
            TextDrawBoxColor        (in_t, (color & 0xFFFFFF00) | (0x66 & ((color & 0x000000FF) / 2)));
     
            in_t = Bars[barid][pb_t3] = TextDrawCreate(x + 1.2, y + 2.15, "_");
            TextDrawTextSize        (in_t, pb_percent(x, width, max, 1.0), 0.0);
            TextDrawLetterSize      (in_t, 1.0, height / 10 - 0.35);
            TextDrawBoxColor        (in_t, color);
     
            Bars[barid][pb_x] = x;
            Bars[barid][pb_y] = y;
            Bars[barid][pb_w] = width;
            Bars[barid][pb_h] = height;
            Bars[barid][pb_m] = max;
            Bars[barid][pb_color] = color;
            Bars[barid][pb_created] = true;
            return Bar:barid;
    }
     
    stock DestroyProgressBar(Bar:barid)
    {
            if(barid != INVALID_BAR_ID && Bar:-1 < barid < Bar:MAX_BARS)
            {
                    if(!Bars[_:barid][pb_created])
                            return 0;
     
                    TextDrawDestroy(Bars[_:barid][pb_t1]);
                    TextDrawDestroy(Bars[_:barid][pb_t2]);
                    TextDrawDestroy(Bars[_:barid][pb_t3]);
     
                    Bars[_:barid][pb_t1] = Text:0;      
                    Bars[_:barid][pb_t2] = Text:0;      
                    Bars[_:barid][pb_t3] = Text:0;
                    Bars[_:barid][pb_x] = 0.0;
                    Bars[_:barid][pb_y] = 0.0;
                    Bars[_:barid][pb_w] = 0.0;
                    Bars[_:barid][pb_h] = 0.0;
                    Bars[_:barid][pb_m] = 0.0;
                    Bars[_:barid][pb_v] = 0.0;
                    Bars[_:barid][pb_color] = 0;
                    Bars[_:barid][pb_created] = false;
                    return 1;
            }
            return 0;
    }
     
    stock ShowProgressBarForPlayer(playerid, Bar:barid)
    {
            if(IsPlayerConnected(playerid) && barid != INVALID_BAR_ID && Bar:-1 < barid < Bar:MAX_BARS)
            {
                    if(!Bars[_:barid][pb_created])
                            return 0;
     
                    TextDrawShowForPlayer(playerid, Bars[_:barid][pb_t1]);
                    TextDrawShowForPlayer(playerid, Bars[_:barid][pb_t2]);
                    TextDrawShowForPlayer(playerid, Bars[_:barid][pb_t3]);
                    return 1;
            }
            return 0;
    }
     
    stock HideProgressBarForPlayer(playerid, Bar:barid)
    {
            if(IsPlayerConnected(playerid) && barid != INVALID_BAR_ID && Bar:-1 < barid < Bar:MAX_BARS)
            {
                    if(!Bars[_:barid][pb_created])
                            return 0;
     
                    TextDrawHideForPlayer(playerid, Bars[_:barid][pb_t1]);
                    TextDrawHideForPlayer(playerid, Bars[_:barid][pb_t2]);
                    TextDrawHideForPlayer(playerid, Bars[_:barid][pb_t3]);
                    return 1;
            }
            return 0;
    }
     
    stock SetProgressBarValue(Bar:barid, Float:value)
    {
            if(barid == INVALID_BAR_ID || Bar:MAX_BARS < barid < Bar:-1)
                    return 0;
     
            if(Bars[_:barid][pb_created])
            {
                    value =
                            (value < 0.0) ? (0.0) : (value > Bars[_:barid][pb_m]) ? (Bars[_:barid][pb_m]) : (value);
     
                    TextDrawUseBox(Bars[_:barid][pb_t3], value > 0.0);
     
					Bars[_:barid][pb_v] = value;
     
                    TextDrawTextSize(Bars[_:barid][pb_t3],
                            pb_percent(Bars[_:barid][pb_x], Bars[_:barid][pb_w], Bars[_:barid][pb_m], value), 0.0);
     
                    return 1;
            }
            return 0;
    }
     
    stock Float:GetProgressBarValue(Bar:barid)
    {
            if(barid == INVALID_BAR_ID || Bar:MAX_BARS < barid < Bar:-1)
                    return INVALID_BAR_VALUE;
     
            if(Bars[_:barid][pb_created])
                    return Bars[_:barid][pb_v];
     
            return INVALID_BAR_VALUE;
    }
     
    stock SetProgressBarMaxValue(Bar:barid, Float:max)
    {
            if(barid == INVALID_BAR_ID || Bar:MAX_BARS < barid < Bar:-1)
                    return 0;
     
            if(Bars[_:barid][pb_created])
            {
                    Bars[_:barid][pb_m] = max;
                    SetProgressBarValue(barid, Bars[_:barid][pb_v]);
                    return 1;
            }
            return 0;
    }
     
    stock SetProgressBarColor(Bar:barid, color)
    {
            if(barid == INVALID_BAR_ID || Bar:MAX_BARS < barid < Bar:-1)
                    return 0;
     
            if(Bars[_:barid][pb_created])
            {      
                    Bars[_:barid][pb_color] = color;
                    TextDrawBoxColor(Bars[_:barid][pb_t1], 0x00000000 | (color & 0x000000FF));
     
                    TextDrawBoxColor(Bars[_:barid][pb_t2],
                            (color & 0xFFFFFF00) | (0x66 & ((color & 0x000000FF) / 2)));
     
                    TextDrawBoxColor(Bars[_:barid][pb_t3], color);
                    return 1;
            }
            return 0;
    }
     
    stock ShowProgressBarForAll(Bar:barid)
    {
            #if defined _foreach_included
            foreach(Player, i)
            #else
            for(new i = 0; i < MAX_PLAYERS; ++i)
                    if(IsPlayerConnected(i))
            #endif
            #if defined IsPlayerNPC
                    if(!IsPlayerNPC(i))
            #endif
            {
                    ShowProgressBarForPlayer(i, barid);
            }
            return 1;
    }
     
    stock HideProgressBarForAll(Bar:barid)
    {
            #if defined _foreach_included
            foreach(Player, i)
            #else
            for(new i = 0; i < MAX_PLAYERS; ++i)
                    if(IsPlayerConnected(i))
            #endif
            #if defined IsPlayerNPC
                    if(!IsPlayerNPC(i))
            #endif
            {
                    HideProgressBarForPlayer(i, barid);
            }
            return 1;
    }
     
    stock UpdateProgressBar(Bar:barid, playerid=INVALID_PLAYER_ID)
    {
            if(playerid == INVALID_PLAYER_ID)
            {
                    return ShowProgressBarForAll(barid);
            } else {
                    return ShowProgressBarForPlayer(playerid, barid);
            }
    }

