├── Interface
└── Patch-C.MPQ
├── LUA
└── ClassLess
│ ├── A_encryption.lua
│ ├── Client.lua
│ ├── Levelup.lua
│ ├── Server.lua
│ └── data
│ ├── locks.data
│ ├── req.data
│ ├── spells.data
│ └── talents.data
├── README.md
└── SQL
└── character_classless.sql
/Interface/Patch-C.MPQ:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AstoriaCore/Astoria-ClasslessSystem/9eb3ec311e50f73d1694b88d708790f437ff2a87/Interface/Patch-C.MPQ
--------------------------------------------------------------------------------
/LUA/ClassLess/A_encryption.lua:
--------------------------------------------------------------------------------
1 | local charset = {} do -- [0-9a-zA-Z]
2 | for c = 48, 57 do table.insert(charset, string.char(c)) end
3 | for c = 65, 90 do table.insert(charset, string.char(c)) end
4 | for c = 97, 122 do table.insert(charset, string.char(c)) end
5 | end
6 |
7 | local randomSeed = os.clock()^5
8 |
9 | function randomString(length)
10 | if not length or length <= 0 then return '' end
11 | math.randomseed(randomSeed)
12 | return randomString(length - 1) .. charset[math.random(1, #charset)]
13 | end
14 |
15 | function checkSecret(player, client, server)
16 | local valid = (client == server)
17 | if not (valid) then
18 | player:SendNotification("ERRORMSG")
19 | end
20 | return valid
21 | end
--------------------------------------------------------------------------------
/LUA/ClassLess/Client.lua:
--------------------------------------------------------------------------------
1 | -- ___ ___ _ __ _____ ___ ___ ___ ___ ___ _ ___ _ __
2 | -- | __| __| |\ \ / / _ \ / _ \| \ | _ \ __| _ \/_\ / __| |/ /
3 | -- | _|| _|| |_\ \/\/ / (_) | (_) | |) | | / _|| _/ _ \ (__| ' <
4 | -- |_| |___|____\_/\_/ \___/ \___/|___/ |_|_\___|_|/_/ \_\___|_|\_\
5 |
6 |
7 | local AIO = AIO or require("AIO")
8 |
9 | -- CLIENT SECRET
10 | local clientSecret = ""
11 | local handlerName = "yQ4CiWjHET"
12 |
13 | --|TInterface/ICONS/VAS_RaceChange:35:35|t
14 | local LastContainerNum = 1
15 | -- Settings
16 | local iconSize = 35
17 | local leftConst = 172
18 | local itemsPerRow = 7
19 | local current_class = 1
20 | local current_spec = 1
21 | local prices = {}
22 |
23 | -- Ready-to-use for the system
24 |
25 | local classes = {"Druid", "Hunter", "Mage", "Paladin", "Priest", "Rogue", "Shaman", "Warlock", "Warrior", "MONK", "DEMONHUNTER"};
26 | local class_list = {"DRUID", "HUNTER", "MAGE", "PALADIN", "PRIEST", "ROGUE", "SHAMAN", "WARLOCK", "WARRIOR"}
27 | local spell_point_list = {}
28 | local talent_point_list = {}
29 |
30 |
31 | --Data
32 | if AIO.IsServer() then
33 | --Spells
34 | AIO.AddAddon("lua_scripts\\ClassLess\\data\\spells.data", "spells")
35 | --Talents
36 | AIO.AddAddon("lua_scripts\\ClassLess\\data\\talents.data", "talents")
37 | --Locks
38 | AIO.AddAddon("lua_scripts\\ClassLess\\data\\locks.data", "locks")
39 | --Requirements
40 | AIO.AddAddon("lua_scripts\\ClassLess\\data\\req.data", "req")
41 | end
42 |
43 | if AIO.AddAddon() then
44 | return
45 | end
46 |
47 | --Variables
48 |
49 | local spellsplus, spellsminus = {}, {}
50 | local tpellsplus, tpellsminus = {}, {}
51 | local talentsplus, talentsminus = {}, {}
52 | local db = CLDB
53 |
54 | --Functions
55 |
56 | local function CountSpellPoints(c, s)
57 | local r = 0
58 | for k,v in pairs(db.data.spells[class_list[c]][s][4]) do
59 | --check if v[1][1] in db.spells, if so r++
60 | if tContains(db.spells, v[1][1]) then
61 | r = r + 1
62 | end
63 | end
64 | return r
65 | end
66 |
67 | local function CountTalentPoints(c, s)
68 | local r = 0
69 | for k,v in pairs(db.data.talents[class_list[c]][s][4]) do
70 | --check if v[1][1] in db.spells, if so r++
71 | for i,j in pairs(v[1]) do
72 | if tContains(db.talents, j) then
73 | r = r + 1
74 | end
75 | end
76 | end
77 | return r
78 | end
79 |
80 | local function UpdatePointText()
81 | for k,v in pairs(class_list) do --zeta
82 | local cap = 0
83 | local ctp = 0
84 | for i = 1, 3 do
85 | local ap = CountSpellPoints(k, i)
86 | cap = cap + ap
87 | local tp = CountTalentPoints(k,i)
88 | ctp = ctp + tp
89 | for j = 1, 2 do
90 | _G["CLContainer"..j.."Sub"..k.."SubButton"..i].text:SetText(tostring(ap))
91 | _G["CLContainer"..j.."Sub"..k.."SubButton"..i].text2:SetText(tostring(tp))
92 | end
93 | end
94 | for j = 1, 2 do
95 | _G["CLContainer"..j.."SubButton"..k].text:SetText(tostring(cap))
96 | _G["CLContainer"..j.."SubButton"..k].text2:SetText(tostring(ctp))
97 | end
98 | end
99 | end
100 |
101 | local function FrameToggle(frame)
102 | local f = _G[frame]
103 | if f ~= nil then
104 | if f:IsVisible() ~= 1 then
105 | f:Show()
106 | elseif f:IsVisible() == 1 then
107 | f:Hide()
108 | end
109 | end
110 | end
111 |
112 | local function FrameShow(fname)
113 | local frame = fname
114 | if type(fname) ~= "table" then
115 | frame = _G[fname]
116 | end
117 | if frame ~= nil and frame:IsVisible() ~= 1 then
118 | frame:Show()
119 | end
120 | end
121 |
122 | local function FrameHide(fname)
123 | local frame = fname
124 | if type(fname) ~= "table" then
125 | frame = _G[fname]
126 | end
127 | if frame ~= nil and frame:IsVisible() == 1 then
128 | frame:Hide()
129 | end
130 | end
131 |
132 | --DoShit Function
133 | local function DoShit()
134 | --Table Functions
135 | local function tCopy(t)
136 | local u = {}
137 | for k, v in pairs(t) do
138 | u[k] = v
139 | end
140 | return setmetatable(u, getmetatable(t))
141 | end
142 |
143 | local function tRemoveKey(table, key)
144 | for i = 1, #table do
145 | if table[i] == key then
146 | tremove(table, i)
147 | end
148 | end
149 | end
150 |
151 | local function tCompare(t1, t2)
152 | if #t1 ~= #t2 then
153 | return false
154 | end
155 | for i = 1, #t1 do
156 | if t1[i] ~= t2[i] then
157 | return false
158 | end
159 | end
160 | return true
161 | end
162 |
163 | local function pairsSort(t, f)
164 | local a = {}
165 | for n in pairs(t) do
166 | table.insert(a, n)
167 | end
168 | table.sort(a, f)
169 | local i = 0
170 | local iter = function()
171 | i = i + 1
172 | if a[i] == nil then
173 | return nil
174 | else
175 | return a[i], t[a[i]]
176 | end
177 | end
178 | return iter
179 | end
180 |
181 | --Frame Creation Functions
182 | local function CreateTexture(base, layer, path, blend)
183 | local t = base:CreateTexture(nil, layer)
184 | if path then
185 | t:SetTexture(path)
186 | end
187 | if blend then
188 | t:SetBlendMode(blend)
189 | end
190 | return t
191 | end
192 |
193 | local function FrameBackground(frame, background)
194 | local t = CreateTexture(frame, "BACKGROUND")
195 | t:SetPoint("TOPLEFT")
196 | frame.topleft = t
197 |
198 | t = CreateTexture(frame, "BACKGROUND")
199 | t:SetPoint("TOPLEFT", frame.topleft, "TOPRIGHT")
200 | frame.topright = t
201 |
202 | t = CreateTexture(frame, "BACKGROUND")
203 | t:SetPoint("TOPLEFT", frame.topleft, "BOTTOMLEFT")
204 | frame.bottomleft = t
205 |
206 | t = CreateTexture(frame, "BACKGROUND")
207 | t:SetPoint("TOPLEFT", frame.topleft, "BOTTOMRIGHT")
208 | frame.bottomright = t
209 | -- frame.topleft:SetTexture(background .. "-TopLeft")
210 | --frame.topright:SetTexture(background .. "-TopRight")
211 | -- frame.bottomleft:SetTexture(background .. "-BottomLeft")
212 | --frame.bottomright:SetTexture(background .. "-BottomRight")
213 | end
214 |
215 | local function FrameLayout(frame, width, height)
216 | local texture_height = height / (256 + 75)
217 | local texture_width = width / (256 + 44)
218 |
219 | frame:SetSize(width, height)
220 |
221 | local wl, wr, ht, hb = texture_width * 256, texture_width * 64, texture_height * 256, texture_height * 128
222 |
223 | frame.topleft:SetSize(wl, ht)
224 | frame.topright:SetSize(wr, ht)
225 | frame.bottomleft:SetSize(wl, hb)
226 | frame.bottomright:SetSize(wr, hb)
227 | end
228 |
229 | local function MakeButton(name, parent) --gamma
230 | local button = CreateFrame("Button", name, parent)
231 | button:SetNormalFontObject(GameFontNormal)
232 | button:SetHighlightFontObject(GameFontHighlight)
233 | button:SetDisabledFontObject(GameFontDisable)
234 | if name == "CLButton1" or name == "CLButton2" then
235 | local texture = button:CreateTexture("BACKGROUND")
236 | if name == "CLButton1" then
237 | texture:SetTexture("Interface\\Icons\\INV_Misc_Book_09")
238 | else
239 | texture:SetTexture("Interface\\Icons\\Ability_Marksmanship")
240 | end
241 | -- texture:SetTexCoord(0, 0.625, 0, 0.6875)
242 | local size = button:GetSize()
243 | texture:SetAllPoints()
244 | texture:SetSize(0.5 * size, 0.5 * size)
245 | button.texture = texture
246 | --[[texture = button:CreateTexture("ARTWORK")
247 | texture:SetTexture("Interface\\Buttons\\CLCircle")
248 | --texture:SetTexCoord(0, 0.625, 0, 0.6875)
249 | texture:SetPoint("CENTER")
250 | texture:SetSize(0.7 * size, 0.7 * size)
251 | button.normal = texture
252 | button:SetNormalTexture(texture)
253 |
254 | texture = button:CreateTexture("ARTWORK")
255 | texture:SetTexture("Interface\\Buttons\\CLCircleActive")
256 | texture:SetPoint("CENTER")
257 | texture:SetSize(0.7 * size, 0.7 * size)
258 | button.pushed = texture
259 | button:SetPushedTexture(texture)
260 | ]]
261 | --[[texture = button:CreateTexture()
262 | texture:SetTexture "Interface\\Buttons\\UI-Panel-Button-Highlight"
263 | -- texture:SetTexCoord(0, 0.625, 0, 0.6875)
264 | texture:SetAllPoints(button)
265 | button:SetHighlightTexture(texture)]]
266 | else
267 | local texture = button:CreateTexture()
268 | texture:SetTexture "Interface\\Buttons\\UI-Panel-Button-Up"
269 | texture:SetTexCoord(0, 0.625, 0, 0.6875)
270 | texture:SetAllPoints(button)
271 | button.normal = texture
272 | button:SetNormalTexture(texture)
273 | texture = button:CreateTexture()
274 | texture:SetTexture "Interface\\Buttons\\UI-Panel-Button-Down"
275 | texture:SetTexCoord(0, 0.625, 0, 0.6875)
276 | texture:SetAllPoints(button)
277 | button.pushed = texture
278 | button:SetPushedTexture(texture)
279 | texture = button:CreateTexture()
280 | texture:SetTexture "Interface\\Buttons\\UI-Panel-Button-Highlight"
281 | texture:SetTexCoord(0, 0.625, 0, 0.6875)
282 | texture:SetAllPoints(button)
283 | button:SetHighlightTexture(texture)
284 | end
285 | return button
286 | end
287 |
288 | local function MakeRankFrame(button, anchor)
289 | --local t = CreateTexture(button, "OVERLAY", "Interface\\Textures\\border")
290 | t:SetSize(32, 32)
291 | t:SetPoint("CENTER", button, anchor)
292 | local fs = button:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
293 | --fs.texture = t
294 | fs:SetPoint("TOP", button, "BOTTOM", 0, -2)
295 | return fs
296 | end
297 |
298 | local function NewButton(name, parent, size, icon, rank, a, b, c, d, empty)
299 | local button = CreateFrame("Button", name, parent)
300 | -- ItemButtonTemplate (minus Count and Slot)
301 | button:SetSize(size, size)
302 | local t = CreateTexture(button, "BORDER")
303 | t:SetSize(size * 0.8, size * 0.8)
304 | t:SetPoint("CENTER")
305 | button.texture = t
306 | if(empty == nil) then
307 | t = CreateTexture(button, nil, "Interface\\Buttons\\CLCircle")
308 | t:SetSize(size * 1.2, size * 1.2)
309 | t:SetPoint("CENTER")
310 | button.normal = t
311 | button:SetNormalTexture(t)
312 | t = CreateTexture(button, nil, "Interface\\Buttons\\CLCircleActive")
313 | t:SetSize(size * 1.2, size * 1.2)
314 | t:SetPoint("CENTER")
315 | button.pushed = t
316 | button:SetPushedTexture(t)
317 | --[[t = CreateTexture(button, nil, "Interface\\Buttons\\ButtonHilight-Square", "ADD")
318 | t:SetSize(size, size)
319 | t:SetPoint("CENTER")
320 | button:SetHighlightTexture(t)]]
321 | -- TalentButtonTemplate
322 | --[[local texture = CreateTexture(button, "BACKGROUND", "Interface\\Buttons\\UI-EmptySlot-White")
323 | texture:SetSize(size * 1.7, size * 1.7)
324 | texture:SetPoint("CENTER")
325 | button.slot = texture]]
326 | end
327 | if rank ~= nil then
328 | button.rank = MakeRankFrame(button, "BOTTOMRIGHT")
329 | end
330 |
331 | if icon ~= nil then
332 | button.texture:SetTexture(icon)
333 | if a ~= nil then
334 | button.texture:SetTexCoord(a, b, c, d)
335 | end
336 | end
337 | return button
338 | end
339 |
340 | --Utility Functions
341 | function GetPoints(type)
342 | if type == "ap" then
343 | local ap = math.floor(UnitLevel("player") * 0.45) - #db.spells
344 | local tap = #spellsplus
345 | return ap - tap, tap
346 | end
347 |
348 | if type == "tp" then
349 | local tp = UnitLevel("player") - 9
350 | if tp < 0 then
351 | tp = 0
352 | end
353 | tp = tp - (#db.talents + #db.tpells)
354 | local ttp = #talentsplus + #tpellsplus
355 | return tp - ttp, ttp
356 | end
357 | return 0, 0
358 | end
359 | --main Frame Functions
360 | local function SelectTab(tab, cname, pname, bname)
361 | if tab ~= 0 then
362 | local parent = _G[pname]
363 | local ltab = parent:GetAttribute("tab")
364 |
365 | local button, lbutton = _G[bname .. tab], _G[bname .. ltab]
366 | local child, lchild = _G[cname .. tab], _G[cname .. ltab]
367 | if lchild ~= nil then
368 | FrameHide(lchild)
369 | end
370 | if lbutton ~= nil then
371 | lbutton:SetButtonState("NORMAL")
372 | end
373 | if button ~= nil then
374 | button:SetButtonState("PUSHED", true)
375 | end
376 | if child ~= nil then
377 | FrameShow(child)
378 | end
379 | parent:SetAttribute("tab", tab)
380 | end
381 | end
382 |
383 | local function LearnConfirm(action, state)
384 | local tab = _G["CLMainFrame"]:GetAttribute("tab")
385 | if tab ~= nil and tab > 0 then
386 | if action == "Apply" and state ~= "true" then
387 | StaticPopup_Show("LEARN_CONFIRM")
388 | end
389 | if action == "Reset" and state ~= "true" then
390 | StaticPopup_Show("RESET_CONFIRM")
391 | end
392 |
393 | if action == "Apply" and state == "true" then
394 | if tab == 1 then
395 | for i = 1, #spellsplus do
396 | if not tContains(db.spells, spellsplus[i]) then
397 | tinsert(db.spells, spellsplus[i])
398 | end
399 | end
400 | for i = 1, #tpellsplus do
401 | if not tContains(db.tpells, tpellsplus[i]) then
402 | tinsert(db.tpells, tpellsplus[i])
403 | end
404 | end
405 | for i=1, #spellsminus do
406 | if tContains(db.spells, spellsminus[i]) then
407 | tRemoveKey(db.spells, spellsminus[i])
408 | end
409 | end
410 | for i=1, #tpellsminus do
411 | if tContains(db.tpells, tpellsminus[i]) then
412 | tRemoveKey(db.tpells, tpellsminus[i])
413 | end
414 | end
415 | wipe(spellsplus)
416 | wipe(spellsminus)
417 | wipe(tpellsplus)
418 | wipe(tpellsminus)
419 | sort(db.spells)
420 | sort(db.tpells)
421 | AIO.Handle(handlerName, "LearnSpell", db.spells, db.tpells, clientSecret)
422 | end
423 |
424 | if tab == 2 then
425 | for i = 1, #talentsplus do
426 | if not tContains(db.talents, talentsplus[i]) then
427 | tinsert(db.talents, talentsplus[i])
428 | end
429 | end
430 | for i=1, #talentsminus do
431 | if tContains(db.talents, talentsminus[i]) then
432 | tRemoveKey(db.talents, talentsminus[i])
433 | end
434 | end
435 | wipe(talentsplus)
436 | wipe(talentsminus)
437 | sort(db.talents)
438 | AIO.Handle(handlerName, "LearnTalent", db.talents, clientSecret)
439 | end
440 |
441 |
442 | end
443 |
444 | if action == "Reset" and state == "true" then
445 | if tab == 1 then
446 | wipe(spellsplus)
447 | wipe(spellsminus)
448 | wipe(tpellsplus)
449 | wipe(tpellsminus)
450 | end
451 |
452 | if tab == 2 then
453 | wipe(talentsplus)
454 | wipe(talentsminus)
455 | end
456 |
457 | end
458 | UpdatePointText()
459 | SelectTab(tab, "CLContainer", "CLMainFrame", "CLButton")
460 | end
461 | end
462 |
463 | ------Fill Spells Functions
464 | local function TempLearnSpell(spell, talent)
465 | if tContains(spellsminus, spell) then
466 | tRemoveKey(spellsminus, spell)
467 | end
468 | if not tContains(spellsplus, spell) then
469 | tinsert(spellsplus, spell)
470 | end
471 | if talent == 1 then
472 | if tContains(tpellsminus, spell) then
473 | tRemoveKey(tpellsminus, spell)
474 | end
475 | if not tContains(tpellsplus, spell) then
476 | tinsert(tpellsplus, spell)
477 | end
478 | end
479 | end
480 |
481 | local function TempUnlearnSpell(spell, talent)
482 | if tContains(spellsplus, spell) then
483 | tRemoveKey(spellsplus, spell)
484 | end
485 | if not tContains(spellsminus, spell) then
486 | tinsert(spellsminus, spell)
487 | end
488 | if talent == 1 then
489 | if tContains(tpellsplus, spell) then
490 | tRemoveKey(tpellsplus, spell)
491 | end
492 | if not tContains(tpellsminus, spell) then
493 | tinsert(tpellsminus, spell)
494 | end
495 | end
496 | end
497 |
498 | local function TempLearnTalent(spell, talent)
499 | if tContains(talentsminus, spell) then
500 | tRemoveKey(talentsminus, spell)
501 | end
502 | if not tContains(talentsplus, spell) then
503 | tinsert(talentsplus, spell)
504 | end
505 | end
506 |
507 | local function TempUnlearnTalent(spell, talent)
508 | if tContains(talentsplus, spell) then
509 | tRemoveKey(talentsplus, spell)
510 | end
511 | if not tContains(talentsminus, spell) then
512 | tinsert(talentsminus, spell)
513 | end
514 | end
515 |
516 | local function ParseTooltip(spell)
517 | local f = CreateFrame("GameTooltip", "CLTmpTooltip", UIParent, "GameTooltipTemplate")
518 | f:SetOwner(UIParent, "ANCHOR_NONE")
519 | local link = GetSpellLink(spell)
520 | if link == nil then
521 | link = GetSpellLink(78)
522 | link = gsub(link, "78", spell)
523 | end
524 | f:SetHyperlink(link)
525 |
526 | local t = {}
527 |
528 | for i = 1, select("#", f:GetRegions()) do
529 | local ttl = _G["CLTmpTooltipTextLeft" .. i]
530 | local ttr = _G["CLTmpTooltipTextRight" .. i]
531 | if (ttl ~= nil and ttl:GetText() ~= nil) and (ttr ~= nil and ttr:GetText() ~= nil) then
532 | tinsert(t, {ttl:GetText(), ttr:GetText()})
533 | elseif (ttl ~= nil and ttl:GetText() ~= nil) then
534 | tinsert(t, ttl:GetText())
535 | end
536 | end
537 |
538 | f:ClearLines()
539 | f:Hide()
540 | return t
541 | end
542 |
543 | local function ButtonTooltip(button, spell, nspell, rank, ranks, level, lcolor, ccolor, state, cost, lock, req, rreq)
544 | local bname = button:GetName()
545 | local pt = ParseTooltip(spell)
546 | local c = RED_FONT_COLOR
547 | button.tooltip =
548 | _G[bname .. "tooltip"] or CreateFrame("GameTooltip", bname .. "tooltip", button, "GameTooltipTemplate")
549 |
550 | button:SetScript(
551 | "OnEnter",
552 | function()
553 | button.tooltip:Hide()
554 | button.tooltip:SetOwner(button, "ANCHOR_RIGHT")
555 | local link = GetSpellLink(nspell)
556 | if link == nil then
557 | link = GetSpellLink(78)
558 | link = gsub(link, "78", nspell)
559 | end
560 | button.tooltip:SetHyperlink(link)
561 | button.tooltip:AddDoubleLine("Current rank", rank .. "/" .. ranks, 1, 1, 1, 1, 1, 1)
562 | if pt[#pt] ~= nil and rank > 0 and ranks > 1 and rank ~= ranks then
563 | button.tooltip:AddLine(pt[#pt], nil, nil, nil, true)
564 | end
565 |
566 | if rreq ~= nil then
567 | button.tooltip:AddLine(rreq, c.r, c.g, c.b)
568 | end
569 | if rank < ranks then
570 | if req ~= nil then
571 | button.tooltip:AddLine(req, c.r, c.g, c.b)
572 | end
573 | if lock ~= nil then
574 | button.tooltip:AddLine(lock, c.r, c.g, c.b)
575 | end
576 | if level ~= nil then
577 | button.tooltip:AddLine("Requires level " .. level, lcolor.r, lcolor.g, lcolor.b)
578 | end
579 | button.tooltip:AddLine(cost, ccolor.r, ccolor.g, ccolor.b)
580 | end
581 | button.tooltip:AddLine("SPELLID: " .. spell)
582 | button.tooltip:Show()
583 | end
584 | )
585 |
586 | button:SetScript(
587 | "OnLeave",
588 | function()
589 | button.tooltip:Hide()
590 | end
591 | )
592 | end
593 |
594 | local function FillSpells(class, spec, parent, mode)
595 | local spells, eqt, spellcheck
596 |
597 | local spellcheck1 = tCopy(db.spells)
598 | for i = 1, #spellsplus do
599 | if not tContains(spellcheck1, spellsplus[i]) then
600 | tinsert(spellcheck1, spellsplus[i])
601 | else
602 | tremove(spellsplus, i)
603 | end
604 | end
605 | for i = 1, #spellsminus do
606 | if tContains(spellcheck1, spellsminus[i]) then
607 | tRemoveKey(spellcheck1, spellsminus[i])
608 | else
609 | tremove(spellsminus, i)
610 | end
611 | end
612 |
613 | local spellcheck2 = tCopy(db.talents)
614 | for i = 1, #talentsplus do
615 | if not tContains(spellcheck2, talentsplus[i]) then
616 | tinsert(spellcheck2, talentsplus[i])
617 | else
618 | tremove(talentsplus, i)
619 | end
620 | end
621 | for i = 1, #talentsminus do
622 | if tContains(spellcheck2, talentsminus[i]) then
623 | tRemoveKey(spellcheck2, talentsminus[i])
624 | else
625 | tremove(talentsminus, i)
626 | end
627 | end
628 |
629 | local allspells = tCopy(spellcheck1)
630 | for i = 1, #spellcheck2 do
631 | if not tContains(allspells, spellcheck2[i]) then
632 | tinsert(allspells, spellcheck2[i])
633 | end
634 | end
635 |
636 | if mode == "spell" then
637 | spells = db.data.spells[class][spec][4]
638 | eqt = "false"
639 | if tCompare(db.spells, spellcheck1) then
640 | eqt = "true"
641 | end
642 | spellcheck = spellcheck1
643 | else
644 | spells = db.data.talents[class][spec][4]
645 | eqt = "false"
646 | if tCompare(db.talents, spellcheck2) then
647 | eqt = "true"
648 | end
649 | spellcheck = spellcheck2
650 | end
651 |
652 | local left, top = leftConst, -12
653 |
654 | for i = 1, #spells do
655 | local spellid, levelid = spells[i][1], spells[i][2]
656 |
657 | local prank, rank, nrank, ranks, spell, nspell, nlevel
658 | rank, ranks = 0, #spellid
659 |
660 | for j = 1, ranks do
661 | if tContains(spellcheck, spellid[j]) then
662 | rank = j
663 | end
664 | end
665 |
666 | if rank > 0 then
667 | spell = spellid[rank]
668 | else
669 | rank = 0
670 | spell = spellid[1]
671 | end
672 | if rank + 1 <= ranks then
673 | nspell, nlevel, nrank = spellid[rank + 1], levelid[rank + 1], rank + 1
674 | else
675 | nspell, nlevel, nrank = spellid[rank], levelid[rank], rank
676 | end
677 | prank = rank - 1
678 |
679 | local icon = ({GetSpellInfo(nspell)})[3]
680 | if nspell == 75 then icon = "Interface/Icons/Ability_Whirlwind" end
681 | local button =
682 | _G["CLSpellsClass" .. class .. "Spec" .. spec .. mode .. i] or
683 | NewButton("CLSpellsClass" .. class .. "Spec" .. spec .. mode .. i, parent, iconSize, icon, "true")
684 | button:SetButtonState("NORMAL", "true")
685 | button:SetPoint("TOPLEFT", left, top)
686 | if button:GetAttribute("hrank") == nil or eqt == "true" then
687 | button:SetAttribute("hrank", rank)
688 | end
689 | if mode == "spell" then
690 | if spell_point_list[class] == nil then
691 | spell_point_list[class] = {}
692 | end
693 | if spell_point_list[class][spec] == nil then
694 | spell_point_list[class][spec] = {}
695 | end
696 | spell_point_list[class][spec][icon] = rank
697 | else
698 | if talent_point_list[class] == nil then
699 | talent_point_list[class] = {}
700 | end
701 | if talent_point_list[class][spec] == nil then
702 | talent_point_list[class][spec] = {}
703 | end
704 | talent_point_list[class][spec][icon] = rank
705 | end
706 | local hrank = button:GetAttribute("hrank")
707 |
708 | local state, saturated, color, acost, tcost, lock, req, rreq =
709 | "normal",
710 | 0,
711 | GREEN_FONT_COLOR,
712 | 1,
713 | 0,
714 | nil,
715 | nil,
716 | nil
717 | local ap, tp = GetPoints("ap"), GetPoints("tp")
718 | local lcolor, ccolor = color, color
719 | local nacost, ntcost = acost, tcost
720 | local ncost
721 |
722 | if rank == 1 and spells[i][4] == 1 then
723 | tcost = 1
724 | end
725 | if nrank == 1 and spells[i][4] == 1 then
726 | ntcost = 1
727 | end
728 |
729 | if rank == ranks then
730 | state = "full"
731 | end
732 |
733 | if state ~= "full" then
734 | if UnitLevel("player") < nlevel then
735 | state = "disabled"
736 | lcolor = RED_FONT_COLOR
737 | end
738 |
739 | if mode == "spell" then
740 | if ap < nacost or tp < ntcost then
741 | state = "disabled"
742 | ccolor = RED_FONT_COLOR
743 | end
744 | else
745 | if tp < nacost or ap < ntcost then
746 | state = "disabled"
747 | ccolor = RED_FONT_COLOR
748 | end
749 | end
750 |
751 | if db.locks[spell] ~= nil then
752 | for h = 1, #db.locks[spell] do
753 | if tContains(allspells, db.locks[spell][h]) then
754 | state = "disabled"
755 | lock = 'Locked by "' .. ({GetSpellInfo(db.locks[spell][h])})[1] .. '" ' .. mode
756 | break
757 | end
758 | end
759 | end
760 |
761 | if db.req[nspell] ~= nil then
762 | local reqs, reqr = ({GetSpellInfo(db.req[nspell])})[1], ({GetSpellInfo(db.req[nspell])})[2]
763 | if not tContains(allspells, db.req[nspell]) then
764 | state = "disabled"
765 | req = "req " .. mode .. ' "' .. reqs
766 | if reqr ~= "" then
767 | req = req .. "(" .. reqr .. ')"'
768 | else
769 | req = req .. '"'
770 | end
771 | end
772 | end
773 | end
774 |
775 | if db.rreq[spell] ~= nil then
776 | local rreqs, rreqr = ({GetSpellInfo(db.rreq[spell])})[1], ({GetSpellInfo(db.rreq[spell])})[2]
777 | if tContains(allspells, db.rreq[spell]) and rank ~= hrank then
778 | state = "req"
779 | rreq = "Required for " .. mode .. ' "' .. rreqs
780 | if rreqr ~= "" then
781 | rreq = rreq .. "(" .. rreqr .. ')"'
782 | else
783 | rreq = rreq .. '"'
784 | end
785 | end
786 | end
787 |
788 | if state == "disabled" and rank > 0 then
789 | state = "temp"
790 | end
791 |
792 | if state == "disabled" then
793 | saturated = 1
794 | color = GRAY_FONT_COLOR
795 | elseif state == "full" then
796 | color = NORMAL_FONT_COLOR
797 | elseif state == "temp" then
798 | color = RAID_CLASS_COLORS["SHAMAN"]
799 | elseif state == "req" then
800 | color = ORANGE_FONT_COLOR
801 | end
802 | button.texture:SetDesaturated(saturated)
803 | --button.slot:SetVertexColor(color.r, color.g, color.b)
804 | button.rank:SetVertexColor(color.r, color.g, color.b)
805 | button.rank:SetText(rank)
806 |
807 | if mode == "spell" then
808 | ncost = "Requires 1 AP"
809 | if ntcost == 1 then
810 | ncost = ncost .. ", 1 TP"
811 | end
812 | else
813 | ncost = "Requires 1 TP"
814 | if ntcost == 1 then
815 | ncost = ncost .. ", 1 AP"
816 | end
817 | end
818 |
819 | local clickable = true
820 |
821 | if state == "normal" and rank > hrank then
822 | if nrank <= ranks then
823 | button:RegisterForClicks("LeftButtonDown", "RightButtonDown")
824 | end
825 | end
826 | if state == "normal" and rank == hrank then
827 | if nrank <= ranks then
828 | button:RegisterForClicks("LeftButtonDown","RightButtonDown")
829 | end
830 | end
831 | if state == "normal" and rank == 0 then
832 | button:RegisterForClicks("LeftButtonDown")
833 | end
834 | if (state == "full" or state == "temp") and rank > hrank then
835 | button:RegisterForClicks("RightButtonDown")
836 | end
837 | if (state == "full" or state == "temp") and rank == hrank then
838 | button:RegisterForClicks("RightButtonDown")
839 | --clickable = false
840 | end
841 | if state == "req" and rank > hrank and nrank <= ranks and rreq ~= nil then
842 | if UnitLevel("player") < nlevel then
843 | button:RegisterForClicks()
844 | clickable = false
845 | else
846 | button:RegisterForClicks("LeftButtonDown")
847 | end
848 | end
849 | if state == "disabled" then
850 | button:RegisterForClicks()
851 | clickable = false
852 | end
853 |
854 | button:SetScript(
855 | "OnClick",
856 | function(self, key, down)
857 | if not (button:IsEnabled() and clickable ~= false) then return end
858 | local ap, tap = GetPoints("ap")
859 | local tp, ttp = GetPoints("tp")
860 | if key == "LeftButton" then
861 | if (mode == "spell") then
862 | if(ap > 0 and UnitLevel("player") >= nlevel) then
863 | if(ntcost == 1) then
864 | if(tp > 0) then
865 | TempLearnSpell(nspell, ntcost)
866 | end
867 | else
868 | TempLearnSpell(nspell, ntcost)
869 | end
870 | end
871 | else if mode == "talent" and tp >0 and UnitLevel("player") >= nlevel then
872 | TempLearnTalent(nspell, ntcost)
873 | end
874 | end
875 | end
876 |
877 | if key == "RightButton" then
878 | if mode == "spell" then
879 | TempUnlearnSpell(spell, tcost)
880 | else
881 | TempUnlearnTalent(spell, tcost)
882 | end
883 | end
884 |
885 | FillSpells(class, spec, parent, mode)
886 | button:Hide()
887 | button:Show()
888 | end)
889 |
890 | ButtonTooltip(button, spell, nspell, rank, ranks, nlevel, lcolor, ccolor, state, ncost, lock, req, rreq)
891 |
892 | if i / itemsPerRow == math.floor(i / itemsPerRow) then
893 | left = leftConst
894 | top = top - 60
895 | else
896 | left = left + 60
897 | end
898 | end
899 | end
900 |
901 | --Create Main Button
902 | local button =
903 | _G["CLButton"] or NewButton("CLButton", UIParent, 48, "Interface\\Tooltips\\Book_Icon", nil, nil, nil, nil, nil, true) --Interface\\ICONS\\INV_Enchant_FormulaEpic_01
904 | button:SetMovable(true)
905 | button:EnableMouse(true)
906 | button:SetToplevel(true)
907 | button:RegisterForDrag("RightButton")
908 | button:SetScript("OnDragStart", button.StartMoving)
909 | button:SetScript("OnDragStop", button.StopMovingOrSizing)
910 | button:SetPoint("RIGHT", -24, 0)
911 | button:SetScript(
912 | "OnClick",
913 | function()
914 | FrameToggle("CLMainFrame")
915 | end
916 | )
917 |
918 | AIO.SavePosition(button)
919 |
920 | --button.flash = CreateFrame("Frame", "CLButtonFlash", button)
921 | --button.flash:SetAllPoints()
922 | --button.flash:Hide()
923 | --local texture = button.flash:CreateTexture()
924 | -- texture:SetTexture("Interface\\Cooldown\\star4")
925 | -- texture:SetAllPoints()
926 | -- texture:SetBlendMode("ADD")
927 | -- button.animation = texture:CreateAnimationGroup()
928 | -- local a1 = button.animation:CreateAnimation("Scale")
929 | -- a1:SetScale(2.5, 2.5)
930 | -- a1:SetDuration(3)
931 | -- a1:SetSmoothing("OUT")
932 |
933 | -- local a2 = button.animation:CreateAnimation("Rotation")
934 | -- a2:SetDegrees(360)
935 | -- a2:SetDuration(3)
936 | -- a2:SetSmoothing("OUT")
937 | -- button.animation:SetLooping("BOUNCE")
938 | -- button.flash:SetScript(
939 | -- "OnShow",
940 | -- function()
941 | -- button.animation:Play()
942 | -- end
943 | -- )
944 | -- button.flash:SetScript(
945 | -- "OnHide",
946 | -- function()
947 | -- button.animation:Stop()
948 | -- end
949 | -- )
950 |
951 | button.tooltip =
952 | _G["CLButtontooltip"] or CreateFrame("GameTooltip", "CLButtontooltip", button, "GameTooltipTemplate")
953 | button:SetScript(
954 | "OnEnter",
955 | function()
956 | local ap, tp= GetPoints("ap"), GetPoints("tp")
957 | button.tooltip:Hide()
958 | button.tooltip:SetOwner(button, "ANCHOR_RIGHT")
959 | button.tooltip:AddLine("Distribute your Ability or Talents Points", nil, nil, nil, true)
960 | local c = GREEN_FONT_COLOR
961 | if ap > 0 or tp > 0 then
962 | local string =
963 | "You have\n" ..
964 | ap .. " Ability Points\n" .. tp .. " Talent Points"
965 | button.tooltip:AddLine(string, c.r, c.g, c.b, true)
966 | end
967 | button.tooltip:AddLine("Drag with right button for move", 1, 1, 1, true)
968 | button.tooltip:Show()
969 | end
970 | )
971 | button:SetScript(
972 | "OnLeave",
973 | function()
974 | button.tooltip:Hide()
975 | end
976 | )
977 |
978 | button:SetScript(
979 | "OnUpdate",
980 | function()
981 | local ap, tp = GetPoints("ap"), GetPoints("tp")
982 | if ap > 0 or tp > 0 then
983 | FrameShow(button.flash)
984 | else
985 | FrameHide(button.flash)
986 | end
987 | end
988 | )
989 |
990 | button:RegisterEvent("PLAYER_LEVEL_UP")
991 | button:SetScript(
992 | "OnEvent",
993 | function()
994 | local tab = _G["CLMainFrame"]:GetAttribute("tab")
995 | if tab ~= 0 then
996 | SelectTab(tab, "CLContainer", "CLMainFrame", "CLButton")
997 | end
998 | end
999 | )
1000 |
1001 | --Create Main Frame
1002 | local frame = CLMainFrame or CreateFrame("Frame", "CLMainFrame", UIParent)
1003 | frame:Hide()
1004 | frame:SetMovable(true)
1005 | frame:EnableMouse(true)
1006 | frame:SetToplevel(true)
1007 |
1008 | frame.titleRegion = frame:CreateTitleRegion()
1009 | frame.titleRegion:SetSize(967, 24) -- 600 wide x 24 tall
1010 | frame.titleRegion:SetPoint("TOPLEFT") -- anchor the titleRegion to top left of frame
1011 | -- this is the drag bar texture
1012 | frame.titleTexture = frame:CreateTexture("frame_titleTexture", "ARTWORK")
1013 | frame.titleTexture:SetSize(967, 24) -- texture is the same size as the title drag bar
1014 | frame.titleTexture:SetPoint("TOPLEFT")
1015 |
1016 |
1017 | frame:RegisterForDrag("LeftButton")
1018 | frame:SetToplevel(true)
1019 | frame:SetSize(967, 670) -- 420x680
1020 | --[[frame:SetBackdrop(
1021 | {
1022 | bgFile = "Interface\\TutorialFrame\\TutorialFrameBackground",
1023 | edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
1024 | tile = true,
1025 | edgeSize = 16,
1026 | tileSize = 32,
1027 | insets = {left = 5, right = 5, top = 5, bottom = 5}
1028 | }
1029 | )]]
1030 |
1031 | --FrameBackground(frame, "Interface\\QuestFrame\\UI-QuestLog-Empty")
1032 | frame:SetPoint("CENTER", 0, 0)
1033 | frame:SetScript("OnDragStart", frame.StartMoving)
1034 | frame:SetScript("OnDragStop", frame.StopMovingOrSizing)
1035 | frame:SetAttribute("tab", 0)
1036 | frame:SetAttribute("child", "CLContainer")
1037 |
1038 | AIO.SavePosition(frame)
1039 |
1040 | local function TabSelect(frame)
1041 | if (frame == nil) then frame = _G["CLMainFrame"] end
1042 | local tab = frame:GetAttribute("tab")
1043 | if tab == 0 then
1044 | tab = 1
1045 | end
1046 | SelectTab(tab, "CLContainer", "CLMainFrame", "CLButton")
1047 | end
1048 |
1049 | frame:SetScript(
1050 | "OnShow",
1051 | function()
1052 | TabSelect()
1053 | UpdatePointText()
1054 | end
1055 | )
1056 |
1057 | frame:SetScript(
1058 | "OnHide",
1059 | function()
1060 | local tab = frame:GetAttribute("tab")
1061 | if tab ~= 0 then
1062 | FrameHide("Container" .. tab)
1063 | end
1064 | end
1065 | )
1066 |
1067 | frame:SetScript(
1068 | "OnUpdate",
1069 | function()
1070 | local ap, tap = GetPoints("ap")
1071 | local tp, ttp = GetPoints("tp")
1072 | -- local string =icons[1].." "..icons[2].."\n"
1073 | local string2 = ap
1074 | if tap > 0 then
1075 | string2 = string2 .. "(" .. tap .. ")"
1076 | end
1077 | -- string = string .. " AP "..icons[1].." " .. tp
1078 | string2 = string2.." AP " .. tp
1079 | if ttp > 0 then
1080 | string2 = string2 .. "(" .. ttp .. ")"
1081 | end
1082 | string2 = string2 .. " TP "--..icons[2]
1083 |
1084 | if _G["CLMainFramePoints"] ~= nil then
1085 | -- CLMainFramePoints.text:SetText(string)
1086 | CLMainFramePoints.text2:SetText(string2)
1087 | end
1088 |
1089 | local tab = _G["CLMainFrame"]:GetAttribute("tab")
1090 | if tab ~= nil and tab > 0 then
1091 |
1092 | if (tab == 1 and #spellsplus + #spellsminus > 0) or (tab == 2 and #talentsplus + #talentsminus + #tpellsplus + #tpellsminus > 0) then
1093 | FrameShow("CLResetButtonFrame")
1094 | else
1095 | FrameHide("CLResetButtonFrame")
1096 | end
1097 | end
1098 | end
1099 | )
1100 |
1101 | -- Close button
1102 | local button = _G["CLMainFrameClose"] or CreateFrame("Button", "CLMainFrameClose", _G["CLMainFrame"])
1103 | button:SetSize(36, 36)
1104 | button:SetPoint("TOPRIGHT")
1105 | button:SetNormalTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Up")
1106 | button:SetPushedTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Down")
1107 | button:SetHighlightTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Highlight")
1108 | button:SetScript(
1109 | "OnClick",
1110 | function()
1111 | FrameHide("CLMainFrame")
1112 | end
1113 | )
1114 |
1115 | -- AP and TP points
1116 | local frame = _G["CLMainFramePoints"] or CreateFrame("Frame", "CLMainFramePoints", _G["CLMainFrame"])
1117 | frame:SetSize(160, 32)
1118 | frame:SetPoint("TOPLEFT", 25, -30)
1119 | frame.text = frame:CreateFontString("CLMainFramePointsText", "OVERLAY", "GameFontNormal")
1120 | frame.text:SetTextColor(199/255,42/255,42/255)
1121 | CLMainFramePoints.text:SetJustifyV("MIDDLE");
1122 | CLMainFramePoints.text:SetJustifyH("LEFT");
1123 | frame.text:SetPoint("CENTER")
1124 |
1125 | frame.text2 = frame:CreateFontString("CLMainFramePointsText2", "OVERLAY", "GameFontNormal")
1126 | frame.text2:SetTextColor(204/255,126/255,43/255)
1127 | CLMainFramePoints.text2:SetJustifyV("MIDDLE");
1128 | CLMainFramePoints.text2:SetJustifyH("LEFT");
1129 | frame.text2:SetPoint("CENTER")
1130 | --frame:SetScript("OnUpdate", UpdatePoints)
1131 |
1132 | -- Learn Confirm and cancel
1133 | local frame = _G["CLResetFrame"] or CreateFrame("Frame", "CLResetFrame", _G["CLMainFrame"])
1134 | frame:SetSize(160, 32)
1135 | frame:SetPoint("BOTTOMRIGHT")
1136 | --frame:SetScript("OnUpdate", UpdateReset)
1137 |
1138 | local frame = _G["CLResetButtonFrame"] or CreateFrame("Frame", "CLResetButtonFrame", _G["CLResetFrame"])
1139 | frame:Hide()
1140 | frame:SetSize(160, 32)
1141 | frame:SetPoint("CENTER")
1142 |
1143 | local frame = _G["CLWipeButtonFrame"] or CreateFrame("Frame", "CLWipeButtonFrame", _G["CLResetFrame"])
1144 | frame:SetSize(32, 32)
1145 | frame:SetPoint("LEFT", 20,0)
1146 |
1147 | local button =
1148 | _G["CLWipeButton"] or
1149 | NewButton(
1150 | "CLWipeButton",
1151 | _G["CLWipeButtonFrame"],
1152 | 36,
1153 | "Interface\\Tooltips\\Reverse_White",
1154 | nil
1155 | )
1156 | button:SetPoint("BOTTOMRIGHT", 10, - 8)
1157 | button:SetScript(
1158 | "OnClick",
1159 | function()
1160 | if not (button:IsEnabled()) then return end
1161 | StaticPopup_Show("WIPE_SPELLS")
1162 | end
1163 | )
1164 |
1165 |
1166 | StaticPopupDialogs["WIPE_SPELLS"] = {
1167 | text = "Please, confirm resetting ALL your spells and talents",
1168 | button1 = YES,
1169 | button2 = NO,
1170 | OnAccept = function()
1171 | AIO.Handle(handlerName, "WipeAll", clientSecret)
1172 | TabSelect()
1173 | _G["CLMainFrame"]:Hide()
1174 | UpdatePointText()
1175 | end,
1176 | OnShow = function(self)
1177 | rst = db.reset + 1
1178 | if (rst > #prices) then
1179 | rst = #prices
1180 | end
1181 | MoneyFrame_Update(self.moneyFrame, prices[rst]);
1182 | end,
1183 | timeout = 0,
1184 | whileDead = true,
1185 | hideOnEscape = true,
1186 | hasMoneyFrame = 1,
1187 | preferredIndex = 3
1188 | }
1189 |
1190 |
1191 | local frame = _G["CLUnusedButtonFrame"] or CreateFrame("Frame", "CLUnusedButtonFrame", _G["CLResetFrame"])
1192 | frame:SetSize(32, 32)
1193 | frame:SetPoint("BOTTOMLEFT",-20,0)
1194 |
1195 | local button =
1196 | _G["CLUnusedButton"] or
1197 | NewButton(
1198 | "CLUnusedButton",
1199 | _G["CLUnusedButtonFrame"],
1200 | 36,
1201 | "Interface\\Tooltips\\conviction",
1202 | nil
1203 | )
1204 | button:SetPoint("BOTTOMRIGHT", 100, - 8)
1205 | button:SetScript(
1206 | "OnClick",
1207 | function()
1208 | if not (button:IsEnabled()) then return end
1209 | StaticPopup_Show("BRUH")
1210 | end
1211 | )
1212 |
1213 |
1214 | StaticPopupDialogs["BRUH"] = {
1215 | text = "This Classless System is presented to you by the Astoria Staff Team!",
1216 | button1 = THANKS,
1217 | button2 = AWESOME,
1218 |
1219 | timeout = 0,
1220 | whileDead = true,
1221 | hideOnEscape = true,
1222 | preferredIndex = 3
1223 | }
1224 |
1225 |
1226 |
1227 |
1228 | local buttons = {"Apply", "Reset"}
1229 | for i = 1, #buttons do
1230 | --buttons:
1231 | local button = _G["CLResetButton" .. i] or MakeButton("CLResetButton" .. i, _G["CLResetButtonFrame"])
1232 | button:SetText(buttons[i])
1233 | button:SetSize(75, 32)
1234 | button:SetPoint("LEFT", 80 * (i - 1)-321, 45) --
1235 | button:SetScript(
1236 | "OnClick",
1237 | function()
1238 | if not (button:IsEnabled()) then return end
1239 | LearnConfirm(buttons[i], "false")
1240 | end
1241 | )
1242 | end
1243 |
1244 | --Learn and reset confirm dialogs
1245 | StaticPopupDialogs["LEARN_CONFIRM"] = {
1246 | text = "Please, confirm learning.",
1247 | button1 = "Yes",
1248 | button2 = "No",
1249 | OnAccept = function()
1250 | LearnConfirm("Apply", "true")
1251 | end,
1252 | timeout = 0,
1253 | whileDead = true,
1254 | hideOnEscape = true,
1255 | preferredIndex = 3
1256 | }
1257 |
1258 | StaticPopupDialogs["RESET_CONFIRM"] = {
1259 | text = "Please, confirm resetting.",
1260 | button1 = "Yes",
1261 | button2 = "No",
1262 | OnAccept = function()
1263 | LearnConfirm("Reset", "true")
1264 | end,
1265 | timeout = 0,
1266 | whileDead = true,
1267 | hideOnEscape = true,
1268 | preferredIndex = 3
1269 | }
1270 |
1271 | --Main Tab buttons, containers
1272 | local buttons = {"", ""}
1273 | for i = 1, #buttons do
1274 | --buttons:
1275 | local button = _G["CLButton" .. i] or MakeButton("CLButton" .. i, _G["CLMainFrame"], true)
1276 | button:SetText(buttons[i])
1277 | button:SetSize(18,18)
1278 | button:SetPoint("TOP",50*(i) +6, -110) --alpha
1279 | button.norm = button:CreateTexture(nil, "ARTWORK")
1280 | button.norm:SetTexture("Interface/Buttons/CLCircle")
1281 | button.norm:SetPoint("CENTER")
1282 | button.norm:SetSize(30,30)
1283 | button:SetNormalTexture(button.norm)
1284 | button.push = button:CreateTexture(nil, "OVERLAY")
1285 | button.push:SetTexture("Interface/Buttons/CLCircleActive")
1286 | button.push:SetPoint("CENTER")
1287 | button.push:SetSize(30,30)
1288 | button:SetPushedTexture(button.push)
1289 | button:SetScript(
1290 | "OnClick",
1291 | function()
1292 | SelectTab(i, "CLContainer", "CLMainFrame", "CLButton")
1293 | SelectTab(current_class, "CLContainer"..i.."Sub", "CLContainer"..i, "CLContainer"..i.."SubButton")
1294 | SelectTab(current_spec, "CLContainer"..i.."Sub"..current_class.."Sub", "CLContainer"..i.."Sub"..current_class, "CLContainer"..i.."Sub"..current_class.."SubButton")
1295 | end
1296 | )
1297 | --containers:
1298 | local frame = _G["CLContainer" .. i] or CreateFrame("Frame", "CLContainer" .. i, _G["CLMainFrame"])
1299 | frame:SetSize (967, 670)
1300 | frame:SetPoint("TOPLEFT")
1301 | frame:SetAttribute("tab", 0)
1302 | frame:SetAttribute("child", "CLContainer" .. i .. "Sub")
1303 | frame:Hide()
1304 | frame:SetScript(
1305 | "OnShow",
1306 | function()
1307 | local tab = frame:GetAttribute("tab")
1308 | if tab == 0 then
1309 | tab = 1
1310 | end
1311 | local child = frame:GetAttribute("child")
1312 | SelectTab(tab, child, "CLContainer" .. i, child .. "Button")
1313 | end
1314 | )
1315 | end
1316 |
1317 |
1318 | local frame = _G["CLClassesFrame"] or CreateFrame("Frame", "CLClassesFrame", _G["CLMainFrame"])
1319 | frame:SetSize(967, 670)
1320 | frame:SetPoint("TOPLEFT")
1321 | t = CreateTexture(frame, "BACKGROUND")
1322 | t:SetTexCoord(0, 0.944, 0, 0.654)
1323 | frame.background = t
1324 | frame.background:SetTexture("Interface\\Tooltips\\CLMainFrame")
1325 | frame.background:SetAllPoints()
1326 |
1327 |
1328 |
1329 | -- frame:SetBackdrop(
1330 | -- {
1331 | -- bgFile = "Interface\\TutorialFrame\\TutorialFrameBackground",
1332 | -- edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
1333 | -- tile = true,
1334 | -- edgeSize = 16,
1335 | -- tileSize = 16,
1336 | -- insets = {left = 0, right = 0, top = 2, bottom = 2}
1337 | -- }
1338 | -- )
1339 |
1340 | for index = 1, 2 do
1341 | --Class buttons for spells and talents
1342 | local i = 1
1343 | local arr
1344 | local mode
1345 | if index == 1 then
1346 | arr = db.data.spells
1347 | mode = "spell"
1348 | else
1349 | arr = db.data.talents
1350 | mode = "talent"
1351 | end
1352 | for k, v in pairsSort(arr) do
1353 | local class, cnum, inum = k, i, index
1354 | local button =
1355 | _G["CLContainer" .. index .. "SubButton" .. i] or
1356 | NewButton(
1357 | "CLContainer" .. index .. "SubButton" .. i,
1358 | _G["CLContainer" .. index],
1359 | 36,
1360 | "Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES",
1361 | nil,
1362 | unpack(CLASS_ICON_TCOORDS[class])
1363 | )
1364 | button:SetPoint("TOPLEFT", 50, - 54 - 60 * i) --beta
1365 | button.text = _G["CLContainer"..index.."SubButton"..i.."Text"] or button:CreateFontString("CLContainer"..index.."SubButton"..i.."Text", "OVERLAY")
1366 | button.text:SetFont("Fonts\\FRIZQT__.TTF", 12, "OUTLINE")
1367 | button.text:SetPoint("CENTER", 50, 0)
1368 | button.text:SetText(tostring(CountSpellPoints(i,1) + CountSpellPoints(i,2) + CountSpellPoints(i,3)))
1369 | button.text:SetTextColor(186/255,38/255,38/255)
1370 | button.texttex = button:CreateTexture(nil, "ARTWORK")
1371 | button.texttex:SetTexture("Interface/Buttons/CLCircleSmall")
1372 | button.texttex:SetPoint("CENTER", button.text, "CENTER")
1373 | button.text2 = _G["CLContainer"..index.."SubButton"..i.."Text2"] or button:CreateFontString("CLContainer"..index.."SubButton"..i.."Text2", "OVERLAY")
1374 | button.text2:SetFont("Fonts\\FRIZQT__.TTF", 12, "OUTLINE")
1375 | button.text2:SetPoint("CENTER", 80, 0)
1376 | button.text2:SetText(tostring(CountTalentPoints(i,1) + CountTalentPoints(i,2) + CountTalentPoints(i, 3)))
1377 | button.text2:SetTextColor(204/255,126/255,43/255)
1378 | button.text2tex = button:CreateTexture(nil, "ARTWORK")
1379 | button.text2tex:SetTexture("Interface/Buttons/CLCircleSmall")
1380 | button.text2tex:SetPoint("CENTER", button.text2, "CENTER")
1381 | button:SetScript(
1382 | "OnClick",
1383 | function()
1384 | if not (button:IsEnabled()) then return end --delta
1385 | current_class = cnum
1386 | SelectTab(
1387 | cnum,
1388 | "CLContainer".. inum .."Sub",
1389 | "CLContainer" .. inum,
1390 | "CLContainer".. inum .."SubButton"
1391 | )
1392 | LastContainerNum = inum
1393 | end
1394 | )
1395 |
1396 | local frame =
1397 | _G["CLContainer" .. index .. "Sub" .. i] or
1398 | CreateFrame("Frame", "CLContainer" .. index .. "Sub" .. i, _G["CLContainer" .. index])
1399 | --frame:SetBackdrop({bgFile="Interface\\Buttons\\WHITE8X8"})
1400 | frame:SetSize(_G["CLContainer" .. index]:GetSize())
1401 | frame:SetPoint("TOPLEFT")
1402 | frame:SetAttribute("tab", 0)
1403 | frame:SetAttribute("child", "CLContainer" .. index .. "Sub" .. i .. "Sub")
1404 | frame:Hide()
1405 | frame:SetScript(
1406 | "OnShow",
1407 | function()
1408 | local tab = frame:GetAttribute("tab")
1409 | if tab == 0 then
1410 | tab = 1
1411 | end
1412 | local child = frame:GetAttribute("child")
1413 | SelectTab(tab, child, "CLContainer" .. inum .. "Sub" .. cnum, child .. "Button")
1414 | end
1415 | )
1416 |
1417 | --buttons and containers for spells
1418 | for j = 1, #arr[class] do
1419 | local snum = j
1420 | local button =
1421 | _G["CLContainer" .. index .. "Sub" .. i .. "SubButton" .. j] or
1422 | NewButton(
1423 | "CLContainer" .. index .. "Sub" .. i .. "SubButton" .. j,
1424 | _G["CLContainer" .. index .. "Sub" .. i],
1425 | 36,
1426 | "Interface\\Icons\\" .. arr[class][j][2],
1427 | nil
1428 | )
1429 | button:SetPoint("TOP", 50 * (j) -20, -30)
1430 | button.text = button:CreateFontString(nil, "OVERLAY")
1431 | button.text:SetFont("Fonts\\FRIZQT__.TTF", 12, "OUTLINE")
1432 | button.text:SetPoint("CENTER", -10, -35)
1433 | button.text:SetText(tostring(CountSpellPoints(i,j)))
1434 | button.text:SetTextColor(186/255,38/255,38/255)
1435 | button.texttex = button:CreateTexture(nil, "ARTWORK")
1436 | button.texttex:SetTexture("Interface/Buttons/CLCircleSmall")
1437 | button.texttex:SetPoint("CENTER", button.text, "CENTER")
1438 | button.text2 = button:CreateFontString(nil, "OVERLAY")
1439 | button.text2:SetFont("Fonts\\FRIZQT__.TTF", 12, "OUTLINE")
1440 | button.text2:SetPoint("CENTER", 15, -35)
1441 | button.text2:SetText(tostring(CountTalentPoints(i,j)))
1442 | button.text2:SetTextColor(204/255,126/255,43/255)
1443 | button.text2tex = button:CreateTexture(nil, "ARTWORK")
1444 | button.text2tex:SetTexture("Interface/Buttons/CLCircleSmall")
1445 | button.text2tex:SetPoint("CENTER", button.text2, "CENTER")
1446 | button:SetScript(
1447 | "OnClick",
1448 | function()
1449 | if not (button:IsEnabled()) then return end--eta
1450 | current_spec = snum
1451 | SelectTab(
1452 | snum,
1453 | "CLContainer".. inum .."Sub" .. cnum .. "Sub",
1454 | "CLContainer".. inum .."Sub" .. cnum,
1455 | "CLContainer".. inum .."Sub" .. cnum .. "SubButton"
1456 | )
1457 | end
1458 | )
1459 |
1460 | local frame =
1461 | _G["CLContainer" .. index .. "Sub" .. i .. "Sub" .. j] or
1462 | CreateFrame(
1463 | "Frame",
1464 | "CLContainer" .. index .. "Sub" .. i .. "Sub" .. j,
1465 | _G["CLContainer" .. index .. "Sub" .. i]
1466 | )
1467 | frame:SetSize(
1468 | _G["CLContainer" .. index .. "Sub" .. i]:GetWidth()+10,
1469 | _G["CLContainer" .. index .. "Sub" .. i]:GetHeight()+35
1470 | )
1471 | frame:SetPoint("TOP", 200, - 145)
1472 | FrameBackground(frame, "Interface\\TalentFrame\\" .. arr[class][j][3])
1473 | FrameLayout(frame, frame:GetWidth(), frame:GetHeight()+45)
1474 | frame:Hide()
1475 | frame:SetScript(
1476 | "OnShow",
1477 | function()
1478 | local timer = GetTime()
1479 | frame:SetScript(
1480 | "OnUpdate",
1481 | function()
1482 | if GetTime() - timer >= 0.1 then
1483 | FillSpells(class, snum, frame, mode)
1484 | _G["Zin"] = spell_point_list
1485 | frame:SetScript("OnUpdate", nil)
1486 | end
1487 | end
1488 | )
1489 | end
1490 | )
1491 | end
1492 |
1493 | i = i + 1
1494 | end
1495 | end --end of index
1496 |
1497 |
1498 |
1499 | --ClassLess Bars
1500 | local frame = CLBarsFrame or CreateFrame("Frame", "CLBarsFrame", UIParent)
1501 | frame:SetMovable(true)
1502 | frame:EnableMouse(true)
1503 | frame:SetToplevel(true)
1504 | frame:RegisterForDrag("LeftButton")
1505 | frame:SetToplevel(true)
1506 | --frame:SetSize(172, 104)
1507 | frame:SetSize(172, 79)
1508 | frame:SetBackdrop(
1509 | {
1510 | bgFile = "",
1511 | edgeFile = "",
1512 | tile = true,
1513 | edgeSize = 16,
1514 | tileSize = 32,
1515 | insets = {left = 5, right = 5, top = 5, bottom = 5}
1516 | }
1517 | )
1518 | frame:SetPoint("CENTER", 0, 0)
1519 | frame:SetScript("OnDragStart", frame.StartMoving)
1520 | frame:SetScript("OnDragStop", frame.StopMovingOrSizing)
1521 |
1522 | AIO.SavePosition(frame)
1523 |
1524 | -- local energy={0,1,3,6} -- delete
1525 | local energy = {1}
1526 | local colors = {
1527 | -- [0] = {r = 0, g = 0, b = 255}, -- delete
1528 | [1] = {r = 255, g = 0, b = 0},
1529 | -- [3] = {r = 255, g = 255, b = 0} -- delete
1530 | -- [6]={r=0,g=209,b=255}, -- delete
1531 | }
1532 |
1533 | for i = 1, #energy do
1534 | local e = energy[i]
1535 | local c = colors[e]
1536 | local bar = CreateFrame("StatusBar", nil, _G["CLBarsFrame"])
1537 | bar:SetPoint("TOPLEFT", 8, -20 * (i - 1) - 8)
1538 | bar:SetWidth(158)
1539 | bar:SetHeight(20)
1540 | bar:SetStatusBarTexture("Interface\\TARGETINGFRAME\\UI-StatusBar")
1541 | bar:GetStatusBarTexture():SetHorizTile(false)
1542 | bar:GetStatusBarTexture():SetVertTile(false)
1543 | bar:SetStatusBarColor(c.r, c.g, c.b)
1544 |
1545 | bar.bg = bar:CreateTexture(nil, "BACKGROUND")
1546 | bar.bg:SetTexture("Interface\\TARGETINGFRAME\\UI-StatusBar")
1547 | bar.bg:SetAllPoints(true)
1548 | -- bar.bg:SetVertexColor(181, 255, 235)
1549 | bar.bg:SetVertexColor(0, 0, 0)
1550 |
1551 | bar.value = bar:CreateFontString(nil, "OVERLAY")
1552 | bar.value:SetPoint("CENTER")
1553 | bar.value:SetFont("Fonts\\FRIZQT__.TTF", 12, "OUTLINE")
1554 | bar.value:SetJustifyH("CENTER")
1555 | bar.value:SetShadowOffset(1, -1)
1556 | bar.value:SetTextColor(1, 1, 1)
1557 |
1558 | bar:SetScript(
1559 | "Onupdate",
1560 | function()
1561 | local pw = UnitPower("player", e) or 0
1562 | local pwm = UnitPowerMax("player", e) or 100
1563 | bar:SetMinMaxValues(0, pwm)
1564 | bar:SetValue(pw)
1565 | bar.value:SetText(pw .. "/" .. pwm)
1566 | end
1567 | )
1568 | end
1569 | end --End of Doshit
1570 |
1571 | --Main Execution
1572 | local MyHandlers = AIO.AddHandlers(handlerName, {})
1573 |
1574 |
1575 | function MyHandlers.LoadVars(player, spr, tpr, tar,rem, rst, prc, scr, rsd)
1576 | --Init
1577 | db.spells = spr
1578 | db.tpells = tpr
1579 | db.talents = tar
1580 | db.reset = rst
1581 | prices = prc
1582 | if (rsd ~= true) then
1583 | clientSecret = scr
1584 | DoShit()
1585 | end
1586 | end
1587 |
1588 | --hook original Talent Frame
1589 | function ToggleTalentFrame()
1590 | FrameToggle("CLMainFrame")
1591 | end
1592 |
--------------------------------------------------------------------------------
/LUA/ClassLess/Levelup.lua:
--------------------------------------------------------------------------------
1 | -- ___ ___ _ __ _____ ___ ___ ___ ___ ___ _ ___ _ __
2 | -- | __| __| |\ \ / / _ \ / _ \| \ | _ \ __| _ \/_\ / __| |/ /
3 | -- | _|| _|| |_\ \/\/ / (_) | (_) | |) | | / _|| _/ _ \ (__| ' <
4 | -- |_| |___|____\_/\_/ \___/ \___/|___/ |_|_\___|_|/_/ \_\___|_|\_\
5 |
6 |
7 | local function OnLevel(event, player)
8 | local level=player:GetLevel()
9 | if level>=10 then if not player:HasSkill(414) then player:SetSkill(414, 0, 1, 1) end end
10 | if level>=20 then if not player:HasSkill(413) then player:SetSkill(413, 0, 1, 1) end end
11 | if level>=40 then if not player:HasSkill(293) then player:SetSkill(293, 0, 1, 1) end end
12 | end
13 |
14 | RegisterPlayerEvent(13, OnLevel)
15 |
16 | local plrs = GetPlayersInWorld()
17 | if plrs then
18 | for i, player in ipairs(plrs) do
19 | OnLevel(i, player)
20 | end
21 | end
--------------------------------------------------------------------------------
/LUA/ClassLess/Server.lua:
--------------------------------------------------------------------------------
1 | -- ___ ___ _ __ _____ ___ ___ ___ ___ ___ _ ___ _ __
2 | -- | __| __| |\ \ / / _ \ / _ \| \ | _ \ __| _ \/_\ / __| |/ /
3 | -- | _|| _|| |_\ \/\/ / (_) | (_) | |) | | / _|| _/ _ \ (__| ' <
4 | -- |_| |___|____\_/\_/ \___/ \___/|___/ |_|_\___|_|/_/ \_\___|_|\_\
5 |
6 |
7 | -- SERVER SECRET
8 | local serverSecret = randomString(128)
9 | local handlerName = "yQ4CiWjHET"
10 |
11 | local prices = {10000, 50000, 100000, 150000, 200000, 350000}
12 |
13 | --Functions
14 | local function tContains(table, item)
15 | local index = 1
16 | while table[index] do
17 | if (item == table[index]) then
18 | return true
19 | end
20 | index = index + 1
21 | end
22 | return nil
23 | end
24 |
25 | local function toTable(string)
26 | local t = {}
27 | if string ~= "" then
28 | for i in string.gmatch(string, "([^,]+)") do
29 | table.insert(t, tonumber(i))
30 | end
31 | end
32 | return t
33 | end
34 |
35 | local function toString(tbl)
36 | local string = ""
37 | if #tbl > 1 then
38 | string = table.concat(tbl, ",")
39 | elseif #tbl == 1 then
40 | string = tbl[1]
41 | end
42 | return string
43 | end
44 |
45 | --Init
46 | local AIO = AIO or require("AIO")
47 | local MyHandlers = AIO.AddHandlers(handlerName, {})
48 | local spells, tpells, talents, stats, resets = {}, {}, {}, {}, {}
49 | local AttributesAuraIds = {7464, 7471, 7477, 7468, 7474} -- Strength, Agility, Stamina, Intellect, Spirit
50 |
51 | local function SendVars(msg, player, resend)
52 | local guid = player:GetGUIDLow()
53 | local sendspells = spells[guid] or ""
54 | local sendtpells = tpells[guid] or ""
55 | local sendtalents = talents[guid] or ""
56 | local sendstats = stats[guid] or "0,0,0,0,0"
57 | local sendreset = resets[guid] or 0
58 | AIO.Handle(player, handlerName, "LoadVars", sendspells, sendtpells, sendtalents, sendstats, sendreset, prices, serverSecret, resend)
59 | end
60 |
61 | AIO.AddOnInit(SendVars)
62 |
63 | --Database Functions
64 | --create DB for GUID
65 | local function DBCreate(guid)
66 | CharDBQuery("INSERT INTO character_classless VALUES (" .. guid .. ", '', '', '', '0,0,0,0,0', 0)")
67 | end
68 |
69 | --Read DB for GUID
70 | local function DBRead(querry)
71 | local spells, tpells, talents, stats, reset = "", "", "", "0,0,0,0,0", 0
72 | if querry ~= nil then
73 | spells = querry:GetString(1)
74 | tpells = querry:GetString(2)
75 | talents = querry:GetString(3)
76 | stats = "0,0,0,0,0"
77 | reset = querry:GetUInt32(5)
78 | end
79 | return spells, tpells, talents, stats, reset
80 | end
81 |
82 | --Write DB for GUID
83 | local function DBWrite(guid, entry, value)
84 | local querry = "UPDATE character_classless SET " .. entry .. "='" .. value .. "' WHERE guid = " .. guid
85 | CharDBQuery(querry)
86 | return true
87 | end
88 |
89 | --Delete DB for GUID
90 | local function OnDelete(event, guid)
91 | CharDBQuery("DELETE FROM character_classless WHERE guid = " .. guid)
92 | end
93 |
94 | --Utility Functions
95 | local function OnLogin(event, player)
96 | local guid = player:GetGUIDLow()
97 | local sp, tsp, tal, sta, reset = "", "", "", "0,0,0,0,0", 0
98 | local querry = CharDBQuery("SELECT * FROM character_classless WHERE guid = " .. guid)
99 | if querry == nil then
100 | DBCreate(guid)
101 | else
102 | sp, tsp, tal, sta, reset = DBRead(querry)
103 | end
104 | spells[guid] = toTable(sp)
105 | tpells[guid] = toTable(tsp)
106 | talents[guid] = toTable(tal)
107 | stats[guid] = toTable(sta)
108 | resets[guid] = reset
109 | end
110 |
111 | local function OnLogout(event, player)
112 | local guid = player:GetGUIDLow()
113 | DBWrite(guid, "spells", toString(spells[guid]))
114 | DBWrite(guid, "tpells", toString(tpells[guid]))
115 | DBWrite(guid, "talents", toString(talents[guid]))
116 | DBWrite(guid, "stats", "0,0,0,0,0")
117 | DBWrite(guid, "resets", resets[guid])
118 | spells[guid] = nil
119 | tpells[guid] = nil
120 | talents[guid] = nil
121 | stats[guid] = nil
122 | resets[guid] = nil
123 | end
124 |
125 | RegisterPlayerEvent(2, OnDelete)
126 | RegisterPlayerEvent(3, OnLogin)
127 | RegisterPlayerEvent(4, OnLogout)
128 |
129 |
130 | local plrs = GetPlayersInWorld()
131 | if plrs then
132 | for i, player in ipairs(plrs) do
133 | OnLogin(i, player)
134 | end
135 | end
136 |
137 | function MyHandlers.LearnSpell(player, spr, tpr, clientSecret)
138 | local isValid = checkSecret(player, clientSecret, serverSecret)
139 | if not (isValid) then return end
140 | local guid = player:GetGUIDLow()
141 | for i = 1, #spr do
142 | local spell = spr[i]
143 | if not player:HasSpell(spell) then
144 |
145 | player:LearnSpell(spell)
146 | end
147 | end
148 | for i = 1, #spells[guid] do
149 | local spell = spells[guid][i]
150 | if not tContains(spr, spell) then
151 | player:RemoveSpell(spell)
152 | end
153 | end
154 | for i = 1, #tpells[guid] do
155 | local spell = tpells[guid][i]
156 | if not tContains(spr, spell) then
157 | player:RemoveSpell(spell)
158 | end
159 | end
160 | spells[guid] = spr
161 | tpells[guid] = tpr
162 | DBWrite(guid, "spells", toString(spr))
163 | DBWrite(guid, "tpells", toString(tpr))
164 | player:SaveToDB()
165 | end
166 |
167 | function MyHandlers.LearnTalent(player, tar, clientSecret)
168 | local isValid = checkSecret(player, clientSecret, serverSecret)
169 | if not (isValid) then return end
170 | local guid = player:GetGUIDLow()
171 | for i = 1, #tar do
172 | local spell = tar[i]
173 | if not player:HasSpell(spell) then
174 | player:LearnSpell(spell)
175 | end
176 | end
177 | for i = 1, #talents[guid] do
178 | local talent = talents[guid][i]
179 | if not tContains(tar, talent) then
180 | player:RemoveSpell(talent)
181 | end
182 | end
183 | talents[guid] = tar
184 | DBWrite(guid, "talents", toString(tar))
185 | player:SaveToDB()
186 | end
187 |
188 |
189 |
190 | function MyHandlers.WipeAll(player, clientSecret)
191 | local isValid = checkSecret(player, clientSecret, serverSecret)
192 | if not (isValid) then return end
193 |
194 | local guid = player:GetGUIDLow()
195 |
196 | rst = resets[guid] + 1
197 | if (rst > #prices) then
198 | rst = #prices
199 | end
200 |
201 | price = prices[rst]
202 | if (player:GetCoinage() < price) then
203 | player:SendNotification("Not enough money to reset.")
204 | return
205 | end
206 |
207 | player:ModifyMoney(-price)
208 |
209 | table.sort(spells[guid], function(a, b) return a > b end)
210 | table.sort(tpells[guid], function(a, b) return a > b end)
211 | table.sort(talents[guid], function(a, b) return a > b end)
212 | for i=1,#spells[guid] do
213 | local spell=spells[guid][i]
214 | if player:HasSpell(spell) then
215 | player:RemoveSpell(spell)
216 | end
217 | end
218 |
219 | for i=1,#tpells[guid] do
220 | local spell=tpells[guid][i]
221 | if player:HasSpell(spell) then
222 | player:RemoveSpell(spell)
223 | player:RemoveSpell(spell)
224 | end
225 | end
226 |
227 | for i=1,#talents[guid] do
228 | local spell=talents[guid][i]
229 | if player:HasSpell(spell) then
230 | player:RemoveSpell(spell)
231 | end
232 | end
233 |
234 | spells[guid]={}
235 | tpells[guid]={}
236 | talents[guid]={}
237 | stats[guid]={0,0,0,0,0}
238 |
239 | resets[guid] = resets[guid] + 1
240 |
241 | DBWrite(guid,"spells","")
242 | DBWrite(guid,"tpells","")
243 | DBWrite(guid,"talents","")
244 | DBWrite(guid,"stats","0,0,0,0,0")
245 | DBWrite(guid,"resets",resets[guid])
246 | player:SaveToDB()
247 | SendVars(AIO.Msg(), player, true)
248 | end
249 |
250 |
251 | local function PLAYER_EVENT_ON_SAVE(event, player)
252 | player:SendBroadcastMessage("You're saved! :)")
253 | end
254 |
255 | -- RegisterPlayerEvent( 25, PLAYER_EVENT_ON_SAVE )
--------------------------------------------------------------------------------
/LUA/ClassLess/data/locks.data:
--------------------------------------------------------------------------------
1 | --LOCKS
2 | local tlocks={
3 | {{100,20252,3411},781,{2983,36554},49576,1953,48020,{1850,16979,49376}},
4 | {47528,{6552,72},1766,57994},
5 | {47476,2139,15487,34490},
6 | {49016,12292,57934,19574,31884,47241,50334},
7 | {{48982,49005,55233},12975,19236,6201,61336},
8 | {64382,32375},
9 | {18499,19574,6346,49039,8143,50334},
10 | {871,498,19263,5277,48792,30823,22812,47585},
11 | {5246,8122,5484},
12 | {633,12043,33206,47788,16188,17116},
13 | {642,61999,20608,45438,693,20484},
14 | {56222,355,20736,6795,62124},
15 | {1161,59671,5209,31789},
16 | {12472,10060,32182,2825},
17 | {{3563,3567,3566,32272,49358,35715},{3561,3562,3565,32271,49359,33690}},
18 | {{49361,11417,32267,11418,11420,35717},{49360,32266,11416,10059,11419,33691}},
19 | {12051,64901,{1454,18220},34074,29166,16190,54428},
20 | {49042,12299,16252,20143},
21 | {55129,12297,{17002,57878},16254,20096},
22 | {29590,13705,30816,53620},
23 | {55107,12163,20111},
24 | {49226,23584,13715},
25 | {48978,61216},
26 | {48987,12320,14138,{19426,19370},16255,20117},
27 | {49006,46865,29140},
28 | }
29 |
30 | if CLDB==nil then CLDB={} end
31 | if CLDB.locks==nil then CLDB.locks={} end
32 |
33 | CLDB.locks={}
34 | for i=1,#tlocks do
35 | local spells=tlocks[i]
36 | for j=1,#spells do
37 |
38 | spell=spells[j]
39 | if type(spell)~="table" then spell={spell} end
40 |
41 | for k=1,#spell do
42 | tspell=spell[k]
43 | if CLDB.locks[tspell]==nil then CLDB.locks[tspell] ={} end
44 |
45 | for l=1,#spells do
46 | if l~=j then
47 | if type(spells[l])~="table" then
48 | tinsert(CLDB.locks[tspell],spells[l]) else for m=1,#spells[l] do tinsert(CLDB.locks[tspell],spells[l][m]) end end
49 | end
50 |
51 | end
52 | end
53 | end
54 | end
55 |
--------------------------------------------------------------------------------
/LUA/ClassLess/data/req.data:
--------------------------------------------------------------------------------
1 | --REQUIREMENTS
2 | local treq={
3 | {{25894,25918,27143,48937,48938},{19854,25290,27142,48935,48936}},
4 | {25898,20217},
5 | {25899,20911},
6 | {{25782,25916,27141,48933,48934},{19838,25291,27140,48931,48932}},
7 | {13159,5118},
8 | {61846,27044},
9 | {{21562,21564,25392,48162},{10937,10938,25389,48161}},
10 | {{27681,32999,48074},{27841,25312,48073}},
11 | {{27683,39374,48170},{10958,25433,48169}},
12 | {{23028,27127,43002},{10157,27126,42995}},
13 | {{16689,16810,16811,16812,16813,17329,27009,53312},{339,1062,5195,5196,9852,9853,26989,53308}},
14 | {{21849,21850,26991,48470},{9884,9885,26990,48469}},
15 | {7302,7301},
16 | {706,696},
17 | {55610,50887},
18 | {{9634},{5487}}
19 |
20 | }
21 |
22 | if CLDB==nil then CLDB={} end
23 | if CLDB.req==nil then CLDB.req={} end
24 |
25 | for i=1,#treq do
26 | local spells=treq[i]
27 | local rspells,nspells=spells[1],spells[2]
28 | if type(rspells)~="table" then rspells={rspells} end
29 | if type(nspells)~="table" then nspells={nspells} end
30 |
31 | for j=1,#rspells do
32 | CLDB.req[rspells[j]]=nspells[j]
33 | end
34 |
35 | end
36 |
37 |
38 |
39 | if CLDB.rreq==nil then CLDB.rreq={} end
40 | local i=1
41 | for k,v in pairs(CLDB.req) do
42 | CLDB.rreq[v]=k
43 | i=i+1
44 | end
45 |
--------------------------------------------------------------------------------
/LUA/ClassLess/data/spells.data:
--------------------------------------------------------------------------------
1 | --SPELLS
2 | if CLDB==nil then CLDB={} end
3 | if CLDB.data==nil then CLDB.data={} end
4 | if CLDB.data.spells==nil then CLDB.data.spells={} end
5 |
6 | CLDB.data.spells.WARRIOR={
7 | {"Arms","Ability_Rogue_Eviscerate","WarriorArms",{
8 | {{2457},{1},"",0},
9 | {{78},{1},"",0},
10 | {{100},{4},"",0},
11 | {{772},{4},"",0},
12 | {{6343},{6},"",0},
13 | {{1715},{8},"",0},
14 | {{7384},{12},"",0},
15 | {{694},{16},"",0},
16 | {{20230},{20},"",0},
17 | {{12328},{30},"",1},
18 | {{12294},{40},"",1},
19 | {{46924},{60},"",1},
20 | {{64382},{70},"",0},
21 | {{57755},{80},"",0},
22 | }},
23 |
24 | {"Fury","Ability_Warrior_InnerRage","WarriorFury",{
25 | {{6673},{1},"",0},
26 | {{34428},{6},"",0},
27 | {{1160},{14},"",0},
28 | {{845},{20},"",0},
29 | {{12323},{20},"",1},
30 | {{5246},{22},"",0},
31 | {{5308},{24},"",0},
32 | {{1161},{26},"",0},
33 | {{2458},{30},"",0},
34 | {{20252},{30},"",0},
35 | {{1464},{30},"",0},
36 | {{12292},{30},"",1},
37 | {{18499},{32},"",0},
38 | {{1680},{36},"",0},
39 | {{6552},{38},"",0},
40 | {{23881},{40},"",1},
41 | {{1719},{50},"",0},
42 | {{60970},{50},"",1},
43 | {{469},{68},"",0},
44 | {{55694},{75},"",0},
45 | }},
46 |
47 | {"Protection","Ability_Warrior_DefensiveStance","WarriorProtection",{
48 | {{2687},{10},"",0},
49 | {{71},{10},"",0},
50 | {{72},{12},"",0},
51 | {{6572},{14},"",0},
52 | {{2565},{16},"",0},
53 | {{676},{18},"",0},
54 | {{12678},{20},"",0},
55 | {{12975},{20},"",1},
56 | {{871},{28},"",0},
57 | {{7386},{30},"",0},
58 | {{355},{30},"",0},
59 | {{12809},{30},"",1},
60 | {{50720},{40},"",1},
61 | {{23922},{40},"",0},
62 | {{20243},{50},"",1},
63 | {{46968},{60},"",1},
64 | {{23920},{64},"",0},
65 | {{3411},{70},"",0},
66 | }},
67 | }
68 |
69 |
70 | CLDB.data.spells.PALADIN={
71 | {"Holy","Spell_Holy_HolyBolt","PaladinHoly",{
72 | {{635},{1},"",0},
73 | {{21084},{1},"",0},
74 | {{1152},{8},"",0},
75 | {{633},{10},"",0},
76 | {{7328},{12},"",0},
77 | {{19742},{14},"",0},
78 | {{26573},{20},"",0},
79 | {{879},{20},"",0},
80 | {{19750},{20},"",0},
81 | {{5502},{20},"",0},
82 | {{19746},{22},"",0},
83 | {{10326},{24},"",0},
84 | {{20165},{30},"",0},
85 | {{20166},{38},"",0},
86 | {{4987},{42},"",0},
87 | {{2812},{50},"",0},
88 | {{25894},{54},"",0},
89 | {{31821},{20},"",1},
90 | {{20216},{30},"",1},
91 | {{20473},{40},"",1},
92 | {{31842},{50},"",1},
93 | {{53563},{60},"",1},
94 | {{54428},{71},"",0},
95 | {{53601},{80},"",0},
96 | }},
97 |
98 | {"Protection","SPELL_HOLY_DEVOTIONAURA","PaladinProtection",{
99 | {{465},{1},"",0},
100 | {{498},{6},"",0},
101 | {{853},{8},"",0},
102 | {{1022},{10},"",0},
103 | {{31789},{14},"",0},
104 | {{62124},{16},"",0},
105 | {{25780},{16},"",0},
106 | {{1044},{18},"",0},
107 | {{20217},{20},"",0},
108 | {{64205},{20},"",1},
109 | {{20164},{22},"",0},
110 | {{1038},{26},"",0},
111 | {{19876},{28},"",0},
112 | {{19752},{30},"",0},
113 | {{20911},{30},"",1},
114 | {{19888},{32},"",0},
115 | {{642},{34},"",0},
116 | {{19891},{36},"",0},
117 | {{20925},{40},"",1},
118 | {{6940},{46},"",0},
119 | {{31935},{50},"",1},
120 | {{25898},{60},"",0},
121 | {{25899},{60},"",0},
122 | {{53595},{60},"",1},
123 | }},
124 |
125 | {"Retribution","Spell_Holy_AuraOfLight","PaladinCombat",{
126 | {{19740},{4},"",0},
127 | {{20271},{4},"",0},
128 | {{53408},{12},"",0},
129 | {{7294},{16},"",0},
130 | {{20375},{20},"",1},
131 | {{53407},{28},"",0},
132 | {{20066},{40},"",1},
133 | {{24275},{44},"",0},
134 | {{35395},{50},"",1},
135 | {{25782},{52},"",0},
136 | {{53385},{60},"",1},
137 | {{32223},{62},"",0},
138 | {{31801},{64},"",0},
139 | {{31884},{70},"",0},
140 | }},
141 | }
142 |
143 | CLDB.data.spells.HUNTER={
144 | {"Beast Mastery","Ability_Hunter_BeastTaming","HunterBeastMastery",{
145 | {{13163},{4},"",0},
146 | {{13165},{10},"",0},
147 | {{883},{10},"",0},
148 | {{2641},{10},"",0},
149 | {{6991},{10},"",0},
150 | {{982},{10},"",0},
151 | {{1515},{10},"",0},
152 | {{136},{12},"",0},
153 | {{6197},{14},"",0},
154 | {{1002},{14},"",0},
155 | {{1513},{14},"",0},
156 | {{5118},{16},"",0},
157 | {{34074},{20},"",0},
158 | {{1462},{24},"",0},
159 | {{13161},{30},"",0},
160 | {{19577},{30},"",1},
161 | {{19574},{40},"",1},
162 | {{13159},{40},"",0},
163 | {{20043},{46},"",0},
164 | {{62757},{60},"",0},
165 | {{34026},{66},"",0},
166 | {{61846},{74},"",0},
167 | {{53271},{75},"",0},
168 | }},
169 |
170 | {"Marksmanship","Ability_Marksmanship","HunterMarksmanship",{
171 | {{75},{1},"",0},
172 | {{1978},{4},"",0},
173 | {{3044},{6},"",0},
174 | {{1130},{6},"",0},
175 | {{5116},{8},"",0},
176 | {{20736},{12},"",0},
177 | {{2643},{18},"",0},
178 | {{19434},{20},"",1},
179 | {{3043},{22},"",0},
180 | {{3045},{26},"",0},
181 | {{23989},{30},"",1},
182 | {{1543},{32},"",0},
183 | {{3034},{36},"",0},
184 | {{1510},{40},"",0},
185 | {{19506},{40},"",1},
186 | {{56641},{50},"",0},
187 | {{34490},{50},"",1},
188 | {{53209},{60},"",1},
189 | {{19801},{60},"",0},
190 | {{53351},{71},"",0},
191 | }},
192 |
193 | {"Survival","Ability_Hunter_SwiftStrike","HunterSurvival",{
194 | {{2973},{1},"",0},
195 | {{1494},{1},"",0},
196 | {{19883},{10},"",0},
197 | {{2974},{12},"",0},
198 | {{13795},{16},"",0},
199 | {{1495},{16},"",0},
200 | {{19884},{18},"",0},
201 | {{781},{20},"",0},
202 | {{1499},{20},"",0},
203 | {{19503},{20},"",1},
204 | {{19885},{24},"",0},
205 | {{19880},{26},"",0},
206 | {{13809},{28},"",0},
207 | {{5384},{30},"",0},
208 | {{19306},{30},"",1},
209 | {{19878},{32},"",0},
210 | {{13813},{34},"",0},
211 | {{19386},{40},"",1},
212 | {{19882},{40},"",0},
213 | {{19879},{50},"",0},
214 | {{3674},{50},"",1},
215 | {{53301},{60},"",1},
216 | {{19263},{60},"",0},
217 | {{34600},{68},"",0},
218 | {{34477},{70},"",0},
219 | {{60192},{80},"",0},
220 | }},
221 | }
222 |
223 | CLDB.data.spells.ROGUE={
224 | {"Assassination","Ability_Rogue_Eviscerate","RogueAssassination",{
225 | {{2098},{1},"",0},
226 | {{5171},{10},"",0},
227 | {{8647},{14},"",0},
228 | {{703},{14},"",0},
229 | {{8676},{18},"",0},
230 | {{51722},{20},"",0},
231 | {{1943},{20},"",0},
232 | {{1833},{26},"",0},
233 | {{408},{30},"",0},
234 | {{14177},{30},"",1},
235 | {{1329},{50},"",1},
236 | {{51662},{60},"",1},
237 | {{32645},{62},"",0},
238 | {{26679},{64},"",0},
239 | {{2842},{65},"",0},
240 | }},
241 |
242 | {"Combat","Ability_BackStab","RogueCombat",{
243 | {{1752},{1},"",0},
244 | {{53},{4},"",0},
245 | {{1776},{6},"",0},
246 | {{5277},{8},"",0},
247 | {{2983},{10},"",0},
248 | {{1766},{12},"",0},
249 | {{1966},{16},"",0},
250 | {{14251},{20},"",1},
251 | {{13877},{30},"",1},
252 | {{13750},{40},"",1},
253 | {{51690},{60},"",1},
254 | {{5938},{70},"",0},
255 | {{51723},{80},"",0},
256 | }},
257 |
258 | {"Subtlety","Ability_Stealth","RogueSubtlety",{
259 | {{1784},{1},"",0},
260 | {{921},{4},"",0},
261 | {{6770},{10},"",0},
262 | {{14278},{20},"",1},
263 | {{1725},{22},"",0},
264 | {{1856},{22},"",0},
265 | {{2836},{24},"",0},
266 | {{1842},{30},"",0},
267 | {{14185},{30},"",1},
268 | {{16511},{30},"",1},
269 | {{2094},{34},"",0},
270 | {{1860},{40},"",0},
271 | {{14183},{40},"",1},
272 | {{36554},{50},"",1},
273 | {{51713},{60},"",1},
274 | {{31224},{66},"",0},
275 | {{57934},{75},"",0},
276 | }},
277 | }
278 |
279 | CLDB.data.spells.PRIEST={
280 | {"Discipline","Spell_Holy_WordFortitude","PriestDiscipline",{
281 | {{1243},{1},"",0},
282 | {{17},{6},"",0},
283 | {{588},{12},"",0},
284 | {{527},{18},"",0},
285 | {{6346},{20},"",0},
286 | {{9484},{20},"",0},
287 | {{14751},{20},"",1},
288 | {{8129},{24},"",0},
289 | {{14752},{30},"",0},
290 | {{1706},{34},"",0},
291 | {{10060},{40},"",1},
292 | {{21562},{48},"",0},
293 | {{33206},{50},"",1},
294 | {{27681},{60},"",0},
295 | {{47540},{60},"",1},
296 | {{32375},{70},"",0},
297 | }},
298 |
299 | {"Holy","Spell_Holy_HolyBolt","PriestHoly",{
300 | {{2050},{1},"",0},
301 | {{585},{1},"",0},
302 | {{139},{8},"",0},
303 | {{2006},{10},"",0},
304 | {{528},{14},"",0},
305 | {{2054},{16},"",0},
306 | {{2061},{20},"",0},
307 | {{14914},{20},"",0},
308 | {{15237},{20},"",0},
309 | {{19236},{20},"",1},
310 | {{596},{30},"",0},
311 | {{552},{32},"",0},
312 | {{724},{40},"",1},
313 | {{2060},{40},"",0},
314 | {{34861},{50},"",1},
315 | {{47788},{60},"",1},
316 | {{64901},{60},"",0},
317 | {{32546},{64},"",0},
318 | {{33076},{68},"",0},
319 | {{64843},{80},"",0},
320 | }},
321 |
322 | {"Shadow","Spell_Shadow_ShadowWordPain","PriestShadow",{
323 | {{589},{4},"",0},
324 | {{586},{8},"",0},
325 | {{8092},{10},"",0},
326 | {{8122},{14},"",0},
327 | {{2944},{20},"",0},
328 | {{453},{20},"",0},
329 | {{15407},{20},"",1},
330 | {{2096},{22},"",0},
331 | {{605},{30},"",0},
332 | {{976},{30},"",0},
333 | {{15487},{30},"",1},
334 | {{15286},{30},"",1},
335 | {{15473},{40},"",1},
336 | {{64044},{50},"",1},
337 | {{34914},{50},"",1},
338 | {{27683},{56},"",0},
339 | {{47585},{60},"",1},
340 | {{32379},{62},"",0},
341 | {{34433},{66},"",0},
342 | {{48045},{75},"",0},
343 | }},
344 | }
345 |
346 | CLDB.data.spells.SHAMAN={
347 | {"Elemental","Spell_Nature_Lightning","ShamanElementalCombat",{
348 | {{403},{1},"",0},
349 | {{8042},{4},"",0},
350 | {{2484},{6},"",0},
351 | {{5730},{8},"",0},
352 | {{8050},{10},"",0},
353 | {{3599},{10},"",0},
354 | {{1535},{12},"",0},
355 | {{370},{12},"",0},
356 | {{57994},{16},"",0},
357 | {{8056},{20},"",0},
358 | {{8190},{26},"",0},
359 | {{66842},{30},"",0},
360 | {{421},{32},"",0},
361 | {{66843},{40},"",0},
362 | {{16166},{40},"",1},
363 | {{66844},{50},"",0},
364 | {{30706},{50},"",1},
365 | {{51490},{60},"",1},
366 | {{2894},{68},"",0},
367 | {{51505},{75},"",0},
368 | {{51514},{80},"",0},
369 | }},
370 |
371 | {"Enhancement","Spell_Nature_LightningShield","ShamanEnhancement",{
372 | {{8017},{1},"",0},
373 | {{8071},{4},"",0},
374 | {{324},{8},"",0},
375 | {{8024},{10},"",0},
376 | {{8075},{10},"",0},
377 | {{2645},{16},"",0},
378 | {{8033},{20},"",0},
379 | {{131},{22},"",0},
380 | {{8181},{24},"",0},
381 | {{6196},{26},"",0},
382 | {{8184},{280},"",0},
383 | {{8227},{28},"",0},
384 | {{546},{28},"",0},
385 | {{556},{30},"",0},
386 | {{8177},{30},"",0},
387 | {{10595},{30},"",0},
388 | {{8232},{30},"",0},
389 | {{8512},{32},"",0},
390 | {{6495},{34},"",0},
391 | {{17364},{40},"",1},
392 | {{60103},{45},"",1},
393 | {{30823},{50},"",1},
394 | {{51533},{60},"",1},
395 | {{3738},{64},"",0},
396 | {{2062},{66},"",0},
397 | {{32182},{70},"",0},
398 | {{2825},{70},"",0}, -- Horde
399 | }},
400 |
401 | {"Restoration","Spell_Nature_MagicImmunity","ShamanRestoration",{
402 | {{331},{1},"",0},
403 | {{2008},{12},"",0},
404 | {{526},{16},"",0},
405 | {{8143},{18},"",0},
406 | {{5394},{20},"",0},
407 | {{8004},{20},"",0},
408 | {{52127},{20},"",0},
409 | {{55198},{20},"",1},
410 | {{5675},{26},"",0},
411 | {{51730},{30},"",0},
412 | {{20608},{30},"",0},
413 | {{36936},{30},"",0},
414 | {{16188},{30},"",1},
415 | {{8170},{38},"",0},
416 | {{1064},{40},"",0},
417 | {{16190},{40},"",1},
418 | {{974},{50},"",1},
419 | {{61295},{60},"",1},
420 | }},
421 | }
422 |
423 | CLDB.data.spells.MAGE={
424 | {"Arcane","Spell_Holy_MagicalSentry","MageArcane",{
425 | {{1459},{1},"",0},
426 | {{5504},{4},"",0},
427 | {{587},{6},"",0},
428 | {{5143},{8},"",0},
429 | {{118},{8},"",0},
430 | {{604},{12},"",0},
431 | {{130},{12},"",0},
432 | {{1449},{14},"",0},
433 | {{1008},{18},"",0},
434 | {{475},{18},"",0},
435 | {{1953},{20},"",0},
436 | {{12051},{20},"",0},
437 | {{1463},{20},"",0},
438 | {{3562},{20},"",0},
439 | {{3563},{20},"",0}, -- Horde
440 | {{3561},{20},"",0},
441 | {{3567},{20},"",0}, -- Horde
442 | {{54646},{20},"",1},
443 | {{2139},{24},"",0},
444 | {{759},{28},"",0},
445 | {{3565},{30},"",0},
446 | {{32271},{30},"",0},
447 | {{3566},{30},"",0}, -- Horde
448 | {{32272},{30},"",0}, -- Horde
449 | {{12043},{30},"",1},
450 | {{6117},{34},"",0},
451 | {{49359},{35},"",0},
452 | {{49358},{35},"",0}, -- Horde
453 | {{49360},{35},"",0},
454 | {{49361},{35},"",0}, -- Horde
455 | {{32266},{40},"",0},
456 | {{11417},{40},"",0}, -- Horde
457 | {{11416},{40},"",0},
458 | {{32267},{40},"",0}, -- Horde
459 | {{10059},{40},"",0},
460 | {{11418},{40},"",0}, -- Horde
461 | {{12042},{40},"",1},
462 | {{11419},{50},"",0},
463 | {{11420},{50},"",0}, -- Horde
464 | {{31589},{50},"",1},
465 | {{23028},{56},"",0},
466 | {{44425},{60},"",1},
467 | {{30451},{64},"",0},
468 | {{33691},{65},"",0},
469 | {{66},{68},"",0},
470 | {{43987},{70},"",0},
471 | {{30449},{70},"",0},
472 | }},
473 |
474 | {"Fire","Spell_Fire_FireBolt02","MageFire",{
475 | {{133},{1},"",0},
476 | {{2136},{6},"",0},
477 | {{2120},{16},"",0},
478 | {{543},{20},"",0},
479 | {{2948},{22},"",0},
480 | {{11366},{20},"",1},
481 | {{11113},{30},"",1},
482 | {{11129},{40},"",1},
483 | {{31661},{50},"",1},
484 | {{44457},{60},"",1},
485 | {{30482},{62},"",0},
486 | {{44614},{75},"",0},
487 | }},
488 |
489 | {"Frost","Spell_Frost_FrostBolt02","MageFrost",{
490 | {{168},{1},"",0},
491 | {{116},{4},"",0},
492 | {{122},{10},"",0},
493 | {{10},{20},"",0},
494 | {{12472},{20},"",1},
495 | {{6143},{22},"",0},
496 | {{120},{26},"",0},
497 | {{7302},{30},"",0},
498 | {{45438},{30},"",0},
499 | {{11958},{30},"",1},
500 | {{11426},{40},"",1},
501 | {{31687},{50},"",1},
502 | {{44572},{60},"",1},
503 | {{30455},{66},"",0},
504 | }},
505 | }
506 |
507 | CLDB.data.spells.WARLOCK={
508 | {"Affliction","Spell_Shadow_DeathCoil","WarlockCurses",{
509 | {{172},{4},"",0},
510 | {{702},{4},"",0},
511 | {{1454},{6},"",0},
512 | {{980},{8},"",0},
513 | {{5782},{8},"",0},
514 | {{1120},{10},"",0},
515 | {{689},{14},"",0},
516 | {{5138},{24},"",0},
517 | {{1714},{26},"",0},
518 | {{18223},{30},"",1},
519 | {{1490},{32},"",0},
520 | {{5484},{40},"",0},
521 | {{18220},{40},"",1},
522 | {{6789},{42},"",0},
523 | {{30108},{50},"",1},
524 | {{48181},{60},"",1},
525 | {{603},{60},"",0},
526 | {{27243},{70},"",0},
527 | }},
528 |
529 |
530 | {"Demonology","Spell_Shadow_Metamorphosis","WarlockSummoning",{
531 | {{687},{1},"",0},
532 | {{688},{4},"",0},
533 | {{6201},{10},"",0},
534 | {{697},{10},"",0},
535 | {{755},{12},"",0},
536 | {{5697},{16},"",0},
537 | {{693},{18},"",0},
538 | {{706},{20},"",0},
539 | {{698},{20},"",0},
540 | {{712},{20},"",0},
541 | {{19028},{20},"",1},
542 | {{18708},{20},"",1},
543 | {{126},{22},"",0},
544 | {{5500},{24},"",0},
545 | {{132},{26},"",0},
546 | {{710},{28},"",0},
547 | {{6366},{28},"",0},
548 | {{1098},{30},"",0},
549 | {{691},{30},"",0},
550 | {{6229},{32},"",0},
551 | {{2362},{36},"",0},
552 | {{47193},{40},"",1},
553 | {{30146},{50},"",1},
554 | {{59671},{50},"",0},
555 | {{54784},{50},"",0},
556 | {{50589},{50},"",0},
557 | {{1122},{50},"",0},
558 | {{18540},{50},"",0},
559 | {{47241},{60},"",1},
560 | {{28176},{62},"",0},
561 | {{29858},{66},"",0},
562 | {{29893},{68},"",0},
563 | {{48018},{80},"",0},
564 | {{48020},{80},"",0}, -- 59672
565 | }},
566 |
567 |
568 | {"Destruction","Spell_Shadow_RainOfFire","WarlockDestruction",{
569 | {{686},{1},"",0},
570 | {{348},{1},"",0},
571 | {{5676},{18},"",0},
572 | {{5740},{20},"",0},
573 | {{17877},{20},"",1},
574 | {{1949},{30},"",0},
575 | {{17962},{40},"",1},
576 | {{6353},{48},"",0},
577 | {{30283},{50},"",1},
578 | {{50796},{60},"",1},
579 | {{29722},{64},"",0},
580 | {{47897},{75},"",0},
581 | }},
582 | }
583 |
584 |
585 | CLDB.data.spells.DRUID={
586 | {"Balance","Spell_Nature_StarFall","DruidBalance",{
587 | {{5176},{1},"",0},
588 | {{8921},{4},"",0},
589 | {{467},{6},"",0},
590 | {{339},{8},"",0},
591 | {{16689},{10},"",0},
592 | {{770},{18},"",0},
593 | {{2637},{18},"",0},
594 | {{2912},{20},"",0},
595 | {{2908},{22},"",0},
596 | {{5570},{30},"",1},
597 | {{24858},{40},"",1},
598 | {{16914},{40},"",0},
599 | {{29166},{40},"",0},
600 | {{22812},{44},"",0},
601 | {{33831},{50},"",1},
602 | {{50516},{50},"",1},
603 | {{48505},{60},"",1},
604 | {{33786},{70},"",0},
605 | }},
606 |
607 | {"Feral Combat","Ability_Racial_BearForm","DruidFeralCombat",{
608 | {{99},{10},"",0},
609 | {{6795},{10},"",0},
610 | {{6807},{10},"",0},
611 | {{5229},{12},"",0},
612 | {{5211},{14},"",0},
613 | {{5487},{15},"",0},
614 | {{1066},{16},"",0},
615 | {{779},{16},"",0},
616 | {{783},{16},"",0},
617 | {{16857},{18},"",0},
618 | {{768},{20},"",0},
619 | {{1082},{20},"",0},
620 | {{5215},{20},"",0},
621 | {{1079},{20},"",0},
622 | {{61336},{20},"",1},
623 | {{5221},{22},"",0},
624 | {{1822},{24},"",0},
625 | {{5217},{24},"",0},
626 | {{1850},{26},"",0},
627 | {{5209},{28},"",0},
628 | {{8998},{28},"",0},
629 | {{22568},{32},"",0},
630 | {{6785},{32},"",0},
631 | {{5225},{32},"",0},
632 | {{16979},{30},"",1}, -- 49377
633 | {{49376},{30},"",1}, -- 49377
634 | {{22842},{36},"",0},
635 | {{9005},{36},"",0},
636 | {{9634},{40},"",0},
637 | {{20719},{40},"",0},
638 | {{62600},{40},"",0},
639 | {{33878},{50},"",1}, --33917
640 | {{33876},{50},"",1}, --33917
641 | {{50334},{60},"",1},
642 | {{22570},{62},"",0},
643 | {{33745},{66},"",0},
644 | {{62078},{71},"",0},
645 | {{52610},{75},"",0},
646 | }},
647 |
648 | {"Restoration","Spell_Nature_HealingTouch","DruidRestoration",{
649 | {{5185},{1},"",0},
650 | {{1126},{1},"",0},
651 | {{8946},{4},"",0},
652 | {{774},{4},"",0},
653 | {{8936},{12},"",0},
654 | {{50769},{12},"",0},
655 | {{20484},{20},"",0},
656 | {{2782},{24},"",0},
657 | {{2893},{26},"",0},
658 | {{740},{30},"",0},
659 | {{17116},{30},"",1},
660 | {{18562},{40},"",1},
661 | {{33891},{50},"",1}, -- 65139
662 | {{21849},{50},"",0},
663 | {{48438},{60},"",1},
664 | {{33763},{64},"",0},
665 | {{50464},{80},"",0},
666 | }},
667 | }
--------------------------------------------------------------------------------
/LUA/ClassLess/data/talents.data:
--------------------------------------------------------------------------------
1 | --TALENTS
2 | if CLDB==nil then CLDB={} end
3 | if CLDB.data==nil then CLDB.data={} end
4 | if CLDB.data.talents==nil then CLDB.data.talents={} end
5 |
6 | CLDB.data.talents.WARRIOR={
7 | {"Arms","Ability_Rogue_Eviscerate","WarriorArms",{
8 | {{12282, 12663, 12664},{10,11,12},"",0},
9 | {{16462, 16463, 16464, 16465, 16466},{10,11,12,13,14},"",0},
10 | {{12286, 12658},{10,11},"",0},
11 | {{12285, 12697},{15,16},"",0},
12 | {{12300, 12959, 12960},{15,16,17},"",0},
13 | {{12295, 12676, 12677},{15,16,17},"",0},
14 | {{12290, 12963},{20,21},"",0},
15 | {{12296},{20},"",0},
16 | {{16493, 16494},{20,21},"",0},
17 | {{12834, 12849, 12867},{20,21,22},"",0},
18 | {{12163, 12711, 12712},{25,26,27},"",0},
19 | {{56636, 56637, 56638},{25,26,27},"",0},
20 | {{12700, 12781, 12783, 12784, 12785},{30,31,32,33,34},"",0},
21 | {{12284, 12701, 12702, 12703, 12704},{30,31,32,33,34},"",0},
22 | {{12281, 12812, 12813, 12814, 12815},{30,31,32,33,34},"",0},
23 | {{20504, 20505},{35,36},"",0},
24 | {{12289, 12668, 23695},{35,36,37},"",0},
25 | {{46854, 46855},{35,36},"",0},
26 | {{29834, 29838},{40,41},"",0},
27 | {{46865, 46866},{40,41},"",0},
28 | {{12862, 12330},{40,41},"",0},
29 | {{64976},{45},"",0},
30 | {{35446, 35448, 35449},{45,46,47},"",0},
31 | {{46859, 46860},{45,46},"",0},
32 | {{29723, 29725, 29724},{50,51,52},"",0},
33 | {{29623},{50},"",0},
34 | {{29836, 29859},{50,51},"",0},
35 | {{46867, 56611, 56612, 56613, 56614},{55,56,57,58,59},"",0},
36 | }},
37 |
38 |
39 | {"Fury","Ability_Warrior_InnerRage","WarriorFury",{
40 | {{61216, 61221, 61222},{10,11,12},"",0},
41 | {{12321, 12835},{10,11},"",0},
42 | {{12320, 12852, 12853, 12855, 12856},{10,11,12,13,14},"",0},
43 | {{12324, 12876, 12877, 12878, 12879},{15,16,17,18,19},"",0},
44 | {{12322, 12999, 13000, 13001, 13002},{15,16,17,18,19},"",0},
45 | {{12329, 12950, 20496},{20,21,22},"",0},
46 | {{16487, 16489, 16492},{20,21,22},"",0},
47 | {{12318, 13857, 12858, 12860, 12861},{20,21,22,23,24},"",0},
48 | {{23584, 23585, 23586, 23587, 23588},{25,26,27,28,29},"",0},
49 | {{20502, 20503},{25,26},"",0},
50 | {{12317, 13045, 13046, 13047, 13048},{25,26,27,28,29},"",0},
51 | {{29590, 29591, 29592},{30,31,32},"",0},
52 | {{29888, 29889},{30,31},"",0},
53 | {{20500, 20501},{35,36},"",0},
54 | {{12319, 12971, 12972, 12973, 12974},{35,36,37,38,39},"",0},
55 | {{46908, 46909, 56924},{40,41,42},"",0},
56 | {{29721, 29776},{40,41},"",0},
57 | {{46910, 46911},{45,46},"",0},
58 | {{29759, 29760, 29761, 29762, 29763},{45,46,47,48,49},"",0},
59 | {{29801},{50},"",0},
60 | {{46913, 46914, 46915},{50,51,52},"",0},
61 | {{56927, 56929, 56930, 56931, 56932},{55,56,57,58,59},"",0},
62 | {{46917},{60},"",0},
63 | }},
64 |
65 | {"Protection","Ability_Warrior_DefensiveStance","WarriorProtection",{
66 | {{12301, 12818},{10,11},"",0},
67 | {{12298, 12724, 12725, 12726, 12727},{10,11,12,13,14},"",0},
68 | {{12287, 12665, 12666},{10,11,12},"",0},
69 | {{50685, 50686, 50687},{15,16,17},"",0},
70 | {{12297, 12750, 12751, 12752, 12753},{15,16,17,18,19},"",0},
71 | {{12797, 12799},{20,21},"",0},
72 | {{29598, 29599},{20,21},"",0},
73 | {{12299, 12761, 12762, 12763, 12764},{20,21,22,23,24},"",0},
74 | {{59088, 59089},{25,26},"",0},
75 | {{12313, 12804},{25,26},"",0},
76 | {{12308, 12810, 12811},{25,26,27},"",0},
77 | {{12312, 12803},{30,31},"",0},
78 | {{12311, 12958},{30,31},"",0},
79 | {{16538, 16539, 16540, 16541, 16542},{35,36,37,38,39},"",0},
80 | {{29593, 29594},{40,41},"",0},
81 | {{29787, 29790, 29792},{40,41,42},"",0},
82 | {{29140, 29143, 29144},{45,46,47},"",0},
83 | {{46945, 46949},{45,46},"",0},
84 | {{57499},{50},"",0},
85 | {{47294, 47295, 47296},{50,51,52},"",0},
86 | {{46951, 46952, 46953},{55,56,57},"",0},
87 | {{58872, 58874},{55,56},"",0},
88 | }},
89 | }
90 |
91 |
92 | CLDB.data.talents.PALADIN={
93 | {"Holy","Spell_Holy_HolyBolt","PaladinHoly",{
94 | {{20205, 20206, 20207, 20209, 20208},{10,11,12,13,14},"",0},
95 | {{20224, 20225, 20330, 20331, 20332},{10,11,12,13,14},"",0},
96 | {{20237, 20238, 20239},{15,16,17},"",0},
97 | {{20257, 20258, 20259, 20260, 20261},{15,16,17,18,19},"",0},
98 | {{9453, 25836},{15,16},"",0},
99 | {{20210, 20212, 20213, 20214, 20215},{20,21,22,23,24},"",0},
100 | {{20234, 20235},{20,21},"",0},
101 | {{20254, 20255, 20256},{25,26,27},"",0},
102 | {{20244, 20245},{25,26},"",0},
103 | {{53660, 53661},{25,26},"",0},
104 | {{31822, 31823},{30,31},"",0},
105 | {{20359, 20360, 20361},{30,31,32},"",0},
106 | {{31825, 31826},{35,36},"",0},
107 | {{5923, 5924, 5925, 5926, 25829},{35,36,37,38,39},"",0},
108 | {{31833, 31835, 31836},{40,41,42},"",0},
109 | {{31828, 31829, 31830},{40,41,42},"",0},
110 | {{53551, 53552, 53553},{45,46,47},"",0},
111 | {{31837, 31838, 31839, 31840, 31841},{45,46,47,48,49},"",0},
112 | {{53671, 53673, 54151, 54154, 54155},{50,51,52,53,54},"",0},
113 | {{53569, 53576},{55,56},"",0},
114 | {{53556, 53557},{55,56},"",0},
115 | }},
116 |
117 | {"Protection","SPELL_HOLY_DEVOTIONAURA","PaladinProtection",{
118 | {{63646, 63647, 63648, 63649, 63650},{10,11,12,13,14},"",0},
119 | {{20262, 20263, 20264, 20265, 20266},{10,11,12,13,14},"",0},
120 | {{31844, 31845, 53519},{15,16,17},"",0},
121 | {{20174, 20175},{15,16},"",0},
122 | {{20096, 20097, 20098, 20099, 20100},{15,16,17,18,19},"",0},
123 | {{20468, 20469, 20470},{20,21,22},"",0},
124 | {{20143, 20144, 20145, 20146, 20147},{20,21,22,23,24},"",0},
125 | {{53527, 53530},{25,26},"",0},
126 | {{20487, 20488},{25,26},"",0},
127 | {{20138, 20139, 20140},{25,26,27},"",0},
128 | {{20177, 20179, 20181, 20180, 20182},{30,31,32,33,34},"",0},
129 | {{31848, 31849},{35,36},"",0},
130 | {{20196, 20197, 20198},{35,36,37},"",0},
131 | {{31785, 33776},{40,41},"",0},
132 | {{31850, 31851, 31852},{40,41,42},"",0},
133 | {{20127, 20130, 20135},{45,46,47},"",0},
134 | {{31858, 31859, 31860},{45,46,47},"",0},
135 | {{53590, 53591, 53592},{50,51,52},"",0},
136 | {{53583, 53585},{50,51},"",0},
137 | {{53709, 53710, 53711},{55,56,57},"",0},
138 | {{53695, 53696},{55,56},"",0},
139 | }},
140 |
141 | {"Retribution","Spell_Holy_AuraOfLight","PaladinCombat",{
142 | {{20060, 20061, 20062, 20063, 20064},{10,11,12,13,14},"",0},
143 | {{20101, 20102, 20103, 20104, 20105},{10,11,12,13,14},"",0},
144 | {{25956, 25957},{15,16},"",0},
145 | {{20335, 20336, 20337},{15,16,17},"",0},
146 | {{20042, 20045},{15,16},"",0},
147 | {{9452, 26016},{20,21},"",0},
148 | {{20117, 20118, 20119, 20120, 20121},{20,21,22,23,24},"",0},
149 | {{26022, 26023},{20,21},"",0},
150 | {{9799, 25988},{25,26},"",0},
151 | {{32043, 35396, 35397},{25,26,27},"",0},
152 | {{31866, 31867, 31868},{25,26,27},"",0},
153 | {{20111, 20112, 20113},{30,31,32},"",0},
154 | {{31869},{30},"",0},
155 | {{20049, 20056, 20057},{35,36,37},"",0},
156 | {{31871, 31872},{35,36},"",0},
157 | {{53486, 53488},{40,41},"",0},
158 | {{31876, 31877, 31878},{40,41,42},"",0},
159 | {{31879, 31880, 31881},{45,46,47},"",0},
160 | {{53375, 53376},{45,46},"",0},
161 | {{53379, 53484, 53648},{50,51,52},"",0},
162 | {{53501, 53502, 53503},{50,51,52},"",0},
163 | {{53380, 53381, 53382},{55,56,57},"",0},
164 | }},
165 | }
166 |
167 | CLDB.data.talents.HUNTER={
168 | {"Beast Mastery","Ability_Hunter_BeastTaming","HunterBeastMastery",{
169 | {{19552, 19553, 19554, 19555, 19556},{10,11,12,13,14},"",0},
170 | {{19583, 19584, 19585, 19586, 19587},{10,11,12,13,14},"",0},
171 | {{35029, 35030},{15,16},"",0},
172 | {{19549, 19550, 19551},{15,16,17},"",0},
173 | {{19609, 19610, 19612},{15,16,17},"",0},
174 | {{24443, 19575},{15,16},"",0},
175 | {{19559, 19560},{20,21},"",0},
176 | {{53265},{20},"",0},
177 | {{19616, 19617, 19618, 19619, 19620},{20,21,22,23,24},"",0},
178 | {{19572, 19573},{25,26},"",0},
179 | {{19598, 19599, 19600, 19601, 19602},{25,26,27,28,29},"",0},
180 | {{19578, 20895},{30,31},"",0},
181 | {{19590, 19592},{30,31},"",0},
182 | {{34453, 34454},{35,36},"",0},
183 | {{19621, 19622, 19623, 19624, 19625},{35,36,37,38,39},"",0},
184 | {{34455, 34459, 34460},{40,41,42},"",0},
185 | {{34462, 34464, 34465},{40,41,42},"",0},
186 | {{53252, 53253},{45,46},"",0},
187 | {{34466, 34467, 34468, 34469, 34470},{45,46,47,48,49},"",0},
188 | {{53262, 53263, 53264},{50,51,52},"",0},
189 | {{34692},{50},"",0},
190 | {{53256, 53259, 53260},{50,51,52},"",0},
191 | {{56314, 56315, 56316, 56317, 56318},{55,56,57,58,59},"",0},
192 | {{53270},{60},"",0},
193 | }},
194 |
195 | {"Marksmanship","Ability_Marksmanship","HunterMarksmanship",{
196 | {{19407, 19412},{10,11},"",0},
197 | {{53620, 53621, 53622},{10,11,12},"",0},
198 | {{19426, 19427, 19429, 19430, 19431},{10,11,12,13,14},"",0},
199 | {{34482, 34483, 34484},{15,16,17},"",0},
200 | {{19421, 19422, 19423},{15,16,17},"",0},
201 | {{19485, 19487, 19488, 19489, 19490},{15,16,17,18,19},"",0},
202 | {{34950, 34954},{20,21},"",0},
203 | {{19454, 19455, 19456},{20,21,22},"",0},
204 | {{34948, 34949},{20,21},"",0},
205 | {{19464, 19465, 19466},{25,26,27},"",0},
206 | {{19416, 19417, 19418, 19419, 19420},{25,26,27,28,29},"",0},
207 | {{35100, 35102},{30,31},"",0},
208 | {{19461, 19462, 24691},{30,31,32},"",0},
209 | {{34475, 34476},{35,36},"",0},
210 | {{19507, 19508, 19509},{35,36,37},"",0},
211 | {{53234, 53237, 53238},{40,41,42},"",0},
212 | {{35104, 35110, 35111},{40,41,42},"",0},
213 | {{34485, 34486, 34487, 34488, 34489},{45,46,47,48,49},"",0},
214 | {{53228, 53232},{45,46},"",0},
215 | {{53215, 53216, 53217},{50,51,52},"",0},
216 | {{53221, 53222, 53224},{50,51,52},"",0},
217 | {{53241, 53243, 53244, 53245, 53246},{55,56,57,58,59},"",0},
218 | }},
219 |
220 | {"Survival","Ability_Hunter_SwiftStrike","HunterSurvival",{
221 | {{52783, 52785, 52786, 52787, 52788},{10,11,12,13,14},"",0},
222 | {{19498, 19499, 19500},{10,11,12},"",0},
223 | {{19159, 19160},{10,11},"",0},
224 | {{19290, 19294, 24283},{15,16,17},"",0},
225 | {{19184, 19387, 19388},{15,16,17},"",0},
226 | {{19376, 63457, 63458},{15,16,17},"",0},
227 | {{34494, 34496},{15,16},"",0},
228 | {{19255, 19256, 19257, 19258, 19259},{20,21,22,23,24},"",0},
229 | {{19295, 19297, 19298},{20,21,22},"",0},
230 | {{19286, 19287},{20,21},"",0},
231 | {{56333, 56336, 56337},{25,26,27},"",0},
232 | {{56342, 56343, 56344},{25,26,27},"",0},
233 | {{56339, 56340, 56341},{30,31,32},"",0},
234 | {{19370, 19371, 19373},{30,31,32},"",0},
235 | {{19168, 19180, 19181, 24296, 24297},{35,36,37,38,39},"",0},
236 | {{34491, 34492, 34493},{35,36,37},"",0},
237 | {{34500, 34502, 34503},{40,41,42},"",0},
238 | {{34497, 34498, 34499},{40,41,42},"",0},
239 | {{34506, 34507, 34508, 34838, 34839},{45,46,47,48,49},"",0},
240 | {{53295, 53296, 53297},{45,46,47},"",0},
241 | {{53298, 53299},{50,51},"",0},
242 | {{53302, 53303, 53301},{50,51,52},"",0},
243 | {{53290, 53291, 53292},{55,56,57},"",0},
244 | }},
245 | }
246 |
247 | CLDB.data.talents.ROGUE={
248 | {"Assassination","Ability_Rogue_Eviscerate","RogueAssassination",{
249 | {{14162, 14163, 14164},{10,11,12},"",0},
250 | {{14144, 14148},{10,11},"",0},
251 | {{14138, 14139, 14140, 14141, 14142},{10,11,12,13,14},"",0},
252 | {{14156, 14160, 14161},{15,16,17},"",0},
253 | {{51632, 51633},{15,16},"",0},
254 | {{13733, 13865, 13866},{15,16,17},"",0},
255 | {{14983},{20},"",0},
256 | {{14168, 14169},{20,21},"",0},
257 | {{14128, 14132, 14135, 14136, 14137},{20,21,22,23,24},"",0},
258 | {{16513, 16514, 16515},{25,26,27},"",0},
259 | {{14113, 14114, 14115, 14116, 14117},{25,26,27,28,29},"",0},
260 | {{31208, 31209},{30,31},"",0},
261 | {{14174, 14175, 14176},{30,31,32},"",0},
262 | {{31244, 31245},{30,31},"",0},
263 | {{14186, 14190, 14193, 14194, 14195},{35,36,37,38,39},"",0},
264 | {{14158, 14159},{35,36},"",0},
265 | {{51625, 51626},{40,41},"",0},
266 | {{58426},{40},"",0},
267 | {{31380, 31382, 31383},{40,41,42},"",0},
268 | {{51634, 51635, 51636},{45,46,47},"",0},
269 | {{31234, 31235, 31236},{45,46,47},"",0},
270 | {{31226, 31227, 58410},{50,51,52},"",0},
271 | {{51627, 51628, 51629},{50,51,52},"",0},
272 | {{51664, 51665, 51667, 51668, 51669},{55,56,57,58,59},"",0},
273 | }},
274 |
275 | {"Combat","Ability_BackStab","RogueCombat",{
276 | {{13741, 13793, 13792},{10,11,12},"",0},
277 | {{13732, 13863},{10,11},"",0},
278 | {{13715, 13848, 13849, 13851, 13852},{10,11,12,13,14},"",0},
279 | {{14165, 14166},{15,16},"",0},
280 | {{13713, 13853, 13854},{15,16,17},"",0},
281 | {{13705, 13832, 13843, 13844, 13845},{15,16,17,18,19},"",0},
282 | {{13742, 13872},{20,21},"",0},
283 | {{13706, 13804, 13805, 13806, 13807},{20,21,22,23,24},"",0},
284 | {{13754, 13867},{25,26},"",0},
285 | {{13743, 13875},{25,26},"",0},
286 | {{13712, 13788, 13789},{25,26,27},"",0},
287 | {{18427, 18428, 18429, 61330, 61331},{25,26,27,28,29},"",0},
288 | {{13709, 13800, 13801, 13802, 13803},{30,31,32,33,34},"",0},
289 | {{13960, 13961, 13962, 13963, 13964},{30,31,32,33,34},"",0},
290 | {{30919, 30920},{35,36},"",0},
291 | {{31124, 31126},{35,36},"",0},
292 | {{31122, 31123, 61329},{40,41,42},"",0},
293 | {{31130, 31131},{40,41},"",0},
294 | {{5952, 51679},{45,46},"",0},
295 | {{35541, 35550, 35551, 35552, 35553},{45,46,47,48,49},"",0},
296 | {{51672, 51674},{50,51},"",0},
297 | {{32601},{50},"",0},
298 | {{51682, 58413},{50,51},"",0},
299 | {{51685, 51686, 51687, 51688, 51689},{55,56,57,58,59},"",0},
300 | }},
301 |
302 | {"Subtlety","Ability_Stealth","RogueSubtlety",{
303 | {{14179, 58422, 58423, 58424, 58425},{10,11,12,13,14},"",0},
304 | {{13958, 13970, 13971},{10,11,12},"",0},
305 | {{14057, 14072},{10,11},"",0},
306 | {{30892, 30893},{15,16},"",0},
307 | {{14076, 14094},{15,16},"",0},
308 | {{13975, 14062, 14063},{15,16,17},"",0},
309 | {{13981, 14066},{20,21},"",0},
310 | {{14171, 14172, 14173},{20,21,22},"",0},
311 | {{13983, 14070, 14071},{25,26,27},"",0},
312 | {{13976, 13979, 13980},{25,26,27},"",0},
313 | {{14079, 14080},{25,26},"",0},
314 | {{30894, 30895},{30,31},"",0},
315 | {{14082, 14083},{30,31},"",0},
316 | {{31221, 31222, 31223},{35,36,37},"",0},
317 | {{30902, 30903, 30904, 30905, 30906},{35,36,37,38,39},"",0},
318 | {{31211, 31212, 31213},{40,41,42},"",0},
319 | {{31228, 31229, 31230},{40,41,42},"",0},
320 | {{31216, 31217, 31218, 31219, 31220},{45,46,47,48,49},"",0},
321 | {{51692, 51696},{45,46},"",0},
322 | {{51698, 51700, 51701},{50,51,52},"",0},
323 | {{58414, 58415},{50,51},"",0},
324 | {{51708, 51709, 51710, 51711, 51712},{55,56,57,58,59},"",0},
325 | }},
326 | }
327 |
328 | CLDB.data.talents.PRIEST={
329 | {"Discipline","Spell_Holy_WordFortitude","PriestDiscipline",{
330 | {{14522, 14788, 14789, 14790, 14791},{10,11,12,13,14},"",0},
331 | {{47586, 47587, 47588, 52802, 52803},{10,11,12,13,14},"",0},
332 | {{14523, 14784, 14785},{15,16,17},"",0},
333 | {{14747, 14770, 14771},{15,16,17},"",0},
334 | {{14749, 14767},{15,16},"",0},
335 | {{14531, 14774},{15,16},"",0},
336 | {{14521, 14776, 14777},{20,21,22},"",0},
337 | {{14748, 14768, 14769},{20,21,22},"",0},
338 | {{33167, 33171, 33172},{25,26,27},"",0},
339 | {{14520, 14780, 14781},{25,26,27},"",0},
340 | {{14750, 14772},{25,26},"",0},
341 | {{33201, 33202},{30,31},"",0},
342 | {{18551, 18552, 18553, 18554, 18555},{30,31,32,33,34},"",0},
343 | {{63574},{30},"",0},
344 | {{33186, 33190},{35,36},"",0},
345 | {{34908, 34909, 34910},{35,36,37},"",0},
346 | {{45234, 45243, 45244},{40,41,42},"",0},
347 | {{63504, 63505, 63506},{40,41,42},"",0},
348 | {{57470, 57472},{45,46},"",0},
349 | {{47535, 47536, 47537},{45,46,47},"",0},
350 | {{47507, 47508},{45,46},"",0},
351 | {{47509, 47511, 47515},{50,51,52},"",0},
352 | {{47516, 47517},{50,51},"",0},
353 | {{52795, 52797, 52798, 52799, 52800},{55,56,57,58,59},"",0},
354 | }},
355 |
356 | {"Holy","Spell_Holy_HolyBolt","PriestHoly",{
357 | {{14913, 15012},{10,11},"",0},
358 | {{14908, 15020, 17191},{10,11,12},"",0},
359 | {{14889, 15008, 15009, 15010, 15011},{10,11,12,13,14},"",0},
360 | {{27900, 27901, 27902, 27903, 27904},{15,16,17,18,19},"",0},
361 | {{18530, 18531, 18533, 18534, 18535},{15,16,17,18,19},"",0},
362 | {{27811, 27815, 27816},{20,21,22},"",0},
363 | {{14892, 15362, 15363},{20,21,22},"",0},
364 | {{27789, 27790},{25,26},"",0},
365 | {{14912, 15013, 15014},{25,26,27},"",0},
366 | {{14909, 15017},{25,26},"",0},
367 | {{14911, 15018},{30,31},"",0},
368 | {{20711},{30},"",0},
369 | {{14901, 15028, 15029, 15030, 15031},{30,31,32,33,34},"",0},
370 | {{33150, 33154},{35,36},"",0},
371 | {{14898, 15349, 15354, 15355, 15356},{35,36,37,38,39},"",0},
372 | {{34753, 34859, 34860},{40,41,42},"",0},
373 | {{33142, 33145, 33146},{40,41,42},"",0},
374 | {{64127, 64129},{45,46},"",0},
375 | {{33158, 33159, 33160, 33161, 33162},{45,46,47,48,49},"",0},
376 | {{63730, 63733, 63737},{45,46,47},"",0},
377 | {{63534, 63542, 63543},{50,51,52},"",0},
378 | {{47558, 47559, 47560},{50,51,52},"",0},
379 | {{47562, 47564, 47565, 47566, 47567},{55,56,57,58,59},"",0},
380 | }},
381 |
382 | {"Shadow","Spell_Shadow_ShadowWordPain","PriestShadow",{
383 | {{15270, 15335, 15336},{10,11,12},"",0},
384 | {{15337, 15338},{10,11},"",0},
385 | {{15259, 15307, 15308, 15309, 15310},{10,11,12,13,14},"",0},
386 | {{15272, 15318, 15320},{15,16,17},"",0},
387 | {{15275, 15317},{15,16},"",0},
388 | {{15260, 15327, 15328},{15,16,17},"",0},
389 | {{15392, 15448},{20,21},"",0},
390 | {{15273, 15312, 15313, 15314, 15316},{20,21,22,23,24},"",0},
391 | {{15274, 15311},{25,26},"",0},
392 | {{17322, 17323},{25,26},"",0},
393 | {{15257, 15331, 15332},{25,26,27},"",0},
394 | {{27839, 27840},{30,31},"",0},
395 | {{33213, 33214, 33215},{30,31,32},"",0},
396 | {{14910, 33371},{35,36},"",0},
397 | {{63625, 63626, 63627},{35,36,37},"",0},
398 | {{33221, 33222, 33223, 33224, 33225},{40,41,42,43,44},"",0},
399 | {{47569, 47570},{45,46},"",0},
400 | {{33191, 33192, 33193},{45,46,47},"",0},
401 | {{47580, 47581, 47582},{50,51,52},"",0},
402 | {{47573, 47577, 47578, 51166, 51167},{55,56,57,58,59},"",0},
403 | }},
404 | }
405 |
406 | CLDB.data.talents.SHAMAN={
407 | {"Elemental","Spell_Nature_Lightning","ShamanElementalCombat",{
408 | {{16039, 16109, 16110, 16111, 16112},{10,11,12,13,14},"",0},
409 | {{16035, 16105, 16106, 16017, 16108},{10,11,12,13,14},"",0},
410 | {{16038, 16160, 16161},{15,16,17},"",0},
411 | {{28996, 28997, 28998},{15,16,17},"",0},
412 | {{30160, 29179, 29180},{15,16,17},"",0},
413 | {{16040, 16113, 16114, 16115, 16116},{20,21,22,23,24},"",0},
414 | {{16164},{20},"",0},
415 | {{16089, 60184, 60185, 60187, 60188},{20,21,22,23,24},"",0},
416 | {{16086, 16544},{25,26},"",0},
417 | {{29062, 29064, 29065},{25,26,27},"",0},
418 | {{28999, 29000},{30,31},"",0},
419 | {{16041},{30},"",0},
420 | {{30664, 30665, 30666},{30,31,32},"",0},
421 | {{30672, 30673, 30674},{35,36,37},"",0},
422 | {{16578, 16579, 16580, 16581, 16582},{35,36,37,38,39},"",0},
423 | {{51483, 51485, 51486},{40,41,42},"",0},
424 | {{63370, 63372},{45,46},"",0},
425 | {{51466, 51470},{45,46},"",0},
426 | {{30675, 30678, 30679},{45,46,47},"",0},
427 | {{51474, 51478, 51479},{50,51,52},"",0},
428 | {{51480, 51481, 51482},{50,51,52},"",0},
429 | {{62097, 62098, 62099, 62100, 62101},{55,56,57,58,59},"",0},
430 | }},
431 |
432 | {"Enhancement","Spell_Nature_LightningShield","ShamanEnhancement",{
433 | {{16259, 16295, 52456},{10,11,12},"",0},
434 | {{16043, 16130},{10,11},"",0},
435 | {{17485, 17486, 17487, 17488, 17489},{10,11,12,13,14},"",0},
436 | {{16258, 16293},{15,16},"",0},
437 | {{16255, 16302, 16303, 16304, 16305},{15,16,17,18,19},"",0},
438 | {{16262, 16287},{15,16},"",0},
439 | {{16261, 16290, 51881},{15,16,17},"",0},
440 | {{16266, 29079, 29080},{20,21,22},"",0},
441 | {{43338},{20},"",0},
442 | {{16254, 16271, 16272},{20,21,22},"",0},
443 | {{16256, 16281, 16282, 16283, 16284},{25,26,27,28,29},"",0},
444 | {{16252, 16306, 16307, 16308, 16309},{25,26,27,28,29},"",0},
445 | {{29192, 29193},{30,31},"",0},
446 | {{16268},{30},"",0},
447 | {{51883, 51884, 51885},{30,31,32},"",0},
448 | {{30802, 30808, 30809},{35,36,37},"",0},
449 | {{29082, 29084, 29086},{35,36,37},"",0},
450 | {{63373, 63374},{35,36},"",0},
451 | {{30816, 30818, 30819},{40,41,42},"",0},
452 | {{30798},{40},"",0},
453 | {{51525, 51526, 51527},{45,46,47},"",0},
454 | {{51521, 51522},{45,46},"",0},
455 | {{30812, 30813, 30814},{50,51,52},"",0},
456 | {{51523, 51524},{50,51},"",0},
457 | {{51528, 51529, 51530, 51531, 51532},{55,56,57,58,59},"",0},
458 | }},
459 |
460 | {"Restoration","Spell_Nature_MagicImmunity","ShamanRestoration",{
461 | {{16182, 16226, 16227, 16228, 16229},{10,11,12,13,14},"",0},
462 | {{16173, 16222, 16223, 16224, 16225},{10,11,12,13,14},"",0},
463 | {{16184, 16209},{15,16},"",0},
464 | {{29187, 29189, 29191},{15,16,17},"",0},
465 | {{16179, 16214, 16215, 16216, 16217},{15,16,17,18,19},"",0},
466 | {{16180, 16196, 16198},{20,21,22},"",0},
467 | {{16181, 16230, 16232},{20,21,22},"",0},
468 | {{16176, 16235, 16240},{20,21,22},"",0},
469 | {{16187, 16205, 16206},{25,26,27},"",0},
470 | {{16194, 16218, 16219, 16220, 16221},{25,26,27,28,29},"",0},
471 | {{29206, 29205, 29202},{30,31,32},"",0},
472 | {{30864, 30865, 30866},{30,31,32},"",0},
473 | {{16178, 16210, 16211, 16212, 16213},{35,36,37,38,39},"",0},
474 | {{30881, 30883, 30884, 30885, 30886},{40,41,42,43,44},"",0},
475 | {{51886},{40},"",0},
476 | {{51554, 51555},{45,46},"",0},
477 | {{30872, 30873},{45,46},"",0},
478 | {{30867, 30868, 30869},{45,46,47},"",0},
479 | {{51556, 51557, 51558},{50,51,52},"",0},
480 | {{51560, 51561},{50,51},"",0},
481 | {{51562, 51563, 51564, 51565, 51566},{55,56,57,58,59},"",0},
482 | }},
483 | }
484 |
485 | CLDB.data.talents.MAGE={
486 | {"Arcane","Spell_Holy_MagicalSentry","MageArcane",{
487 | {{11210, 12592},{10,11},"",0},
488 | {{11222, 12839, 12840},{10,11,12},"",0},
489 | {{11237, 12463, 12464,16769, 16770},{10,11,12,13,14},"",0},
490 | {{28574, 54658, 54659},{15,16,17},"",0},
491 | {{29441, 29444},{15,16},"",0},
492 | {{11213, 12574, 12575, 12576, 12577},{15,16,17,18,19},"",0},
493 | {{11247, 12606},{20,21},"",0},
494 | {{11242, 12467, 12469},{20,21,22},"",0},
495 | {{44397, 44398, 44399},{20,21,22},"",0},
496 | {{11252, 12605},{25,26},"",0},
497 | {{11255, 12598},{25,26},"",0},
498 | {{18462, 18463, 18464},{25,26,27},"",0},
499 | {{29447, 55339, 55340},{25,26,27},"",0},
500 | {{31569, 31570},{30,31},"",0},
501 | {{11232, 12500, 12501, 12502, 12503},{30,31,32,33,34},"",0},
502 | {{31574, 31575, 54354},{35,36,37},"",0},
503 | {{15058, 15059, 15060},{35,36,37},"",0},
504 | {{31571, 31572},{35,36},"",0},
505 | {{31579, 31582, 31583},{40,41,42},"",0},
506 | {{44394, 44395, 44396},{40,41,42},"",0},
507 | {{44378, 44379},{45,46},"",0},
508 | {{31584, 31585, 31586, 31587, 31588},{45,46,47,48,49},"",0},
509 | {{44404, 54486, 54488, 54489, 54490},{50,51,52,53,54},"",0},
510 | {{44400, 44402, 44403},{55,56,57},"",0},
511 | {{35578, 35581},{55,56},"",0},
512 | }},
513 |
514 | {"Fire","Spell_Fire_FireBolt02","MageFire",{
515 | {{11078, 11080},{10,11},"",0},
516 | {{18459, 18460, 54734},{10,11,12},"",0},
517 | {{11069, 12338, 12339, 12340, 12341},{10,11,12,13,14},"",0},
518 | {{11119, 11120, 12846, 12847, 12848},{15,16,17,18,19},"",0},
519 | {{54747, 54749},{15,16},"",0},
520 | {{11108, 12349, 12350},{15,16,17},"",0},
521 | {{11100, 12353},{20,21},"",0},
522 | {{11103, 12357, 12358},{20,21,22},"",0},
523 | {{11083, 12351},{20,21},"",0},
524 | {{11095, 12872, 12873},{25,26,27},"",0},
525 | {{11094, 13043},{25,26},"",0},
526 | {{29074, 29075, 29076},{25,26,27},"",0},
527 | {{31638, 31639, 31640},{30,31,32},"",0},
528 | {{11115, 11367, 11368},{30,31,32},"",0},
529 | {{31641, 31642},{35,36},"",0},
530 | {{11124, 12378, 12398, 12399, 12400},{35,36,37,38,39},"",0},
531 | {{34293, 34295, 34296},{40,41,42},"",0},
532 | {{31679, 31680},{40,41},"",0},
533 | {{44440, 44441},{45,46},"",0},
534 | {{31656, 31657, 31658},{45,46,47},"",0},
535 | {{44442, 44443},{50,51},"",0},
536 | {{44445, 44446, 44448},{50,51,52},"",0},
537 | {{44449, 44469, 44470, 44471, 44472},{55,56,57,58,59},"",0},
538 | }},
539 |
540 | {"Frost","Spell_Frost_FrostBolt02","MageFrost",{
541 | {{11071, 12496, 12497},{10,11,12},"",0},
542 | {{11070, 12473, 16763, 16765, 16766},{10,11,12,13,14},"",0},
543 | {{31670, 31672, 55094},{10,11,12},"",0},
544 | {{11207, 12672, 15047},{15,16,17},"",0},
545 | {{11189, 28332},{15,16},"",0},
546 | {{29438, 29439, 29440},{15,16,17},"",0},
547 | {{11175, 12569, 12571},{15,16,17},"",0},
548 | {{11151, 12952, 12953},{20,21,22},"",0},
549 | {{11185, 12487, 12488},{20,21,22},"",0},
550 | {{16757, 16758},{25,26},"",0},
551 | {{11160, 12518, 12519},{25,26,27},"",0},
552 | {{11170, 12982, 12983},{25,26,27},"",0},
553 | {{11190, 12489, 12490},{30,31,32},"",0},
554 | {{31667, 31668, 31669},{30,31,32},"",0},
555 | {{55091, 55092},{35,36},"",0},
556 | {{11180, 28592, 28593},{35,36,37},"",0},
557 | {{44745, 54787},{40,41},"",0},
558 | {{31674, 31675, 31676, 31677, 31678},{40,41,42,43,44},"",0},
559 | {{31682, 31683},{45,46},"",0},
560 | {{44543, 44545},{45,46},"",0},
561 | {{44546, 44548, 44549},{50,51,52},"",0},
562 | {{44557, 44560, 44561},{50,51,52},"",0},
563 | {{44566, 44567, 44568, 44570, 44571},{55,56,57,58,59},"",0},
564 | }},
565 | }
566 |
567 | CLDB.data.talents.WARLOCK={
568 | {"Affliction","Spell_Shadow_DeathCoil","WarlockCurses",{
569 | {{18827, 18829},{10,11},"",0},
570 | {{18174, 18175, 18176},{10,11,12},"",0},
571 | {{17810, 17811, 17812, 17813, 17814},{10,11,12,13,14},"",0},
572 | {{18179, 18180},{15,16},"",0},
573 | {{18213, 18372},{15,16},"",0},
574 | {{18182, 18183},{15,16},"",0},
575 | {{17804, 17805},{15,16},"",0},
576 | {{53754, 53759},{20,21},"",0},
577 | {{17783, 17784, 17785},{20,21,22},"",0},
578 | {{18288},{20},"",0},
579 | {{18218, 18219},{25,26},"",0},
580 | {{18094, 18095},{25,26},"",0},
581 | {{32381, 32382, 32383},{25,26,27},"",0},
582 | {{32385, 32387, 32392, 32393, 32394},{30,31,32,33,34},"",0},
583 | {{63108},{30},"",0},
584 | {{54037, 54038},{35,36},"",0},
585 | {{18271, 18272, 18273, 18274, 18275},{35,36,37,38,39},"",0},
586 | {{47195, 47196, 47197},{40,41,42},"",0},
587 | {{30060, 30062, 30062, 30063, 30064},{40,41,42,43,44},"",0},
588 | {{30054, 30057},{45,46},"",0},
589 | {{32477, 32483, 32484},{45,46,47},"",0},
590 | {{47198, 47199, 47200},{50,51,52},"",0},
591 | {{58435},{50},"",0},
592 | {{47201, 47202, 47203, 47204, 47205},{55,56,57,58,59},"",0},
593 | }},
594 |
595 |
596 | {"Demonology","Spell_Shadow_Metamorphosis","WarlockSummoning",{
597 | {{18692, 18693},{10,11},"",0},
598 | {{18694, 18695, 18696},{10,11,12},"",0},
599 | {{18697, 18698, 18699},{10,11,12},"",0},
600 | {{47230, 47231},{10,11},"",0},
601 | {{18703, 18704},{15,16},"",0},
602 | {{18705, 18706, 18707},{15,16,17},"",0},
603 | {{18731, 18743, 18744},{15,16,17},"",0},
604 | {{18754, 18755, 18756},{20,21,22},"",0},
605 | {{30143, 30144, 30145},{20,21,22},"",0},
606 | {{18769, 18770, 18771, 18772, 18773},{25,26,27,28,29},"",0},
607 | {{18709, 18710},{25,26},"",0},
608 | {{30326},{30},"",0},
609 | {{18767, 18768},{30,31},"",0},
610 | {{23785, 23822, 23823, 23824, 23825},{35,36,37,38,39},"",0},
611 | {{47245, 47246, 47247},{35,36,37},"",0},
612 | {{30319, 30320, 30321},{40,41,42},"",0},
613 | {{35691, 35692, 35693},{40,41,42},"",0},
614 | {{30242, 30245, 30246, 30247, 30248},{45,46,47,48,49},"",0},
615 | {{63156, 63158},{45,46},"",0},
616 | {{54347, 54348, 54349},{50,51,52},"",0},
617 | {{63117, 63121, 63123},{50,51,52},"",0},
618 | {{47236, 47237, 47238, 47239, 47240},{55,56,57,58,59},"",0},
619 | }},
620 |
621 |
622 | {"Destruction","Spell_Shadow_RainOfFire","WarlockDestruction",{
623 | {{17793, 17796, 17801, 17802, 17803},{10,11,12,13,14},"",0},
624 | {{17788, 17789, 17790, 17791, 17792},{10,11,12,13,14},"",0},
625 | {{18119, 18120},{15,16},"",0},
626 | {{63349, 63350, 63351},{15,16,17},"",0},
627 | {{17778, 17779, 17780},{15,16,17},"",0},
628 | {{18126, 18127},{20,21},"",0},
629 | {{17959, 59738, 59739, 59740, 59741},{20,21,22,23,24},"",0},
630 | {{18135, 18136},{25,26},"",0},
631 | {{17917, 17918},{25,26},"",0},
632 | {{17927, 17929, 17930},{25,26,27},"",0},
633 | {{34935, 34938, 34939},{30,31,32},"",0},
634 | {{17815, 17833, 17834},{30,31,32},"",0},
635 | {{18130},{30},"",0},
636 | {{30299, 30301, 30302},{35,36,37},"",0},
637 | {{17954, 17955, 17956, 17957, 17958},{35,36,37,38,39},"",0},
638 | {{30293, 30295, 30296},{40,41,42},"",0},
639 | {{18096, 18073, 63245},{40,41,42},"",0},
640 | {{30288, 30289, 30290, 30291, 30292},{45,46,47,48,49},"",0},
641 | {{54117, 54118},{45,46},"",0},
642 | {{47258, 47259, 47260},{50,51,52},"",0},
643 | {{47220, 47221, 47223},{50,51,52},"",0},
644 | {{47266, 47267, 47268, 47269, 47270},{55,56,57,58,59},"",0},
645 | }},
646 | }
647 |
648 |
649 | CLDB.data.talents.DRUID={
650 | {"Balance","Spell_Nature_StarFall","DruidBalance",{
651 | {{16814, 16815, 16816, 16817, 16818},{10,11,12,13,14},"",0},
652 | {{57810, 57811, 57812, 57813, 57814},{10,11,12,13,14},"",0},
653 | {{16845, 16846, 16847},{15,16,17},"",0},
654 | {{35363, 35364},{15,16},"",0},
655 | {{16821, 16822},{15,16},"",0},
656 | {{16836, 16839, 16840},{20,21,22},"",0},
657 | {{16880, 61345, 61346},{20,21,22},"",0},
658 | {{57865},{20},"",0},
659 | {{16819, 16820},{20,21},"",0},
660 | {{16909, 16910, 16911, 16912, 16913},{25,26,27,28,29},"",0},
661 | {{16850, 16923, 16924},{25,26,27},"",0},
662 | {{33589, 33590, 33591},{30,31,32},"",0},
663 | {{57849, 57850, 57851},{30,31,32},"",0},
664 | {{33597, 33599, 33956},{35,36,37},"",0},
665 | {{16896, 16897, 16899},{35,36,37},"",0},
666 | {{33592, 33596},{35,36},"",0},
667 | {{48384, 48395, 48396},{40,41,42},"",0},
668 | {{33600, 33601, 33602},{40,41,42},"",0},
669 | {{48389, 48392, 48393},{45,46,47},"",0},
670 | {{33603, 33604, 33605, 33606, 33607},{45,46,47,48,49},"",0},
671 | {{48516, 48521, 48525},{50,51,52},"",0},
672 | {{48488, 48514},{50,51},"",0},
673 | {{48506, 48510, 48511},{55,56,57},"",0},
674 | }},
675 |
676 | {"Feral Combat","Ability_Racial_BearForm","DruidFeralCombat",{
677 | {{16934, 16935, 16936, 16937, 16938},{10,11,12,13,14},"",0},
678 | {{16858, 16859, 16860, 16861, 16862},{10,11,12,13,14},"",0},
679 | {{16947, 16948, 16949},{15,16,17},"",0},
680 | {{16998, 16999},{15,16},"",0},
681 | {{16929, 16930, 16931},{15,16,17},"",0},
682 | {{17002, 24866},{20,21},"",0},
683 | {{16942, 16943, 16944},{20,21,22},"",0},
684 | {{16966, 16968},{25,26},"",0},
685 | {{16972, 16974, 16975},{25,26,27},"",0},
686 | {{37116, 37117},{25,26},"",0},
687 | {{48409, 48410},{25,26},"",0},
688 | {{16940, 16941},{30,31},"",0},
689 | {{33872, 33873},{30,31},"",0},
690 | {{57878, 57880, 57881},{35,36,37},"",0},
691 | {{17003, 17004, 17005, 17006, 24894},{35,36,37,38,39},"",0},
692 | {{33853, 33855, 33856},{35,36,37},"",0},
693 | {{17007},{40},"",0},
694 | {{34297, 34300},{40,41},"",0},
695 | {{33851, 33852, 33957},{40,41,42},"",0},
696 | {{57873, 57876, 57877},{45,46,47},"",0},
697 | {{33859, 33866, 33867},{45,46,47},"",0},
698 | {{48483, 48484, 48485},{45,46,47},"",0},
699 | {{48492, 48494, 48495},{50,51,52},"",0},
700 | {{48532, 48489, 48491},{50,51,52},"",0},
701 | {{48432, 48433, 48434, 51268, 51269},{55,56,57,58,59},"",0},
702 | {{63503},{55},"",0},
703 | }},
704 |
705 | {"Restoration","Spell_Nature_HealingTouch","DruidRestoration",{
706 | {{17050, 17051},{10,11},"",0},
707 | {{17063, 17065, 17066},{10,11,12},"",0},
708 | {{17056, 17058, 17059, 17060, 17061},{10,11,12,13,14},"",0},
709 | {{17069, 17070, 17071, 17072, 17073},{15,16,17,18,19},"",0},
710 | {{17118, 17119, 17120},{15,16,17},"",0},
711 | {{16833, 16834, 16835},{15,16,17},"",0},
712 | {{17106, 17107, 17108},{20,21,22},"",0},
713 | {{16864},{20},"",0},
714 | {{48411, 48412},{20,21},"",0},
715 | {{24968, 24969, 24970, 24971, 24972},{25,26,27,28,29},"",0},
716 | {{17111, 17112, 17113},{25,26,27},"",0},
717 | {{17104, 24943, 24944, 24945, 24946},{30,31,32,33,34},"",0},
718 | {{17123, 17124},{30,31},"",0},
719 | {{33879, 33880},{35,36},"",0},
720 | {{17074, 17075, 17076, 17077, 17078},{35,36,37,38,39},"",0},
721 | {{34151, 34152, 34153},{40,41,42},"",0},
722 | {{33881, 33882, 33883},{40,41,42},"",0},
723 | {{33886, 33887, 33888, 33889, 33890},{45,46,47,48,49},"",0},
724 | {{48496, 48499, 48500},{45,46,47},"",0},
725 | {{48539, 48544, 48545},{50,51,52},"",0},
726 | {{48535, 48536, 48537},{50,51,52},"",0},
727 | {{63410, 63411},{55,56},"",0},
728 | {{51179, 51180, 51181, 51182, 51183},{55,56,57,58,59},"",0},
729 | }},
730 | }
731 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |