Name | Type | is_array | initial_value |
Count | integer | No | |
HeroSelectorCategory | integer | Yes | |
HeroSelectorEvent | real | No | |
HeroSelectorEventIsRandom | boolean | No | |
HeroSelectorEventPlayer | player | No | |
HeroSelectorEventUnit | unit | No | |
HeroSelectorEventUnitCode | unitcode | No | |
HeroSelectorRandomOnly | unitcode | Yes | |
HeroSelectorUnitCode | unitcode | Yes |
library FrameLoader initializer init_function
// in 1.31 and upto 1.32.9 PTR (when I wrote this). Frames are not correctly saved and loaded, breaking the game.
// This library runs all functions added to it with a 0s delay after the game was loaded.
// function FrameLoaderAdd takes code func returns nothing
// func runs when the game is loaded.
globals
private trigger eventTrigger = CreateTrigger()
private trigger actionTrigger = CreateTrigger()
private timer t = CreateTimer()
endglobals
function FrameLoaderAdd takes code func returns nothing
call TriggerAddAction(actionTrigger, func)
endfunction
private function timerAction takes nothing returns nothing
call TriggerExecute(actionTrigger)
endfunction
private function eventAction takes nothing returns nothing
call TimerStart(t, 0, false, function timerAction)
endfunction
private function init_function takes nothing returns nothing
call TriggerRegisterGameEvent(eventTrigger, EVENT_GAME_LOADED)
call TriggerAddAction(eventTrigger, function eventAction)
endfunction
endlibrary
library Ascii /* v1.1.0.0 Nestharus/Bribe
************************************************************************************
*
* function Char2Ascii takes string s returns integer
* integer ascii = Char2Ascii("F")
*
* function Ascii2Char takes integer a returns string
* string char = Ascii2Char('F')
*
* function A2S takes integer a returns string
* string rawcode = A2S('CODE')
*
* function S2A takes string s returns integer
* integer rawcode = S2A("CODE")
*
************************************************************************************/
globals
private integer array i //hash
private integer array h //hash2
private integer array y //hash3
private string array c //char
endglobals
function Char2Ascii takes string p returns integer
local integer z = i[StringHash(p)/0x1F0748+0x40D]
if (c[z] != p) then
if (c[z - 32] != p) then
if (c[h[z]] != p) then
if (c[y[z]] != p) then
if (c[83] != p) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"ASCII ERROR: INVALID CHARACTER: " + p)
return 0
endif
return 83
endif
return y[z]
endif
return h[z]
endif
return z - 32
endif
return z
endfunction
function Ascii2Char takes integer a returns string
return c[a]
endfunction
function A2S takes integer a returns string
local string s=""
loop
set s=c[a-a/256*256]+s
set a=a/256
exitwhen 0==a
endloop
return s
endfunction
function S2A takes string s returns integer
local integer a=0
local integer l=StringLength(s)
local integer j=0
local string m
local integer h
loop
exitwhen j==l
set a = a*256 + Char2Ascii(SubString(s,j,j+1))
set j=j+1
endloop
return a
endfunction
private module Init
private static method onInit takes nothing returns nothing
set i[966] = 8
set i[1110] = 9
set i[1621] = 10
set i[1375] = 12
set i[447] = 13
set i[233] = 32
set i[2014] = 33
set i[1348] = 34
set i[1038] = 35
set i[1299] = 36
set i[1018] = 37
set i[1312] = 38
set i[341] = 39
set i[939] = 40
set i[969] = 41
set i[952] = 42
set i[2007] = 43
set i[1415] = 44
set i[2020] = 45
set i[904] = 46
set i[1941] = 47
set i[918] = 48
set i[1593] = 49
set i[719] = 50
set i[617] = 51
set i[703] = 52
set i[573] = 53
set i[707] = 54
set i[1208] = 55
set i[106] = 56
set i[312] = 57
set i[124] = 58
set i[1176] = 59
set i[74] = 60
set i[1206] = 61
set i[86] = 62
set i[340] = 63
set i[35] = 64
set i[257] = 65
set i[213] = 66
set i[271] = 67
set i[219] = 68
set i[1330] = 69
set i[1425] = 70
set i[1311] = 71
set i[238] = 72
set i[1349] = 73
set i[244] = 74
set i[1350] = 75
set i[205] = 76
set i[1392] = 77
set i[1378] = 78
set i[1432] = 79
set i[1455] = 80
set i[1454] = 81
set i[1431] = 82
set i[1409] = 83
set i[1442] = 84
set i[534] = 85
set i[1500] = 86
set i[771] = 87
set i[324] = 88
set i[1021] = 89
set i[73] = 90
set i[1265] = 91
set i[1941] = 92
set i[1671] = 93
set i[1451] = 94
set i[1952] = 95
set i[252] = 96
set i[257] = 97
set i[213] = 98
set i[271] = 99
set i[219] = 100
set i[1330] = 101
set i[1425] = 102
set i[1311] = 103
set i[238] = 104
set i[1349] = 105
set i[244] = 106
set i[1350] = 107
set i[205] = 108
set i[1392] = 109
set i[1378] = 110
set i[1432] = 111
set i[1455] = 112
set i[1454] = 113
set i[1431] = 114
set i[1409] = 115
set i[1442] = 116
set i[534] = 117
set i[1500] = 118
set i[771] = 119
set i[324] = 120
set i[1021] = 121
set i[73] = 122
set i[868] = 123
set i[1254] = 124
set i[588] = 125
set i[93] = 126
set i[316] = 161
set i[779] = 162
set i[725] = 163
set i[287] = 164
set i[212] = 165
set i[7] = 166
set i[29] = 167
set i[1958] = 168
set i[1009] = 169
set i[1580] = 170
set i[1778] = 171
set i[103] = 172
set i[400] = 174
set i[1904] = 175
set i[135] = 176
set i[1283] = 177
set i[469] = 178
set i[363] = 179
set i[550] = 180
set i[1831] = 181
set i[1308] = 182
set i[1234] = 183
set i[1017] = 184
set i[1093] = 185
set i[1577] = 186
set i[606] = 187
set i[1585] = 188
set i[1318] = 189
set i[980] = 190
set i[1699] = 191
set i[1292] = 192
set i[477] = 193
set i[709] = 194
set i[1600] = 195
set i[2092] = 196
set i[50] = 197
set i[546] = 198
set i[408] = 199
set i[853] = 200
set i[205] = 201
set i[411] = 202
set i[1311] = 203
set i[1422] = 204
set i[1808] = 205
set i[457] = 206
set i[1280] = 207
set i[614] = 208
set i[1037] = 209
set i[237] = 210
set i[1409] = 211
set i[1023] = 212
set i[1361] = 213
set i[695] = 214
set i[161] = 215
set i[1645] = 216
set i[1822] = 217
set i[644] = 218
set i[1395] = 219
set i[677] = 220
set i[1677] = 221
set i[881] = 222
set i[861] = 223
set i[1408] = 224
set i[1864] = 225
set i[1467] = 226
set i[1819] = 227
set i[1971] = 228
set i[949] = 229
set i[774] = 230
set i[1828] = 231
set i[865] = 232
set i[699] = 233
set i[786] = 234
set i[1806] = 235
set i[1286] = 236
set i[1128] = 237
set i[1490] = 238
set i[1720] = 239
set i[1817] = 240
set i[729] = 241
set i[1191] = 242
set i[1164] = 243
set i[413] = 244
set i[349] = 245
set i[1409] = 246
set i[660] = 247
set i[2016] = 248
set i[1087] = 249
set i[1497] = 250
set i[753] = 251
set i[1579] = 252
set i[1456] = 253
set i[606] = 254
set i[1625] = 255
set h[92] = 47
set h[201] = 108
set h[201] = 76
set h[203] = 103
set h[203] = 71
set h[246] = 115
set h[246] = 83
set h[246] = 211
set h[254] = 187
set y[201] = 108
set y[203] = 103
set y[246] = 115
set c[8]="\b"
set c[9]="\t"
set c[10]="\n"
set c[12]="\f"
set c[13]="\r"
set c[32]=" "
set c[33]="!"
set c[34]="\""
set c[35]="#"
set c[36]="$"
set c[37]="%"
set c[38]="&"
set c[39]="'"
set c[40]="("
set c[41]=")"
set c[42]="*"
set c[43]="+"
set c[44]=","
set c[45]="-"
set c[46]="."
set c[47]="/"
set c[48]="0"
set c[49]="1"
set c[50]="2"
set c[51]="3"
set c[52]="4"
set c[53]="5"
set c[54]="6"
set c[55]="7"
set c[56]="8"
set c[57]="9"
set c[58]=":"
set c[59]=";"
set c[60]="<"
set c[61]="="
set c[62]=">"
set c[63]="?"
set c[64]="@"
set c[65]="A"
set c[66]="B"
set c[67]="C"
set c[68]="D"
set c[69]="E"
set c[70]="F"
set c[71]="G"
set c[72]="H"
set c[73]="I"
set c[74]="J"
set c[75]="K"
set c[76]="L"
set c[77]="M"
set c[78]="N"
set c[79]="O"
set c[80]="P"
set c[81]="Q"
set c[82]="R"
set c[83]="S"
set c[84]="T"
set c[85]="U"
set c[86]="V"
set c[87]="W"
set c[88]="X"
set c[89]="Y"
set c[90]="Z"
set c[91]="["
set c[92]="\\"
set c[93]="]"
set c[94]="^"
set c[95]="_"
set c[96]="`"
set c[97]="a"
set c[98]="b"
set c[99]="c"
set c[100]="d"
set c[101]="e"
set c[102]="f"
set c[103]="g"
set c[104]="h"
set c[105]="i"
set c[106]="j"
set c[107]="k"
set c[108]="l"
set c[109]="m"
set c[110]="n"
set c[111]="o"
set c[112]="p"
set c[113]="q"
set c[114]="r"
set c[115]="s"
set c[116]="t"
set c[117]="u"
set c[118]="v"
set c[119]="w"
set c[120]="x"
set c[121]="y"
set c[122]="z"
set c[123]="{"
set c[124]="|"
set c[125]="}"
set c[126]="~"
set c[128] = "€"
set c[130] = "‚"
set c[131] = "ƒ"
set c[132] = "„"
set c[133] = "…"
set c[134] = "†"
set c[135] = "‡"
set c[136] = "ˆ"
set c[137] = "‰"
set c[138] = "Š"
set c[139] = "‹"
set c[140] = "Œ"
set c[142] = "Ž"
set c[145] = "‘"
set c[146] = "’"
set c[147] = "“"
set c[148] = "”"
set c[149] = "•"
set c[150] = "–"
set c[151] = "—"
set c[152] = "˜"
set c[153] = "™"
set c[154] = "š"
set c[155] = "›"
set c[156] = "œ"
set c[158] = "ž"
set c[159] = "Ÿ"
set c[160] = " "
set c[161] = "¡"
set c[162] = "¢"
set c[163] = "£"
set c[164] = "¤"
set c[165] = "¥"
set c[166] = "¦"
set c[167] = "§"
set c[168] = "¨"
set c[169] = "©"
set c[170] = "ª"
set c[171] = "«"
set c[172] = "¬"
set c[174] = "®"
set c[175] = "¯"
set c[176] = "°"
set c[177] = "±"
set c[178] = "²"
set c[179] = "³"
set c[180] = "´"
set c[181] = "µ"
set c[182] = "¶"
set c[183] = "·"
set c[184] = "¸"
set c[185] = "¹"
set c[186] = "º"
set c[187] = "»"
set c[188] = "¼"
set c[189] = "½"
set c[190] = "¾"
set c[191] = "¿"
set c[192] = "À"
set c[193] = "Á"
set c[194] = "Â"
set c[195] = "Ã"
set c[196] = "Ä"
set c[197] = "Å"
set c[198] = "Æ"
set c[199] = "Ç"
set c[200] = "È"
set c[201] = "É"
set c[202] = "Ê"
set c[203] = "Ë"
set c[204] = "Ì"
set c[205] = "Í"
set c[206] = "Î"
set c[207] = "Ï"
set c[208] = "Ð"
set c[209] = "Ñ"
set c[210] = "Ò"
set c[211] = "Ó"
set c[212] = "Ô"
set c[213] = "Õ"
set c[214] = "Ö"
set c[215] = "×"
set c[216] = "Ø"
set c[217] = "Ù"
set c[218] = "Ú"
set c[219] = "Û"
set c[220] = "Ü"
set c[221] = "Ý"
set c[222] = "Þ"
set c[223] = "ß"
set c[224] = "à"
set c[225] = "á"
set c[226] = "â"
set c[227] = "ã"
set c[228] = "ä"
set c[229] = "å"
set c[230] = "æ"
set c[231] = "ç"
set c[232] = "è"
set c[233] = "é"
set c[234] = "ê"
set c[235] = "ë"
set c[236] = "ì"
set c[237] = "í"
set c[238] = "î"
set c[239] = "ï"
set c[240] = "ð"
set c[241] = "ñ"
set c[242] = "ò"
set c[243] = "ó"
set c[244] = "ô"
set c[245] = "õ"
set c[246] = "ö"
set c[247] = "÷"
set c[248] = "ø"
set c[249] = "ù"
set c[250] = "ú"
set c[251] = "û"
set c[252] = "ü"
set c[253] = "ý"
set c[254] = "þ"
set c[255] = "ÿ"
endmethod
endmodule
private struct Inits extends array
implement Init
endstruct
endlibrary
library TeamViewer initializer init_function uses HeroSelector
//TeamViewer 1.4
//Plugin for HeroSelector by Tasyen
//It shows the selection of Teams in groups
//Default setup could be suited for 2 team games
//API
// TeamViewerInit()
// creates Frames of TeamViewer, normaly should be called at the end of HeroSelectors Init
globals
private boolean ShowNonAllies = true //show non allies
private boolean UpdateNonAllies = false //update the image of non allies when the select or pick
//position when ShowNonAllies = false or when a TeamPos is not set
//how big are the Faces
private real ButtonSize = 0.03
private integer ButtonAlphaSelected = 150
private string ButtonDefaultIcon = "UI\\Widgets\\EscMenu\\Human\\quest-unknown.blp"
private real CategoryButtonSize = 0.015 //size of the CategoryButtons below an players name
private real CategoryButtonGap = 0.002 // space between 2 CategoryButtons
private real Scale = 1.0 // scales the PlayerFrames
public boolean AllowSwapAlly = true
public boolean AllowSwapEnemy = true
private string SwapTexture = "ReplaceableTextures\\CommandButtons\\BTNPatrol.blp"
private real SwapSize = 0.017
//used when ShowNonAllies = true
//warcraft 3 Teams start with 0
private real array TeamPosX
private real array TeamPosY
private real array TeamPosGapY
private boolean array TeamPosLeft2Right
private trigger ButtonTrigger
private boolean array HasPicked
private integer array Swap
private framehandle array playerParentFrame
private framehandle array playerFaceButton
private framehandle array playerFaceIcon
private framehandle array playerFaceIconDisabled
private framehandle array playerFaceIconPushed
private framehandle array playerFaceTooltip
private framehandle array playerFaceTooltipBox
private framehandle array playerFaceName
private framehandle array playerFaceColor
private framehandle array playerSwapFrame
private framehandle array LastTeamFaceButton
//2D
private framehandle array playerCategoryIcon
private framehandle array playerCategoryButton
private framehandle array playerCategoryTooltip
private framehandle array playerCategoryTooltipBox
endglobals
function TeamViewerSetup takes nothing returns nothing
set TeamPosX[0] = 0.02
set TeamPosY[0] = 0.5
set TeamPosGapY[0] = 0.015
set TeamPosLeft2Right[0] = true
set TeamPosX[1] = 0.75
set TeamPosY[1] = 0.5
set TeamPosGapY[1] = 0.015
set TeamPosLeft2Right[1] = false
endfunction
// (true) allows includes the player in TeamViewer
private function AllowPlayer takes player p returns boolean
return GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(p) == MAP_CONTROL_USER
endfunction
private function PosFirstFrame takes framehandle movingFrame, framehandle relativFrame, boolean left2Right returns nothing
if left2Right then
call BlzFrameSetPoint(movingFrame, FRAMEPOINT_TOPLEFT, relativFrame, FRAMEPOINT_BOTTOMLEFT, 0, 0)
else
call BlzFrameSetPoint(movingFrame, FRAMEPOINT_TOPRIGHT, relativFrame, FRAMEPOINT_BOTTOMRIGHT, 0, 0)
endif
endfunction
private function PosFrame takes framehandle movingFrame, framehandle relativFrame, boolean left2Right returns nothing
if left2Right then
call BlzFrameSetPoint(movingFrame, FRAMEPOINT_TOPLEFT, relativFrame, FRAMEPOINT_TOPRIGHT, CategoryButtonGap, 0)
else
call BlzFrameSetPoint(movingFrame, FRAMEPOINT_TOPRIGHT, relativFrame, FRAMEPOINT_TOPLEFT, -CategoryButtonGap, 0)
endif
endfunction
private function UpdateButton takes player p, integer unitCode, integer alpha, boolean updateCategory returns nothing
local integer playerIndex = GetPlayerId(p)
local integer teamNr = GetPlayerTeam(p)
local framehandle prevCategoryButton = null
local integer category = 1
local integer unitCodeIndex = LoadInteger(HeroSelector_Hash, unitCode, 0)
local integer unitCategory = HeroSelector_HeroCategory[unitCodeIndex]
local integer categoryButtonIndex
local integer buttonIndex = 1
local boolean left2Right = false
if UpdateNonAllies or IsPlayerAlly(GetLocalPlayer(), p) then
call BlzFrameSetText(playerFaceTooltip[playerIndex], GetObjectName(unitCode))
call BlzFrameSetTexture(playerFaceIcon[playerIndex], BlzGetAbilityIcon(unitCode), 0, true)
call BlzFrameSetTexture(playerFaceIconPushed[playerIndex], BlzGetAbilityIcon(unitCode), 0, true)
call BlzFrameSetAlpha(playerFaceButton[playerIndex], alpha)
if ShowNonAllies then
set left2Right = TeamPosLeft2Right[teamNr]
else
set left2Right = TeamPosLeft2Right[0]
endif
loop
exitwhen buttonIndex > HeroSelector_CategoryButtonCount
set categoryButtonIndex = playerIndex*1000 + buttonIndex
call BlzFrameClearAllPoints(playerCategoryButton[categoryButtonIndex])
if BlzBitAnd(category, unitCategory) > 0 then
call BlzFrameSetVisible(playerCategoryButton[categoryButtonIndex], true)
if prevCategoryButton == null then
call PosFirstFrame(playerCategoryButton[categoryButtonIndex], playerFaceName[playerIndex], left2Right)
else
call PosFrame(playerCategoryButton[categoryButtonIndex], prevCategoryButton, left2Right)
endif
set prevCategoryButton = playerCategoryButton[categoryButtonIndex]
else
call BlzFrameSetVisible(playerCategoryButton[categoryButtonIndex], false)
endif
set category = category + category
set buttonIndex = buttonIndex + 1
endloop
endif
set prevCategoryButton = null
endfunction
private function PlayerFaceClicked takes player clickingPlayer, player targetPlayer returns nothing
local integer clickNumber
local integer targetNumber
local integer clickPlayerId = GetPlayerId(clickingPlayer)
local integer targetPlayerId = GetPlayerId(targetPlayer)
local unit tempUnit
// call BJDebugMsg(GetPlayerName(clickingPlayer) + " Clicked " + GetPlayerName(targetPlayer))
if GetUnitTypeId(HeroSelector_PickedUnit[clickPlayerId]) == 0 then
return
endif
if GetUnitTypeId(HeroSelector_PickedUnit[targetPlayerId]) == 0 then
return
endif
// self click allows all others to swap with you
if clickingPlayer == targetPlayer then
if Swap[clickPlayerId] == 0 then
set Swap[clickPlayerId] = 2147483647
call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, GetPlayerName(clickingPlayer) + " wants to Swap")
else
set Swap[clickPlayerId] = 0
endif
elseif (AllowSwapAlly and IsPlayerAlly(clickingPlayer, targetPlayer) ) or (AllowSwapEnemy and IsPlayerEnemy(clickingPlayer, targetPlayer)) then
set clickNumber = R2I(Pow(2,clickPlayerId))
set targetNumber = R2I(Pow(2,targetPlayerId))
set Swap[clickPlayerId] = BlzBitXor(Swap[clickPlayerId], targetNumber)
if BlzBitAnd(Swap[clickPlayerId], targetNumber) > 0 then
call DisplayTextToPlayer(targetPlayer, 0, 0, GetPlayerName(clickingPlayer) + " wants to Swap")
endif
if BlzBitAnd(Swap[clickPlayerId], targetNumber) > 0 and BlzBitAnd(Swap[targetPlayerId], clickNumber) > 0 then
call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, GetPlayerName(clickingPlayer) + " <-> " + GetPlayerName(targetPlayer))
call SetUnitOwner(HeroSelector_PickedUnit[clickPlayerId], targetPlayer, true)
call SetUnitOwner(HeroSelector_PickedUnit[targetPlayerId], clickingPlayer, true)
set tempUnit = HeroSelector_PickedUnit[clickPlayerId]
set HeroSelector_PickedUnit[clickPlayerId] = HeroSelector_PickedUnit[targetPlayerId]
set HeroSelector_PickedUnit[targetPlayerId] = tempUnit
set tempUnit = null
call UpdateButton(clickingPlayer, GetUnitTypeId(HeroSelector_PickedUnit[clickPlayerId]), 255, true)
call UpdateButton(targetPlayer, GetUnitTypeId(HeroSelector_PickedUnit[targetPlayerId]), 255, true)
// after swap reset to 0
set Swap[clickPlayerId] = 0
set Swap[targetPlayerId] = 0
call BlzFrameSetVisible(playerSwapFrame[clickPlayerId], false)
call BlzFrameSetVisible(playerSwapFrame[targetPlayerId], false)
endif
endif
call BlzFrameSetVisible(playerSwapFrame[clickPlayerId], GetLocalPlayer() != clickingPlayer and BlzBitAnd(Swap[clickPlayerId], R2I(Pow(2,GetPlayerId(GetLocalPlayer())))) > 0)
endfunction
private function PlayerFaceClickTriggerAction takes nothing returns nothing
local framehandle frame = BlzGetTriggerFrame()
local integer playerIndex = 0
call HeroSelectorframeLoseFocus(frame)
loop
exitwhen playerIndex == GetBJMaxPlayers()
if playerFaceButton[playerIndex] == frame then
call PlayerFaceClicked(GetTriggerPlayer(), Player(playerIndex))
endif
set playerIndex = playerIndex + 1
endloop
set frame = null
endfunction
function TeamViewerInit takes nothing returns nothing
local player p
local integer playerIndex = 0
local integer colorIndex = 0
local integer teamNr
local boolean left2Right = false
local integer createContext
local integer buttonIndex
local integer categoryButtonIndex
loop
exitwhen playerIndex == GetBJMaxPlayers()
set p = Player(playerIndex)
if AllowPlayer(p) then
set teamNr = GetPlayerTeam(p)
set createContext = 1000 + playerIndex
set playerParentFrame[playerIndex] = BlzCreateFrame("HeroSelectorTextBox", HeroSelectorBox, 0, createContext)
set playerFaceColor[playerIndex] = BlzCreateFrameByType("BACKDROP", "", playerParentFrame[playerIndex], "", createContext)
//set playerParentFrame[playerIndex] = BlzCreateFrameByType("FRAME", "TeamViewerPlayerFrame", HeroSelectorBox, "", createContext)
set playerFaceButton[playerIndex] = BlzCreateFrame("HeroSelectorButton", playerParentFrame[playerIndex], 0, createContext)
set playerFaceName[playerIndex] = BlzCreateFrame("HeroSelectorText", playerParentFrame[playerIndex], 0, createContext) // do not the buttons child, else it is affected by Alpha change
set playerFaceIcon[playerIndex] = BlzGetFrameByName("HeroSelectorButtonIcon", createContext)
set playerFaceIconDisabled[playerIndex] = BlzGetFrameByName("HeroSelectorButtonIconDisabled", createContext)
set playerFaceIconPushed[playerIndex] = BlzGetFrameByName("HeroSelectorButtonIconPushed", createContext)
set playerSwapFrame[playerIndex] = BlzCreateFrameByType("BACKDROP", "", playerParentFrame[playerIndex], "", createContext)
set playerFaceTooltipBox[playerIndex] = BlzCreateFrame("HeroSelectorTextBox", playerFaceButton[playerIndex], 0, createContext)
set playerFaceTooltip[playerIndex] = BlzCreateFrame("HeroSelectorText", playerFaceTooltipBox[playerIndex], 0, createContext)
call BlzTriggerRegisterFrameEvent(ButtonTrigger, playerFaceButton[playerIndex], FRAMEEVENT_CONTROL_CLICK)
call BlzFrameSetPoint(playerFaceTooltipBox[playerIndex], FRAMEPOINT_BOTTOMLEFT, playerFaceTooltip[playerIndex], FRAMEPOINT_BOTTOMLEFT, -0.007, -0.007)
call BlzFrameSetPoint(playerFaceTooltipBox[playerIndex], FRAMEPOINT_TOPRIGHT, playerFaceTooltip[playerIndex], FRAMEPOINT_TOPRIGHT, 0.007, 0.007)
call BlzFrameSetSize(playerParentFrame[playerIndex], 0.11 + ButtonSize, ButtonSize + CategoryButtonSize + 0.001)
call BlzFrameSetPoint(playerFaceColor[playerIndex], FRAMEPOINT_TOPLEFT, playerParentFrame[playerIndex], FRAMEPOINT_TOPLEFT, 0.005, -0.0035)
call BlzFrameSetPoint(playerFaceColor[playerIndex], FRAMEPOINT_TOPRIGHT, playerParentFrame[playerIndex], FRAMEPOINT_TOPRIGHT, -0.005, -0.0035)
call BlzFrameSetSize(playerFaceColor[playerIndex], 0, 0.003)
call BlzFrameSetPoint(playerSwapFrame[playerIndex], FRAMEPOINT_TOPRIGHT, playerParentFrame[playerIndex], FRAMEPOINT_TOPRIGHT, 0, 0)
call BlzFrameSetSize(playerSwapFrame[playerIndex], SwapSize, SwapSize)
call BlzFrameSetTexture(playerSwapFrame[playerIndex], SwapTexture, 0, false)
call BlzFrameSetVisible(playerSwapFrame[playerIndex], false)
set colorIndex = GetHandleId(GetPlayerColor(p))
if colorIndex < 10 then
call BlzFrameSetTexture(playerFaceColor[playerIndex], "ReplaceableTextures\\TeamColor\\TeamColor0"+I2S(colorIndex), 0, false)
else
call BlzFrameSetTexture(playerFaceColor[playerIndex], "ReplaceableTextures\\TeamColor\\TeamColor"+I2S(colorIndex), 0, false)
endif
if ShowNonAllies then
set left2Right = TeamPosLeft2Right[teamNr]
else
set left2Right = TeamPosLeft2Right[0]
endif
call BlzFrameSetSize(playerFaceButton[playerIndex], ButtonSize, ButtonSize)
call BlzFrameSetSize(playerFaceName[playerIndex], 0.105 - ButtonSize, 0.013)
if LastTeamFaceButton[teamNr] == null then
if ShowNonAllies then
call BlzFrameSetAbsPoint(playerFaceButton[playerIndex], FRAMEPOINT_BOTTOMLEFT, TeamPosX[teamNr], TeamPosY[teamNr])
else
call BlzFrameSetAbsPoint(playerFaceButton[playerIndex], FRAMEPOINT_BOTTOMLEFT, TeamPosX[0], TeamPosY[0])
endif
else
call BlzFrameSetPoint(playerFaceButton[playerIndex], FRAMEPOINT_TOPLEFT, LastTeamFaceButton[teamNr], FRAMEPOINT_BOTTOMLEFT, 0, -TeamPosGapY[teamNr])
endif
set LastTeamFaceButton[teamNr] = playerFaceButton[playerIndex]
call PosFrame(playerFaceName[playerIndex], playerFaceButton[playerIndex], left2Right)
if left2Right then
call BlzFrameSetPoint(playerFaceTooltip[playerIndex], FRAMEPOINT_BOTTOMLEFT, playerFaceButton[playerIndex], FRAMEPOINT_TOPLEFT, 0, 0)
call BlzFrameSetPoint(playerParentFrame[playerIndex], FRAMEPOINT_TOPLEFT, playerFaceButton[playerIndex], FRAMEPOINT_TOPLEFT, -0.007, 0.007)
else
call BlzFrameSetPoint(playerFaceTooltip[playerIndex], FRAMEPOINT_BOTTOMRIGHT, playerFaceButton[playerIndex], FRAMEPOINT_TOPRIGHT, 0, 0)
call BlzFrameSetPoint(playerParentFrame[playerIndex], FRAMEPOINT_TOPRIGHT, playerFaceButton[playerIndex], FRAMEPOINT_TOPRIGHT, 0.007, 0.007)
endif
call BlzFrameSetText(playerFaceName[playerIndex], GetPlayerName(p))
call BlzFrameSetTooltip(playerFaceButton[playerIndex], playerFaceTooltipBox[playerIndex])
call BlzFrameSetTexture(playerFaceIcon[playerIndex], ButtonDefaultIcon, 0, true)
call BlzFrameSetTexture(playerFaceIconPushed[playerIndex], ButtonDefaultIcon, 0, true)
//print("Pre HeroSelector.Category")
set buttonIndex = 1
loop
exitwhen buttonIndex > HeroSelector_CategoryButtonCount
set categoryButtonIndex = playerIndex*1000 + buttonIndex
//print("playerIndex",key)
set playerCategoryButton[categoryButtonIndex] = BlzCreateFrameByType("BUTTON", "", playerParentFrame[playerIndex], "", 0)
set playerCategoryIcon[categoryButtonIndex] = BlzCreateFrameByType("BACKDROP", "", playerCategoryButton[categoryButtonIndex], "", 0)
set playerCategoryTooltipBox[categoryButtonIndex] = BlzCreateFrame("HeroSelectorTextBox", playerCategoryButton[categoryButtonIndex], 0, categoryButtonIndex)
set playerCategoryTooltip[categoryButtonIndex] = BlzCreateFrame("HeroSelectorText", playerCategoryTooltipBox[categoryButtonIndex], 0, categoryButtonIndex)
call BlzFrameSetText(playerCategoryTooltip[categoryButtonIndex], BlzFrameGetText(HeroSelector_CategoryTooltipFrame[buttonIndex]))
call BlzFrameSetTooltip( playerCategoryButton[categoryButtonIndex], playerCategoryTooltipBox[categoryButtonIndex])
call BlzFrameSetAllPoints(playerCategoryIcon[categoryButtonIndex], playerCategoryButton[categoryButtonIndex])
call BlzFrameSetPoint(playerCategoryTooltip[categoryButtonIndex], FRAMEPOINT_BOTTOM, playerCategoryButton[categoryButtonIndex], FRAMEPOINT_TOP, 0, 0)
call BlzFrameSetSize( playerCategoryButton[categoryButtonIndex], 0.015, 0.015)
call BlzFrameSetTexture(playerCategoryIcon[categoryButtonIndex], HeroSelector_CategoryTexture[buttonIndex], 0, true)
call BlzFrameSetVisible( playerCategoryButton[categoryButtonIndex], false)
call BlzFrameSetPoint(playerCategoryTooltipBox[categoryButtonIndex], FRAMEPOINT_BOTTOMLEFT, playerCategoryTooltip[categoryButtonIndex], FRAMEPOINT_BOTTOMLEFT, -0.007, -0.007)
call BlzFrameSetPoint(playerCategoryTooltipBox[categoryButtonIndex], FRAMEPOINT_TOPRIGHT, playerCategoryTooltip[categoryButtonIndex], FRAMEPOINT_TOPRIGHT, 0.007, 0.007)
set buttonIndex = buttonIndex + 1
endloop
call BlzFrameSetScale(playerParentFrame[playerIndex], Scale)
//When showning only allies, hide non allies
if not ShowNonAllies and not IsPlayerAlly(p, GetLocalPlayer()) then
call BlzFrameSetVisible(playerParentFrame[playerIndex], false)
endif
endif
set playerIndex = playerIndex + 1
endloop
endfunction
function TeamViewerButtonSelected takes player p, integer unitCode returns nothing
local integer playerIndex = GetPlayerId(p)
if not HasPicked[playerIndex] then
call UpdateButton(p, unitCode, ButtonAlphaSelected, true)
endif
endfunction
function TeamViewerUnitCreated takes player p, unit u, boolean isRandom returns nothing
local integer playerIndex = GetPlayerId(p)
call UpdateButton(p, GetUnitTypeId(u), 255, false)
set HasPicked[playerIndex] = true
endfunction
function TeamViewerRepick takes unit u, player p returns nothing
local integer playerIndex = GetPlayerId(p)
if UpdateNonAllies or IsPlayerAlly(GetLocalPlayer(), p) then
call BlzFrameSetText(playerFaceTooltip[playerIndex], "")
call BlzFrameSetTexture(playerFaceIcon[playerIndex], ButtonDefaultIcon, 0, true)
call BlzFrameSetTexture(playerFaceIconPushed[playerIndex], ButtonDefaultIcon, 0, true)
call BlzFrameSetAlpha(playerFaceButton[playerIndex], 255)
endif
set HasPicked[playerIndex] = false
endfunction
function TeamViewerReset takes nothing returns nothing
local integer playerIndex= 0
local integer buttonIndex
local integer categoryButtonIndex
loop
exitwhen playerIndex == GetBJMaxPlayers()
if playerFaceButton[playerIndex] != null then
call BlzFrameSetTexture(playerFaceIcon[playerIndex], ButtonDefaultIcon, 0, true)
call BlzFrameSetTexture(playerFaceIconPushed[playerIndex], ButtonDefaultIcon, 0, true)
call BlzFrameSetAlpha(playerFaceButton[playerIndex], 255)
set HasPicked[playerIndex]=false
//print("Pre HeroSelector.Category")
set buttonIndex=1
loop
exitwhen buttonIndex > HeroSelector_CategoryButtonCount
set categoryButtonIndex=playerIndex * 1000 + buttonIndex
call BlzFrameSetTexture(playerCategoryIcon[categoryButtonIndex], HeroSelector_CategoryTexture[buttonIndex], 0, true)
call BlzFrameSetVisible(playerCategoryButton[categoryButtonIndex], false)
set buttonIndex=buttonIndex + 1
endloop
endif
set playerIndex=playerIndex + 1
endloop
endfunction
private function init_function takes nothing returns nothing
set ButtonTrigger = CreateTrigger()
call TriggerAddAction(ButtonTrigger, function PlayerFaceClickTriggerAction)
call TeamViewerSetup()
endfunction
endlibrary
library TeamViewer initializer init_function uses HeroSelector
//TeamViewer 1.4 (One)
//Plugin for HeroSelector by Tasyen
//It shows the selection of Players in cols. When a col is full right of it a new is started
//API
// TeamViewerInit()
// creates Frames of TeamViewer, normaly should be called at the end of HeroSelectors Init
globals
//how big are the Faces
private real ButtonSize = 0.03
private integer ButtonAlphaSelected = 150
private string ButtonDefaultIcon = "UI\\Widgets\\EscMenu\\Human\\quest-unknown.blp"
private real CategoryButtonSize = 0.015 //size of the CategoryButtons below an players name
private real CategoryButtonGap = 0.002 // space between 2 CategoryButtons
private real Scale = 1.0 // scales the PlayerFrames
public boolean AllowSwapAlly = true
public boolean AllowSwapEnemy = true
private string SwapTexture = "ReplaceableTextures\\CommandButtons\\BTNPatrol.blp"
private real SwapSize = 0.017
private real TeamPosX = 0.02
private real TeamPosY = 0.5
private real TeamPosGapY = 0.015
private real TeamPosGapX = 0.015
private integer TeamRowCount = 7
private trigger ButtonTrigger
private boolean array HasPicked
private integer array Swap
private framehandle array playerParentFrame
private framehandle array playerFaceButton
private framehandle array playerFaceIcon
private framehandle array playerFaceIconPushed
private framehandle array playerFaceIconDisabled
private framehandle array playerFaceTooltip
private framehandle array playerFaceTooltipBox
private framehandle array playerFaceName
private framehandle array playerFaceColor
private framehandle array playerSwapFrame
private framehandle array LastTeamFaceButton
//2D
private framehandle array playerCategoryIcon
private framehandle array playerCategoryButton
private framehandle array playerCategoryTooltip
private framehandle array playerCategoryTooltipBox
endglobals
// (true) allows includes the player in TeamViewer
private function AllowPlayer takes player p returns boolean
return GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(p) == MAP_CONTROL_USER
endfunction
private function PosFrame takes framehandle movingFrame, framehandle relativFrame returns nothing
call BlzFrameSetPoint(movingFrame, FRAMEPOINT_TOPLEFT, relativFrame, FRAMEPOINT_TOPRIGHT, CategoryButtonGap, 0)
endfunction
private function UpdateButton takes player p, integer unitCode, integer alpha, boolean updateCategory returns nothing
local integer playerIndex = GetPlayerId(p)
local framehandle prevCategoryButton = null
local integer category = 1
local integer unitCodeIndex = LoadInteger(HeroSelector_Hash, unitCode, 0)
local integer unitCategory = HeroSelector_HeroCategory[unitCodeIndex]
local integer categoryButtonIndex
local integer buttonIndex = 1
call BlzFrameSetText(playerFaceTooltip[playerIndex], GetObjectName(unitCode))
call BlzFrameSetTexture(playerFaceIcon[playerIndex], BlzGetAbilityIcon(unitCode), 0, true)
call BlzFrameSetTexture(playerFaceIconPushed[playerIndex], BlzGetAbilityIcon(unitCode), 0, true)
call BlzFrameSetAlpha(playerFaceButton[playerIndex], alpha)
if updateCategory then
loop
exitwhen buttonIndex > HeroSelector_CategoryButtonCount
set categoryButtonIndex = playerIndex*1000 + buttonIndex
call BlzFrameClearAllPoints(playerCategoryButton[categoryButtonIndex])
if BlzBitAnd(category, unitCategory) > 0 then
call BlzFrameSetVisible(playerCategoryButton[categoryButtonIndex], true)
if prevCategoryButton == null then
call BlzFrameSetPoint(playerCategoryButton[categoryButtonIndex], FRAMEPOINT_TOPLEFT, playerFaceName[playerIndex], FRAMEPOINT_BOTTOMLEFT, 0, 0)
else
call PosFrame(playerCategoryButton[categoryButtonIndex], prevCategoryButton)
endif
set prevCategoryButton = playerCategoryButton[categoryButtonIndex]
else
call BlzFrameSetVisible(playerCategoryButton[categoryButtonIndex], false)
endif
set category = category + category
set buttonIndex = buttonIndex + 1
endloop
endif
set prevCategoryButton = null
endfunction
private function PlayerFaceClicked takes player clickingPlayer, player targetPlayer returns nothing
local integer clickNumber
local integer targetNumber
local integer clickPlayerId = GetPlayerId(clickingPlayer)
local integer targetPlayerId = GetPlayerId(targetPlayer)
local unit tempUnit
// call BJDebugMsg(GetPlayerName(clickingPlayer) + " Clicked " + GetPlayerName(targetPlayer))
if GetUnitTypeId(HeroSelector_PickedUnit[clickPlayerId]) == 0 then
return
endif
if GetUnitTypeId(HeroSelector_PickedUnit[targetPlayerId]) == 0 then
return
endif
// self click allows all others to swap with you
if clickingPlayer == targetPlayer then
if Swap[clickPlayerId] == 0 then
set Swap[clickPlayerId] = 2147483647
call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, GetPlayerName(clickingPlayer) + " wants to Swap")
else
set Swap[clickPlayerId] = 0
endif
elseif (AllowSwapAlly and IsPlayerAlly(clickingPlayer, targetPlayer) ) or (AllowSwapEnemy and IsPlayerEnemy(clickingPlayer, targetPlayer)) then
set clickNumber = R2I(Pow(2,clickPlayerId))
set targetNumber = R2I(Pow(2,targetPlayerId))
set Swap[clickPlayerId] = BlzBitXor(Swap[clickPlayerId], targetNumber)
if BlzBitAnd(Swap[clickPlayerId], targetNumber) > 0 then
call DisplayTextToPlayer(targetPlayer, 0, 0, GetPlayerName(clickingPlayer) + " wants to Swap")
endif
if BlzBitAnd(Swap[clickPlayerId], targetNumber) > 0 and BlzBitAnd(Swap[targetPlayerId], clickNumber) > 0 then
call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, GetPlayerName(clickingPlayer) + " <-> " + GetPlayerName(targetPlayer))
call SetUnitOwner(HeroSelector_PickedUnit[clickPlayerId], targetPlayer, true)
call SetUnitOwner(HeroSelector_PickedUnit[targetPlayerId], clickingPlayer, true)
set tempUnit = HeroSelector_PickedUnit[clickPlayerId]
set HeroSelector_PickedUnit[clickPlayerId] = HeroSelector_PickedUnit[targetPlayerId]
set HeroSelector_PickedUnit[targetPlayerId] = tempUnit
set tempUnit = null
call UpdateButton(clickingPlayer, GetUnitTypeId(HeroSelector_PickedUnit[clickPlayerId]), 255, true)
call UpdateButton(targetPlayer, GetUnitTypeId(HeroSelector_PickedUnit[targetPlayerId]), 255, true)
// after swap reset to 0
set Swap[clickPlayerId] = 0
set Swap[targetPlayerId] = 0
call BlzFrameSetVisible(playerSwapFrame[clickPlayerId], false)
call BlzFrameSetVisible(playerSwapFrame[targetPlayerId], false)
endif
endif
call BlzFrameSetVisible(playerSwapFrame[clickPlayerId], GetLocalPlayer() != clickingPlayer and BlzBitAnd(Swap[clickPlayerId], R2I(Pow(2,GetPlayerId(GetLocalPlayer())))) > 0)
endfunction
private function PlayerFaceClickTriggerAction takes nothing returns nothing
local framehandle frame = BlzGetTriggerFrame()
local integer playerIndex = 0
call HeroSelectorframeLoseFocus(frame)
loop
exitwhen playerIndex == GetBJMaxPlayers()
if playerFaceButton[playerIndex] == frame then
call PlayerFaceClicked(GetTriggerPlayer(), Player(playerIndex))
endif
set playerIndex = playerIndex + 1
endloop
set frame = null
endfunction
function TeamViewerInit takes nothing returns nothing
local player p
local integer playerIndex = 0
local integer colorIndex = 0
local integer createContext
local integer buttonIndex
local integer rowCount = TeamRowCount
local integer created = 0
local integer categoryButtonIndex
loop
exitwhen playerIndex == GetBJMaxPlayers()
set p = Player(playerIndex)
if AllowPlayer(p) then
set createContext = 1000 + playerIndex
set created = created + 1
set playerParentFrame[playerIndex] = BlzCreateFrame("HeroSelectorTextBox", HeroSelectorBox, 0, createContext)
set playerFaceColor[playerIndex] = BlzCreateFrameByType("BACKDROP", "", playerParentFrame[playerIndex], "", createContext)
//set playerParentFrame[playerIndex] = BlzCreateFrameByType("FRAME", "TeamViewerPlayerFrame", HeroSelectorBox, "", createContext)
set playerFaceButton[playerIndex] = BlzCreateFrame("HeroSelectorButton", playerParentFrame[playerIndex], 0, createContext)
set playerFaceName[playerIndex] = BlzCreateFrame("HeroSelectorText", playerParentFrame[playerIndex], 0, createContext) // do not the buttons child, else it is affected by Alpha change
set playerFaceIcon[playerIndex] = BlzGetFrameByName("HeroSelectorButtonIcon", createContext)
set playerFaceIconPushed[playerIndex] = BlzGetFrameByName("HeroSelectorButtonIconPushed", createContext)
set playerFaceIconDisabled[playerIndex] = BlzGetFrameByName("HeroSelectorButtonIconDisabled", createContext)
set playerSwapFrame[playerIndex] = BlzCreateFrameByType("BACKDROP", "", playerParentFrame[playerIndex], "", createContext)
set playerFaceTooltipBox[playerIndex] = BlzCreateFrame("HeroSelectorTextBox", playerFaceButton[playerIndex], 0, createContext)
set playerFaceTooltip[playerIndex] = BlzCreateFrame("HeroSelectorText", playerFaceTooltipBox[playerIndex], 0, createContext)
call BlzTriggerRegisterFrameEvent(ButtonTrigger, playerFaceButton[playerIndex], FRAMEEVENT_CONTROL_CLICK)
call BlzFrameSetPoint(playerFaceTooltipBox[playerIndex], FRAMEPOINT_BOTTOMLEFT, playerFaceTooltip[playerIndex], FRAMEPOINT_BOTTOMLEFT, -0.007, -0.007)
call BlzFrameSetPoint(playerFaceTooltipBox[playerIndex], FRAMEPOINT_TOPRIGHT, playerFaceTooltip[playerIndex], FRAMEPOINT_TOPRIGHT, 0.007, 0.007)
call BlzFrameSetSize(playerParentFrame[playerIndex], 0.11 + ButtonSize, ButtonSize + CategoryButtonSize + 0.001)
call BlzFrameSetPoint(playerFaceColor[playerIndex], FRAMEPOINT_TOPLEFT, playerParentFrame[playerIndex], FRAMEPOINT_TOPLEFT, 0.005, -0.0035)
call BlzFrameSetPoint(playerFaceColor[playerIndex], FRAMEPOINT_TOPRIGHT, playerParentFrame[playerIndex], FRAMEPOINT_TOPRIGHT, -0.005, -0.0035)
call BlzFrameSetSize(playerFaceColor[playerIndex], 0, 0.003)
call BlzFrameSetPoint(playerSwapFrame[playerIndex], FRAMEPOINT_TOPRIGHT, playerParentFrame[playerIndex], FRAMEPOINT_TOPRIGHT, 0, 0)
call BlzFrameSetSize(playerSwapFrame[playerIndex], SwapSize, SwapSize)
call BlzFrameSetTexture(playerSwapFrame[playerIndex], SwapTexture, 0, false)
call BlzFrameSetVisible(playerSwapFrame[playerIndex], false)
set colorIndex = GetHandleId(GetPlayerColor(p))
if colorIndex < 10 then
call BlzFrameSetTexture(playerFaceColor[playerIndex], "ReplaceableTextures\\TeamColor\\TeamColor0"+I2S(colorIndex), 0, false)
else
call BlzFrameSetTexture(playerFaceColor[playerIndex], "ReplaceableTextures\\TeamColor\\TeamColor"+I2S(colorIndex), 0, false)
endif
call BlzFrameSetSize(playerFaceButton[playerIndex], ButtonSize, ButtonSize)
call BlzFrameSetSize(playerFaceName[playerIndex], 0.105 - ButtonSize, 0.013)
if created == 1 then
call BlzFrameSetAbsPoint(playerFaceButton[playerIndex], FRAMEPOINT_BOTTOMLEFT, TeamPosX, TeamPosY)
else
if rowCount <= 0 then
call BlzFrameSetPoint(playerFaceButton[playerIndex], FRAMEPOINT_TOPLEFT, LastTeamFaceButton[created - TeamRowCount], FRAMEPOINT_TOPRIGHT, TeamPosGapX + 0.11, 0)
else
call BlzFrameSetPoint(playerFaceButton[playerIndex], FRAMEPOINT_TOPLEFT, LastTeamFaceButton[created - 1], FRAMEPOINT_BOTTOMLEFT, 0, -TeamPosGapY)
endif
endif
set rowCount = rowCount - 1
set LastTeamFaceButton[created] = playerFaceButton[playerIndex]
call PosFrame(playerFaceName[playerIndex], playerFaceButton[playerIndex])
call BlzFrameSetPoint(playerFaceTooltip[playerIndex], FRAMEPOINT_BOTTOMLEFT, playerFaceButton[playerIndex], FRAMEPOINT_TOPLEFT, 0, 0)
call BlzFrameSetPoint(playerParentFrame[playerIndex], FRAMEPOINT_TOPLEFT, playerFaceButton[playerIndex], FRAMEPOINT_TOPLEFT, -0.007, 0.007)
call BlzFrameSetText(playerFaceName[playerIndex], GetPlayerName(p))
call BlzFrameSetTooltip(playerFaceButton[playerIndex], playerFaceTooltipBox[playerIndex])
call BlzFrameSetTexture(playerFaceIcon[playerIndex], ButtonDefaultIcon, 0, true)
call BlzFrameSetTexture(playerFaceIconPushed[playerIndex], ButtonDefaultIcon, 0, true)
set buttonIndex = 1
loop
exitwhen buttonIndex > HeroSelector_CategoryButtonCount
set categoryButtonIndex = playerIndex*1000 + buttonIndex
set playerCategoryButton[categoryButtonIndex] = BlzCreateFrameByType("BUTTON", "", playerParentFrame[playerIndex], "", 0)
set playerCategoryIcon[categoryButtonIndex] = BlzCreateFrameByType("BACKDROP", "", playerCategoryButton[categoryButtonIndex], "", 0)
set playerCategoryTooltipBox[categoryButtonIndex] = BlzCreateFrame("HeroSelectorTextBox", playerCategoryButton[categoryButtonIndex], 0, categoryButtonIndex)
set playerCategoryTooltip[categoryButtonIndex] = BlzCreateFrame("HeroSelectorText", playerCategoryTooltipBox[categoryButtonIndex], 0, categoryButtonIndex)
call BlzFrameSetText(playerCategoryTooltip[categoryButtonIndex], BlzFrameGetText(HeroSelector_CategoryTooltipFrame[buttonIndex]))
call BlzFrameSetTooltip( playerCategoryButton[categoryButtonIndex], playerCategoryTooltipBox[categoryButtonIndex])
call BlzFrameSetAllPoints(playerCategoryIcon[categoryButtonIndex], playerCategoryButton[categoryButtonIndex])
call BlzFrameSetPoint(playerCategoryTooltip[categoryButtonIndex], FRAMEPOINT_BOTTOM, playerCategoryButton[categoryButtonIndex], FRAMEPOINT_TOP, 0, 0)
call BlzFrameSetSize( playerCategoryButton[categoryButtonIndex], 0.015, 0.015)
call BlzFrameSetTexture(playerCategoryIcon[categoryButtonIndex], HeroSelector_CategoryTexture[buttonIndex], 0, true)
call BlzFrameSetVisible( playerCategoryButton[categoryButtonIndex], false)
call BlzFrameSetPoint(playerCategoryTooltipBox[categoryButtonIndex], FRAMEPOINT_BOTTOMLEFT, playerCategoryTooltip[categoryButtonIndex], FRAMEPOINT_BOTTOMLEFT, -0.007, -0.007)
call BlzFrameSetPoint(playerCategoryTooltipBox[categoryButtonIndex], FRAMEPOINT_TOPRIGHT, playerCategoryTooltip[categoryButtonIndex], FRAMEPOINT_TOPRIGHT, 0.007, 0.007)
set buttonIndex = buttonIndex + 1
endloop
call BlzFrameSetScale(playerParentFrame[playerIndex], Scale)
endif
set playerIndex = playerIndex + 1
endloop
endfunction
function TeamViewerButtonSelected takes player p, integer unitCode returns nothing
local integer playerIndex = GetPlayerId(p)
if not HasPicked[playerIndex] then
call UpdateButton(p, unitCode, ButtonAlphaSelected, true)
endif
endfunction
function TeamViewerUnitCreated takes player p, unit u, boolean isRandom returns nothing
local integer playerIndex = GetPlayerId(p)
set HasPicked[playerIndex] = true
call UpdateButton(p, GetUnitTypeId(u), 255, false)
endfunction
function TeamViewerRepick takes unit u, player p returns nothing
local integer playerIndex = GetPlayerId(p)
call BlzFrameSetText(playerFaceTooltip[playerIndex], "")
call BlzFrameSetTexture(playerFaceIcon[playerIndex], ButtonDefaultIcon, 0, true)
call BlzFrameSetTexture(playerFaceIconPushed[playerIndex], ButtonDefaultIcon, 0, true)
call BlzFrameSetAlpha(playerFaceButton[playerIndex], 255)
set HasPicked[playerIndex] = false
endfunction
function TeamViewerReset takes nothing returns nothing
local integer playerIndex= 0
local integer buttonIndex
local integer categoryButtonIndex
loop
exitwhen playerIndex == GetBJMaxPlayers()
if playerFaceButton[playerIndex] != null then
call BlzFrameSetTexture(playerFaceIcon[playerIndex], ButtonDefaultIcon, 0, true)
call BlzFrameSetTexture(playerFaceIconPushed[playerIndex], ButtonDefaultIcon, 0, true)
call BlzFrameSetAlpha(playerFaceButton[playerIndex], 255)
set HasPicked[playerIndex]=false
//print("Pre HeroSelector.Category")
set buttonIndex=1
loop
exitwhen buttonIndex > HeroSelector_CategoryButtonCount
set categoryButtonIndex=playerIndex * 1000 + buttonIndex
call BlzFrameSetTexture(playerCategoryIcon[categoryButtonIndex], HeroSelector_CategoryTexture[buttonIndex], 0, true)
call BlzFrameSetVisible(playerCategoryButton[categoryButtonIndex], false)
set buttonIndex=buttonIndex + 1
endloop
endif
set playerIndex=playerIndex + 1
endloop
endfunction
private function init_function takes nothing returns nothing
set ButtonTrigger = CreateTrigger()
call TriggerAddAction(ButtonTrigger, function PlayerFaceClickTriggerAction)
endfunction
endlibrary
library HeroInfo initializer init_function requires Ascii
// 1.5
//Plugin for by Tasyen
//This Creates a TextDisplay which displays the name and the Extended tooltip of selected units
globals
private framehandle TextDisplay
private string DescHeroNamePrefix = "|cffffcc00" //added before the Units Name
private string DescHeroNameSufix = "|r" //added after the units Name
private real TextAreaSizeX = 0.2
private real TextAreaSizeY = 0.2
private real TextAreaOffsetX = 0.0
private real TextAreaOffsetY = 0.0
private framepointtype TextAreaPoint = FRAMEPOINT_TOPLEFT //pos the Tooltip with which Point
private framepointtype TextAreaRelativePoint = FRAMEPOINT_TOPRIGHT //pos the Tooltip to which Point of the Relative
private boolean TextAreaRelativeGame = false //(false) relativ to box, (true) relativ to GameUI
private integer MaxButtonCount = 7
private integer ButtonPerRow = 7
private boolean DetectUnitSkills = true // (true) creates a dummy (for neutral Passive) when selecting an option to find any skill this unitCode has on default and displays them in the preview
private real ButtonSizeX = 0.03
private real ButtonSizeY = 0.03
private real ToolTipSize = 0.2 // how big is one line in the tooltip
private boolean ToolTipFixedPos = true // (true) All tooltip's starts over the first Buttons
private framehandle array Buttons
private framehandle array Icon
private framehandle array IconOff
private framehandle array IconPushed
private framehandle array Tooltip
private framehandle array TooltipBox
private integer ButtonCurrentIndex = 0
endglobals
function HeroInfoInitHeroData takes nothing returns nothing
// get skill list from object editor: hold shift then open the hero/unit skill field now copy paste the content
call SaveStr(HeroSelector_Hash, 0, 'Hpal' , "AHhb,AHds,AHre,AHad")
call SaveStr(HeroSelector_Hash, 0, 'Hmkg' , "AHtc,AHtb,AHbh,AHav")
call SaveStr(HeroSelector_Hash, 0, 'Hamg' , "AHbz,AHab,AHwe,AHmt")
call SaveStr(HeroSelector_Hash, 0, 'Hblm' , "AHfs,AHbn,AHdr,AHpx")
call SaveStr(HeroSelector_Hash, 0, 'Obla' , "AOwk,AOcr,AOmi,AOww")
call SaveStr(HeroSelector_Hash, 0, 'Ofar' , "AOfs,AOsf,AOcl,AOeq")
call SaveStr(HeroSelector_Hash, 0, 'Otch' , "AOsh,AOae,AOre,AOws")
call SaveStr(HeroSelector_Hash, 0, 'Oshd' , "AOhw,AOhx,AOsw,AOvd")
call SaveStr(HeroSelector_Hash, 0, 'Udea' , "AUdc,AUdp,AUau,AUan")
call SaveStr(HeroSelector_Hash, 0, 'Ulic' , "AUfn,AUfu,AUdr,AUdd")
call SaveStr(HeroSelector_Hash, 0, 'Udre' , "AUav,AUsl,AUcs,AUin")
call SaveStr(HeroSelector_Hash, 0, 'Ucrl' , "AUim,AUts,AUcb,AUls")
call SaveStr(HeroSelector_Hash, 0, 'Ekee' , "AEer,AEfn,AEah,AEtq")
call SaveStr(HeroSelector_Hash, 0, 'Emoo' , "AHfa,AEst,AEar,AEsf")
call SaveStr(HeroSelector_Hash, 0, 'Edem' , "AEmb,AEim,AEev,AEme")
call SaveStr(HeroSelector_Hash, 0, 'Ewar' , "AEbl,AEfk,AEsh,AEsv")
call SaveStr(HeroSelector_Hash, 0, 'Nbrn' , "ANsi,ANba,ANdr,ANch")
call SaveStr(HeroSelector_Hash, 0, 'Nbst' , "ANsg,ANsq,ANsw,ANst")
call SaveStr(HeroSelector_Hash, 0, 'Nngs' , "ANfl,ANfa,ANms,ANto")
call SaveStr(HeroSelector_Hash, 0, 'Npbm' , "ANbf,ANdh,ANdb,ANef")
call SaveStr(HeroSelector_Hash, 0, 'Nalc' , "ANhs,ANab,ANcr,ANtm")
call SaveStr(HeroSelector_Hash, 0, 'Ntin' , "ANsy,ANcs,ANeg,ANrg")
call SaveStr(HeroSelector_Hash, 0, 'Nfir' , "ANia,ANso,ANlm,ANvc")
call SaveStr(HeroSelector_Hash, 0, 'Nplh' , "ANrf,ANht,ANca,ANdo")
endfunction
function HeroInfoInit takes nothing returns nothing
local integer col = 0
local integer index = 0
set TextDisplay = BlzCreateFrame("HeroSelectorTextArea", HeroSelectorBox, 0, 0)
call BlzFrameSetSize(TextDisplay , TextAreaSizeX, TextAreaSizeY)
if not TextAreaRelativeGame then
call BlzFrameSetPoint(TextDisplay, TextAreaPoint, HeroSelectorBox, TextAreaRelativePoint, TextAreaOffsetX, TextAreaOffsetY)
else
call BlzFrameSetPoint(TextDisplay, TextAreaPoint, BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), TextAreaRelativePoint, TextAreaOffsetX, TextAreaOffsetY)
endif
loop
set index = index + 1
exitwhen index > MaxButtonCount
set Buttons[index] = BlzCreateFrame("HeroSelectorButton", TextDisplay, 0, 0)
set Icon[index] = BlzGetFrameByName("HeroSelectorButtonIcon", 0)
set IconOff[index] = BlzGetFrameByName("HeroSelectorButtonIconDisabled", 0)
set IconPushed[index] = BlzGetFrameByName("HeroSelectorButtonIconPushed", 0)
set TooltipBox[index] = BlzCreateFrame("HeroSelectorTextBox", Buttons[index], 0, 0)
set Tooltip[index] = BlzCreateFrame("HeroSelectorText", TooltipBox[index], 0, 0)
call BlzFrameSetSize(Buttons[index], ButtonSizeX, ButtonSizeY)
if ToolTipFixedPos then
call BlzFrameSetPoint(Tooltip[index], FRAMEPOINT_BOTTOMLEFT, Buttons[1], FRAMEPOINT_TOPLEFT, 0, 0.007)
else
call BlzFrameSetPoint(Tooltip[index], FRAMEPOINT_BOTTOMLEFT, Buttons[index], FRAMEPOINT_TOPLEFT, 0, 0.007)
endif
call BlzFrameSetPoint(TooltipBox[index], FRAMEPOINT_BOTTOMLEFT, Tooltip[index], FRAMEPOINT_BOTTOMLEFT, -0.007, -0.007)
call BlzFrameSetPoint(TooltipBox[index], FRAMEPOINT_TOPRIGHT, Tooltip[index], FRAMEPOINT_TOPRIGHT, 0.007, 0.007)
call BlzFrameSetTooltip(Buttons[index], TooltipBox[index])
call BlzFrameSetSize(Tooltip[index], ToolTipSize, 0)
if index > 1 then
set col = col + 1
if col >= ButtonPerRow then
set col = 0
call BlzFrameSetPoint(Buttons[index], FRAMEPOINT_TOPLEFT, Buttons[index - ButtonPerRow], FRAMEPOINT_BOTTOMLEFT, 0.00, -0.004)
else
call BlzFrameSetPoint(Buttons[index], FRAMEPOINT_TOPLEFT, Buttons[index - 1], FRAMEPOINT_TOPRIGHT, 0.004, 0)
endif
else
call BlzFrameSetPoint(Buttons[index], FRAMEPOINT_TOPLEFT, TextDisplay, FRAMEPOINT_BOTTOMLEFT, 0.002, 0)
endif
call BlzFrameSetEnable(Buttons[index], false)
call BlzFrameSetVisible(Buttons[index], false)
endloop
endfunction
public function UpdateSkillPreivew takes string icon, string name, string text returns nothing
set ButtonCurrentIndex = ButtonCurrentIndex + 1
if ButtonCurrentIndex > MaxButtonCount then
return
endif
call BlzFrameSetVisible(Buttons[ButtonCurrentIndex], true)
call BlzFrameSetTexture(Icon[ButtonCurrentIndex], icon, 0, false)
call BlzFrameSetTexture(IconPushed[ButtonCurrentIndex], icon, 0, false)
//BlzFrameSetTexture(IconOff[ButtonCurrentIndex], HeroSelectorGetDisabledIcon(icon), 0, false)
call BlzFrameSetTexture(IconOff[ButtonCurrentIndex], icon, 0, false)
// x Size and no y Size makes it multiline text when the text does not fit into 1 line
if text != null and name != null then
call BlzFrameSetSize(Tooltip[ButtonCurrentIndex], ToolTipSize, 0)
call BlzFrameSetText(Tooltip[ButtonCurrentIndex], name + "\n" + text)
else
// only the name, set frameSize to 0/0 to match the displayed text
call BlzFrameSetSize(Tooltip[ButtonCurrentIndex], 0, 0)
call BlzFrameSetText(Tooltip[ButtonCurrentIndex], name)
endif
endfunction
public function ValidTooltip takes string text returns boolean
if text == "Tool tip missing!" or text == "" or text == " " then
return false
endif
return true
endfunction
public function abiFilter takes ability abi returns boolean
// no skills markes as item skills
if BlzGetAbilityBooleanField(abi, ABILITY_BF_ITEM_ABILITY) then
return false
endif
if not ValidTooltip(BlzGetAbilityStringLevelField(abi, ABILITY_SLF_TOOLTIP_NORMAL, 0)) then
return false
endif
return true
endfunction
function HeroInfoButtonSelected takes player p, integer unitCode returns nothing
local unit dummyUnit
local integer startIndex
local integer skillCode
local string heroData
local ability abi
local integer abiIndex
if DetectUnitSkills then
set dummyUnit = CreateUnit(Player(GetPlayerNeutralPassive()), unitCode, 0, 0, 0)
endif
// Reset the global Buttons Index
set ButtonCurrentIndex = 0
if GetLocalPlayer() == p then
call BlzFrameSetText(TextDisplay, DescHeroNamePrefix + GetObjectName(unitCode) + DescHeroNameSufix)
call BlzFrameAddText(TextDisplay, BlzGetAbilityExtendedTooltip(unitCode,0))
if HaveSavedString(HeroSelector_Hash, 0, unitCode) then
set heroData = LoadStr(HeroSelector_Hash, 0, unitCode)
set startIndex = 0
loop
exitwhen startIndex + 3 >= StringLength(heroData)
set skillCode = S2A(SubString(heroData, startIndex, startIndex + 4))
set startIndex = startIndex + 5
// for hero skills show the learn text, "Tool tip missing!" is the default string
if ValidTooltip(BlzGetAbilityResearchExtendedTooltip(skillCode, 0)) then
call UpdateSkillPreivew(BlzGetAbilityIcon(skillCode), GetObjectName(skillCode), BlzGetAbilityResearchExtendedTooltip(skillCode, 0) )
elseif ValidTooltip(BlzGetAbilityExtendedTooltip(skillCode, 0)) then
// skills without a research text show the first Level
call UpdateSkillPreivew(BlzGetAbilityIcon(skillCode), GetObjectName(skillCode), BlzGetAbilityExtendedTooltip(skillCode, 0))
else
call UpdateSkillPreivew(BlzGetAbilityIcon(skillCode), GetObjectName(skillCode), null)
endif
endloop
endif
if DetectUnitSkills then
set abiIndex = 0
loop
set abi = BlzGetUnitAbilityByIndex(dummyUnit, abiIndex)
if abi != null then
if abiFilter(abi) then
if ValidTooltip(BlzGetAbilityStringLevelField(abi, ABILITY_SLF_TOOLTIP_LEARN_EXTENDED, 0)) then
call UpdateSkillPreivew(BlzGetAbilityStringLevelField(abi, ABILITY_SLF_ICON_NORMAL, 0), BlzGetAbilityStringLevelField(abi, ABILITY_SLF_TOOLTIP_NORMAL, 0), BlzGetAbilityStringLevelField(abi, ABILITY_SLF_TOOLTIP_LEARN_EXTENDED, 0))
else
call UpdateSkillPreivew(BlzGetAbilityStringLevelField(abi, ABILITY_SLF_ICON_NORMAL, 0), BlzGetAbilityStringLevelField(abi, ABILITY_SLF_TOOLTIP_NORMAL, 0), BlzGetAbilityStringLevelField(abi, ABILITY_SLF_TOOLTIP_NORMAL_EXTENDED, 0))
endif
endif
set abiIndex = abiIndex + 1
else
exitwhen true
endif
endloop
endif
loop
set ButtonCurrentIndex = ButtonCurrentIndex + 1
exitwhen ButtonCurrentIndex > MaxButtonCount
call BlzFrameSetVisible(Buttons[ButtonCurrentIndex], false)
endloop
endif
if DetectUnitSkills then
call RemoveUnit(dummyUnit)
set dummyUnit = null
endif
set abi = null
set heroData = null
endfunction
private function init_function takes nothing returns nothing
call HeroInfoInitHeroData()
endfunction
endlibrary
library HeroSelector initializer init_function requires optional FrameLoader, optional Ascii
//HeroSelector V1.8
//API
//=====
//HeroSelectorForcePick()
//HeroSelectorForcePickPlayer(player p)
//HeroSelectorForcePickRace(race r)
//HeroSelectorForcePickTeam(integer teamNr)
//HeroSelectorForceRandom()
//HeroSelectorForceRandomRace(race r)
//HeroSelectorForceRandomTeam(integer teamNr)
//HeroSelectorDoPick(player p)
//HeroSelectorDoRandom(player p)
//HeroSelectorShow(boolean flag)
//HeroSelectorShowForce(boolean flag, force f)
//HeroSelectorShowRace(boolean flag, race r)
//HeroSelectorShowPlayer(boolean flag, player p)
//HeroSelectorShowTeam(boolean flag, integer teamNr)
//HeroSelectorEnableBan(boolean flag)
//HeroSelectorEnableBanRace
//HeroSelectorEnableBanTeam
//HeroSelectorEnableBanPlayer
//HeroSelectorEnableBanForce
//HeroSelectorEnablePick(boolean flag)
//HeroSelectorEnablePickForce
//HeroSelectorEnablePickPlayer
//HeroSelectorEnablePickTeam
//HeroSelectorEnablePickRace
//HeroSelectorRollOption(player p, boolean includeRandomOnly, integer exculdedIndex, integer category) returns integer
//HeroSelectorCounterChangeUnitCode(integer unitCode, integer add, player p)
//HeroSelectorEnableButtonIndex(integer unitCode, integer buttonIndex)
//HeroSelectorDisableButtonIndex(integer buttonIndex, integer teamNr)
//HeroSelectorButtonRequirementDone(integer unitCode, player p) returns boolean
//HeroSelectorDeselectButton(integer buttonIndex)
//HeroSelectorAddUnit(integer unitCode, boolean onlyRandom)
//HeroSelectorAddUnitCategory(integer unitCode, integer category)
//HeroSelectorSetUnitCategory(integer unitCode, integer category)
//HeroSelectorSetUnitReqPlayer(integer unitCode, player p)
//HeroSelectorSetUnitReqPlayerState(integer unitCode, playerstate ps)
//HeroSelectorSetUnitReqRace(integer unitCode, race r)
//HeroSelectorSetUnitReqForce(integer unitCode, force f)
//HeroSelectorSetUnitReqTeam(integer unitCode, integer teamNr)
//HeroSelectorSetUnitReqTechLevel(integer unitCode, integer techCode, integer techLevel)
//HeroSelectorSetFrameText(framehandle frame, string text)
//HeroSelectorSetFrameTextPlayer
//HeroSelectorSetFrameTextForce
//HeroSelectorSetFrameTextTeam
//HeroSelectorSetFrameTextRace
//HeroSelectorSetTitleText(string text)
//HeroSelectorSetTitleTextRace
//HeroSelectorSetTitleTextPlayer
//HeroSelectorSetTitleTextForce
//HeroSelectorSetTitleTextTeam
//HeroSelectorSetBanButtonText
//HeroSelectorSetBanButtonTextPlayer
//HeroSelectorSetBanButtonTextRace
//HeroSelectorSetBanButtonTextForce
//HeroSelectorSetBanButtonTextTeam
//HeroSelectorSetRandomButtonText
//HeroSelectorSetRandomButtonTextPlayer
//HeroSelectorSetRandomButtonTextForce
//HeroSelectorSetRandomButtonTextTeam
//HeroSelectorSetRandomButtonTextRace
//HeroSelectorSetAcceptButtonText
//HeroSelectorSetAcceptButtonTextPlayer
//HeroSelectorSetAcceptButtonTextForce
//HeroSelectorSetAcceptButtonTextTeam
//HeroSelectorSetAcceptButtonTextRace
//HeroSelectorAddCategory(string icon, string text) //should only be used before the category Buttons are created
//HeroSelectorGetDisabledIcon(string iconPath)
//HeroSelectorUpdate()
//=====
globals
//Setup
private string TocPath = "war3mapImported\\HeroSelector.toc" //ex/import also "HeroSelector.fdf"
//Box
private string BoxFrameName = "HeroSelectorRaceBox" //this is the background box being created
private real BoxPosX = 0.3
private real BoxPosY = 0.4
private framepointtype BoxPosPoint = FRAMEPOINT_CENTER
private boolean AutoShow = true //(true) shows the box and the Selection at 0.0 for all players
//Unique Picks
public integer UnitCount = 2 //each hero is in total allowed to be picked this amount of times (includes random, repicking allows a hero again).
public integer UnitCountPerTeam = 1 //Each Team is allowed to pick this amount of each unitType
private string ToManyTooltip = "OUTOFSTOCKTOOLTIP"
// PickAbleHeroes is a Way to define pickable Units without touching initHeroes
// pickable options expects one string like "Hamg,Hmkg,Hpal,Hblm". It can contain 0 to have empty slots "Hamg,0,Hpal,0,Hblm"
// all melee heroes "Hamg,Hmkg,Hpal,Hblm,Obla,Ofar,Otch,Oshd,Udea,Ulic,Udre,Ucrl,Edem,Ekee,Emoo,Ewar,Nngs,Nbrn,Npbm,Nplh,Nbst,Nfir,Ntin,Nalc"
// works only when you have Libary Ascii in your map
// First PickAbleHeroes then InitHeroes
public string PickAbleHeroes = ""
//Ban
private boolean DelayBanUntilPick = false //(true) baning will not be applied instantly, instead it is applied when HeroSelectorEnablePick is called the next time.
//Category
private boolean CategoryAffectRandom = true //(false) random will not care about selected category
private boolean CategoryMultiSelect = false //(false) deselect other category when selecting one, (true) can selected multiple categories and all heroes having any of them are not filtered.
private real CategorySize = 0.02 //the size of the Category Button
private real CategorySpaceX = 0.0008 //space between 2 category Buttons, it is meant to need only one line of Categoryy Buttons.
private integer CategoryFilteredAlpha = 45 // Alpha value of Heroes being filtered by unselected categories
private boolean CategoryAutoDetect = true // try to set category of added options automatic
private boolean CategoryAutoDetectHero = false // Will create and remove added Heroes to read and setup the Category for the primary Attribute Str(4) Agi(8) Int(16)
//Icon path, tooltip Text (tries to localize)
//Indicator
private framehandle IndicatorSelected
private framehandle IndicatorSelectedParent
private string IndicatorPathPick = "UI\\Feedback\\Autocast\\UI-ModalButtonOn.mdl" //this model is used by the indicator during picking
private string IndicatorPathBan = "war3mapImported\\HeroSelectorBan.mdl" //this model is used by the indicator during baning
//Grid
private real SpaceBetweenX = 0.008 //space between 2 buttons in one row
private real SpaceBetweenY = 0.008 //space between 2 rows
private integer ButtonColCount = 4 //amount of buttons in one row
private integer ButtonRowCount = 4 //amount of rows
private boolean ChainedButtons = true //(true) connect to the previous button/ or row, (false) have a offset to the box topLeft in this moving a button has no effect on other buttons.
//Button
private real ButtonSize = 0.036 //size of each button
private boolean ButtonBlendAll = false //(true) when a hero icon uses transparenzy
private string EmptyButtonPath = "UI\\Widgets\\EscMenu\\Human\\blank-background.blp"
private boolean HideEmptyButtons = true
//Ban Button
private string BanButtonTextPrefix = "|cffcf2084" //Prefix Text for the Ban Button
private string BanButtonText = "CHAT_ACTION_BAN" //tries to get a Localized String
private real BanButtonSizeX = 0.085
private real BanButtonSizeY = 0.03
private string BanTooltip = "DISALLOWED"
private boolean BanIgnoreRequirment = true // (true) Ban is not restricted by Requirments
//BanDone Button
private string BanDoneButtonTextPrefix = "|cffcf2084" //Prefix Text for the Ban Button
private string BanDoneButtonText = "QUESTACCEPT" //tries to get a Localized String
private real BanDoneButtonSizeX = 0.085
private real BanDoneButtonSizeY = 0.03
public boolean BanDoneButtonIsShown = false //show this button in the Ban Phase
//Accept Button
private string AcceptButtonTextPrefix = ""
private string AcceptButtonText = "ACCEPT"
private real AcceptButtonSizeX = 0.085
private real AcceptButtonSizeY = 0.03
public boolean AcceptButtonIsShown = true
//Random Button
private string RandomButtonTextPrefix = ""
private string RandomButtonText = "RANDOM" //tries Localizing
private real RandomButtonSizeX = 0.085
private real RandomButtonSizeY = 0.03
private boolean RandomButtonIsShown = true
private boolean RandomButtonPick = false //(true) pressing the random button will pick the option. (false) pressing the random button will select a button, random only heroes can not be selected, but that does not matter. This weak random and randomonly should not be combined.
//Repick Button
private string RepickButtonTextPrefix = ""
private string RepickButtonText = "REPICK" //tries Localizing
private real RepickButtonSizeX = 0.085
private real RepickButtonSizeY = 0.03
public boolean RepickButtonIsShown = true //show this button in the Pick Phase
//ShowButton
private string ShowButtonTextPrefix = ""
public string ShowButtonText = "PICK-HERO" //tries Localizing
public real ShowButtonSizeX = 0.085
public real ShowButtonSizeY = 0.03
public boolean ShowButtonIsShown = false //show this button
public real ShowButtonX = 0.42
public real ShowButtonY = 0.58
public framepointtype ShowButtonPoint = FRAMEPOINT_TOPLEFT
//Tooltip
private string TooltipPrefix = "|cffffcc00"
private real TooltipOffsetX = 0
private real TooltipOffsetY = 0
private framepointtype TooltipPoint = FRAMEPOINT_BOTTOM //pos the Tooltip with which Point
private framepointtype TooltipRelativePoint = FRAMEPOINT_TOP //pos the Tooltip to which Point of the Relative
private boolean TooltipRelativIsBox = false //(true) use the box as anchor, (false) use the button as anchor
private string TooltipRequires = "QUESTCOMPONENTS"
//System variables, Do not touch
public integer HeroButtonCount = ButtonRowCount*ButtonColCount
public unit array PickedUnit
public trigger CategoryClickTrigger = CreateTrigger()
public trigger AcceptButtonTrigger = CreateTrigger()
public trigger BanButtonTrigger = CreateTrigger()
public trigger RandomButtonTrigger = CreateTrigger()
public trigger RepickButtonTrigger = CreateTrigger()
public trigger BanDoneButtonTrigger = CreateTrigger()
public trigger ShowButtonTrigger = CreateTrigger()
public framehandle BanButton
public framehandle AcceptButton
public framehandle RandomButton
public framehandle BanDoneButton
public framehandle RepickButton
public framehandle ShowButton
private player array DelayBanPlayer
private integer array DelayBanUnitCode
private integer DelayBanCount = 0
public framehandle array CategoryButton
public framehandle array CategoryIconFrame
public framehandle array CategoryIconPushedFrame
public framehandle array CategoryTooltipFrame
public framehandle array CategoryTooltipFrameBox
public string array CategoryText
public string array CategoryTexture
public string array CategoryTextureDisabled
private integer array CategoryButtonValue
public integer CategoryButtonCount = 0
private integer array UsedTeamNr
private integer UsedTeamNrCount = 0
private integer ButtonHeroCount = 0
private integer array ButtonHeroUnitCode
private integer array HeroTotalCount
public integer array HeroCategory
private integer array HeroRegType
private player array HeroRegPlayer
private playerstate array HeroRegPlayerState
private force array HeroRegForce
private integer array HeroRegNumber
private integer array HeroRegNumber2
private race array HeroRegRace
private integer HeroCount = 0
private integer array HeroUnitCode
private integer array HeroButtonIndex
public hashtable Hash = InitHashtable()
framehandle HeroSelectorBox
private framehandle HeroSelectorBoxSeperator
private framehandle HeroSelectorBoxTitle
private integer array HeroButtonUnitCode
private integer HeroButtonUnitCodeCount = 0
private framehandle array HeroButtonIcon
private framehandle array HeroButtonIconPushed
private framehandle array HeroButtonIconDisabled
private framehandle array HeroButtonTooltip
private framehandle array HeroButtonTooltipBox
private framehandle array HeroButtonFrame
private trigger HeroButtonClickTrigger = CreateTrigger()
private integer array PlayerSelectedButtonIndex
private integer array PlayerSelectedCategory
private integer array PlayerLastSelectedCategoryIndex
private integer LastAction = 0
endglobals
public function ShowButtonParent takes nothing returns framehandle
return BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
endfunction
private function AutoDetectCategory takes integer unitCode returns integer
local integer value = 0
local unit u
local integer primaryAttribute
if CategoryAutoDetect then
if IsUnitIdType(unitCode, UNIT_TYPE_MELEE_ATTACKER) then
set value = 1
elseif IsUnitIdType(unitCode, UNIT_TYPE_RANGED_ATTACKER) then
set value = 2
endif
if CategoryAutoDetectHero and IsUnitIdType(unitCode, UNIT_TYPE_HERO) then
set u = CreateUnit(Player(bj_PLAYER_NEUTRAL_EXTRA), unitCode, 0, 0, 270)
set primaryAttribute = BlzGetUnitIntegerField(u, UNIT_IF_PRIMARY_ATTRIBUTE)
call RemoveUnit(u)
set u = null
if ConvertHeroAttribute(primaryAttribute) == HERO_ATTRIBUTE_STR then
set value = value + 4
elseif ConvertHeroAttribute(primaryAttribute) == HERO_ATTRIBUTE_AGI then
set value = value + 8
elseif ConvertHeroAttribute(primaryAttribute) == HERO_ATTRIBUTE_INT then
set value = value + 16
endif
endif
endif
return value
endfunction
private function GetBorderSize takes nothing returns real
if GetPlayerRace(GetLocalPlayer()) == RACE_HUMAN then
return 0.029
elseif GetPlayerRace(GetLocalPlayer()) == RACE_ORC then
return 0.029
elseif GetPlayerRace(GetLocalPlayer()) == RACE_UNDEAD then
return 0.035
elseif GetPlayerRace(GetLocalPlayer()) == RACE_NIGHTELF then
return 0.035
elseif GetPlayerRace(GetLocalPlayer()) == RACE_DEMON then
return 0.024
else
return 0.0
endif
endfunction
//=====
//code start
//=====
function HeroSelectorGetDisabledIcon takes string icon returns string
//ReplaceableTextures\CommandButtons\BTNHeroPaladin.tga -> ReplaceableTextures\CommandButtonsDisabled\DISBTNHeroPaladin.tga
if SubString(icon, 34, 35) != "\\" then
return icon
endif //this string has not enough chars return it
//string.len(icon) < 34 then return icon end //this string has not enough chars return it
return SubString(icon, 0, 34) + "Disabled\\DIS" + SubString(icon, 35, StringLength(icon))
endfunction
function HeroSelectorAddCategory takes string icon, string text returns nothing
//adds an data category construct
set CategoryButtonCount = CategoryButtonCount + 1
set CategoryText[CategoryButtonCount] = text
set CategoryTexture[CategoryButtonCount] = icon
set CategoryTextureDisabled[CategoryButtonCount] = HeroSelectorGetDisabledIcon(icon)
if CategoryButtonCount > 1 then
set CategoryButtonValue[CategoryButtonCount] = CategoryButtonValue[CategoryButtonCount - 1]*2
else
set CategoryButtonValue[CategoryButtonCount] = 1
endif
endfunction
function HeroSelectorSetFrameText takes framehandle frame, string text returns nothing
call BlzFrameSetText(frame, text)
endfunction
function HeroSelectorSetFrameTextPlayer takes framehandle frame, string text, player p returns nothing
if GetLocalPlayer() == p then
call BlzFrameSetText(frame, text)
endif
endfunction
function HeroSelectorSetFrameTextTeam takes framehandle frame, string text, integer teamNr returns nothing
if GetPlayerTeam(GetLocalPlayer()) == teamNr then
call BlzFrameSetText(frame, text)
endif
endfunction
function HeroSelectorSetFrameTextRace takes framehandle frame, string text, race r returns nothing
if GetPlayerRace(GetLocalPlayer()) == r then
call BlzFrameSetText(frame, text)
endif
endfunction
function HeroSelectorSetFrameTextForce takes framehandle frame, string text, force f returns nothing
if BlzForceHasPlayer(f, GetLocalPlayer()) then
call BlzFrameSetText(frame, text)
endif
endfunction
function HeroSelectorSetTitleText takes string text returns nothing
call HeroSelectorSetFrameText(HeroSelectorBoxTitle, text)
endfunction
function HeroSelectorSetTitleTextPlayer takes string text, player who returns nothing
call HeroSelectorSetFrameTextPlayer(HeroSelectorBoxTitle, text, who)
endfunction
function HeroSelectorSetTitleTextForce takes string text, force who returns nothing
call HeroSelectorSetFrameTextForce(HeroSelectorBoxTitle, text, who)
endfunction
function HeroSelectorSetTitleTextTeam takes string text, integer who returns nothing
call HeroSelectorSetFrameTextTeam(HeroSelectorBoxTitle, text, who)
endfunction
function HeroSelectorSetTitleTextRace takes string text, race who returns nothing
call HeroSelectorSetFrameTextRace(HeroSelectorBoxTitle, text, who)
endfunction
function HeroSelectorSetBanButtonText takes string text returns nothing
call HeroSelectorSetFrameText(BanButton, text)
endfunction
function HeroSelectorSetBanButtonTextPlayer takes string text, player who returns nothing
call HeroSelectorSetFrameTextPlayer(BanButton, text, who)
endfunction
function HeroSelectorSetBanButtonTextForce takes string text, force who returns nothing
call HeroSelectorSetFrameTextForce(BanButton, text, who)
endfunction
function HeroSelectorSetBanButtonTextTeam takes string text, integer who returns nothing
call HeroSelectorSetFrameTextTeam(BanButton, text, who)
endfunction
function HeroSelectorSetBanButtonTextRace takes string text, race who returns nothing
call HeroSelectorSetFrameTextRace(BanButton, text, who)
endfunction
function HeroSelectorSetRandomButtonText takes string text returns nothing
call HeroSelectorSetFrameText(RandomButton, text)
endfunction
function HeroSelectorSetRandomButtonTextPlayer takes string text, player who returns nothing
call HeroSelectorSetFrameTextPlayer(RandomButton, text, who)
endfunction
function HeroSelectorSetRandomButtonTextForce takes string text, force who returns nothing
call HeroSelectorSetFrameTextForce(RandomButton, text, who)
endfunction
function HeroSelectorSetRandomButtonTextTeam takes string text, integer who returns nothing
call HeroSelectorSetFrameTextTeam(RandomButton, text, who)
endfunction
function HeroSelectorSetRandomButtonTextRace takes string text, race who returns nothing
call HeroSelectorSetFrameTextRace(RandomButton, text, who)
endfunction
function HeroSelectorSetAcceptButtonText takes string text returns nothing
call HeroSelectorSetFrameText(AcceptButton, text)
endfunction
function HeroSelectorSetAcceptButtonTextPlayer takes string text, player who returns nothing
call HeroSelectorSetFrameTextPlayer(AcceptButton, text, who)
endfunction
function HeroSelectorSetAcceptButtonTextForce takes string text, force who returns nothing
call HeroSelectorSetFrameTextForce(AcceptButton, text, who)
endfunction
function HeroSelectorSetAcceptButtonTextTeam takes string text, integer who returns nothing
call HeroSelectorSetFrameTextTeam(AcceptButton, text, who)
endfunction
function HeroSelectorSetAcceptButtonTextRace takes string text, race who returns nothing
call HeroSelectorSetFrameTextRace(AcceptButton, text, who)
endfunction
function HeroSelectorSetUnitCategory takes integer unitCode, integer category returns nothing
local integer index = LoadInteger(Hash, unitCode, 0)
set HeroCategory[index] = category
endfunction
function HeroSelectorAddUnitCategory takes integer unitCode, integer category returns nothing
local integer index = LoadInteger(Hash, unitCode, 0)
set HeroCategory[index] = BlzBitOr(category, HeroCategory[index])
endfunction
function HeroSelectorDeselectButton takes integer buttonIndex returns nothing
local integer playerIndex = 0
if buttonIndex > 0 then
if PlayerSelectedButtonIndex[GetPlayerId(GetLocalPlayer())] == buttonIndex then
call BlzFrameSetVisible(IndicatorSelected, false)
endif
loop
exitwhen playerIndex == GetBJMaxPlayers()
if PlayerSelectedButtonIndex[playerIndex] == buttonIndex then
set PlayerSelectedButtonIndex[playerIndex] = 0
endif
set playerIndex = playerIndex + 1
endloop
else
loop
exitwhen playerIndex == GetBJMaxPlayers()
set PlayerSelectedButtonIndex[playerIndex] = 0
set playerIndex = playerIndex + 1
endloop
call BlzFrameSetVisible(IndicatorSelected, false)
endif
endfunction
function HeroSelectorSetUnitReqRace takes integer unitCode, race r returns nothing
local integer index = LoadInteger(Hash, unitCode, 0)
set HeroRegType[index] = 1
set HeroRegRace[index] = r
endfunction
function HeroSelectorSetUnitReqForce takes integer unitCode, force f returns nothing
local integer index = LoadInteger(Hash, unitCode, 0)
set HeroRegType[index] = 4
set HeroRegForce[index] = f
endfunction
function HeroSelectorSetUnitReqPlayer takes integer unitCode, player p returns nothing
local integer index = LoadInteger(Hash, unitCode, 0)
set HeroRegType[index] = 3
set HeroRegPlayer[index] = p
endfunction
function HeroSelectorSetUnitReqTeam takes integer unitCode, integer teamNr returns nothing
local integer index = LoadInteger(Hash, unitCode, 0)
set HeroRegType[index] = 2
set HeroRegNumber[index] = teamNr
endfunction
function HeroSelectorSetUnitReqTechLevel takes integer unitCode, integer techCode, integer techLevel returns nothing
local integer index = LoadInteger(Hash, unitCode, 0)
set HeroRegType[index] = 5
set HeroRegNumber[index] = techCode
set HeroRegNumber2[index] = techLevel
endfunction
function HeroSelectorSetUnitReqPlayerState takes integer unitCode, playerstate ps returns nothing
local integer index = LoadInteger(Hash, unitCode, 0)
set HeroRegType[index] = 6
set HeroRegPlayerState[index] = ps
endfunction
function HeroSelectorGetUnitReqString takes integer unitCode returns string
local integer index = LoadInteger(Hash, unitCode, 0)
if HeroRegType[index] == 0 then //no requirement
elseif HeroRegType[index] == 1 then
if HeroRegRace[index] == RACE_HUMAN then
return GetLocalizedString("HUMAN")
elseif HeroRegRace[index] == RACE_ORC then
return GetLocalizedString("ORC")
elseif HeroRegRace[index] == RACE_UNDEAD then
return GetLocalizedString("UNDEAD")
elseif HeroRegRace[index] == RACE_NIGHTELF then
return GetLocalizedString("NIGHT_ELF")
endif
elseif HeroRegType[index] == 2 then
return GetLocalizedString("TEAM") + I2S(HeroRegNumber[index])
elseif HeroRegType[index] == 3 then
return GetPlayerName(HeroRegPlayer[index])
elseif HeroRegType[index] == 4 then
return "Force"
elseif HeroRegType[index] == 5 then
if HeroRegNumber2[index] > 1 then
return GetObjectName(HeroRegNumber[index]) +"("+I2S(HeroRegNumber2[index])+")"
else
return GetObjectName(HeroRegNumber[index])
endif
elseif HeroRegType[index] == 6 then
if HeroRegPlayerState[index] == PLAYER_STATE_RESOURCE_HERO_TOKENS then
return "HERO TOCKEN"
endif
endif
return ""
endfunction
function HeroSelectorButtonRequirementDone takes integer unitCode, player p returns boolean
//true when no requirement is set or the requirment call is successful
local integer index = LoadInteger(Hash, unitCode, 0)
if HeroRegType[index] == 0 then //no requirement
return true
elseif HeroRegType[index] == 1 and HeroRegRace[index] == GetPlayerRace(p) then
return true
elseif HeroRegType[index] == 2 and HeroRegNumber[index] == GetPlayerTeam(p) then
return true
elseif HeroRegType[index] == 3 and HeroRegPlayer[index] == p then
return true
elseif HeroRegType[index] == 4 and BlzForceHasPlayer(HeroRegForce[index], p) then
return true
elseif HeroRegType[index] == 5 and GetPlayerTechCount(p, HeroRegNumber[index], true) >= HeroRegNumber2[index] then
return true
elseif HeroRegType[index] == 6 and GetPlayerState(p, HeroRegPlayerState[index]) >= 1 then
return true
endif
return false
endfunction
function HeroSelectorDisableButtonIndex takes integer buttonIndex, integer teamNr returns nothing
local integer playerIndex = 0
if buttonIndex > 0 then
if teamNr == -1 or teamNr == GetPlayerTeam(GetLocalPlayer()) then
call BlzFrameSetEnable(HeroButtonFrame[buttonIndex], false)
endif
if PlayerSelectedButtonIndex[GetPlayerId(GetLocalPlayer())] == buttonIndex then
call BlzFrameSetVisible(IndicatorSelected, false)
endif
//deselect this Button from all players or the team
loop
exitwhen playerIndex == GetBJMaxPlayers()
if (teamNr == -1 or teamNr == GetPlayerTeam(Player(playerIndex))) and PlayerSelectedButtonIndex[playerIndex] == buttonIndex then
set PlayerSelectedButtonIndex[playerIndex] = 0
endif
set playerIndex = playerIndex + 1
endloop
endif
endfunction
function HeroSelectorEnableButtonIndex takes integer unitCode, integer buttonIndex returns nothing
if buttonIndex > 0 then
call BlzFrameSetEnable(HeroButtonFrame[buttonIndex], true and (BanIgnoreRequirment and BlzFrameIsVisible(BanButton) ) or HeroSelectorButtonRequirementDone(unitCode, GetLocalPlayer()))
endif
endfunction
function HeroSelectorUpdateTooltip takes integer unitCode returns nothing
local integer unitCodeIndex = LoadInteger(Hash, unitCode, 0)
local integer buttonIndex = HeroButtonIndex[unitCodeIndex]
local framehandle frame = HeroButtonTooltip[buttonIndex]
local integer teamKey = StringHash("TeamCount"+I2S(GetPlayerTeam(GetLocalPlayer())))
if HeroTotalCount[unitCodeIndex] > UnitCount then
call BlzFrameSetText(frame, TooltipPrefix + GetObjectName(unitCode) + "\n|r(" + GetLocalizedString(BanTooltip) + ")")
else
if HeroTotalCount[unitCodeIndex] == UnitCount or LoadInteger(Hash, unitCode, teamKey) >= UnitCountPerTeam then
call BlzFrameSetText(frame, TooltipPrefix + GetObjectName(unitCode) + "\n|r(" + GetLocalizedString(ToManyTooltip) + ")")
elseif not HeroSelectorButtonRequirementDone(unitCode, GetLocalPlayer()) then
call BlzFrameSetText(frame, TooltipPrefix + GetObjectName(unitCode) + "\n|r(" + GetLocalizedString(TooltipRequires) + ")\n" + HeroSelectorGetUnitReqString(unitCode))
else
call BlzFrameSetText(frame, TooltipPrefix + GetObjectName(unitCode))
endif
endif
endfunction
function HeroSelectorCounterChangeUnitCode takes integer unitCode, integer add, player p returns nothing
local integer unitCodeIndex = LoadInteger(Hash, unitCode, 0)
local integer buttonIndex = HeroButtonIndex[unitCodeIndex]
local integer teamNr = GetPlayerTeam(p)
local integer teamKey = StringHash("TeamCount"+I2S(teamNr))
set HeroTotalCount[unitCodeIndex] = HeroTotalCount[unitCodeIndex] + add
call SaveInteger(Hash, unitCode, teamKey, LoadInteger(Hash, unitCode, teamKey) + add)
if HeroTotalCount[unitCodeIndex] >= UnitCount then
//disable for all
call HeroSelectorDisableButtonIndex(buttonIndex, -1)
else
//enable for all
call HeroSelectorEnableButtonIndex(unitCode, buttonIndex)
if LoadInteger(Hash, unitCode, teamKey) >= UnitCountPerTeam then
//disable for this team
call HeroSelectorDisableButtonIndex(buttonIndex, teamNr)
endif
endif
call HeroSelectorUpdateTooltip(unitCode)
endfunction
function HeroSelectorRollOption takes player p, boolean includeRandomOnly, integer exculdedIndex, integer category returns integer
local integer teamNr = GetPlayerTeam(p)
local integer array options
local integer optionCount = 0
local integer teamKey = StringHash("TeamCount"+I2S(teamNr))
local boolean allowed
local integer index = 1
local integer unitCode
local integer unitCodeIndex
loop
exitwhen index > HeroCount
set unitCode = HeroUnitCode[index]
set unitCodeIndex = LoadInteger(Hash, unitCode, 0)
set allowed = true
//total limited reached?
if HeroTotalCount[unitCodeIndex] >= UnitCount then
set allowed = false
//print(GetObjectName(unitCode))
//print("rejected total limit")
endif
//team limited reached?
if allowed and LoadInteger(Hash, unitCode, teamKey) >= UnitCountPerTeam then
//print(GetObjectName(unitCode))
//print("rejected team limit")
set allowed = false
endif
//allow randomOnly?
if allowed and not includeRandomOnly and HeroButtonIndex[unitCodeIndex] == 0 then
//print(GetObjectName(unitCode))
//print("rejected random only")
set allowed = false
endif
//this index is excluded? This can make sure you get another button.
if allowed and HeroButtonIndex[unitCodeIndex] > 0 and HeroButtonIndex[unitCodeIndex] == exculdedIndex then
//print(GetObjectName(unitCode))
//print("rejected exclude")
set allowed = false
endif
//fullfills the requirement?
if allowed and not HeroSelectorButtonRequirementDone(unitCode, p) then
//print(GetObjectName(unitCode))
//print("rejected requirement")
set allowed = false
endif
//when having an given an category only allow options having that category atleast partly
if allowed and category > 0 and BlzBitAnd(category, HeroCategory[unitCodeIndex]) == 0 then
//print(GetObjectName(unitCode))
//print(" rejected category", category, HeroSelector.UnitData[unitCode].Category)
set allowed = false
endif
if allowed then
set optionCount = optionCount + 1
set options[optionCount] = unitCode
endif
set index = index + 1
endloop
//nothing is allwoed?
if optionCount == 0 then
return 0
else
return options[GetRandomInt(1, optionCount)]
endif
endfunction
function HeroSelectorEnablePickDelayBanAction takes nothing returns nothing
loop
exitwhen DelayBanCount <= 0
call HeroSelectorCounterChangeUnitCode(DelayBanUnitCode[DelayBanCount], UnitCount + 1, DelayBanPlayer[DelayBanCount])
set DelayBanCount = DelayBanCount - 1
endloop
endfunction
function HeroSelectorUpdate takes nothing returns nothing
local integer buttonIndex = 1
local integer unitCodeIndex
local integer teamNr
local integer teamIndex = 0
local integer teamKey
loop
exitwhen buttonIndex > HeroButtonCount
//have data for this button?
if HeroButtonUnitCode[buttonIndex] > 0 then
if HideEmptyButtons then
call BlzFrameSetVisible(HeroButtonFrame[buttonIndex], true)
endif
set unitCodeIndex = LoadInteger(Hash, HeroButtonUnitCode[buttonIndex],0)
if HeroTotalCount[unitCodeIndex] >= UnitCount then
//disable for all
call HeroSelectorDisableButtonIndex(buttonIndex, -1)
else
//enable for all
call HeroSelectorEnableButtonIndex(HeroButtonUnitCode[buttonIndex], buttonIndex)
set teamIndex = 0
loop
exitwhen teamIndex > UsedTeamNrCount
set teamNr = UsedTeamNr[teamIndex]
set teamKey = StringHash("TeamCount"+I2S(teamNr))
if LoadInteger(Hash, HeroButtonUnitCode[buttonIndex], teamKey) >= UnitCountPerTeam then
//disable for this team
call HeroSelectorDisableButtonIndex(buttonIndex, teamNr)
endif
set teamIndex = teamIndex + 1
endloop
endif
call BlzFrameSetTexture(HeroButtonIcon[buttonIndex], BlzGetAbilityIcon(HeroButtonUnitCode[buttonIndex]), 0, ButtonBlendAll)
call BlzFrameSetTexture(HeroButtonIconPushed[buttonIndex], BlzGetAbilityIcon(HeroButtonUnitCode[buttonIndex]), 0, ButtonBlendAll)
call BlzFrameSetTexture(HeroButtonIconDisabled[buttonIndex], HeroSelectorGetDisabledIcon(BlzGetAbilityIcon(HeroButtonUnitCode[buttonIndex])), 0, ButtonBlendAll)
//call BlzFrameSetText(HeroButtonTooltip[buttonIndex], TooltipPrefix + GetObjectName(HeroButtonUnitCode[buttonIndex]))
call HeroSelectorUpdateTooltip(HeroButtonUnitCode[buttonIndex])
else
//no, make it unclickable and empty
call BlzFrameSetEnable(HeroButtonFrame[buttonIndex], false)
if HideEmptyButtons then
call BlzFrameSetVisible(HeroButtonFrame[buttonIndex], false)
endif
call BlzFrameSetTexture(HeroButtonIcon[buttonIndex], EmptyButtonPath, 0, true)
call BlzFrameSetTexture(HeroButtonIconPushed[buttonIndex], EmptyButtonPath, 0, true)
call BlzFrameSetTexture(HeroButtonIconDisabled[buttonIndex], EmptyButtonPath, 0, true)
endif
set buttonIndex = buttonIndex + 1
endloop
endfunction
function HeroSelectorEnablePickAction takes boolean flag returns nothing
call BlzFrameSetVisible(AcceptButton, true and AcceptButtonIsShown)
call BlzFrameSetVisible(RandomButton, true and RandomButtonIsShown)
call BlzFrameSetVisible(RepickButton, true and RepickButtonIsShown)
call BlzFrameSetVisible(BanButton, false)
call BlzFrameSetVisible(BanDoneButton, false)
call BlzFrameSetEnable(AcceptButton, flag)
call BlzFrameSetEnable(RandomButton, flag)
call BlzFrameSetModel(IndicatorSelected, IndicatorPathPick, 0)
if flag then
set LastAction = 1
else
set LastAction = 2
endif
if BanIgnoreRequirment then
call HeroSelectorUpdate()
endif
endfunction
function HeroSelectorEnablePick takes boolean flag returns nothing
call HeroSelectorEnablePickDelayBanAction()
call HeroSelectorEnablePickAction(flag)
endfunction
function HeroSelectorEnablePickPlayer takes boolean flag, player p returns nothing
call HeroSelectorEnablePickDelayBanAction()
if GetLocalPlayer() == p then
call HeroSelectorEnablePickAction(flag)
endif
endfunction
function HeroSelectorEnablePickTeam takes boolean flag, integer teamNr returns nothing
call HeroSelectorEnablePickDelayBanAction()
if GetPlayerTeam(GetLocalPlayer()) == teamNr then
call HeroSelectorEnablePickAction(flag)
endif
endfunction
function HeroSelectorEnablePickRace takes boolean flag, race r returns nothing
call HeroSelectorEnablePickDelayBanAction()
if GetPlayerRace(GetLocalPlayer()) == r then
call HeroSelectorEnablePickAction(flag)
endif
endfunction
function HeroSelectorEnablePickForce takes boolean flag, force f returns nothing
call HeroSelectorEnablePickDelayBanAction()
if BlzForceHasPlayer(f, GetLocalPlayer()) then
call HeroSelectorEnablePickAction(flag)
endif
endfunction
function HeroSelectorEnableBanPlayerAction takes boolean flag returns nothing
call BlzFrameSetVisible(AcceptButton, false)
call BlzFrameSetVisible(RandomButton, false)
call BlzFrameSetVisible(RepickButton, false)
call BlzFrameSetVisible(BanButton, true)
call BlzFrameSetVisible(BanDoneButton, true and BanDoneButtonIsShown)
call BlzFrameSetEnable(BanButton, flag)
call BlzFrameSetEnable(BanDoneButton, flag)
call BlzFrameSetModel(IndicatorSelected, IndicatorPathBan, 0)
if flag then
set LastAction = 3
else
set LastAction = 4
endif
if BanIgnoreRequirment then
call HeroSelectorUpdate()
endif
endfunction
function HeroSelectorEnableBanPlayer takes boolean flag, player p returns nothing
if GetLocalPlayer() == p then
call HeroSelectorEnableBanPlayerAction(flag)
endif
endfunction
function HeroSelectorEnableBanForce takes boolean flag, force f returns nothing
if BlzForceHasPlayer(f, GetLocalPlayer()) then
call HeroSelectorEnableBanPlayerAction(flag)
endif
endfunction
function HeroSelectorEnableBanTeam takes boolean flag, integer teamNr returns nothing
if GetPlayerTeam(GetLocalPlayer()) == teamNr then
call HeroSelectorEnableBanPlayerAction(flag)
endif
endfunction
function HeroSelectorEnableBanRace takes boolean flag, race r returns nothing
if GetPlayerRace(GetLocalPlayer()) == r then
call HeroSelectorEnableBanPlayerAction(flag)
endif
endfunction
function HeroSelectorEnableBan takes boolean flag returns nothing
call HeroSelectorEnableBanPlayerAction(flag)
endfunction
function HeroSelectorframeLoseFocus takes framehandle frame returns nothing
if BlzFrameGetEnable(frame) then
call BlzFrameSetEnable(frame, false)
call BlzFrameSetEnable(frame, true)
endif
endfunction
function HeroSelectorShowFramePlayer takes framehandle frame, boolean flag, player p returns nothing
if GetLocalPlayer() == p then
call BlzFrameSetVisible(frame, flag)
endif
endfunction
function HeroSelectorShowFrameForce takes framehandle frame, boolean flag, force f returns nothing
if BlzForceHasPlayer(f, GetLocalPlayer()) then
call BlzFrameSetVisible(frame, flag)
endif
endfunction
function HeroSelectorShowFrameTeam takes framehandle frame, boolean flag, integer teamNr returns nothing
if GetPlayerTeam(GetLocalPlayer()) == teamNr then
call BlzFrameSetVisible(frame, flag)
endif
endfunction
function HeroSelectorShowFrameRace takes framehandle frame, boolean flag, race r returns nothing
if GetPlayerRace(GetLocalPlayer()) == r then
call BlzFrameSetVisible(frame, flag)
endif
endfunction
function HeroSelectorShowPlayer takes boolean flag, player who returns nothing
call HeroSelectorShowFramePlayer(HeroSelectorBox, flag, who)
endfunction
function HeroSelectorShowTeam takes boolean flag, integer who returns nothing
call HeroSelectorShowFrameTeam(HeroSelectorBox, flag, who)
endfunction
function HeroSelectorShowRace takes boolean flag, race who returns nothing
call HeroSelectorShowFrameRace(HeroSelectorBox, flag, who)
endfunction
function HeroSelectorShowForce takes boolean flag, force who returns nothing
call HeroSelectorShowFrameForce(HeroSelectorBox, flag, who)
endfunction
function HeroSelectorShow takes boolean flag returns nothing
call BlzFrameSetVisible(HeroSelectorBox, flag)
endfunction
function HeroSelectorAddUnit takes integer unitCode, boolean onlyRandom returns nothing
//no unitCode => empty field
if unitCode == 0 then
set ButtonHeroCount = ButtonHeroCount + 1
else
//Such an object Exist? not unique?
if GetObjectName(unitCode) == "" or HaveSavedBoolean(Hash, unitCode, 0) then
return
endif
set HeroCount = HeroCount + 1
set HeroUnitCode[HeroCount] = unitCode
call SaveBoolean(Hash, unitCode, 0, true)
call SaveInteger(Hash, unitCode, 0, HeroCount)
set HeroCategory[HeroCount] = AutoDetectCategory(unitCode)
if not onlyRandom then
set ButtonHeroCount = ButtonHeroCount + 1
set HeroButtonIndex[HeroCount] = ButtonHeroCount
set ButtonHeroUnitCode[ButtonHeroCount] = unitCode
endif
endif
endfunction
function HeroSelectorDoRandom takes player p returns nothing
local integer category = 0
local integer unitCode
local unit u
if CategoryAffectRandom then
set category = PlayerSelectedCategory[GetPlayerId(p)]
endif
set unitCode = HeroSelectorRollOption(p, true, 0, category)
if unitCode == 0 then
return
endif
set u = CreateUnit(p, unitCode, 0, 0, 0)
set PickedUnit[GetPlayerId(p)] = u
call HeroSelectorCounterChangeUnitCode(unitCode, 1, p)
set udg_HeroSelectorEventUnit = u
set udg_HeroSelectorEventIsRandom = true
set udg_HeroSelectorEventUnitCode = unitCode
set udg_HeroSelectorEventPlayer = p
set udg_HeroSelectorEvent = 0.0
set udg_HeroSelectorEvent = 1.0
set udg_HeroSelectorEvent = 0.0
set u = null
endfunction
function HeroSelectorDoPick takes player p returns boolean
local integer unitCode
local unit u
//pick what currently is selected, returns true on success returns false when something went wrong,
local integer buttonIndex = PlayerSelectedButtonIndex[GetPlayerId(p)]
if buttonIndex <= 0 then
return false
endif //reject nothing selected
set unitCode = HeroButtonUnitCode[buttonIndex]
if not HeroSelectorButtonRequirementDone(unitCode, p) then
return false
endif //reject requirment not fullfilled
set u = CreateUnit(p, unitCode, 0, 0, 0)
set PickedUnit[GetPlayerId(p)] = u
call HeroSelectorCounterChangeUnitCode(unitCode, 1, p)
set udg_HeroSelectorEventUnit = u
set udg_HeroSelectorEventIsRandom = false
set udg_HeroSelectorEventUnitCode = unitCode
set udg_HeroSelectorEventPlayer = p
set udg_HeroSelectorEvent = 0.0
set udg_HeroSelectorEvent = 1.0
set udg_HeroSelectorEvent = 0.0
set u = null
return true
endfunction
function HeroSelectorForceRandom takes nothing returns nothing
//this is a wrapper for doRandom allowing different dataTypes
local player p
local integer playerIndex = 0
loop
exitwhen playerIndex == GetBJMaxPlayers()
set p = Player(playerIndex)
if GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING then
call HeroSelectorDoRandom(p)
endif
set playerIndex = playerIndex + 1
endloop
set p = null
endfunction
function HeroSelectorForceRandomTeam takes integer who returns nothing
//this is a wrapper for doRandom allowing different dataTypes
local player p
local integer playerIndex = 0
loop
exitwhen playerIndex == GetBJMaxPlayers()
set p = Player(playerIndex)
if GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING then
if GetPlayerTeam(p) == who then
call HeroSelectorDoRandom(p)
endif
endif
set playerIndex = playerIndex + 1
endloop
set p = null
endfunction
function HeroSelectorForceRandomRace takes race who returns nothing
//this is a wrapper for doRandom allowing different dataTypes
local player p
local integer playerIndex = 0
loop
exitwhen playerIndex == GetBJMaxPlayers()
set p = Player(playerIndex)
if GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING then
if GetPlayerRace(p) == who then
call HeroSelectorDoRandom(p)
endif
endif
set playerIndex = playerIndex + 1
endloop
set p = null
endfunction
function HeroSelectorForcePick takes nothing returns nothing
//this is a wrapper for doRandom allowing different dataTypes
local player p
local integer playerIndex = 0
loop
exitwhen playerIndex == GetBJMaxPlayers()
set p = Player(playerIndex)
if GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING then
if not HeroSelectorDoPick(p) then
call HeroSelectorDoRandom(p)
endif
endif
set playerIndex = playerIndex + 1
endloop
endfunction
function HeroSelectorForcePickTeam takes integer who returns nothing
//this is a wrapper for doRandom allowing different dataTypes
local player p
local integer playerIndex = 0
loop
exitwhen playerIndex == GetBJMaxPlayers()
set p = Player(playerIndex)
if GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING then
if GetPlayerTeam(p) == who then
if not HeroSelectorDoPick(p) then
call HeroSelectorDoRandom(p)
endif
endif
endif
set playerIndex = playerIndex + 1
endloop
endfunction
function HeroSelectorForcePickRace takes race r returns nothing
//this is a wrapper for doRandom allowing different dataTypes
local player p
local integer playerIndex = 0
loop
exitwhen playerIndex == GetBJMaxPlayers()
set p = Player(playerIndex)
if GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING then
if GetPlayerRace(p) == r then
if not HeroSelectorDoPick(p) then
call HeroSelectorDoRandom(p)
endif
endif
endif
set playerIndex = playerIndex + 1
endloop
endfunction
function HeroSelectorForcePickPlayer takes player p returns nothing
if not HeroSelectorDoPick(p) then
call HeroSelectorDoRandom(p)
endif
endfunction
function HeroSelectorActionPressHeroButton takes nothing returns nothing
local framehandle fh = BlzGetTriggerFrame()
local player p = GetTriggerPlayer()
local integer buttonIndex = LoadInteger(Hash, GetHandleId(fh), 0)
local integer unitCode = HeroButtonUnitCode[buttonIndex]
set PlayerSelectedButtonIndex[GetPlayerId(p)] = buttonIndex
call HeroSelectorframeLoseFocus(BlzGetTriggerFrame())
if GetLocalPlayer() == p then
call BlzFrameSetVisible(IndicatorSelected, true)
call BlzFrameSetPoint(IndicatorSelected, FRAMEPOINT_TOPLEFT, fh, FRAMEPOINT_TOPLEFT, -0.001, 0.001)
call BlzFrameSetPoint(IndicatorSelected, FRAMEPOINT_BOTTOMRIGHT, fh, FRAMEPOINT_BOTTOMRIGHT, -0.0012, -0.0016)
endif
set udg_HeroSelectorEventUnit = null
set udg_HeroSelectorEventUnitCode = unitCode
set udg_HeroSelectorEventPlayer = p
set udg_HeroSelectorEvent = 0.0
set udg_HeroSelectorEvent = 2.0
set udg_HeroSelectorEvent = 0.0
set fh = null
set p = null
endfunction
function HeroSelectorActionBanDoneButton takes nothing returns nothing
call HeroSelectorframeLoseFocus(BlzGetTriggerFrame())
set udg_HeroSelectorEventPlayer = GetTriggerPlayer()
set udg_HeroSelectorEvent = 0.0
set udg_HeroSelectorEvent = 5.0
set udg_HeroSelectorEvent = 0.0
endfunction
function HeroSelectorActionRepickButton takes nothing returns nothing
call HeroSelectorframeLoseFocus(BlzGetTriggerFrame())
if GetUnitTypeId(PickedUnit[GetPlayerId(GetTriggerPlayer())]) > 0 then
set udg_HeroSelectorEventUnit = PickedUnit[GetPlayerId(GetTriggerPlayer())]
set udg_HeroSelectorEventPlayer = GetTriggerPlayer()
set udg_HeroSelectorEvent = 0.0
set udg_HeroSelectorEvent = 4.0
set udg_HeroSelectorEvent = 0.0
endif
endfunction
function HeroSelectorActionRandomButton takes nothing returns nothing
local player p = GetTriggerPlayer()
local integer playerIndex = GetPlayerId(p)
local integer unitCode
local integer unitCodeIndex
local integer buttonIndex
call HeroSelectorframeLoseFocus(BlzGetTriggerFrame())
if RandomButtonPick then
call HeroSelectorDoRandom(p)
else
set unitCode = HeroSelectorRollOption(p, false, PlayerSelectedButtonIndex[playerIndex], PlayerSelectedCategory[playerIndex])
if unitCode > 0 and GetLocalPlayer() == p then
set unitCodeIndex = LoadInteger(Hash, unitCode, 0)
set buttonIndex = HeroButtonIndex[unitCodeIndex]
call BlzFrameClick(HeroButtonFrame[buttonIndex])
endif
endif
set p = null
endfunction
function HeroSelectorActionAcceptButton takes nothing returns nothing
call HeroSelectorframeLoseFocus(BlzGetTriggerFrame())
call HeroSelectorDoPick(GetTriggerPlayer())
endfunction
function HeroSelectorActionShowButton takes nothing returns nothing
if GetLocalPlayer() == GetTriggerPlayer() then
call BlzFrameSetVisible(HeroSelectorBox, not BlzFrameIsVisible(HeroSelectorBox))
endif
endfunction
function HeroSelectorActionBanButton takes nothing returns nothing
local player p = GetTriggerPlayer()
local integer playerIndex = GetPlayerId(p)
local integer buttonIndex = PlayerSelectedButtonIndex[playerIndex]
local integer unitCode = HeroButtonUnitCode[buttonIndex]
call HeroSelectorframeLoseFocus(BlzGetTriggerFrame())
if buttonIndex > 0 then
if not DelayBanUntilPick then
call HeroSelectorCounterChangeUnitCode(unitCode, UnitCount + 1, p)
else
set DelayBanCount = DelayBanCount + 1
set DelayBanPlayer[DelayBanCount] = p
set DelayBanUnitCode[DelayBanCount] = unitCode
endif
set udg_HeroSelectorEventUnit = null
set udg_HeroSelectorEventUnitCode = unitCode
set udg_HeroSelectorEventPlayer = p
set udg_HeroSelectorEvent = 0.0
set udg_HeroSelectorEvent = 3.0
set udg_HeroSelectorEvent = 0.0
endif
set p = null
endfunction
function HeroSelectorActionCategoryButton takes nothing returns nothing
local integer buttonIndex
local framehandle fh = BlzGetTriggerFrame()
local integer categoryIndex = LoadInteger(Hash, GetHandleId(fh), 0)
local integer lastCategoryIndex
local player p = GetTriggerPlayer()
local integer playerIndex = GetPlayerId(p)
local integer unitCodeIndex
call HeroSelectorframeLoseFocus(fh)
//has this category already?
if BlzBitAnd(PlayerSelectedCategory[playerIndex], CategoryButtonValue[categoryIndex]) != 0 then
//yes, unable
set PlayerSelectedCategory[playerIndex] = PlayerSelectedCategory[playerIndex] - CategoryButtonValue[categoryIndex]
if GetLocalPlayer() == p then
call BlzFrameSetTexture(CategoryIconFrame[categoryIndex], CategoryTextureDisabled[categoryIndex], 0, true)
call BlzFrameSetTexture(CategoryIconPushedFrame[categoryIndex], CategoryTextureDisabled[categoryIndex], 0, true)
endif
else
if not CategoryMultiSelect and PlayerSelectedCategory[playerIndex] != 0 then
set lastCategoryIndex = PlayerLastSelectedCategoryIndex[playerIndex]
call BlzFrameSetTexture(CategoryIconFrame[lastCategoryIndex], CategoryTextureDisabled[lastCategoryIndex], 0, true)
call BlzFrameSetTexture(CategoryIconPushedFrame[lastCategoryIndex], CategoryTextureDisabled[lastCategoryIndex], 0, true)
set PlayerSelectedCategory[playerIndex] = 0
endif
//no, enable
set PlayerSelectedCategory[playerIndex] = PlayerSelectedCategory[playerIndex] + CategoryButtonValue[categoryIndex]
if GetLocalPlayer() == p then
call BlzFrameSetTexture(CategoryIconFrame[categoryIndex], CategoryTexture[categoryIndex], 0, true)
call BlzFrameSetTexture(CategoryIconPushedFrame[categoryIndex], CategoryTexture[categoryIndex], 0, true)
endif
set PlayerLastSelectedCategoryIndex[playerIndex] = categoryIndex
endif
if GetLocalPlayer() == p then
//update all buttons
//buttons not having at least 1 selected category becomes partly transparent
set buttonIndex = 1
loop
exitwhen buttonIndex > HeroButtonCount
if HeroButtonUnitCode[buttonIndex] > 0 then
set unitCodeIndex = LoadInteger(Hash, HeroButtonUnitCode[buttonIndex],0)
if PlayerSelectedCategory[playerIndex] == 0 or BlzBitAnd(HeroCategory[unitCodeIndex], PlayerSelectedCategory[playerIndex]) > 0 then
call BlzFrameSetAlpha(HeroButtonFrame[buttonIndex], 255)
else
call BlzFrameSetAlpha(HeroButtonFrame[buttonIndex], CategoryFilteredAlpha)
endif
endif
set buttonIndex = buttonIndex + 1
endloop
endif
set fh = null
set p = null
endfunction
function HeroSelectorInit takes nothing returns nothing
local boolean loaded = BlzLoadTOCFile(TocPath)
local integer buttonIndex
local real titleSize = 0.015
local real borderSize = GetBorderSize()
local integer colCount = ButtonColCount
local integer rowCount = ButtonRowCount
local framehandle box = BlzCreateFrame(BoxFrameName, BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, 0)
local framehandle boxBottom = BlzCreateFrame("HeroSelectorRaceTopBox", box, 0, 0)
local integer rowRemaining = colCount
local real y = -borderSize - titleSize - 0.0125 - CategorySize
local real x = borderSize
set HeroSelectorBoxTitle = BlzCreateFrame("HeroSelectorTitle", box, 0, 0)
set IndicatorSelectedParent = BlzCreateFrameByType("BUTTON", "MyHeroIndikatorParent", box, "", 0)
call BlzFrameSetLevel(IndicatorSelectedParent, 9)
set IndicatorSelected = BlzCreateFrameByType("SPRITE", "MyHeroIndikator", IndicatorSelectedParent, "", 0)
set HeroSelectorBox = box
set HeroSelectorBoxSeperator = boxBottom
call BlzFrameSetModel(IndicatorSelected, IndicatorPathPick, 0)
call BlzFrameSetScale(IndicatorSelected, ButtonSize/0.036) //scale the model to the button size.
call BlzFrameSetVisible(IndicatorSelected, false)
call BlzFrameSetAbsPoint(box, BoxPosPoint, BoxPosX, BoxPosY)
call BlzFrameSetSize(box, borderSize*2 + ButtonSize*colCount + SpaceBetweenX*(colCount-1), borderSize*2 + ButtonSize*rowCount + SpaceBetweenY*(rowCount - 1) + titleSize + CategorySize + 0.0145)
call BlzFrameSetPoint(HeroSelectorBoxTitle, FRAMEPOINT_TOP, box, FRAMEPOINT_TOP, 0, -borderSize*0.6)
call BlzFrameSetText(HeroSelectorBoxTitle, "Hero Selection")
call BlzFrameSetTextAlignment(HeroSelectorBoxTitle, TEXT_JUSTIFY_MIDDLE, TEXT_JUSTIFY_CENTER)
call BlzFrameSetSize(HeroSelectorBoxTitle, BlzFrameGetWidth(box) - borderSize*2, 0.03)
// human UI size differs much, needs other numbers
if GetPlayerRace(GetLocalPlayer()) == RACE_HUMAN then
call BlzFrameSetPoint(boxBottom, FRAMEPOINT_TOPLEFT, box, FRAMEPOINT_TOPLEFT, borderSize*0.055, - 0.9*borderSize - titleSize - 0.003 -CategorySize)
call BlzFrameSetPoint(boxBottom, FRAMEPOINT_TOPRIGHT, box, FRAMEPOINT_TOPRIGHT, -borderSize*0.055, - 0.9*borderSize - titleSize - 0.003 -CategorySize)
else
call BlzFrameSetPoint(boxBottom, FRAMEPOINT_TOPLEFT, box, FRAMEPOINT_TOPLEFT, borderSize*0.25, - 0.9*borderSize - titleSize - 0.003 -CategorySize)
call BlzFrameSetPoint(boxBottom, FRAMEPOINT_TOPRIGHT, box, FRAMEPOINT_TOPRIGHT, -borderSize*0.25, - 0.9*borderSize - titleSize - 0.003 -CategorySize)
endif
call BlzFrameSetSize(boxBottom, 0.01, 0.1)
if colCount*rowCount < ButtonHeroCount then
call BJDebugMsg("FieldCount:"+ I2S(colCount*rowCount) + "HeroCount" + I2S(ButtonHeroCount))
endif
set buttonIndex = 1
loop
exitwhen buttonIndex > HeroButtonCount
set HeroButtonFrame[buttonIndex] = BlzCreateFrame("HeroSelectorButton", box, 0, buttonIndex)
set HeroButtonIcon[buttonIndex] = BlzGetFrameByName("HeroSelectorButtonIcon", buttonIndex)
set HeroButtonIconPushed[buttonIndex] = BlzGetFrameByName("HeroSelectorButtonIconPushed", buttonIndex)
set HeroButtonIconDisabled[buttonIndex] = BlzGetFrameByName("HeroSelectorButtonIconDisabled", buttonIndex)
set HeroButtonUnitCode[buttonIndex] = ButtonHeroUnitCode[buttonIndex]
call SaveInteger(Hash, GetHandleId(HeroButtonFrame[buttonIndex]), 0, buttonIndex)
set HeroButtonTooltipBox[buttonIndex] = BlzCreateFrame("HeroSelectorTextBox", box, 0, buttonIndex)
set HeroButtonTooltip[buttonIndex] = BlzCreateFrame("HeroSelectorText", HeroButtonTooltipBox[buttonIndex], 0, buttonIndex)
call BlzFrameSetTooltip(HeroButtonFrame[buttonIndex], HeroButtonTooltipBox[buttonIndex])
if not TooltipRelativIsBox then
call BlzFrameSetPoint(HeroButtonTooltip[buttonIndex], TooltipPoint, HeroButtonFrame[buttonIndex], TooltipRelativePoint, TooltipOffsetX ,TooltipOffsetY)
else
call BlzFrameSetPoint(HeroButtonTooltip[buttonIndex], TooltipPoint, box, TooltipRelativePoint, TooltipOffsetX ,TooltipOffsetY)
endif
call BlzFrameSetPoint(HeroButtonTooltipBox[buttonIndex], FRAMEPOINT_BOTTOMLEFT, HeroButtonTooltip[buttonIndex], FRAMEPOINT_BOTTOMLEFT, -0.007, -0.007)
call BlzFrameSetPoint(HeroButtonTooltipBox[buttonIndex], FRAMEPOINT_TOPRIGHT, HeroButtonTooltip[buttonIndex], FRAMEPOINT_TOPRIGHT, 0.007, 0.007)
call BlzTriggerRegisterFrameEvent(HeroButtonClickTrigger, HeroButtonFrame[buttonIndex], FRAMEEVENT_CONTROL_CLICK)
call BlzFrameSetSize(HeroButtonFrame[buttonIndex], ButtonSize, ButtonSize)
if ChainedButtons then //buttons are connected to the previous one or the previous row
if buttonIndex == 1 then
call BlzFrameSetPoint(HeroButtonFrame[buttonIndex], FRAMEPOINT_TOPLEFT, box, FRAMEPOINT_TOPLEFT, borderSize, y)
elseif rowRemaining <= 0 then
call BlzFrameSetPoint(HeroButtonFrame[buttonIndex], FRAMEPOINT_TOPLEFT, HeroButtonFrame[buttonIndex - colCount], FRAMEPOINT_BOTTOMLEFT, 0, -SpaceBetweenY)
set rowRemaining = colCount
else
call BlzFrameSetPoint(HeroButtonFrame[buttonIndex], FRAMEPOINT_LEFT, HeroButtonFrame[buttonIndex - 1], FRAMEPOINT_RIGHT, SpaceBetweenX, 0)
endif
else //buttons have an offset to the TopLeft of the box
if rowRemaining <= 0 then
set x = borderSize
set rowRemaining = colCount
set y = y - SpaceBetweenY - ButtonSize
elseif buttonIndex != 1 then
set x = x + ButtonSize + SpaceBetweenX
endif
call BlzFrameSetPoint(HeroButtonFrame[buttonIndex], FRAMEPOINT_TOPLEFT, box, FRAMEPOINT_TOPLEFT, x, y)
endif
set rowRemaining = rowRemaining - 1
set buttonIndex = buttonIndex + 1
endloop
set y = -0.9*borderSize - titleSize - 0.0025
set x = borderSize*0.65
//create category buttons added before the box was created
set buttonIndex = 1
loop
exitwhen buttonIndex > CategoryButtonCount
set CategoryButton[buttonIndex] = BlzCreateFrame("HeroSelectorCategoryButton", box, 0, 0)
set CategoryIconFrame[buttonIndex] = BlzGetFrameByName("HeroSelectorCategoryButtonIcon", 0)
set CategoryIconPushedFrame[buttonIndex] = BlzGetFrameByName("HeroSelectorCategoryButtonIconPushed", 0)
set CategoryTooltipFrameBox[buttonIndex] = BlzCreateFrame("HeroSelectorTextBox", box, 0, buttonIndex)
set CategoryTooltipFrame[buttonIndex] = BlzCreateFrame("HeroSelectorText", CategoryTooltipFrameBox[buttonIndex], 0, buttonIndex)
call BlzFrameSetText(CategoryTooltipFrame[buttonIndex], GetLocalizedString(CategoryText[buttonIndex]))
call BlzFrameSetPoint(CategoryTooltipFrameBox[buttonIndex], FRAMEPOINT_BOTTOMLEFT, CategoryTooltipFrame[buttonIndex], FRAMEPOINT_BOTTOMLEFT, -0.007, -0.007)
call BlzFrameSetPoint(CategoryTooltipFrameBox[buttonIndex], FRAMEPOINT_TOPRIGHT, CategoryTooltipFrame[buttonIndex], FRAMEPOINT_TOPRIGHT, 0.007, 0.007)
call BlzFrameSetPoint(CategoryTooltipFrame[buttonIndex], FRAMEPOINT_BOTTOM, CategoryButton[buttonIndex], FRAMEPOINT_TOP, 0, 0)
call BlzFrameSetTooltip(CategoryButton[buttonIndex], CategoryTooltipFrameBox[buttonIndex])
call BlzFrameSetSize(CategoryButton[buttonIndex], CategorySize, CategorySize)
call BlzFrameSetTexture(CategoryIconFrame[buttonIndex], CategoryTextureDisabled[buttonIndex], 0, true)
call BlzFrameSetTexture(CategoryIconPushedFrame[buttonIndex], CategoryTextureDisabled[buttonIndex], 0, true)
call BlzTriggerRegisterFrameEvent(CategoryClickTrigger, CategoryButton[buttonIndex], FRAMEEVENT_CONTROL_CLICK)
if buttonIndex == 1 then
call BlzFrameSetPoint(CategoryButton[buttonIndex], FRAMEPOINT_TOPLEFT, box, FRAMEPOINT_TOPLEFT, x, y)
else
call BlzFrameSetPoint(CategoryButton[buttonIndex], FRAMEPOINT_LEFT, CategoryButton[buttonIndex - 1], FRAMEPOINT_RIGHT, CategorySpaceX, 0)
endif
call SaveInteger(Hash, GetHandleId(CategoryButton[buttonIndex]), 0, buttonIndex)
set buttonIndex = buttonIndex + 1
endloop
set AcceptButton = BlzCreateFrame("HeroSelectorTextButton", box, 0, 0)
set RandomButton = BlzCreateFrame("HeroSelectorTextButton", box, 0, 1)
set BanButton = BlzCreateFrame("HeroSelectorTextButton", box, 0, 2)
set RepickButton = BlzCreateFrame("HeroSelectorTextButton", box, 0, 3)
set BanDoneButton = BlzCreateFrame("HeroSelectorTextButton", box, 0, 4)
set ShowButton = BlzCreateFrame("HeroSelectorTextButton", ShowButtonParent(), 0, 5)
call BlzTriggerRegisterFrameEvent(AcceptButtonTrigger, AcceptButton, FRAMEEVENT_CONTROL_CLICK)
call BlzTriggerRegisterFrameEvent(RandomButtonTrigger, RandomButton, FRAMEEVENT_CONTROL_CLICK)
call BlzTriggerRegisterFrameEvent(BanButtonTrigger, BanButton, FRAMEEVENT_CONTROL_CLICK)
call BlzTriggerRegisterFrameEvent(RepickButtonTrigger, RepickButton, FRAMEEVENT_CONTROL_CLICK)
call BlzTriggerRegisterFrameEvent(BanDoneButtonTrigger, BanDoneButton, FRAMEEVENT_CONTROL_CLICK)
call BlzTriggerRegisterFrameEvent(ShowButtonTrigger, ShowButton, FRAMEEVENT_CONTROL_CLICK)
call BlzFrameSetSize(AcceptButton, AcceptButtonSizeX, AcceptButtonSizeY)
call BlzFrameSetSize(RandomButton, RandomButtonSizeX, RandomButtonSizeY)
call BlzFrameSetSize(BanButton, BanButtonSizeX, BanButtonSizeY)
call BlzFrameSetSize(RepickButton, RepickButtonSizeX, RepickButtonSizeY)
call BlzFrameSetSize(BanDoneButton, BanDoneButtonSizeX, BanDoneButtonSizeY)
call BlzFrameSetSize(ShowButton, ShowButtonSizeX, ShowButtonSizeY)
//OK, READY, ACCEPT
call BlzFrameSetText(AcceptButton, AcceptButtonTextPrefix + GetLocalizedString(AcceptButtonText))
call BlzFrameSetText(RandomButton, RandomButtonTextPrefix + GetLocalizedString(RandomButtonText))
call BlzFrameSetText(BanButton, BanButtonTextPrefix + GetLocalizedString(BanButtonText))
call BlzFrameSetText(RepickButton, RepickButtonTextPrefix + GetLocalizedString(RepickButtonText))
call BlzFrameSetText(BanDoneButton, BanDoneButtonTextPrefix + GetLocalizedString(BanDoneButtonText))
call BlzFrameSetText(ShowButton, ShowButtonTextPrefix + GetLocalizedString(ShowButtonText))
call BlzFrameSetPoint(AcceptButton, FRAMEPOINT_BOTTOMRIGHT, box, FRAMEPOINT_BOTTOM, 0, 0)
call BlzFrameSetPoint(RandomButton, FRAMEPOINT_LEFT, AcceptButton, FRAMEPOINT_RIGHT, 0, 0)
call BlzFrameSetPoint(RepickButton, FRAMEPOINT_TOP, AcceptButton, FRAMEPOINT_BOTTOMRIGHT, 0, 0)
call BlzFrameSetPoint(BanButton, FRAMEPOINT_BOTTOMRIGHT, box, FRAMEPOINT_BOTTOM, 0, 0)
call BlzFrameSetPoint(BanDoneButton, FRAMEPOINT_LEFT, BanButton, FRAMEPOINT_RIGHT, 0, 0)
call BlzFrameSetAbsPoint(ShowButton, ShowButtonPoint, ShowButtonX, ShowButtonY)
call BlzFrameSetVisible(BanButton, false)
call BlzFrameSetVisible(BanDoneButton, false)
call BlzFrameSetVisible(AcceptButton, AcceptButtonIsShown)
call BlzFrameSetVisible(RandomButton, RandomButtonIsShown)
call BlzFrameSetVisible(RepickButton, RepickButtonIsShown)
call BlzFrameSetVisible(ShowButton, ShowButtonIsShown)
if not AutoShow then
call BlzFrameSetVisible(box, false)
endif
call HeroSelectorUpdate()
call ExecuteFunc("HeroInfoInit")
call ExecuteFunc("TeamViewerInit")
// LastAction is used to Restore the current Pick/Bann Phase after Save&Load
if LastAction == 1 then
call HeroSelectorEnablePick(true)
elseif LastAction == 2 then
call HeroSelectorEnablePick(false)
elseif LastAction == 3 then
call HeroSelectorEnableBan(true)
elseif LastAction == 4 then
call HeroSelectorEnableBan(false)
endif
endfunction
private function At0s takes nothing returns nothing
local integer playerIndex = 0
local integer teamIndexLoop
local integer teamNr
local integer startIndex
//find all Teams in usage
loop
exitwhen playerIndex == GetBJMaxPlayers()
set teamNr = GetPlayerTeam(Player(playerIndex))
if teamNr != -1 then
set teamIndexLoop = UsedTeamNrCount
loop
exitwhen teamIndexLoop == 0
exitwhen UsedTeamNr[teamIndexLoop] == teamNr
set teamIndexLoop = teamIndexLoop - 1
endloop
if teamIndexLoop == 0 then
set UsedTeamNrCount = UsedTeamNrCount + 1
set UsedTeamNr[UsedTeamNrCount] = teamNr
endif
endif
set playerIndex = playerIndex + 1
endloop
call DestroyTimer(GetExpiredTimer())
static if LIBRARY_Ascii then
// "Hamg,Hmkg,Hpal,Hblm"?
// also support "Hamg,0,Hpal,0,Hblm"
if StringLength(PickAbleHeroes) > 4 then
set startIndex = 0
loop
exitwhen startIndex + 3 > StringLength(PickAbleHeroes)
if SubString(PickAbleHeroes, startIndex, startIndex + 2) == "0," then
set startIndex = startIndex + 2
call HeroSelectorAddUnit(0, false)
else
call HeroSelectorAddUnit(S2A(SubString(PickAbleHeroes, startIndex, startIndex + 4)), false)
set startIndex = startIndex + 5
endif
endloop
//'Hpal' -> number?
elseif StringLength(PickAbleHeroes) == 4 then
call HeroSelectorAddUnit(S2A(PickAbleHeroes), false)
endif
endif
call ExecuteFunc("HeroSelectorAction_InitHeroes")
call HeroSelectorInit()
static if LIBRARY_FrameLoader then
call FrameLoaderAdd(function HeroSelectorInit)
endif
endfunction
private function init_function takes nothing returns nothing
call TriggerAddAction(CategoryClickTrigger, function HeroSelectorActionCategoryButton)
call TriggerAddAction(AcceptButtonTrigger, function HeroSelectorActionAcceptButton)
call TriggerAddAction(RandomButtonTrigger, function HeroSelectorActionRandomButton)
call TriggerAddAction(RepickButtonTrigger, function HeroSelectorActionRepickButton)
call TriggerAddAction(BanDoneButtonTrigger, function HeroSelectorActionBanDoneButton)
call TriggerAddAction(BanButtonTrigger, function HeroSelectorActionBanButton)
call TriggerAddAction(ShowButtonTrigger, function HeroSelectorActionShowButton)
call TriggerAddAction(HeroButtonClickTrigger, function HeroSelectorActionPressHeroButton)
call TimerStart(CreateTimer(), 0, false, function At0s)
endfunction
endlibrary
library HeroSelectorAction initializer Init uses HeroSelector, optional TeamViewer, optional HeroInfo
//HeroSelectorAction V1.5a
//what happens to the unit beeing picked, player is the one having pressed the button
function HeroSelectorUnitCreated takes nothing returns nothing
local player p = udg_HeroSelectorEventPlayer
local integer playerIndex = GetPlayerId(p)
local unit u = udg_HeroSelectorEventUnit
local boolean isRandom = udg_HeroSelectorEventIsRandom
set bj_lastCreatedUnit = u
if isRandom then
//randomed
else
//picked
endif
call SetUnitPosition(u, GetPlayerStartLocationX(p), GetPlayerStartLocationY(p))
if p == Player(1) then
endif
static if LIBRARY_TeamViewer then
call TeamViewerUnitCreated(p, u, isRandom)
endif
call PanCameraToTimedForPlayer(p, GetUnitX(u), GetUnitY(u),0)
call SelectUnitForPlayerSingle(u, p)
call HeroSelectorEnablePickPlayer(false, p) //only one pick for this player
set p = null
set u = null
endfunction
//happens when the banButton is pressed, player is the one having pressed the button
function HeroSelectorUnitBaned takes nothing returns nothing
local player p = udg_HeroSelectorEventPlayer
local integer playerIndex = GetPlayerId(p)
local integer unitCode = udg_HeroSelectorEventUnitCode
call HeroSelectorEnableBanPlayer(false, p) //only one ban
set p = null
endfunction
function HeroSelectorButtonSelected takes nothing returns nothing
//player who pressed the button
//unitCode the unitCode selected
//this is not picked.
local player p = udg_HeroSelectorEventPlayer
local integer playerIndex = GetPlayerId(p)
local integer unitCode = udg_HeroSelectorEventUnitCode
static if LIBRARY_HeroInfo then
call HeroInfoButtonSelected(p, unitCode)
endif
static if LIBRARY_TeamViewer then
call TeamViewerButtonSelected(p, unitCode)
endif
set p = null
endfunction
function HeroSelectorRepick takes unit u returns nothing
local integer unitCode
local player p = GetOwningPlayer(u)
local integer playerIndex = GetPlayerId(p)
call UnitRemoveBuffsBJ(bj_REMOVEBUFFS_ALL, u) //this is done to undo metamorph
set unitCode = GetUnitTypeId(u)
if unitCode == 0 then
return
endif
call HeroSelectorCounterChangeUnitCode(unitCode, -1, p)
call HeroSelectorShowPlayer(true, p)
call HeroSelectorEnablePickPlayer(true, p)
static if LIBRARY_TeamViewer then
call TeamViewerRepick(u, p)
endif
call RemoveUnit(u)
endfunction
function HeroSelectorBanDoneButtonEvent takes nothing returns nothing
//player who pressed the button
local player p = udg_HeroSelectorEventPlayer
call HeroSelectorEnablePick(true)
set p = null
endfunction
function HeroSelectorRepickButtonEvent takes nothing returns nothing
call HeroSelectorRepick(udg_HeroSelectorEventUnit)
endfunction
//This runs before the box is created with that the system has the needed data right when it is needed.
//you can add units somewhere else but it is done after the box was created you have to use the update function to update the textures of shown buttons
public function InitHeroes takes nothing returns nothing
//create categories setuped in config
local integer index
local integer categoryMelee = 1 //autodetected
local integer categoryRanged = 2 //autodetected
local integer categoryStr = 4
local integer categoryAgi = 8
local integer categoryInt = 16
call HeroSelectorAddCategory("ReplaceableTextures\\CommandButtons\\BTNSteelMelee", "MELEE") //1, automatic detected when adding an unit
call HeroSelectorAddCategory("ReplaceableTextures\\CommandButtons\\BTNHumanMissileUpOne", "Ranged") //2, automatic detected when adding an unit
call HeroSelectorAddCategory("ReplaceableTextures\\CommandButtons\\BTNGauntletsOfOgrePower", "STRENGTH") //4
call HeroSelectorAddCategory("ReplaceableTextures\\CommandButtons\\BTNSlippersOfAgility", "AGILITY") //8
call HeroSelectorAddCategory("ReplaceableTextures\\CommandButtons\\BTNMantleOfIntelligence", "INTELLECT") //16
//read GUI, when the variable exist
set index = 1
//add from index 1 all random only heroes
loop
exitwhen udg_HeroSelectorRandomOnly[index] == 0
call HeroSelectorAddUnit(udg_HeroSelectorRandomOnly[index], true)
set index = index + 1
endloop
set index = 1
//copy the setuped field
loop
exitwhen index > HeroSelector_HeroButtonCount
call HeroSelectorAddUnit(udg_HeroSelectorUnitCode[index], false)
if udg_HeroSelectorCategory[index] != 0 then
call HeroSelectorAddUnitCategory(udg_HeroSelectorUnitCode[index], udg_HeroSelectorCategory[index])
endif
set index = index + 1
endloop
// return
//adding further units when using the GUI Array does not make much sense, except you would add rows.
call HeroSelectorAddUnit('Hgam', true) //antonidas is an only random Hero that can only be randomed by team 0 (for users 1).
call HeroSelectorAddUnit('Eevi', true) //evil Illidan is an only random Hero that can only be randomed by team 1 (for users 2).
//Adds requirments
//when you have a ban phase it might be better to add the requirments after the ban phase is over, otherwise one can only ban own options.
//human only work for human, as nightelf only for Nightelf
call HeroSelectorSetUnitReqRace('Hpal', RACE_HUMAN)
call HeroSelectorSetUnitReqTechLevel('Hpal', 'hfoo', 4)
call HeroSelectorSetUnitReqRace('Hamg', RACE_HUMAN)
call HeroSelectorSetUnitReqRace('Hblm', RACE_HUMAN)
call HeroSelectorSetUnitReqRace('Hmkg', RACE_HUMAN)
//call HeroSelectorSetUnitReqRace('Ofar', RACE_ORC)
//call HeroSelectorSetUnitReqRace('Oshd', RACE_ORC)
//call HeroSelectorSetUnitReqRace('Otch', RACE_ORC)
//call HeroSelectorSetUnitReqRace('Obla', RACE_ORC)
call HeroSelectorSetUnitReqRace('Emoo', RACE_NIGHTELF)
call HeroSelectorSetUnitReqRace('Edem', RACE_NIGHTELF)
call HeroSelectorSetUnitReqRace('Ekee', RACE_NIGHTELF)
call HeroSelectorSetUnitReqRace('Ewar', RACE_NIGHTELF)
//call HeroSelectorSetUnitReqRace('Udea', RACE_UNDEAD)
//call HeroSelectorSetUnitReqRace('Ulic', RACE_UNDEAD)
//call HeroSelectorSetUnitReqRace('Udre', RACE_UNDEAD)
//call HeroSelectorSetUnitReqRace('Ucrl', RACE_UNDEAD)
call HeroSelectorAddUnitCategory('Hpal', categoryStr)
call HeroSelectorAddUnitCategory('Hamg', categoryInt)
call HeroSelectorAddUnitCategory('Hblm', categoryInt)
call HeroSelectorAddUnitCategory('Hmkg', categoryStr)
call HeroSelectorAddUnitCategory('Ofar', categoryInt)
call HeroSelectorAddUnitCategory('Oshd', categoryAgi)
call HeroSelectorAddUnitCategory('Otch', categoryStr)
call HeroSelectorAddUnitCategory('Obla', categoryAgi)
call HeroSelectorAddUnitCategory('Emoo', categoryAgi)
call HeroSelectorAddUnitCategory('Edem', categoryAgi)
call HeroSelectorAddUnitCategory('Ekee', categoryInt)
call HeroSelectorAddUnitCategory('Ewar', categoryAgi)
call HeroSelectorAddUnitCategory('Udea', categoryStr)
call HeroSelectorAddUnitCategory('Ulic', categoryInt)
call HeroSelectorAddUnitCategory('Udre', categoryStr)
call HeroSelectorAddUnitCategory('Ucrl', categoryStr)
call HeroSelectorSetUnitCategory('Hgam', categoryInt + categoryRanged)
call HeroSelectorSetUnitCategory('Eevi', categoryAgi + categoryMelee)
//call HeroSelectorAddUnit('Hpal', false) //add paladin as selectable Hero
//call HeroSelectorAddUnit('Hamg', false)
//call HeroSelectorAddUnit('Hblm', false)
//call HeroSelectorAddUnit('Hmkg', false)
//call HeroSelectorAddUnit('Obla', true) //this unit can only be randomed
//call HeroSelectorAddUnit('Ofar', false)
//call HeroSelectorAddUnit('Otch', true) //this unit can only be randomed
//call HeroSelectorAddUnit(0,false) //this is an empty box. It still takes a slot.
//call HeroSelectorAddUnit(0,false) //this is an empty box. It still takes a slot.
//call HeroSelectorAddUnit('Oshd', false)
//call HeroSelectorAddUnit('Edem', false)
//call HeroSelectorAddUnit(0,false) //this is an empty box. It still takes a slot.
//call HeroSelectorAddUnit(0,false) //this is an empty box. It still takes a slot.
//call HeroSelectorAddUnit('Ekee', false)
//call HeroSelectorAddUnit('Emoo', false)
//call HeroSelectorAddUnit('Ewar', true)
//call HeroSelectorAddUnit('Udea', false)
//call HeroSelectorAddUnit('Ulic', false)
//call HeroSelectorAddUnit('Udre', false)
//call HeroSelectorAddUnit('Ucrl', true)
endfunction
private function Init takes nothing returns nothing
local trigger trig
set trig = CreateTrigger()
call TriggerRegisterVariableEvent(trig, "udg_HeroSelectorEvent", EQUAL, 2.0 )
call TriggerAddAction(trig, function HeroSelectorButtonSelected)
set trig = CreateTrigger()
call TriggerRegisterVariableEvent(trig, "udg_HeroSelectorEvent", EQUAL, 1.0 )
call TriggerAddAction(trig, function HeroSelectorUnitCreated)
set trig = CreateTrigger()
call TriggerRegisterVariableEvent(trig, "udg_HeroSelectorEvent", EQUAL, 3.0 )
call TriggerAddAction(trig, function HeroSelectorUnitBaned)
set trig = CreateTrigger()
call TriggerRegisterVariableEvent(trig, "udg_HeroSelectorEvent", EQUAL, 4.0 )
call TriggerAddAction(trig, function HeroSelectorRepickButtonEvent)
set trig = CreateTrigger()
call TriggerRegisterVariableEvent(trig, "udg_HeroSelectorEvent", EQUAL, 5.0 )
call TriggerAddAction(trig, function HeroSelectorBanDoneButtonEvent)
endfunction
endlibrary