//-------------------------------------------------------------------------------------------------- // 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; }