├── 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 | AstoriaCore 5 | 6 | 7 |

AstoriaCore Classless System

8 | 9 | ## About 10 | 11 | This is the Classless system that Project Astoria used until near the end. It is an open source classless system from an 12 | Ac-Web.org user, but it was very outdated and had several security holes. We fixed all those security holes (which we 13 | knew about) and restructured the code a bit. We also extended the system even further and gave it a completely new UI. 14 | 15 | ## Supported Gameversions 16 | 17 | The AstoriaCore Classless System is coded for Game Version: `3.3.5a` 18 | 19 | ## How to Install 20 | 21 | Here you will learn how you can install the Classless System to your Server 22 | 23 | ### Requirements: 24 | 25 | * [ELUNA LUA Engine](https://github.com/ElunaLuaEngine/Eluna) 26 | * [AIO](https://github.com/Rochet2/AIO) 27 | 28 | ### Implementation 29 | 30 | 1. Install ELUNA Lua Engine into your Core (if you dont have it yet) 31 | 2. Download and Implement AIO to your Server and Gameclient. (if you dont have it yet) 32 | 3. Move the Patch-C.mpq from the Interface Folder into your Data Folder. (Gameclient) 33 | 4. Move the Lua Scripts from the LUA Folder into your lua_scripts Folder. (Serverfolder) 34 | 5. Import the character_classless into your characters Database. 35 | 36 | ## Disclaimer 37 | 38 | We want to provide you with maximum security, yet we did not write the base of the code ourselves but used it from other OpenSource projects like AzerothCore 39 | and TrinityCore. Therefore we do not guarantee security, correctness, usability of the code and all related programs, tools or Software you use. Also we do not 40 | guarantee direct support for our code. All code written by us you use on your own responsibility. We also reserve the right to exclude people from the community 41 | at any time who do not follow our guidelines or misuse code. 42 | 43 | ## Credits 44 | 45 | * [AstoriaCore Team](https://discord.gg/wvDYdqX) 46 | -------------------------------------------------------------------------------- /SQL/character_classless.sql: -------------------------------------------------------------------------------- 1 | -- -------------------------------------------------------- 2 | -- Host: 127.0.0.1 3 | -- Server Version: 5.7.31-log - MySQL Community Server (GPL) 4 | -- Server Betriebssystem: Win64 5 | -- HeidiSQL Version: 11.0.0.5919 6 | -- -------------------------------------------------------- 7 | 8 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 9 | /*!40101 SET NAMES utf8 */; 10 | /*!50503 SET NAMES utf8mb4 */; 11 | /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 12 | /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 13 | 14 | 15 | -- Exportiere Datenbank Struktur für characters 16 | CREATE DATABASE IF NOT EXISTS `characters` /*!40100 DEFAULT CHARACTER SET utf8 */; 17 | USE `characters`; 18 | 19 | -- Exportiere Struktur von Tabelle characters.character_classless 20 | CREATE TABLE IF NOT EXISTS `character_classless` ( 21 | `guid` bigint(20) NOT NULL, 22 | `spells` longtext, 23 | `tpells` longtext, 24 | `talents` longtext, 25 | `stats` longtext, 26 | `resets` int(11) NOT NULL DEFAULT '0', 27 | PRIMARY KEY (`guid`) 28 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 29 | 30 | -- Exportiere Daten aus Tabelle characters.character_classless: ~1 rows (ungefähr) 31 | /*!40000 ALTER TABLE `character_classless` DISABLE KEYS */; 32 | /*!40000 ALTER TABLE `character_classless` ENABLE KEYS */; 33 | 34 | /*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; 35 | /*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; 36 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 37 | --------------------------------------------------------------------------------