//--------------------------------------------------------------------------------------------------
// BossBarLib - Version: B03d
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
// Developers note
//--------------------------------------------------------------------------------------------------
// Do not modify this code unless you know what you are doing, or it may result in many many syntax
// errors - FuzzYD
//--------------------------------------------------------------------------------------------------
// Dependencies
//--------------------------------------------------------------------------------------------------
//include "TriggerLibs/QuickLib" //Disabled
//include "TriggerLibs/GXML" //Disabled
// If you are using a different import directory for these scripts, you will need to change this.
// If you already included these scripts from another custom script, comment out these line.
// Keep in mind that both QuickLib and GXML are essential for this library to function correctly.
//--------------------------------------------------------------------------------------------------
// Constants
//--------------------------------------------------------------------------------------------------
//Boss Bar Dialog Item constants
const int c_BARLIMIT = 100; //Boss bar count limit
const int c_HPAll = 19; //Hp all constant
const int c_SPAll = 20; //Sp all constant
const int c_EPAll = 21; //Ep all constant
const int c_BorderAll = 22; //Border all constant
const int c_LabelAll = 23; //Label all constant
const int c_Border = 0; //Border constant
const int c_IconBorder = 1; //Icon border constant
const int c_Icon = 2; //Icon constant
const int c_Label = 3; //Label constant
const int c_HPBack = 4; //Hp back constant
const int c_HPFade = 5; //Hp fade constant
const int c_HPBar = 6; //Hp bar constant
const int c_HPBorder = 7; //Hp border constant
const int c_HPLabel = 8; //Hp label constant
const int c_SPBack = 9; //Sp back constant
const int c_SPFade = 10; //Sp fade constant
const int c_SPBar = 11; //Sp bar constant
const int c_SPBorder = 12; //Sp border constant
const int c_SPLabel = 13; //Sp label constant
const int c_EPBack = 14; //Ep back constant
const int c_EPFade = 15; //Ep fade constant
const int c_EPBar = 16; //Ep bar constant
const int c_EPBorder = 17; //Ep border constant
const int c_EPLabel = 18; //Ep label constant
//Property constants
const int c_StyleLabel = 0; //Label style constant
const int c_StyleHPLabel = 1; //HP Label style constant
const int c_StyleSPLabel = 2; //SP Label style constant
const int c_StyleEPLabel = 3; //EP Label style constant
const int c_ColorLabel = 4; //Label color constant
const int c_ColorHPLabel = 5; //HP Label color constant
const int c_ColorSPLabel = 6; //SP Label color constant
const int c_ColorEPLabel = 7; //EP Label color constant
//Race Constants
const int c_Terr = 0; //Terran
const int c_Prot = 1; //Protoss
const int c_Zerg = 2; //Zerg
//const int c_Neut = 3; //Neutral
const int c_Same = -1; //Same constant
//Miscelleneous
const string letters = "abcdefghijklmnopqrstuvwxyz";
const string borderAll = "abhmr";
//--------------------------------------------------------------------------------------------------
// Globals
//--------------------------------------------------------------------------------------------------
//Integers
int gi_BarID = 0; //Boss bar 'pointer'
int gi_bbLastCreated; //Last created boss bar
int gi_bbID; //Hold id
unit gu_bb; //Hold unit
//Style Strings
string[3] title;
string[3] border;
string[3] iconBorder;
string[3] barText;
string[3] barBorder;
string[10] barColors; //Bar Colors
//Initialize variables
void InitBossBarLib(){
//Label Styles - May be depracated
title[0] = "InfoPaneUnitRank_Terr";
title[1] = "InfoPaneUnitRank_Prot";
title[2] = "InfoPaneUnitRank_Zerg";
//Border Styles
border[0] = "ui_mission_leaderboard_frame_light"; //Frame border
border[1] = "ui_callout_border_terran"; //Transparent Border
//Icon Border Styles
iconBorder[0] = "ui_mission_leaderboard_frame_unit";//Portrait border
//Bar Text Styles
barText[0] = "GameFrameSmallBottomButton"; //HP/SP
barText[1] = "GameButtonCharge"; //EP
//Bar Border Styles
barBorder[0] = "ui_mission_leaderboard_progressbar_frame"; //"ui_generic_button_normaloverpressedover";
barBorder[1] = "ui_generic_button_normaloverpressedover_protoss";
barBorder[2] = "ui_generic_button_normaloverpressedover_zerg";
//Bar Colors
//None yet
}
//--------------------------------------------------------------------------------------------------
// Structs
//--------------------------------------------------------------------------------------------------
// For advanced scripters
// Any of these dialog/dialog items can be called back and modified as you wish.
// Custom text styles and the such are possible.
struct bossbar{
playergroup g; //Playergroup
unit u; //Unit that bar is binded to
string label; //Label
text tlabel; //Text Label
string[8] prop; //Properties: Label styles/colors
int race; //Boss bar race (Default: 0 - Terran)
int d; //Dialog
int[19] di; //Dialog item
bool lock; //Boss bar is locked (Default: False)
bool auto; //Boss bar auto-detects unit portrait (Default: True)
bool b; //Bossbar is active/reserved - When inactive, destroy trigger
bool[18] show; //Label show flag
};
bossbar[c_BARLIMIT] s_bb;
//--------------------------------------------------------------------------------------------------
// Functions - Support
//--------------------------------------------------------------------------------------------------
//Psuedocodes
void bbSetColorDC(int BossBarID, int dc, string c);
void bbSetImgDC(int BossBarID, int dc, string img);
//--------------------------------------------------------------------------
//Support functions
void bbSet(int id, int dc, int di){
//Set boss bar dialog item
s_bb[id].di[dc] = di;
}
int bbGet(int id, int dc){
//Get boss bar dialog item
if(dc > c_EPLabel || dc < 0){
cout("bbGet: Invalid dialog control constant."+i2s(dc));
return -1;
}
return s_bb[id].di[dc];
}
void bbSetProp(int id, int prop, string value){
//Set boss bar style/color
s_bb[id].prop[prop] = value;
}
string bbGetProp(int id, int prop){
//Get boss bar style/color
if(prop > c_ColorEPLabel || prop < 0){
cout("bbGetProp: Invalid dialog control constant.");
return "";
}
return s_bb[id].prop[prop];
}
bool bbIsValid(int id){
//Check boss bar validity
return id < 0 || id >= c_BARLIMIT;
}
void bbNewBar(int id, int layer, int type, int xOff, int yOff, int width, int height){
//Create new bar Layer 0 = Red, 1 and 2 are Green.
//Variable Initialization
int di;
int colorMod = iClamp(layer, 0, 1);
//Actions
di = DialogControlCreate(s_bb[id].d, c_triggerControlTypeImage);
dcSetImg(di, Asset("ui_mission_leaderboard_progressbar_fill"), c_g);
dcSetImgType(di, c_triggerImageTypeBorder, c_g);
if(type == 0){
bbSet(id, c_HPBack+layer, di);
}else if(type == 1){
bbSet(id, c_SPBack+layer, di);
}else if(type == 2){
bbSet(id, c_EPBack+layer, di);
}
dcSetSize(di, c_g, width, height);
dcSetPos(di, c_g, c_anchorTopLeft, xOff, yOff);
dcSetImgTiled(di,true,c_g);
if(type == 0){
dcSetColor(di, Color(100-(colorMod*90),10+(colorMod*90),10), c_g);
}else if(type == 1){
dcSetColor(di, Color(50-(colorMod*50),50-(colorMod*50),75), c_g);
}else if(type == 2){
dcSetColor(di, Color(75-(colorMod*25),75-(colorMod*50),75), c_g);
}
//If fade layer, fade 50%
if(layer == 1){
dcFade(di, c_g, 0, 50);
}
}
//--------------------------------------------------------------------------------------------------
// Functions - Core
//--------------------------------------------------------------------------------------------------
int bbLastCreated(){
//Recalls last created boss bar
return gi_bbLastCreated;
}
void bbDestroy(int BossBarID){
//Destroys boss bar
//Conds
if(bbIsValid(BossBarID)){
cout("bbMove: Invalid Boss Bar ID ("+i2s(BossBarID)+")");
return;
}
s_bb[BossBarID].b = false; //Disable boss bar
s_bb[BossBarID].u = null; //Remove unit
DialogDestroy(s_bb[BossBarID].d); //Destroy dialog
//tDebug("Successfully destroyed Boss bar #"+i2s(BossBarID));
Wait(0.125,c_timeGame); //Allows triggers to terminate
}
void bbMove(int BossBarID, int anchor, int xOff, int yOff){
//Moves boss bar
//Conds
if(bbIsValid(BossBarID)){
cout("bbMove: Invalid Boss Bar ID ("+i2s(BossBarID)+")");
return;
}else if(anchor < 0 || anchor > 8){
cout("bbMove: Invalid anchor constant");
return;
}
//Actions
DialogSetPosition(s_bb[BossBarID].d, anchor, xOff, yOff);
}
void bbShow(int BossBarID, bool show){
//Show boss bar
playergroup g = s_bb[BossBarID].g;
//Conds
if(bbIsValid(BossBarID)){
cout("bbShow: Invalid Boss Bar ID ("+i2s(BossBarID)+")");
return;
}
//Actions
DialogSetVisible(s_bb[BossBarID].d, g, show);
}
void bbLock(int BossBarID, bool lock){
//Lock boss bar to unit
//Conds
if(bbIsValid(BossBarID)){
cout("bbLock: Invalid Boss Bar ID ("+i2s(BossBarID)+")");
return;
}else if(s_bb[BossBarID].u == null){
cout("bbLock: Error, no unit could be found @Boss Bar #"+i2s(BossBarID));
return;
}
s_bb[BossBarID].lock = lock;
}
void bbAutoPortrait(int BossBarID, bool auto){
//Boss bar autodetect enable/disable
//Conds
if(bbIsValid(BossBarID)){
cout("bbAutoPortrait: Invalid Boss Bar ID ("+i2s(BossBarID)+")");
return;
}
s_bb[BossBarID].auto = auto;
}
void bbSetSize(int BossBarID, int w, int h){
//Set boss bar size
//Conds
if(bbIsValid(BossBarID)){
cout("bbSetSize: Invalid Boss Bar ID ("+i2s(BossBarID)+")");
return;
}else if(w <= 0 || h <= 0){
cout("bbSetSize: Invalid width or height @ BossBarID #"+i2s(BossBarID));
return;
}
DialogSetSize(s_bb[BossBarID].d, w, h);
}
void bbSetLabel(int BossBarID, string label){
//Set boss bar label
//Variable Initialization
playergroup g = PlayerGroupAll();
int id = BossBarID;
int di = bbGet(id,c_Label);
string s = bbGetProp(id,c_StyleLabel);
string c = StringSub(bbGetProp(id,c_ColorLabel),1,6);
fixed A = h2c(StringSub(bbGetProp(id,c_ColorLabel),7,8));
//Conditions
if(bbIsValid(BossBarID)){
cout("bbSetLabel: Invalid Boss Bar ID ("+i2s(id)+")");
return;
}
//Actions
s_bb[id].label = label; //Store as string
s_bb[id].tlabel = s2t(label); //Store as text
dcFade(di,g,0,A); //Set Alpha
//Automatic
if(StringFind(label,"/",true) != -1){
//If null color string
if(c == ""){
libNtve_gf_SetDialogItemText(di,
s2t("")+StringExternal(label)+s2t(""), g);
}else{
libNtve_gf_SetDialogItemText(di,
s2t("")+
StringExternal(label)+s2t(""), g);
}
}else{
//Manual
//If null color string
if(c == ""){
dcSetText(di, xs(s,label), g);
}else{
dcSetText(di, xs(s,xc(c,label)), g);
}
}
}
void bbSetTextLabel(int BossBarID, text tlabel){
//Set boss bar text label
//Variable Initialization
playergroup g = PlayerGroupAll();
int id = BossBarID;
int di = bbGet(id,c_Label);
string s = bbGetProp(id,c_StyleLabel);
string c = StringSub(bbGetProp(id,c_ColorLabel),1,6);
fixed A = h2c(StringSub(bbGetProp(id,c_ColorLabel),7,8));
//Conditions
if(bbIsValid(BossBarID)){
cout("bbSetTextLabel: Invalid Boss Bar ID ("+i2s(id)+")");
return;
}
//Actions
s_bb[id].label = "TextOverride"; //Disable string
s_bb[id].tlabel = tlabel; //Store as text
dcFade(di,g,0,A); //Set Alpha
//Note: Text style/color will override bbSetStyleDC/bbSetColorDC
//If null color string
if(c == ""){
libNtve_gf_SetDialogItemText(di,
s2t("")+tlabel+s2t(""), g);
}else{
libNtve_gf_SetDialogItemText(di,
s2t("")+tlabel+
s2t(""), g);
}
}
void bbSetRace(int BossBarID, playergroup g, int race){
//Set boss bar race
//Variable Initialization
int id = BossBarID;
//Conds
if(bbIsValid(BossBarID)){
cout("bbSetRace: Invalid Boss Bar ID ("+i2s(id)+")");
return;
}else if(race <= c_Terr && race >= c_Zerg){
cout("bbSetRace: Unrecognized race constant,"+
" check bbSetRace hint for available constants");
return;
}
//Actions
s_bb[id].race = race;
bbSetProp(id,c_StyleLabel,title[race]);
//Check if text: failsafe
if(s_bb[id].label != "TextOverride"){
bbSetLabel(id,s_bb[id].label);
}else{
bbSetTextLabel(id,s_bb[id].tlabel);
}
//Change Border
if(race == c_Terr){
bbSetColorDC(id, c_BorderAll, "35d180");
}else if(race == c_Prot){
bbSetColorDC(id, c_BorderAll, "40b5e3");
}else if(race == c_Zerg){
bbSetColorDC(id, c_BorderAll, "ff8000");
}
}
void bbSetBoss(int BossBarID, unit u){
//Bind unit to boss bar
//Vars
int id = BossBarID;
string uid = uGetType(u);
string name = CatalogFieldValueGet(c_gameCatalogUnit,uid,"Name",0);
string img;
string a;
//Warpig fix
if(uid == "WarPig")
{
a = CatalogFieldValueGet(c_gameCatalogActor,"KelmorianMiner","Model",0);
}
else
{
a = CatalogFieldValueGet(c_gameCatalogActor,uid,"Model",0);
}
//Conds
if(bbIsValid(BossBarID))
{
cout("bbSetBoss: Invalid Boss Bar ID ("+i2s(id)+")");
return;
}
else if(u == null)
{
cout("bbSetBoss: Error, no unit selected @Boss Bar #"+i2s(id));
return;
}
else if(s_bb[BossBarID].u == u)
{
//cout("bbSetBoss: Error, attempt to bind same unit @Boss Bar #"+i2s(id));
return;
}
else if(s_bb[id].lock)
{
cout("bbSetBoss: Error, bar is currently locked @Boss Bar #"+i2s(id));
return;
}
//Actions
//Civilian => Colonist fix
if(StringFind(a,"civilian",false) != -1)
{
a = StringReplaceWord(a,"Civilian","Colonist",1,c_stringNoCase);
}
//Warpig => MarineMercenary fix
if(StringFind(a,"warpig",false) != -1)
{
a = StringReplaceWord(a,a,"MarineMercenary",1,c_stringNoCase);
}
//Male/Female prefix fix
if(StringFind(a,"male",false) != -1){
a = StringReplaceWord(a,"Female","",1,c_stringNoCase);
a = StringReplaceWord(a,"Male","",1,c_stringNoCase);
}
//Refresh boss bar
s_bb[id].u = u;
bbSetLabel(id,name);
//Check if auto-portrait enabled
if(s_bb[id].auto)
{
img = CatalogFieldValueGet(c_gameCatalogModel,a+"Portrait","Image",0);
bbSetImgDC(id,c_Icon,img);
}
//Run Update/Balance triggers
gi_bbID = BossBarID;
gu_bb = u;
tRun("bbUpdate");
tRun("bbBalance");
//Debug outputs
if(0)
{
cout("UnitID: "+uid);
cout("UnitName: "+name);
TriggerDebugOutput(1,StringExternal(name),true);
cout("Actor: "+a);
cout("Image: "+img);
}
}
//Set boss bar group
void bbSetGroup(int BossBarID, playergroup g){
//Conds
if(bbIsValid(BossBarID)){
cout("bbMove: Invalid Boss Bar ID ("+i2s(BossBarID)+")");
}
bbShow(BossBarID,false); //Hide from old group
s_bb[BossBarID].g = g;
bbShow(BossBarID,true); //Show to new group
}
//--------------------------------------------------------------------------------------------------
// Functions - Advanced
//--------------------------------------------------------------------------------------------------
// Advanced functions allow the direct modification of every dialog control element of the boss bar.
void bbShowDC(int BossBarID, int dc, bool b){
//Show or hide dialog elements
playergroup g = PlayerGroupAll();
int id = BossBarID;
int i = 0;
//Conds
if(bbIsValid(BossBarID)){
cout("bbShowDC: Invalid Boss Bar ID ("+i2s(id)+")");
return;
}
//Actions
while(i < 5){
if(dc == c_HPAll){
dcSetVisible(bbGet(id,c_HPBack+i),g,b);
//Paradox override
if(!s_bb[id].show[i] && b){
dcSetVisible(bbGet(id,c_HPBack+i),g,false);
}
}else if(dc == c_SPAll){
dcSetVisible(bbGet(id,c_SPBack+i),g,b);
//Paradox override
if(!s_bb[id].show[i+5] && b){
dcSetVisible(bbGet(id,c_SPBack+i),g,false);
}
}else if(dc == c_EPAll){
dcSetVisible(bbGet(id,c_EPBack+i),g,b);
//Paradox override
if(!s_bb[id].show[i+10] && b){
dcSetVisible(bbGet(id,c_EPBack+i),g,false);
}
}else if(dc <= c_EPLabel){
dcSetVisible(bbGet(id,dc),g,b);
if(dc >= c_HPBack){
s_bb[id].show[dc-c_HPBack] = b;
}
return;
}else{
cout("bbShowDC: Constant not supported ("+
i2s(dc)+")@ BossBar#"+i2s(id));
return;
}
i+=1;
}
//Track hp/sp/ep label show
s_bb[id].show[dc-c_HPBack] = b;
}
void bbSetSizeDC(int BossBarID, int dc, int w, int h){
//Set dialog control sizes
playergroup g = PlayerGroupAll();
int id = BossBarID;
int i = 0;
//Conditions
if(bbIsValid(BossBarID)){
cout("bbSetSizeDC: Invalid Boss Bar ID ("+i2s(id)+")");
return;
}else if(w <= 0 || h <= 0){
cout("bbSetSizeDC: Invalid width or height @ BossBarID #"+i2s(id));
return;
}
//Actions
while(i < 5){
if(dc == c_HPAll){
dcSetSize(bbGet(id,c_HPBack+i),g,w+(i/3-1)*12,h+(i/3-1)*4);
}else if(dc == c_SPAll){
dcSetSize(bbGet(id,c_SPBack+i),g,w+(i/3-1)*12,h+(i/3-1)*4);
}else if(dc == c_EPAll){
dcSetSize(bbGet(id,c_EPBack+i),g,w+(i/3-1)*12,h+(i/3-1)*4);
}else if(dc == c_Icon){
dcSetSize(bbGet(id,c_IconBorder+i),g,w-(i/1)*10,h-(i/1)*10);
if(i == 1){
return;
}
}else if(dc == c_IconBorder || dc == c_Label){
dcSetSize(bbGet(id,dc),g,w,h);
return;
}else{
cout("bbSetSizeDC: Constant not supported ("+
i2s(dc)+")@ BossBar#"+i2s(id));
return;
}
i+=1;
}
}
void bbSetPosDC(int BossBarID, int dc, int x, int y){
//Set dialog control positions
playergroup g = PlayerGroupAll();
int id = BossBarID;
int i = 0;
//Conditions
if(bbIsValid(BossBarID)){
cout("bbSetPosDC: Invalid Boss Bar ID ("+i2s(id)+")");
return;
}
//Actions
while(i < 5){
if(dc == c_HPAll)
{
dcSetPos(bbGet(id,c_HPBack+i),g,0,x+(1-i/3)*6,y+(1-i/3)*2);
}
else if(dc == c_SPAll)
{
dcSetPos(bbGet(id,c_SPBack+i),g,0,x+(1-i/3)*6,y+(1-i/3)*2);
}
else if(dc == c_EPAll)
{
dcSetPos(bbGet(id,c_EPBack+i),g,0,x+(1-i/3)*6,y+(1-i/3)*2);
}
else if(dc == c_Icon)
{
dcSetPos(bbGet(id,c_IconBorder+i),g,0,x+(i/1)*5,y+(i/1)*5);
if(i == 1)
{
return;
}
}
else if(dc == c_IconBorder || dc == c_Label || dc == c_HPLabel)
{
dcSetPos(bbGet(id,dc),g,0,x,y);
return;
}
else
{
cout("bbSetPosDC: Constant not supported ("+
i2s(dc)+")@ BossBar#"+i2s(id));
return;
}
i+=1;
}
}
void bbSetStyleDC(int BossBarID, int dc, string style){
//Set dialog control label styles
int id = BossBarID;
//Conditions
if(bbIsValid(BossBarID)){
cout("bbSetStyleDC: Invalid Boss Bar ID ("+i2s(id)+")");
return;
}
//Actions
if((dc-c_Label)%5 == 0){
//Update text style
bbSetProp(id,c_StyleLabel+(dc-c_Label)/5,style);
//Check if text: failsafe
if(s_bb[id].label != "TextOverride"){
bbSetLabel(id,s_bb[id].label);
}else{
bbSetTextLabel(id,s_bb[id].tlabel);
}
}else{
cout("bbSetStyleDC: Constant not supported ("+
i2s(dc)+")@ BossBar#"+i2s(id));
return;
}
}
void bbSetColorDC(int BossBarID, int dc, string c){
//Set dialog control colors
playergroup g = PlayerGroupAll();
int id = BossBarID;
int i = 0;
int iBorder; //Border index - Special
int iLimit = 4; //Bars and borders
fixed R = h2c(StringSub(c,1,2));
fixed G = h2c(StringSub(c,3,4));
fixed B = h2c(StringSub(c,5,6));
fixed A = h2c(StringSub(c,7,8));
//Conditions
if(bbIsValid(BossBarID)){
cout("bbSetColorDC: Invalid Boss Bar ID ("+i2s(id)+")");
return;
}else if(!(StringLength(c) == 0 || StringLength(c) == 6 || StringLength(c) == 8)){
cout("bbSetColorDC: Invalid hex code '"+c+"' @ BossBar#"+i2s(id));
return;
}
//Actions
//Set white color as default if null color string
if(c == ""){
R = 100;
G = 100;
B = 100;
}
//If c_BorderAll, set iLimit to 5
if(dc == c_BorderAll){
iLimit = 5;
}
while(i < iLimit){
if(dc == c_BorderAll){
iBorder = StringFind(letters,StringSub(borderAll,i+1,i+1),false)-1;
dcFade(bbGet(id,iBorder),g,0,A);
dcSetColor(bbGet(id,iBorder), Color(R,G,B), g);
}else if(dc == c_LabelAll){
dcFade(bbGet(id,i*5+c_Label),g,0,A);
//Update text color
bbSetProp(id,c_ColorLabel+i,c);
if(i*5+c_Label == c_Label){
//Check if text: failsafe
if(s_bb[id].label != "TextOverride"){
bbSetLabel(id,s_bb[id].label);
}else{
bbSetTextLabel(id,s_bb[id].tlabel);
}
}
}else if(dc == c_HPAll){
dcFade(bbGet(id,c_HPBack+i),g,0,A);
dcSetColor(bbGet(id,c_HPBack+i),
Color(R-iClamp(i,0,1)*R/2, G-iClamp(i,0,1)*G/2, B-iClamp(i,0,1)*B/2), g);
}else if(dc == c_SPAll){
dcFade(bbGet(id,c_SPBack+i),g,0,A);
dcSetColor(bbGet(id,c_SPBack+i),
Color(R-iClamp(i,0,1)*R/2, G-iClamp(i,0,1)*G/2, B-iClamp(i,0,1)*B/2), g);
}else if(dc == c_EPAll){
dcFade(bbGet(id,c_EPBack+i),g,0,A);
dcSetColor(bbGet(id,c_EPBack+i),
Color(R-iClamp(i,0,1)*R/2, G-iClamp(i,0,1)*G/2, B-iClamp(i,0,1)*B/2), g);
}else if((dc-c_Label)%5 == 0){
dcFade(bbGet(id,dc),g,0,A);
//Update text color
bbSetProp(id,c_ColorLabel+(dc-c_Label)/5,c);
if(dc == c_Label){
//Check if text: failsafe
if(s_bb[id].label != "TextOverride"){
bbSetLabel(id,s_bb[id].label);
}else{
bbSetTextLabel(id,s_bb[id].tlabel);
}
}
return;
}else if(dc <= c_EPLabel){
dcFade(bbGet(id,dc),g,0,A);
dcSetColor(bbGet(id,dc), Color(R,G,B), g);
return;
}else{
cout("bbSetColorDC: Constant not supported ("+i2s(dc)+") @ BossBar#"+i2s(id));
return;
}
i+=1;
}
}
void bbSetImgDC(int BossBarID, int dc, string img){
//Set dialog control images
playergroup g = PlayerGroupAll();
int id = BossBarID;
int i = 0;
//Conditions
if(bbIsValid(BossBarID)){
cout("bbSetImgDC: Invalid Boss Bar ID ("+i2s(id)+")");
return;
}else if(img == ""){
cout("bbSetImgDC: No image input @ BossBar#"+i2s(id));
return;
}
//Actions
while(i < 3){
if(dc == c_HPAll){
dcSetImg(bbGet(id,c_HPBack+i), img, g);
}else if(dc == c_SPAll){
dcSetImg(bbGet(id,c_SPBack+i), img, g);
}else if(dc == c_EPAll){
dcSetImg(bbGet(id,c_EPBack+i), img, g);
}else if(dc <= c_EPLabel && (dc-c_Label)%5 != 0){
dcSetImg(bbGet(id,dc), img, g);
return;
}else{
cout("bbSetImgDC: Constant not supported ("+
i2s(dc)+")@ BossBar#"+i2s(id));
return;
}
i+=1;
}
}
void bbSetImgTypeDC(int BossBarID, int dc, int type){
//Set dialog control image types (Uses same type constants as SetImgType)
playergroup g = PlayerGroupAll();
int id = BossBarID;
int i = 0;
//Conditions
if(bbIsValid(BossBarID)){
cout("bbSetImgTypeDC: Invalid Boss Bar ID ("+i2s(id)+")");
return;
}else if(type < c_triggerImageTypeNone || type > c_triggerImageTypeEndCap){
cout("bbSetImgTypeDC: Invalid image type @ BossBar#"+i2s(id));
return;
}
//Actions
while(i < 3){
if(dc == c_HPAll){
dcSetImgType(bbGet(id,c_HPBack+i), type, g);
}else if(dc == c_SPAll){
dcSetImgType(bbGet(id,c_SPBack+i), type, g);
}else if(dc == c_EPAll){
dcSetImgType(bbGet(id,c_EPBack+i), type, g);
}else if(dc <= c_EPLabel && (dc-c_Label)%5 != 0){
dcSetImgType(bbGet(id,dc), type, g);
return;
}else{
cout("bbSetImgTypeDC: Constant not supported ("+
i2s(dc)+")@ BossBar#"+i2s(id));
return;
}
i+=1;
}
}
//--------------------------------------------------------------------------------------------------
// Triggers
//--------------------------------------------------------------------------------------------------
bool bbUpdate(bool tc, bool ra){
//Updates HP/MP Bars
//Vars
int i = 0; //Iterator
int id = gi_bbID; //Boss bar ID
unit u = gu_bb; //Unit
int max; //Max
int cur; //Current
fixed pc; //%age
int di_buffer; //Buffer dialog item
string s_buffer; //Buffer string
string s; //Style
string c; //Color
fixed A; //Alpha
//Actions
//Display dialog
bbShow(id,true);
while(i < 3){
//Display enabled bars
if(s_bb[id].show[c_HPAll-c_HPBack+i]){
bbShowDC(id,c_HPAll+i,true);
}
i+=1;
}
//Begin update loop
while(s_bb[id].b && s_bb[id].u == u){
//Update properties
i = 0;
while(i < 3){
//Update properties
max = UnitGetPropertyInt(u, ss2i("084",i+1)+2, true);
cur = UnitGetPropertyInt(u, ss2i("084",i+1), true);
pc = UnitGetPropertyFixed(u, ss2i("084",i+1)+1, true);
if(max != 0){
//If updating HP, Check if unit dead, prevent 1hp bug
if(i == 0){
if(!UnitIsAlive(u)){
cur = 0;
pc = 0;
}
}
di_buffer = bbGet(id,i*5+c_HPLabel);
s_buffer = i2s(cur)+"/"+i2s(max);
s = bbGetProp(id,i+c_StyleHPLabel);
c = bbGetProp(id,i+c_ColorHPLabel);
if(StringLength(c) == 8){
A = h2c(StringSub(c,7,8));
}
if(c == ""){
//Null setting
dcFade(di_buffer,c_g,0,0);
dcSetText(di_buffer, xs(s,s_buffer), c_g);
}else{
if(StringLength(c) == 8){
dcFade(di_buffer,c_g,0,A);
}
dcSetText(di_buffer, xs(s,xc(StringSub(c,1,6),s_buffer)), c_g);
}
dcSetSize(bbGet(id,i*5+c_HPBar), c_g,
iClamp( f2i(pc*dcGetWidth(bbGet(id,i*5+c_HPBack),0)/100), 1,
dcGetWidth(bbGet(id,i*5+c_HPBack),0)), dcGetHeight(bbGet(id,i*5+c_HPBack),0));
}else{
//Terminate trigger is max == 0
if(i == 0){
return true;
}else{
//Paradox override
if(s_bb[id].show[i+15]){
bbShowDC(id,c_HPAll+i,false);
s_bb[id].show[i+15] = true;
}
}
}
i+=1;
}
Wait(c_timeStep,c_timeGame); //Pause
}
return true;
}
bool bbBalance(bool tc, bool ra){
//Balances HP and EP fade bars to match updated bars (Passive)
//Activated at same time as update
//Vars
int i = 0;
int id = gi_bbID; //Boss bar ID
unit u = gu_bb; //Unit
int w; //Width
int h; //Height
int dw; //Width difference
bool b; //Balance check
int bar; //Bar hold
int fade; //Fade hold
//Actions
//Calibrate all bars
while(i < 3){
w = dcGetWidth(bbGet(id,i*5+c_HPBar),0);
h = dcGetHeight(bbGet(id,i*5+c_HPBar),0);
dcSetSize(bbGet(id,i*5+c_HPFade), c_g, w, h);
i+=1;
}
//Execute balancing loop
while(s_bb[id].b && s_bb[id].u == u){
//Terminate if boss dead
if(dcGetWidth(bbGet(id,c_HPFade),0) == 1){
bbShow(id,false); //Hide boss bar
return true; //Terminate trigger
}
//Balance all bars if they aren't
i = 0; //Reset i
while(i < 3){
bar = i*5+c_HPBar;
fade = i*5+c_HPFade;
b = dcGetWidth(bbGet(id,fade),0) > dcGetWidth(bbGet(id,bar),0);
dw = dcGetWidth(bbGet(id,fade),0) - dcGetWidth(bbGet(id,bar),0);
if(b){
w = dcGetWidth(bbGet(id,fade),0);
h = dcGetHeight(bbGet(id,fade),0);
dcSetSize(bbGet(id,fade), c_g, w-iClamp(dw/5, 1, w-1), h);
}else{
w = dcGetWidth(bbGet(id,bar),0);
h = dcGetHeight(bbGet(id,bar),0);
dcSetSize(bbGet(id,fade), c_g, w, h);
}
i+=1;
}
Wait(c_timeStep,c_timeGame); //Pause
}
return true;
}
//--------------------------------------------------------------------------------------------------
// Initializer
//--------------------------------------------------------------------------------------------------
int bbNew(){
//Create new boss bar. Returns Boss Bar ID
//Vars
int i = 0;
int id = gi_BarID;
//Conditions
//Search for free allocated memory for Boss Bars
while(i < c_BARLIMIT){
if(!s_bb[gi_BarID].b){
id = gi_BarID;
break;
}
gi_BarID = (gi_BarID+1)%c_BARLIMIT;
i+=1;
}
//If no free bar slots, return
if(i == c_BARLIMIT){
cout(xc("ff2222","Allocated memory for Boss Bars full. "+
"You may increase the limit by changing the constant c_BARLIMIT"));
return -1;
}else{
gi_BarID = (gi_BarID+1)%c_BARLIMIT;
}
//Actions
//Initialize struct
s_bb[id].g = PlayerGroupAll();
s_bb[id].label = "Boss"; //Default - Boss
s_bb[id].race = c_Terr; //Default - 0: Terran
s_bb[id].auto = true; //Default - Auto-portrait enabled
//Default label styles/colors
bbSetProp(id,c_StyleLabel,title[c_Terr]);
i = 0;
while(i < 4){
if(i > 0){
bbSetProp(id,c_StyleLabel+i,barText[c_Terr]);
}
bbSetProp(id,c_ColorLabel+i,"");
i+=1;
}
//Default dialog item enable
i = 0;
while(i < 18){
s_bb[id].show[i] = true;
i+=1;
}
s_bb[id].d = qd("");
gi_bbLastCreated = id;
bbSet(id, c_Border, qd(""));
dcSetImgType(bbGet(id, c_Border), c_triggerImageTypeBorder, c_g);
bbSet(id, c_IconBorder, qd(""));
dcSetImgType(bbGet(id, c_IconBorder), c_triggerImageTypeBorder, c_g);
bbSet(id, c_Icon, qd(""));
bbSet(id, c_Label, qd(""+xs(title[c_Terr],"Boss")+""));
//HP Bars (350,26) => (200,26)
i = 0;
while(i < 3){
bbNewBar(id, i, 0, 129, 47, 198, 32);
i+=1;
}
bbSet(id, c_HPBorder, qd(""));
dcSetImgType(bbGet(id, c_HPBorder), c_triggerImageTypeBorder, c_g);
bbSet(id, c_HPLabel, qd(""+
xs(barText[0],i2s(9999)+"/"+i2s(9999))+""));
//SP Bars
i = 0;
while(i < 3){
bbNewBar(id, i, 1, 334, 47, 143, 32);
i+=1;
}
bbSet(id, c_SPBorder, qd(""));
dcSetImgType(bbGet(id, c_SPBorder), c_triggerImageTypeBorder, c_g);
bbSet(id, c_SPLabel, qd(""+
xs(barText[0],i2s(9999)+"/"+i2s(9999))+""));
//EP Bars
i = 0;
while(i < 3){
bbNewBar(id, i, 2, 129, 75, 348, 22);
i+=1;
}
bbSet(id, c_EPBorder, qd(""));
dcSetImgType(bbGet(id, c_EPBorder), c_triggerImageTypeBorder, c_g);
bbSet(id, c_EPLabel, qd(""+
xs(barText[0],i2s(9999)+"/"+i2s(9999))+""));
//Center all labels
i = 0;
while(i < 4){
dcCenter(bbGet(id, i*5+c_Label));
i+=1;
}
//tDebug("Successfully created BossBarID: "+i2s(id));
s_bb[id].b = true; //Enable boss bar
return id;
}