Name | Type | is_array | initial_value |
TasHeroLearnEx__Event | real | No | |
TasHeroLearnEx__Skill | abilcode | No | |
TasHeroLearnEx__SkillLevel | integer | No | |
TasHeroLearnEx__SkillString | string | No | |
TasHeroLearnEx__Unit | unit | No | |
TasHeroLearnEx__UnitCode | unitcode | No | |
TasHeroLearnExAddSkills | trigger | No | |
TasHeroLearnExLearnSkill | trigger | No |
library Ascii /* v1.1.0.0 TheDamian/Nestharus
************************************************************************************
*
* 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 TasHeroLearnEx initializer AutoInit requires Ascii
/**
TasHeroLearnEx V2e by Tasyen
A custom UI System to allow an Unit to have many skills to learn from.
public function CustomUnitLearnAbility takes unit u, integer abiCode returns boolean
Make Unit learn/improve abiCode and evoke a Learn Event
considers level requirments
the data used by unit does not not need to contain abiCode
*/
globals
// Where is the TOCFile in your map?
public string TocPath = "war3mapImported\\TasHeroLearnEx.toc"
public boolean AutoRun = true //(true) will create Itself at 0s, (false) you need to TasHeroLearnEx_Init()
public boolean ThrowEvent = true
public integer HeroAbilityLevelSkip = 2 // should match the map gameplay constant
public integer Cols = 8 //amout of buttons in one Row
public integer Rows = 1 // amount of Rows
public boolean ShowEnemy = true // can look into enemy builts false/true?
public boolean HideMaxLevelSlot = false // true shows empty slots for max Leveld skills.
public boolean UserControl = false // Show the Buttons to toggle ShowEnemy & HideMaxLevelSlot
public boolean HideWithoutUser = true // hide TasHeroLearnEx UI when currently nothing would be displayed.
public boolean UseUIScale = true
//ToolTip
public real ToolTipSizeX = 0.2
public real ToolTipPosX = 0.79
public real ToolTipPosY = 0.165
public framepointtype ToolTipPos = FRAMEPOINT_BOTTOMRIGHT
// ShowButton
public string OpenButtonTexture = "ReplaceableTextures\\CommandButtons\\BTNSkillz.blp"
// performance improve temps
public boolean EnforceUpdateOnce = true
public integer UpdateUILastData = 0
public integer UpdateUILastOffset = 0
public integer UpdateUILastUnit = 0
public integer UpdateUILastLevel = 0
public integer UpdateUILastPoints = 0
public integer LastAbiCode = 0
public integer LastAbiLevel = 0
public unit array Selected // current Selected Unit for [player]
public integer array ViewOffset // currentPage
public framehandle Parent
public framehandle SuperParent
public framehandle Open
public hashtable Hash
public integer AnyUnitKey = -1 // Hash Key for any unit
public integer ACacheKey = -99998
public integer SCacheKey = -99997
public integer InvalidKey = -99999
endglobals
//Happens once at creation, decides how TasHeroLearnEx is posed
public function PosBox takes framehandle frame returns nothing
//BlzFrameSetAbsPoint(frame, FRAMEPOINT_BOTTOMLEFT, 0.195, 0.135)
call BlzFrameSetPoint(frame, FRAMEPOINT_BOTTOMLEFT, BlzGetFrameByName("SimpleInfoPanelUnitDetail", 0), FRAMEPOINT_TOPLEFT, -0.1, 0.02)
endfunction
//Happens once at creation, decides where Open Button is posed
public function PosOpen takes framehandle frame returns nothing
//BlzFrameSetAbsPoint(frame, FRAMEPOINT_TOPRIGHT, 0.6, 0.15)
//BlzFrameSetPoint(frame, FRAMEPOINT_BOTTOMRIGHT, BlzGetFrameByName("SimpleInfoPanelUnitDetail", 0), FRAMEPOINT_TOPRIGHT, 0.1, 0.015)
call BlzFrameSetPoint(frame, FRAMEPOINT_BOTTOMRIGHT, BlzGetFrameByName("SimpleInfoPanelUnitDetail", 0), FRAMEPOINT_TOPLEFT, 0.0, -0.01)
endfunction
//Add one skill for this key
public function AddSkill takes integer key, integer abiCode returns nothing
local integer size = LoadInteger(Hash, key, 0) + 1
call SaveInteger(Hash, key, size, abiCode)
call SaveInteger(Hash, key, 0, size)
endfunction
//Add a bunch of skills to key expected format "ACfb,AInv,A070"
public function AddSkillBatch takes integer key, string abiString returns nothing
local integer startIndex = 0
local integer skillCode
loop
exitwhen startIndex + 3 >= StringLength(abiString)
set skillCode = S2A(SubString(abiString, startIndex, startIndex + 4))
set startIndex = startIndex + 5
call AddSkill(key, skillCode)
endloop
endfunction
// config functions relevant to user
// jassCode DataSetup
private function UserDataSetup takes nothing returns nothing
// supported Keys unit, unitCode, Player, AnyUnitKey; unit > unitCode > Player > AnyUnitKey
//bloodmage
//call AddSkillBatch('Hblm', "AHfs,AHbn,AHdr,AHpx,AHhb,AHds,AHre,AHad,AHbz,AHab,AHwe,AHmt,AHtc,AHtb,AHbh,AHav,AOwk,AOcr,AOmi,AOww,AOfs,AOsf,AOcl,AOeq")
//player blue
//call AddSkillBatch(1, "AUim,AUts,AUcb,AUls,AUfn,AUfu,AUdr,AUdd,AUav,AUsl,AUcs,AUin,AUdc,AUdp,AUau,AUan")
endfunction
// ParentFunc who you want as parent, this runs at InitBlizzard, if you need more control you need to modify the part that calls local function Init()
public function ParentFunc takes nothing returns framehandle
return BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
endfunction
// used for HeroData[0]
public function Filter takes unit u returns boolean
if IsUnitIllusion(u) then
return false
endif
//if not IsUnitType(u, UNIT_TYPE_HERO) then
// return false
//endif
//return true if this unit is allowed to use HeroData[0] HeroData[player]
return true
endfunction
// how many LearnPoints an unit has to spent
public function GetLearnPoints takes unit u returns integer
return GetHeroSkillPoints(u)
//return GetPlayerState(GetOwningPlayer(u), PLAYER_STATE_RESOURCE_GOLD)/100
endfunction
// Does the pay part and rejects learning when not enough resources are given
public function Costs takes unit u, integer abiCode returns boolean
// can't pay return false
if GetLearnPoints(u) <= 0 then
return false
endif
//SetPlayerState(GetOwningPlayer(unit), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(GetOwningPlayer(unit), PLAYER_STATE_RESOURCE_GOLD) - 100)
call UnitModifySkillPoints(u, -1)
return true
endfunction
private function LearnAction takes unit u, integer abiCode returns nothing
set udg_TasHeroLearnEx__Skill = abiCode
set udg_TasHeroLearnEx__Unit = u
set udg_TasHeroLearnEx__UnitCode = GetUnitTypeId(u)
set udg_TasHeroLearnEx__SkillLevel = GetUnitAbilityLevel(u, abiCode)
if ThrowEvent then
set udg_TasHeroLearnEx__Event = 1
set udg_TasHeroLearnEx__Event = 0
endif
endfunction
// System code
public function GetAbilityData takes integer abiCode, string tag returns real
// was this ability already parsed?
local string backup
local string abiString = A2S(abiCode)
local integer tagHash = StringHash(abiString + tag)
if not HaveSavedReal(Hash, ACacheKey, tagHash) then
// calc it and store it
// have ParseTags native?
//if ParseTags then
//local abiString = string.pack(">I4", abiCode)
//this.AbilityCache[abiCode+tag] = ParseTags("<"+abiString+","+tag+">")
//else
set backup = BlzGetAbilityExtendedTooltip(abiCode, 0)
call BlzSetAbilityExtendedTooltip(abiCode, "<"+abiString+","+tag+">", 0)
call SaveReal(Hash, ACacheKey, tagHash, S2R(BlzGetAbilityExtendedTooltip(abiCode, 0)))
call BlzSetAbilityExtendedTooltip(abiCode, backup, 0)
//endif
endif
return LoadReal(Hash, ACacheKey, tagHash)
endfunction
public function getDisabledIcon takes string icon returns string
//ReplaceableTextures\CommandButtons\BTNHeroPaladin.tga -> ReplaceableTextures\CommandButtonsDisabled\DISBTNHeroPaladin.tga
local integer iconHash
// make it lower to reduce the amount of cases and for warcraft 3 FilePath case does not matter
set icon = StringCase(icon, false)
set iconHash = StringHash(icon)
if not HaveSavedString(Hash, SCacheKey, iconHash) and SubString(icon, 34, 35) != "\\" then
return icon //this string has not enough chars return it
endif
if not HaveSavedString(Hash, SCacheKey, iconHash) then
//call BJDebugMsg(SubString(icon, 20, 41))
if SubString(icon, 20, 38) == "commandbuttons\\btn" then
//call BJDebugMsg(SubString(icon, 0, 34) + "disabled\\dis" + SubString(icon, 35, StringLength(icon)))
call SaveStr(Hash, SCacheKey, iconHash, SubString(icon, 0, 34) + "disabled\\dis" + SubString(icon, 35, StringLength(icon)))
// default wacraft 3 style
elseif SubString(icon, 20, 41) == "passivebuttons\\pasbtn" then
// call BJDebugMsg(SubString(icon, 0, 20) + "commandbuttonsdisabled\\disbtn" + SubString(icon, 41, StringLength(icon)))
call SaveStr(Hash, SCacheKey, iconHash, SubString(icon, 0, 20) + "commandbuttonsdisabled\\disbtn" + SubString(icon, 41, StringLength(icon)))
// recommented by hiveworkshop
elseif SubString(icon, 20, 38) == "passivebuttons\\pas" then
//call BJDebugMsg(SubString(icon, 0, 20) + "commandbuttonsdisabled\\dispas" + SubString(icon, 38, StringLength(icon)))
call SaveStr(Hash, SCacheKey, iconHash, SubString(icon, 0, 20) + "commandbuttonsdisabled\\dispas" + SubString(icon, 38, StringLength(icon)))
elseif SubString(icon, 20, 38) == "commandbuttons\\atc" then
//call BJDebugMsg(SubString(icon, 0, 34) + "disabled\\disatc" + SubString(icon, 38, StringLength(icon)))
call SaveStr(Hash, SCacheKey, iconHash, SubString(icon, 0, 34) + "disabled\\disatc" + SubString(icon, 38, StringLength(icon)))
endif
endif
return LoadStr(Hash, SCacheKey, iconHash)
endfunction
// supported DataMods
// when data system was choosen
public function SelectData takes unit u returns integer
// read the Count Field return the mainkey for the first found
if LoadInteger(Hash, GetHandleId(u), 0) > 0 then
return GetHandleId(u)
elseif LoadInteger(Hash, GetUnitTypeId(u), 0) > 0 then
return GetUnitTypeId(u)
elseif LoadInteger(Hash, GetPlayerId(GetOwningPlayer(u)), 0) > 0 and Filter(u) then
return GetPlayerId(GetOwningPlayer(u))
elseif LoadInteger(Hash, AnyUnitKey, 0) > 0 and Filter(u) then
return AnyUnitKey
else
return InvalidKey
endif
endfunction
// Make Unit learn abiCode and evoke a Learn Event
public function CustomUnitLearnAbility takes unit u, integer abiCode returns boolean
local integer levelReq
local integer levelSkipReq
if abiCode <= 0 or GetHandleId(u) == 0 then
return false
endif
if GetUnitAbilityLevel(u, abiCode) == 0 then
if R2I(GetAbilityData(abiCode, "reqLevel")) > GetUnitLevel(u) then
return false
endif
if not Costs(u, abiCode) then
return false
endif
call UnitAddAbility(u, abiCode)
call UnitMakeAbilityPermanent(u, true, abiCode)
elseif GetUnitAbilityLevel(u, abiCode) < BlzGetAbilityIntegerField(BlzGetUnitAbility(u, abiCode), ABILITY_IF_LEVELS) then
set levelReq = R2I(GetAbilityData(abiCode, "reqLevel"))
//levelSkipReq = BlzGetAbilityIntegerField(abi, ABILITY_IF_LEVEL_SKIP_REQUIREMENT)
set levelSkipReq = R2I(GetAbilityData(abiCode, "levelSkip" ))
if levelSkipReq == 0 then
set levelSkipReq = HeroAbilityLevelSkip
endif
set levelReq = levelSkipReq*GetUnitAbilityLevel(u, abiCode) + levelReq
if levelReq > GetUnitLevel(u) then
return false
endif
if not Costs(u, abiCode) then
return false
endif
call IncUnitAbilityLevel(u, abiCode)
call UnitMakeAbilityPermanent(u, true, abiCode)
else
//print("CustomUnitLearnEvent max Level", GetUnitName(u), GetAbilityName(abiCode))
return false
endif
call LearnAction(u, abiCode)
return true
endfunction
public function UpdateButton takes integer index, integer abiCode, integer level, integer levelMax returns nothing
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnButton", index), true)
call BlzFrameSetTexture(BlzGetFrameByName("TasHeroLearnButtonBackdrop", index), BlzGetAbilityIcon(abiCode), 0, false)
call BlzFrameSetTexture(BlzGetFrameByName("TasHeroLearnButtonBackdropDisabled", index), getDisabledIcon(BlzGetAbilityIcon(abiCode)), 0, false)
call BlzFrameSetTexture(BlzGetFrameByName("TasHeroLearnButtonBackdropPushed", index), BlzGetAbilityIcon(abiCode), 0, false)
if level >= levelMax then
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnButtonChargeBoxChecked", index), true)
call BlzFrameSetText(BlzGetFrameByName("TasHeroLearnButtonChargeText", index), "")
else
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnButtonChargeBoxChecked", index), false)
call BlzFrameSetText(BlzGetFrameByName("TasHeroLearnButtonChargeText", index), I2S(level + 1))
endif
endfunction
//async
public function UpdateUI takes nothing returns nothing
local boolean foundTooltip = false
local unit u = Selected[GetPlayerId(GetLocalPlayer())]
local integer data = SelectData(u)
local integer heroLevel = GetUnitLevel(u)
local boolean showCurrent = ShowEnemy or IsUnitAlly(u, GetLocalPlayer())
local boolean hasControl = IsUnitOwnedByPlayer(u, GetLocalPlayer()) or GetPlayerAlliance(GetOwningPlayer(u), GetLocalPlayer(), ALLIANCE_SHARED_CONTROL)
local integer i
local integer skillIndex
local integer abiCode
local integer level
local integer levelReq
local integer levelSkipReq
local integer levelMax
local integer learnPoints = GetLearnPoints(u)
local boolean skipUpdate
local integer view = ViewOffset[GetPlayerId(GetLocalPlayer())]
local real scale
if HideWithoutUser then
if (u == null or data == InvalidKey ) then
call BlzFrameSetVisible(SuperParent, false)
set u = null
return
else
call BlzFrameSetVisible(SuperParent, true)
endif
endif
if (IsUnitAlly(u, GetLocalPlayer()) or ShowEnemy) and data != InvalidKey and learnPoints > 0 then
call BlzFrameSetText(BlzGetFrameByName("TasHeroLearnButtonChargeText", 0), I2S(learnPoints))
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnButtonChargeBox", 0), true)
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnButtonSprite", 0), true)
else
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnButtonChargeBox", 0), false)
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnButtonSprite", 0), false)
endif
set scale = BlzFrameGetWidth(BlzGetFrameByName("ConsoleUIBackdrop", 0))
if UseUIScale and scale > 0.1 then
set scale = scale/0.8
call BlzFrameSetScale(Parent, scale)
call BlzFrameSetScale(Open, scale)
endif
if BlzFrameIsVisible(Parent) then
set skipUpdate = UpdateUILastData == data and UpdateUILastOffset == view and UpdateUILastUnit == GetHandleId(u) and UpdateUILastLevel == heroLevel and UpdateUILastPoints == learnPoints
if EnforceUpdateOnce then
set EnforceUpdateOnce = false
set skipUpdate = false
endif
set UpdateUILastData = data
set UpdateUILastOffset = view
set UpdateUILastUnit = GetHandleId(u)
set UpdateUILastPoints = learnPoints
set UpdateUILastLevel = heroLevel
set i = 1
loop
exitwhen i > Cols*Rows
set skillIndex = i + view
if data != InvalidKey and HaveSavedInteger(Hash, data, skillIndex) then
set abiCode = LoadInteger(Hash, data, skillIndex)
set level = GetUnitAbilityLevel(u, abiCode)
if level == 0 then
set levelReq = R2I(GetAbilityData(abiCode, "reqLevel"))
set levelSkipReq = 0 // does not matter much when one has currently level 0
set levelMax = 1 // Assume it can be learned atleast once
else
set levelReq = R2I(GetAbilityData(abiCode, "reqLevel" ))
set levelSkipReq = R2I(GetAbilityData(abiCode, "levelSkip"))
set levelMax = R2I(GetAbilityData(abiCode, "levels"))
endif
if levelSkipReq == 0 then
set levelSkipReq = HeroAbilityLevelSkip
endif
set levelReq = levelSkipReq*level + levelReq
// tooltip
if BlzFrameIsVisible(BlzGetFrameByName("TasHeroLearnButtonTooltip", i)) then
set foundTooltip = true
// only update Tooltip when needed
if abiCode != LastAbiCode or level != LastAbiLevel then
set LastAbiCode = abiCode
set LastAbiLevel = level
call BlzFrameSetTexture(BlzGetFrameByName("TasHeroLearnTooltipIcon", 0), BlzGetAbilityIcon(abiCode), 0, false)
if hasControl then
if heroLevel >= levelReq and level < levelMax then
call BlzFrameSetText(BlzGetFrameByName("TasHeroLearnTooltipText", 0), BlzGetAbilityResearchExtendedTooltip(abiCode, 0))
call BlzFrameSetText(BlzGetFrameByName("TasHeroLearnTooltipName", 0), BlzGetAbilityTooltip(abiCode, level))
elseif level >= levelMax then
call BlzFrameSetText(BlzGetFrameByName("TasHeroLearnTooltipName", 0), BlzGetAbilityTooltip(abiCode, level - 1))
call BlzFrameSetText(BlzGetFrameByName("TasHeroLearnTooltipText", 0), "|Cffffff00 - "+GetLocalizedString("QUESTCOMPLETED")+"|r\n\n"+ BlzGetAbilityResearchExtendedTooltip(abiCode, 0))
elseif heroLevel < levelReq then
call BlzFrameSetText(BlzGetFrameByName("TasHeroLearnTooltipName", 0), BlzGetAbilityTooltip(abiCode, level))
call BlzFrameSetText(BlzGetFrameByName("TasHeroLearnTooltipText", 0), GetLocalizedString("REQUIRESTOOLTIP") +"\n - "+GetLocalizedString("REQUIREDLEVELTOOLTIP")+" "+ I2S(levelReq)+"|r\n\n"+ BlzGetAbilityResearchExtendedTooltip(abiCode, 0))
endif
elseif showCurrent then
call BlzFrameSetText(BlzGetFrameByName("TasHeroLearnTooltipName", 0), BlzGetAbilityTooltip(abiCode, level - 1))
call BlzFrameSetText(BlzGetFrameByName("TasHeroLearnTooltipText", 0), BlzGetAbilityExtendedTooltip(abiCode, level - 1))
endif
endif
endif
// button
if abiCode > 0 and hasControl then
if not HideMaxLevelSlot or level < levelMax then
if not skipUpdate then
call UpdateButton(i, abiCode, level, levelMax)
endif
call BlzFrameSetEnable(BlzGetFrameByName("TasHeroLearnButton", i), heroLevel >= levelReq and level < levelMax)
else
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnButton", i), false)
endif
elseif abiCode > 0 and showCurrent and level >= 1 then
call BlzFrameSetEnable(BlzGetFrameByName("TasHeroLearnButton", i), false)
if not skipUpdate then
call UpdateButton(i, abiCode, level-1, levelMax)
endif
else
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnButton", i), false)
endif
else
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnButton", i), false)
endif
set i = i + 1
endloop
endif
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnTooltipBoxFrame", 0), foundTooltip)
set u = null
endfunction
private function SelectAction takes nothing returns nothing
local integer max
local integer skillCount
local integer data
set Selected[GetPlayerId(GetTriggerPlayer())] = GetTriggerUnit()
set data = SelectData(GetTriggerUnit())
if data != InvalidKey then
set skillCount = LoadInteger(Hash, data, 0)
//local max = R2I(math.max(0, (skillCount - 1)/(this.Cols)))
set max = R2I(IMaxBJ(0, (skillCount +Cols - Cols*Rows)/Cols))
call BlzFrameSetValue(BlzGetFrameByName("TasHeroLearnSlider", 0), IMinBJ(max, R2I(BlzFrameGetValue(BlzGetFrameByName("TasHeroLearnSlider", 0)))))
call BlzFrameSetMinMaxValue(BlzGetFrameByName("TasHeroLearnSlider", 0), 0, max)
else
call BlzFrameSetValue(BlzGetFrameByName("TasHeroLearnSlider", 0), 0)
call BlzFrameSetMinMaxValue(BlzGetFrameByName("TasHeroLearnSlider", 0), 0, 0)
endif
set EnforceUpdateOnce = true
call UpdateUI()
endfunction
private function ESCAction takes nothing returns nothing
if GetLocalPlayer() == GetTriggerPlayer() then
call BlzFrameSetVisible(Parent, false)
endif
endfunction
private function SliderAction takes nothing returns nothing
set ViewOffset[GetPlayerId(GetTriggerPlayer())] = R2I(BlzGetTriggerFrameValue()*Cols)
endfunction
private function WheelAction takes nothing returns nothing
if GetLocalPlayer() == GetTriggerPlayer() then
if BlzGetTriggerFrameValue() > 0 then
call BlzFrameSetValue(BlzGetFrameByName("TasHeroLearnSlider", 0), BlzFrameGetValue(BlzGetFrameByName("TasHeroLearnSlider", 0)) + 1)
else
call BlzFrameSetValue(BlzGetFrameByName("TasHeroLearnSlider", 0), BlzFrameGetValue(BlzGetFrameByName("TasHeroLearnSlider", 0)) - 1)
endif
endif
endfunction
private function ClearFoucsAction takes nothing returns nothing
if GetTriggerPlayer() == GetLocalPlayer() then
call BlzFrameSetEnable(BlzGetTriggerFrame(), false)
call BlzFrameSetEnable(BlzGetTriggerFrame(), true)
call StopCamera()
endif
endfunction
private function ToggleAAction takes nothing returns nothing
if GetLocalPlayer() == GetTriggerPlayer() then
set HideMaxLevelSlot = not HideMaxLevelSlot
endif
endfunction
private function ToggleBAction takes nothing returns nothing
if GetLocalPlayer() == GetTriggerPlayer() then
set ShowEnemy = not ShowEnemy
endif
endfunction
private function GuiAddSkillAction takes nothing returns nothing
call AddSkillBatch(udg_TasHeroLearnEx__UnitCode, udg_TasHeroLearnEx__SkillString)
endfunction
private function GuiLearnSkillAction takes nothing returns nothing
call CustomUnitLearnAbility(udg_TasHeroLearnEx__Unit, udg_TasHeroLearnEx__Skill)
endfunction
private function OpenAction takes nothing returns nothing
if GetLocalPlayer() == GetTriggerPlayer() then
call BlzFrameSetVisible(Parent, not BlzFrameIsVisible(Parent))
endif
endfunction
private function ButtonAction takes nothing returns nothing
local player p = GetTriggerPlayer()
local integer pId = GetPlayerId(p)
local unit u = Selected[pId]
local integer i
local integer skillIndex
if IsUnitType(u, UNIT_TYPE_DEAD) or IsUnitPaused(u) or IsUnitIllusion(u) then
return
endif
if IsUnitOwnedByPlayer(u, p) or GetPlayerAlliance(GetOwningPlayer(u), p, ALLIANCE_SHARED_CONTROL) then
set i = S2I(BlzFrameGetText(BlzGetTriggerFrame()))
set skillIndex = i + ViewOffset[pId]
//print(i, skillIndex)
call CustomUnitLearnAbility(Selected[pId], LoadInteger(Hash, SelectData(Selected[pId]), skillIndex))
else
call DisplayTextToPlayer(p, 0, 0, "Can't Learn - You have no control over this unit")
endif
endfunction
private function InitFrames takes nothing returns nothing
local trigger clearFocusTrigger = CreateTrigger()
local trigger mouseWheelTrigger = CreateTrigger()
local trigger sliderTrigger = CreateTrigger()
local trigger toggleATrigger = CreateTrigger()
local trigger toggleBTrigger = CreateTrigger()
local trigger openTrigger = CreateTrigger()
local trigger buttonTrigger = CreateTrigger()
local framehandle frame
local integer i
local integer count
call BlzGetFrameByName("ConsoleUIBackdrop", 0)
call BlzLoadTOCFile(TocPath)
call TriggerAddAction(clearFocusTrigger, function ClearFoucsAction)
call TriggerAddAction(mouseWheelTrigger, function WheelAction)
call TriggerAddAction(sliderTrigger, function SliderAction)
call TriggerAddAction(toggleATrigger, function ToggleAAction)
call TriggerAddAction(toggleBTrigger, function ToggleBAction)
call TriggerAddAction(openTrigger, function OpenAction)
call TriggerAddAction(buttonTrigger, function ButtonAction)
set SuperParent = BlzCreateFrame("TasHeroLearnParentFrame", ParentFunc(), 0, 0)
set Parent = BlzGetFrameByName("TasHeroLearnFrame", 0)
if GetHandleId(SuperParent) == 0 then
call BJDebugMsg("Error - TasHeroLearnEx Create TasHeroLearnParentFrame")
call BJDebugMsg("Check Imported toc & fdf file")
endif
call PosBox(Parent)
call BlzTriggerRegisterFrameEvent(clearFocusTrigger, Parent, FRAMEEVENT_CONTROL_CLICK)
call BlzTriggerRegisterFrameEvent(mouseWheelTrigger, Parent, FRAMEEVENT_MOUSE_WHEEL)
call BlzFrameSetSize(Parent, 0.04, 0.04)
set frame = BlzCreateFrameByType("SLIDER", "TasHeroLearnSlider", Parent, "QuestMainListScrollBar", 0)
call BlzFrameClearAllPoints(frame)
call BlzFrameSetPoint(frame, FRAMEPOINT_BOTTOMRIGHT, Parent, FRAMEPOINT_BOTTOMRIGHT, -0.004, 0.008)
call BlzFrameSetStepSize(frame, 1)
call BlzTriggerRegisterFrameEvent(sliderTrigger, frame, FRAMEEVENT_SLIDER_VALUE_CHANGED)
set frame = BlzCreateFrameByType("GLUETEXTBUTTON", "TasHeroLearnToggleA", Parent, "ScriptDialogButton", 0)
call BlzFrameSetSize(frame, 0.03, 0.03)
call BlzFrameSetText(frame, "A")
call BlzFrameSetPoint(frame, FRAMEPOINT_BOTTOMRIGHT, Parent, FRAMEPOINT_TOPRIGHT, -0.004, 0.003)
call BlzTriggerRegisterFrameEvent(toggleATrigger, frame, FRAMEEVENT_CONTROL_CLICK)
call BlzTriggerRegisterFrameEvent(clearFocusTrigger, frame, FRAMEEVENT_CONTROL_CLICK)
call BlzFrameSetVisible(frame, UserControl)
set frame = BlzCreateFrameByType("GLUETEXTBUTTON", "TasHeroLearnToggleB", Parent, "ScriptDialogButton", 0)
call BlzFrameSetSize(frame, 0.03, 0.03)
call BlzFrameSetText(frame, "B")
call BlzFrameSetPoint(frame, FRAMEPOINT_RIGHT, BlzGetFrameByName("TasHeroLearnToggleA", 0), FRAMEPOINT_LEFT, -0.004, 0)
call BlzTriggerRegisterFrameEvent(toggleBTrigger, frame, FRAMEEVENT_CONTROL_CLICK)
call BlzTriggerRegisterFrameEvent(clearFocusTrigger, frame, FRAMEEVENT_CONTROL_CLICK)
call BlzFrameSetVisible(frame, UserControl)
set Open = BlzCreateFrame("TasHeroLearnButton", SuperParent, 0, 0)
call BlzFrameSetTexture(BlzGetFrameByName("TasHeroLearnButtonBackdrop", 0), OpenButtonTexture, 0, false)
call BlzFrameSetTexture(BlzGetFrameByName("TasHeroLearnButtonBackdropDisabled", 0), getDisabledIcon(OpenButtonTexture), 0, false)
call BlzFrameSetTexture(BlzGetFrameByName("TasHeroLearnButtonBackdropPushed", 0), OpenButtonTexture, 0, false)
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnButtonChargeBox", 0), false)
call BlzGetFrameByName("TasHeroLearnButtonChargeText", 0)
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnButtonChargeBoxChecked", 0), false)
call PosOpen(Open)
call BlzTriggerRegisterFrameEvent(clearFocusTrigger, Open, FRAMEEVENT_CONTROL_CLICK)
call BlzTriggerRegisterFrameEvent(openTrigger, Open, FRAMEEVENT_CONTROL_CLICK)
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnButtonSprite", 0), false)
set count = 0
set i = 1
loop
exitwhen i > Cols*Rows
set frame = BlzCreateFrame("TasHeroLearnButton", Parent, 0, i)
call BlzFrameSetText(frame, I2S(i))
// reserve HandleIds to allow async access later
call BlzGetFrameByName("TasHeroLearnButtonBackdrop", i)
call BlzGetFrameByName("TasHeroLearnButtonBackdropDisabled", i)
call BlzGetFrameByName("TasHeroLearnButtonBackdropPushed", i)
call BlzGetFrameByName("TasHeroLearnButtonTooltip", i)
call BlzGetFrameByName("TasHeroLearnButtonChargeBox", i)
call BlzGetFrameByName("TasHeroLearnButtonChargeText", i)
call BlzGetFrameByName("TasHeroLearnButtonChargeBoxChecked", i)
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnButtonSprite", i), false)
set count = count + 1
if count > Cols then
call BlzFrameSetPoint(frame, FRAMEPOINT_TOPLEFT, BlzGetFrameByName("TasHeroLearnButton", i - Cols), FRAMEPOINT_BOTTOMLEFT, 0, -0.002)
set count = 1
elseif i > 1 then
call BlzFrameSetPoint(frame, FRAMEPOINT_LEFT, BlzGetFrameByName("TasHeroLearnButton", i - 1), FRAMEPOINT_RIGHT, 0.002, 0)
endif
call BlzTriggerRegisterFrameEvent(buttonTrigger, frame, FRAMEEVENT_CONTROL_CLICK)
call BlzTriggerRegisterFrameEvent(clearFocusTrigger, frame, FRAMEEVENT_CONTROL_CLICK)
call BlzTriggerRegisterFrameEvent(mouseWheelTrigger, frame, FRAMEEVENT_MOUSE_WHEEL)
set i = i + 1
endloop
call BlzFrameSetPoint(BlzGetFrameByName("TasHeroLearnButton", 1), FRAMEPOINT_TOPLEFT, Parent, FRAMEPOINT_TOPLEFT, 0.006, -0.006)
set frame = BlzGetFrameByName("TasHeroLearnButton", 1)
call BlzFrameSetSize(Parent, BlzFrameGetWidth(frame)*Cols + (Cols - 1)*0.002 + 0.023, BlzFrameGetHeight(frame)*Rows + (Rows - 1)*0.002 + 0.012)
call BlzFrameSetSize(BlzGetFrameByName("TasHeroLearnSlider", 0), BlzFrameGetWidth(BlzGetFrameByName("TasHeroLearnSlider", 0)), BlzFrameGetHeight(Parent) - 0.02)
// create one ToolTip which shows data for current hovered inside a timer.
// also reserve handleIds to allow async usage
call BlzCreateFrame("TasHeroLearnTooltipBoxFrame", SuperParent, 0, 0)
call BlzGetFrameByName("TasHeroLearnTooltipBox", 0)
call BlzGetFrameByName("TasHeroLearnTooltipIcon", 0)
call BlzGetFrameByName("TasHeroLearnTooltipName", 0)
call BlzGetFrameByName("TasHeroLearnTooltipSeperator", 0)
call BlzGetFrameByName("TasHeroLearnTooltipText", 0)
call BlzFrameSetSize(BlzGetFrameByName("TasHeroLearnTooltipText", 0), ToolTipSizeX, 0)
call BlzFrameSetAbsPoint(BlzGetFrameByName("TasHeroLearnTooltipText", 0), ToolTipPos, ToolTipPosX, ToolTipPosY)
call BlzFrameSetPoint(BlzGetFrameByName("TasHeroLearnTooltipBox", 0), FRAMEPOINT_TOPLEFT, BlzGetFrameByName("TasHeroLearnTooltipIcon", 0), FRAMEPOINT_TOPLEFT, -0.005, 0.005)
call BlzFrameSetPoint(BlzGetFrameByName("TasHeroLearnTooltipBox", 0), FRAMEPOINT_BOTTOMRIGHT, BlzGetFrameByName("TasHeroLearnTooltipText", 0), FRAMEPOINT_BOTTOMRIGHT, 0.005, -0.005)
call BlzFrameSetVisible(BlzGetFrameByName("TasHeroLearnTooltipBoxFrame", 0), false)
call BlzFrameSetVisible(Parent, false)
//call BlzFrameSetVisible(SuperParent, false)
endfunction
public function Init takes nothing returns nothing
local trigger trig
local integer i
set Hash = InitHashtable()
call UserDataSetup()
set trig = CreateTrigger()
call TriggerAddAction(trig, function ESCAction)
set i = 0
loop
exitwhen i >= bj_MAX_PLAYERS
call TriggerRegisterPlayerEventEndCinematic(trig, Player(i))
set i = i + 1
endloop
// selection
set trig = CreateTrigger()
call TriggerAddAction(trig, function SelectAction)
call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_UNIT_SELECTED)
// TooltipUpdate
call TimerStart(CreateTimer(), 0.2, true, function UpdateUI)
call InitFrames()
static if LIBRARY_FrameLoader then
call FrameLoaderAdd(function InitFrames)
endif
set udg_TasHeroLearnExAddSkills = CreateTrigger()
call TriggerAddAction(udg_TasHeroLearnExAddSkills, function GuiAddSkillAction)
set udg_TasHeroLearnExLearnSkill = CreateTrigger()
call TriggerAddAction(udg_TasHeroLearnExLearnSkill, function GuiLearnSkillAction)
endfunction
public function AutoInit takes nothing returns nothing
if AutoRun then
call Init()
endif
endfunction
endlibrary