aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent-Michael <Vincent_Michael@gmx.de>2013-07-25 00:41:37 +0200
committerVincent-Michael <Vincent_Michael@gmx.de>2013-07-25 00:41:37 +0200
commitd4d43d74106bc3666175614bc7923b8b4e03bf50 (patch)
tree54940a0817cccacbc17fd82e538d17e8dd2d3ad5
parentef83ec8d1c3dca2ef0208de376d0315d26d44227 (diff)
parentc4a1ad2810a1c2e2c2f2e2cbf26033ac3fbdc796 (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts: src/server/game/Globals/ObjectMgr.cpp src/server/game/Spells/SpellMgr.cpp src/server/game/Spells/SpellMgr.h src/server/game/World/World.cpp
-rw-r--r--sql/updates/world/2013_07_24_01_world_spell_ranks.sql682
-rw-r--r--sql/updates/world/2013_07_24_02_world_trinity_strings.sql3
-rw-r--r--sql/updates/world/2013_07_24_03_world_spell_proc_event.sql876
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp24
-rw-r--r--src/server/game/Guilds/GuildMgr.cpp2
-rw-r--r--src/server/game/Spells/SpellMgr.cpp217
-rw-r--r--src/server/game/Spells/SpellMgr.h7
-rw-r--r--src/server/game/World/World.cpp4
-rw-r--r--src/server/scripts/Commands/cs_learn.cpp8
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp10
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.cpp2
11 files changed, 1749 insertions, 86 deletions
diff --git a/sql/updates/world/2013_07_24_01_world_spell_ranks.sql b/sql/updates/world/2013_07_24_01_world_spell_ranks.sql
new file mode 100644
index 00000000000..db1d9803596
--- /dev/null
+++ b/sql/updates/world/2013_07_24_01_world_spell_ranks.sql
@@ -0,0 +1,682 @@
+DELETE FROM `spell_ranks` WHERE `first_spell_id` IN (
+5923,
+5952,
+9452,
+9453,
+9799,
+11069,
+11070,
+11071,
+11078,
+11083,
+11094,
+11095,
+11100,
+11103,
+11108,
+11115,
+11119,
+11124,
+11151,
+11160,
+11170,
+11175,
+11180,
+11185,
+11189,
+11190,
+11207,
+11210,
+11213,
+11222,
+11232,
+11237,
+11242,
+11247,
+11252,
+11255,
+12163,
+12281,
+12282,
+12284,
+12285,
+12286,
+12287,
+12289,
+12290,
+12295,
+12297,
+12298,
+12299,
+12300,
+12301,
+12308,
+12311,
+12312,
+12313,
+12317,
+12318,
+12319,
+12320,
+12321,
+12322,
+12324,
+12329,
+12700,
+12797,
+12834,
+12862,
+13705,
+13706,
+13709,
+13712,
+13713,
+13715,
+13732,
+13733,
+13741,
+13742,
+13743,
+13754,
+13958,
+13960,
+13975,
+13976,
+13981,
+13983,
+14057,
+14076,
+14079,
+14082,
+14113,
+14128,
+14138,
+14144,
+14156,
+14158,
+14162,
+14165,
+14168,
+14171,
+14174,
+14179,
+14186,
+14520,
+14521,
+14522,
+14523,
+14531,
+14747,
+14748,
+14749,
+14750,
+14889,
+14892,
+14898,
+14901,
+14908,
+14909,
+14910,
+14911,
+14912,
+14913,
+15058,
+15257,
+15259,
+15260,
+15270,
+15273,
+15274,
+15275,
+15318,
+15337,
+15392,
+16035,
+16038,
+16039,
+16040,
+16043,
+16086,
+16089,
+16173,
+16176,
+16178,
+16179,
+16180,
+16181,
+16182,
+16184,
+16187,
+16194,
+16252,
+16254,
+16255,
+16256,
+16258,
+16259,
+16261,
+16262,
+16266,
+16462,
+16487,
+16493,
+16513,
+16538,
+16578,
+16757,
+16814,
+16819,
+16821,
+16833,
+16836,
+16845,
+16850,
+16858,
+16880,
+16896,
+16909,
+16929,
+16934,
+16940,
+16942,
+16947,
+16966,
+16972,
+16998,
+17002,
+17003,
+17050,
+17056,
+17063,
+17069,
+17074,
+17104,
+17106,
+17111,
+17118,
+17123,
+17322,
+17485,
+17778,
+17783,
+17788,
+17793,
+17804,
+17810,
+17815,
+17917,
+17927,
+17954,
+17959,
+18094,
+18096,
+18119,
+18126,
+18135,
+18174,
+18179,
+18182,
+18213,
+18218,
+18271,
+18427,
+18459,
+18462,
+18530,
+18551,
+18692,
+18694,
+18697,
+18703,
+18705,
+18709,
+18731,
+18754,
+18767,
+18769,
+18827,
+19159,
+19168,
+19184,
+19255,
+19286,
+19290,
+19295,
+19370,
+19376,
+19407,
+19416,
+19421,
+19426,
+19454,
+19461,
+19464,
+19485,
+19498,
+19507,
+19549,
+19552,
+19559,
+19572,
+19578,
+19583,
+19590,
+19598,
+19609,
+19616,
+19621,
+20042,
+20049,
+20060,
+20096,
+20101,
+20111,
+20117,
+20127,
+20138,
+20143,
+20174,
+20177,
+20196,
+20205,
+20210,
+20224,
+20234,
+20237,
+20244,
+20254,
+20257,
+20262,
+20335,
+20359,
+20468,
+20487,
+20500,
+20502,
+20504,
+23584,
+23785,
+24443,
+24968,
+25956,
+26022,
+27789,
+27811,
+27839,
+27900,
+28574,
+28996,
+28999,
+29062,
+29074,
+29082,
+29140,
+29187,
+29192,
+29206,
+29438,
+29441,
+29447,
+29590,
+29593,
+29598,
+29721,
+29723,
+29759,
+29787,
+29834,
+29836,
+29888,
+30054,
+30060,
+30143,
+30160,
+30242,
+30288,
+30293,
+30299,
+30319,
+30664,
+30672,
+30675,
+30802,
+30812,
+30816,
+30864,
+30867,
+30872,
+30881,
+30892,
+30894,
+30902,
+30919,
+31122,
+31124,
+31130,
+31208,
+31211,
+31216,
+31221,
+31226,
+31228,
+31234,
+31244,
+31380,
+31569,
+31571,
+31574,
+31579,
+31584,
+31638,
+31641,
+31656,
+31667,
+31670,
+31674,
+31679,
+31682,
+31785,
+31822,
+31825,
+31828,
+31833,
+31837,
+31844,
+31848,
+31850,
+31858,
+31866,
+31871,
+31876,
+31879,
+32043,
+32381,
+32385,
+32477,
+33142,
+33150,
+33158,
+33167,
+33186,
+33191,
+33201,
+33213,
+33221,
+33589,
+33592,
+33597,
+33600,
+33603,
+33851,
+33853,
+33859,
+33872,
+33879,
+33881,
+33886,
+34151,
+34293,
+34297,
+34453,
+34455,
+34462,
+34466,
+34475,
+34482,
+34485,
+34491,
+34494,
+34497,
+34500,
+34506,
+34753,
+34908,
+34935,
+34948,
+34950,
+35029,
+35100,
+35104,
+35363,
+35446,
+35541,
+35578,
+35691,
+37116,
+44378,
+44394,
+44397,
+44400,
+44404,
+44442,
+44445,
+44449,
+44543,
+44546,
+44557,
+44566,
+44745,
+45234,
+46854,
+46859,
+46865,
+46867,
+46908,
+46910,
+46913,
+46945,
+46951,
+47195,
+47198,
+47201,
+47220,
+47230,
+47236,
+47245,
+47258,
+47266,
+47294,
+47507,
+47509,
+47516,
+47535,
+47558,
+47562,
+47569,
+47573,
+47580,
+47586,
+48384,
+48389,
+48409,
+48411,
+48432,
+48483,
+48488,
+48492,
+48496,
+48506,
+48516,
+48532,
+48535,
+48539,
+48962,
+48963,
+48965,
+48977,
+48978,
+48979,
+48985,
+48987,
+48988,
+48997,
+49004,
+49006,
+49013,
+49015,
+49018,
+49023,
+49024,
+49027,
+49032,
+49036,
+49042,
+49137,
+49140,
+49145,
+49146,
+49149,
+49175,
+49182,
+49186,
+49188,
+49189,
+49200,
+49202,
+49208,
+49217,
+49219,
+49220,
+49223,
+49224,
+49226,
+49455,
+49467,
+49471,
+49588,
+50040,
+50117,
+50187,
+50365,
+50384,
+50391,
+50685,
+50880,
+51099,
+51123,
+51179,
+51459,
+51466,
+51468,
+51474,
+51480,
+51483,
+51521,
+51523,
+51525,
+51528,
+51554,
+51556,
+51560,
+51562,
+51625,
+51627,
+51632,
+51634,
+51664,
+51672,
+51682,
+51685,
+51692,
+51698,
+51708,
+51745,
+51883,
+52234,
+52783,
+52795,
+53137,
+53175,
+53178,
+53180,
+53182,
+53186,
+53203,
+53215,
+53221,
+53228,
+53234,
+53241,
+53252,
+53256,
+53262,
+53290,
+53295,
+53298,
+53302,
+53375,
+53379,
+53380,
+53409,
+53427,
+53450,
+53481,
+53483,
+53486,
+53501,
+53511,
+53514,
+53527,
+53551,
+53554,
+53556,
+53569,
+53583,
+53590,
+53620,
+53660,
+53671,
+53695,
+53709,
+53754,
+54037,
+54117,
+54347,
+54639,
+54747,
+55061,
+55091,
+55107,
+55129,
+55620,
+55666,
+56314,
+56333,
+56339,
+56342,
+56636,
+56927,
+57470,
+57810,
+57849,
+57873,
+57878,
+58414,
+58872,
+59088,
+61154,
+61216,
+61680,
+61682,
+61686,
+61689,
+62097,
+62758,
+62759,
+62764,
+62905,
+63117,
+63156,
+63349,
+63370,
+63373,
+63410,
+63504,
+63534,
+63625,
+63646,
+63730,
+64127,
+64353,
+65661,
+66799);
diff --git a/sql/updates/world/2013_07_24_02_world_trinity_strings.sql b/sql/updates/world/2013_07_24_02_world_trinity_strings.sql
new file mode 100644
index 00000000000..b14e60c2c9d
--- /dev/null
+++ b/sql/updates/world/2013_07_24_02_world_trinity_strings.sql
@@ -0,0 +1,3 @@
+DELETE FROM `trinity_string` WHERE entry = 850;
+INSERT INTO `trinity_string` (entry, content_default, content_loc1, content_loc2, content_loc3, content_loc4, content_loc5, content_loc6, content_loc7, content_loc8) VALUES
+(850, '├─ Rank: %s (ID: %u)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
diff --git a/sql/updates/world/2013_07_24_03_world_spell_proc_event.sql b/sql/updates/world/2013_07_24_03_world_spell_proc_event.sql
new file mode 100644
index 00000000000..0e179e54ec8
--- /dev/null
+++ b/sql/updates/world/2013_07_24_03_world_spell_proc_event.sql
@@ -0,0 +1,876 @@
+ALTER TABLE `spell_proc_event`
+ CHANGE `entry` `entry` MEDIUMINT(8) DEFAULT 0 NOT NULL;
+
+DELETE FROM `spell_proc_event` WHERE `entry` IN (
+325,
+905,
+945,
+8134,
+8494,
+8495,
+10191,
+10192,
+10193,
+10431,
+10432,
+11120,
+12487,
+12488,
+12574,
+12575,
+12576,
+12577,
+12598,
+12668,
+12724,
+12725,
+12726,
+12727,
+12799,
+12812,
+12813,
+12814,
+12815,
+12846,
+12847,
+12848,
+12849,
+12867,
+12872,
+12873,
+12958,
+12967,
+12968,
+12969,
+12970,
+12971,
+12972,
+12973,
+12974,
+13867,
+14070,
+14071,
+14160,
+14161,
+14190,
+14193,
+14194,
+14195,
+14318,
+14319,
+14320,
+14321,
+14322,
+14774,
+15338,
+15362,
+15363,
+16196,
+16198,
+16235,
+16240,
+16277,
+16278,
+16279,
+16280,
+16281,
+16282,
+16283,
+16284,
+16489,
+16492,
+16544,
+16923,
+16924,
+16954,
+16961,
+17107,
+17108,
+17796,
+17801,
+17802,
+17803,
+18073,
+18095,
+18120,
+19387,
+19388,
+19573,
+20056,
+20057,
+20179,
+20180,
+20181,
+20182,
+20212,
+20213,
+20214,
+20215,
+20235,
+20336,
+20337,
+20501,
+20927,
+20928,
+23695,
+24398,
+25296,
+25469,
+25472,
+25988,
+27044,
+27131,
+27179,
+27815,
+27816,
+28592,
+28593,
+29075,
+29076,
+29179,
+29180,
+29444,
+29594,
+29838,
+30295,
+30296,
+30301,
+30302,
+30678,
+30679,
+30705,
+30883,
+30884,
+30885,
+30886,
+31126,
+31245,
+31570,
+31572,
+31657,
+31658,
+31835,
+31836,
+31872,
+31877,
+31878,
+32387,
+32392,
+32393,
+32394,
+32593,
+32594,
+33145,
+33146,
+33154,
+33192,
+33193,
+33736,
+33882,
+33883,
+34498,
+34499,
+34502,
+34503,
+34859,
+34860,
+34916,
+34917,
+34938,
+34939,
+34954,
+35102,
+35550,
+35551,
+35552,
+35553,
+43019,
+43020,
+44443,
+44446,
+44448,
+44469,
+44470,
+44471,
+44472,
+44560,
+44561,
+45243,
+45244,
+46855,
+46914,
+46915,
+46949,
+47196,
+47197,
+47202,
+47203,
+47204,
+47205,
+47246,
+47247,
+47259,
+47260,
+47264,
+47265,
+47511,
+47515,
+47517,
+47570,
+47581,
+47582,
+48110,
+48111,
+48112,
+48113,
+48159,
+48160,
+48484,
+48485,
+48499,
+48500,
+48510,
+48511,
+48521,
+48525,
+48544,
+48545,
+48951,
+48952,
+49280,
+49281,
+49283,
+49284,
+49503,
+49504,
+49508,
+49509,
+49529,
+49530,
+49599,
+49627,
+49628,
+49654,
+49655,
+50033,
+50034,
+50115,
+50884,
+50885,
+50886,
+50887,
+51462,
+51463,
+51464,
+51465,
+51478,
+51479,
+51522,
+51524,
+51557,
+51558,
+51563,
+51564,
+51565,
+51566,
+51626,
+51628,
+51629,
+51635,
+51636,
+51665,
+51667,
+51668,
+51669,
+51674,
+51679,
+51696,
+51989,
+52004,
+52005,
+52007,
+52008,
+52129,
+52131,
+52134,
+52136,
+52138,
+52797,
+52798,
+52799,
+52800,
+53179,
+53216,
+53217,
+53222,
+53224,
+53232,
+53237,
+53238,
+53259,
+53260,
+53291,
+53292,
+53376,
+53381,
+53382,
+53488,
+53502,
+53503,
+53530,
+53552,
+53553,
+53576,
+53673,
+53696,
+53710,
+53711,
+54151,
+54154,
+54155,
+54637,
+54638,
+54749,
+55667,
+56343,
+56344,
+56611,
+56612,
+56613,
+56614,
+56637,
+56638,
+56822,
+56834,
+56835,
+57472,
+57880,
+57881,
+57960,
+58874,
+59057,
+59089,
+61345,
+61346,
+61847,
+62765,
+63158,
+63245,
+63374,
+63733,
+63737,
+64129,
+66191,
+66192,
+66814,
+66815,
+66816,
+66817);
+
+DELETE FROM `spell_proc_event` WHERE `entry` IN (
+324,
+974,
+1463,
+5952,
+9799,
+11095,
+11119,
+11180,
+11185,
+11213,
+11255,
+12281,
+12289,
+12298,
+12311,
+12319,
+12797,
+12834,
+12966,
+13165,
+13754,
+13983,
+14156,
+14186,
+14531,
+14892,
+15337,
+16086,
+16176,
+16180,
+16256,
+16257,
+16487,
+16850,
+16880,
+16952,
+16958,
+17106,
+17793,
+18094,
+18096,
+18119,
+19184,
+19572,
+20049,
+20177,
+20210,
+20234,
+20335,
+20500,
+20925,
+27811,
+29074,
+29441,
+29593,
+29834,
+30160,
+30293,
+30299,
+30675,
+30701,
+30881,
+31124,
+31244,
+31569,
+31571,
+31656,
+31833,
+31871,
+31876,
+32385,
+33076,
+33142,
+33150,
+33191,
+33881,
+34497,
+34500,
+34753,
+34914,
+34935,
+34950,
+35100,
+35541,
+41635,
+44442,
+44445,
+44449,
+44557,
+45234,
+46854,
+46867,
+46913,
+46945,
+47195,
+47201,
+47245,
+47258,
+47263,
+47509,
+47516,
+47569,
+47580,
+48483,
+48496,
+48506,
+48516,
+48539,
+48988,
+49004,
+49018,
+49149,
+49188,
+49208,
+49217,
+49219,
+49223,
+49467,
+50880,
+51459,
+51474,
+51521,
+51523,
+51556,
+51562,
+51625,
+51627,
+51634,
+51664,
+51672,
+51692,
+51940,
+52127,
+52795,
+53178,
+53215,
+53221,
+53228,
+53234,
+53256,
+53290,
+53375,
+53380,
+53486,
+53501,
+53527,
+53551,
+53569,
+53671,
+53695,
+53709,
+54639,
+54747,
+55666,
+56342,
+56636,
+57470,
+57878,
+58872,
+59088,
+61846,
+62764,
+63156,
+63373,
+63730,
+64127,
+65661,
+66799,
+-324,
+-974,
+-1463,
+-5952,
+-9799,
+-11095,
+-11119,
+-11180,
+-11185,
+-11213,
+-11255,
+-12281,
+-12289,
+-12298,
+-12311,
+-12319,
+-12797,
+-12834,
+-12966,
+-13165,
+-13754,
+-13983,
+-14156,
+-14186,
+-14531,
+-14892,
+-15337,
+-16086,
+-16176,
+-16180,
+-16256,
+-16257,
+-16487,
+-16850,
+-16880,
+-16952,
+-16958,
+-17106,
+-17793,
+-18094,
+-18096,
+-18119,
+-19184,
+-19572,
+-20049,
+-20177,
+-20210,
+-20234,
+-20335,
+-20500,
+-20925,
+-27811,
+-29074,
+-29441,
+-29593,
+-29834,
+-30160,
+-30293,
+-30299,
+-30675,
+-30701,
+-30881,
+-31124,
+-31244,
+-31569,
+-31571,
+-31656,
+-31833,
+-31871,
+-31876,
+-32385,
+-33076,
+-33142,
+-33150,
+-33191,
+-33881,
+-34497,
+-34500,
+-34753,
+-34914,
+-34935,
+-34950,
+-35100,
+-35541,
+-41635,
+-44442,
+-44445,
+-44449,
+-44557,
+-45234,
+-46854,
+-46867,
+-46913,
+-46945,
+-47195,
+-47201,
+-47245,
+-47258,
+-47263,
+-47509,
+-47516,
+-47569,
+-47580,
+-48483,
+-48496,
+-48506,
+-48516,
+-48539,
+-48988,
+-49004,
+-49018,
+-49149,
+-49188,
+-49208,
+-49217,
+-49219,
+-49223,
+-49467,
+-50880,
+-51459,
+-51474,
+-51521,
+-51523,
+-51556,
+-51562,
+-51625,
+-51627,
+-51634,
+-51664,
+-51672,
+-51692,
+-51940,
+-52127,
+-52795,
+-53178,
+-53215,
+-53221,
+-53228,
+-53234,
+-53256,
+-53290,
+-53375,
+-53380,
+-53486,
+-53501,
+-53527,
+-53551,
+-53569,
+-53671,
+-53695,
+-53709,
+-54639,
+-54747,
+-55666,
+-56342,
+-56636,
+-57470,
+-57878,
+-58872,
+-59088,
+-61846,
+-62764,
+-63156,
+-63373,
+-63730,
+-64127,
+-65661,
+-66799);
+
+INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES
+(-324,0,0,0,0,0,0,0,0,0,3),
+(-974,0,0,0,0,0,139944,0,0,0,3),
+(-1463,0,0,0,0,0,0,1024,0,0,0),
+(-5952,0,8,0,1,0,0,0,0,0,0),
+(-9799,0,0,0,0,0,0,2,0,0,0),
+(-11095,0,3,16,0,0,0,0,0,0,0),
+(-11119,4,3,0,0,0,0,2,0,0,0),
+(-11180,16,3,0,0,0,0,0,0,0,0),
+(-11185,0,3,128,0,0,327680,0,0,0,0),
+(-11213,0,3,0,0,0,0,0,0,0,0),
+(-11255,0,3,16384,0,0,0,0,0,0,0),
+(-12281,0,4,2858419268,4194565,0,0,0,0,0,6),
+(-12289,0,4,2,0,0,0,0,0,0,0),
+(-12298,0,0,0,0,0,0,112,0,0,0),
+(-12311,0,4,2048,1,0,0,0,0,0,0),
+(-12319,0,0,0,0,0,0,2,0,0,0),
+(-12797,0,4,1024,0,0,0,0,0,0,0),
+(-12834,0,0,0,0,0,0,2,0,0,0),
+(-12966,0,0,0,0,0,0,65536,0,0,0),
+(-13165,0,0,0,0,0,64,0,0,0,0),
+(-13754,0,8,16,0,0,0,0,0,0,0),
+(-13983,0,0,0,0,0,0,24,0,0,0),
+(-14156,0,8,4063232,8,0,0,0,0,0,0),
+(-14186,0,8,1082131720,6,0,0,2,0,0,1),
+(-14531,0,0,0,0,0,0,2,0,0,0),
+(-14892,0,6,268443136,65540,0,0,2,0,0,0),
+(-15337,0,6,8396800,2,0,0,2,0,0,0),
+(-16086,4,11,0,262144,0,196608,0,0,0,0),
+(-16176,0,11,448,0,16,0,2,0,0,0),
+(-16180,0,11,448,0,16,0,2,0,100,0),
+(-16256,0,0,0,0,0,0,2,0,0,0),
+(-16257,0,0,0,0,0,0,65536,0,0,0),
+(-16487,0,0,0,0,0,0,2,0,0,0),
+(-16850,0,7,4,0,0,0,0,0,0,0),
+(-16880,72,7,103,58720258,0,0,2,0,0,0),
+(-16952,0,7,233472,1024,262144,0,2,0,0,0),
+(-16958,0,0,0,0,0,0,2,0,0,0),
+(-17106,0,7,524288,0,0,0,0,0,0,0),
+(-17793,0,5,1,0,0,0,0,0,0,0),
+(-18094,0,5,10,0,0,0,0,0,0,0),
+(-18096,0,5,256,8388608,0,0,2,0,0,0),
+(-18119,0,5,0,8388608,0,0,0,0,0,0),
+(-19184,0,9,16,8192,0,0,0,0,0,0),
+(-19572,0,9,8388608,0,0,16384,0,0,0,0),
+(-20049,0,0,0,0,0,0,2,0,0,0),
+(-20177,0,0,0,0,0,0,67,0,0,0),
+(-20210,0,10,3221225472,65536,0,0,2,0,0,0),
+(-20234,0,10,32768,0,0,0,0,0,0,0),
+(-20335,0,10,8388608,0,8,16,0,0,100,0),
+(-20500,0,4,268435456,0,0,0,0,0,0,0),
+(-20925,0,0,0,0,0,0,64,0,0,0),
+(-27811,0,0,0,0,0,0,2,0,0,0),
+(-29074,20,3,0,0,0,0,2,0,0,0),
+(-29441,0,0,0,0,0,0,8,0,0,1),
+(-29593,0,0,0,0,0,0,112,0,0,0),
+(-29834,0,0,0,0,0,0,65536,0,0,0),
+(-30160,0,0,0,0,0,0,2,0,0,0),
+(-30293,0,5,897,8519872,0,0,0,0,0,0),
+(-30299,126,0,0,0,0,0,0,0,0,0),
+(-30675,0,11,3,0,0,0,0,0,0,0),
+(-30701,28,0,0,0,0,664232,0,0,100,0),
+(-30881,0,0,0,0,0,0,0,0,0,30),
+(-31124,0,8,16777222,0,0,0,0,0,0,0),
+(-31244,0,8,4063232,9,0,0,52,0,0,0),
+(-31569,0,3,65536,0,0,0,0,0,0,0),
+(-31571,0,3,0,34,0,16384,0,0,0,0),
+(-31656,4,3,134217728,0,0,0,0,0,0,0),
+(-31833,0,10,2147483648,0,0,0,0,0,0,0),
+(-31871,0,10,16,0,0,16384,0,0,0,0),
+(-31876,0,10,8388608,0,0,0,262144,0,0,0),
+(-32385,0,5,1,262144,0,0,0,0,0,0),
+(-33076,0,0,0,0,0,664232,0,0,0,0),
+(-33142,0,0,0,0,0,0,2,0,0,0),
+(-33150,0,0,0,0,0,0,2,0,0,0),
+(-33191,0,6,32768,1024,64,0,0,0,0,0),
+(-33881,0,0,0,0,0,0,2,0,0,0),
+(-34497,0,0,0,0,0,0,2,0,0,0),
+(-34500,0,0,0,0,0,0,2,0,0,0),
+(-34753,0,6,6144,4,4096,0,2,0,0,0),
+(-34914,0,6,8192,0,0,0,0,0,0,0),
+(-34935,0,0,0,0,0,0,0,0,0,8),
+(-34950,0,0,0,0,0,0,2,0,0,0),
+(-35100,0,9,4096,0,1,0,0,0,0,0),
+(-35541,0,0,0,0,0,8388608,0,0,0,0),
+(-41635,0,0,0,0,0,664232,0,0,0,0),
+(-44442,0,3,8388608,64,0,0,65536,0,0,1),
+(-44445,0,3,19,69632,0,0,0,0,0,0),
+(-44449,0,3,551686775,102472,0,0,2,0,0,0),
+(-44557,0,3,32,0,0,0,0,0,0,0),
+(-45234,0,0,0,0,0,0,2,0,0,0),
+(-46854,0,0,0,0,0,0,2,0,0,0),
+(-46867,0,0,0,0,0,0,2,0,0,0),
+(-46913,0,4,64,1028,0,0,262144,0,0,0),
+(-46945,0,4,0,65536,0,0,0,0,0,0),
+(-47195,0,5,2,0,0,0,0,0,0,0),
+(-47201,0,5,16393,262144,0,0,0,0,0,0),
+(-47245,0,5,2,0,0,0,1,0,0,0),
+(-47258,0,5,0,8388608,0,0,65536,0,0,0),
+(-47263,32,5,0,0,0,0,2,0,0,20),
+(-47509,0,0,0,0,0,0,2,0,0,0),
+(-47516,0,6,6144,65536,0,0,0,0,0,0),
+(-47569,0,6,16384,0,0,16384,0,0,0,0),
+(-47580,0,6,0,0,64,0,65536,0,0,0),
+(-48483,0,7,34816,1088,0,0,0,0,0,0),
+(-48496,0,7,96,33554434,0,0,2,0,0,0),
+(-48506,0,7,5,0,0,0,0,0,0,0),
+(-48516,0,7,5,0,0,0,2,0,0,30),
+(-48539,0,7,16,67108864,0,262144,0,0,0,0),
+(-48988,0,0,0,0,0,0,2,0,0,0),
+(-49004,0,0,0,0,0,0,51,0,0,0),
+(-49018,0,15,20971520,0,0,0,0,0,0,0),
+(-49149,0,15,6,131074,0,0,0,0,0,0),
+(-49188,0,15,0,131072,0,0,0,0,0,0),
+(-49208,0,15,4194304,65536,0,0,0,0,0,0),
+(-49217,0,15,0,0,2,0,0,0,0,1),
+(-49219,0,0,0,0,0,4,0,0,0,0),
+(-49223,0,15,17,134348800,0,0,0,0,0,0),
+(-49467,0,15,16,131072,0,0,0,0,0,0),
+(-50880,0,15,0,67108864,0,0,0,0,0,0),
+(-51459,0,0,0,0,0,4,0,0,0,0),
+(-51474,0,0,0,0,0,0,65536,0,0,0),
+(-51521,0,11,0,16777216,0,0,0,0,0,0),
+(-51523,0,11,0,1,0,65536,0,0,50,0),
+(-51556,0,11,192,0,16,0,2,0,0,0),
+(-51562,0,11,256,0,16,0,0,0,0,0),
+(-51625,0,8,268476416,0,0,0,0,0,0,0),
+(-51627,0,0,0,0,0,0,112,0,0,0),
+(-51634,0,0,0,0,0,0,2,0,0,0),
+(-51664,0,8,131072,8,0,0,0,0,0,0),
+(-51672,0,0,0,0,0,0,16,0,0,1),
+(-51692,0,8,516,0,0,0,0,0,0,0),
+(-51940,0,0,0,0,0,0,0,0,20,0),
+(-52127,0,0,0,0,0,0,0,0,0,3),
+(-52795,0,6,1,0,0,0,0,0,0,0),
+(-53178,0,9,0,268435456,0,65536,0,0,100,0),
+(-53215,0,9,1,0,0,0,0,0,0,0),
+(-53221,0,9,0,1,0,0,0,0,0,0),
+(-53228,0,9,32,16777216,0,0,0,0,0,0),
+(-53234,0,9,131072,1,1,0,2,0,0,0),
+(-53256,0,9,2048,8388609,0,0,2,0,0,0),
+(-53290,0,9,2048,1,512,0,2,0,0,0),
+(-53375,0,10,0,8192,0,1024,0,0,0,6),
+(-53380,0,10,8388608,163840,0,0,262146,0,0,0),
+(-53486,0,10,8388608,163840,0,0,262146,0,0,0),
+(-53501,0,0,0,0,0,0,2,0,0,0),
+(-53527,1,10,0,0,4,1024,1,0,100,0),
+(-53551,0,10,4096,0,0,0,0,0,0,0),
+(-53569,0,10,1075838976,65536,0,0,0,0,0,0),
+(-53671,0,10,8388608,0,0,0,0,0,0,0),
+(-53695,0,10,8388608,0,8,16,0,0,0,0),
+(-53709,2,10,16384,0,0,0,0,0,0,0),
+(-54639,0,15,4194304,65536,0,0,0,0,0,0),
+(-54747,0,0,0,0,0,0,65536,0,0,0),
+(-55666,0,15,1,134217728,0,0,0,0,0,0),
+(-56342,0,9,24,134217728,147456,0,0,0,0,22),
+(-56636,0,4,32,0,0,0,262144,0,0,6),
+(-57470,0,6,1,0,0,0,0,0,0,0),
+(-57878,0,0,0,0,0,0,16,0,0,0),
+(-58872,0,0,0,0,0,0,270403,0,0,0),
+(-59088,0,4,0,2,0,1024,0,0,0,0),
+(-61846,0,0,0,0,0,64,0,0,0,0),
+(-62764,0,9,0,268435456,0,65536,0,0,100,0),
+(-63156,0,5,1,192,0,0,0,0,0,0),
+(-63373,0,11,2147483648,0,0,65536,0,0,0,0),
+(-63730,0,6,2048,4,0,0,0,0,0,0),
+(-64127,0,6,1,1,0,0,0,0,0,0),
+(-65661,0,15,4194321,537001988,0,16,0,0,100,0),
+(-66799,0,15,4194304,0,0,0,0,0,0,0);
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 55588bf9b70..f59aa1cdb71 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -4827,10 +4827,10 @@ void ObjectMgr::LoadSpellScriptNames()
Field* fields = result->Fetch();
int32 spellId = fields[0].GetInt32();
- const char *scriptName = fields[1].GetCString();
+ char const* scriptName = fields[1].GetCString();
bool allRanks = false;
- if (spellId <= 0)
+ if (spellId < 0)
{
allRanks = true;
spellId = -spellId;
@@ -4839,20 +4839,18 @@ void ObjectMgr::LoadSpellScriptNames()
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
if (!spellInfo)
{
- TC_LOG_ERROR(LOG_FILTER_SQL, "Scriptname:`%s` spell (spell_id:%d) does not exist in `Spell.dbc`.", scriptName, fields[0].GetInt32());
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Scriptname: `%s` spell (Id: %d) does not exist.", scriptName, spellId);
continue;
}
if (allRanks)
{
- if (sSpellMgr->GetFirstSpellInChain(spellId) != uint32(spellId))
- {
- TC_LOG_ERROR(LOG_FILTER_SQL, "Scriptname:`%s` spell (spell_id:%d) is not first rank of spell.", scriptName, fields[0].GetInt32());
- continue;
- }
- if (!sSpellMgr->GetNextSpellInChain(spellId))
+ if (!spellInfo->IsRanked())
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Scriptname: `%s` spell (Id: %d) has no ranks of spell.", scriptName, fields[0].GetInt32());
+
+ if (spellInfo->GetFirstRankSpell()->Id != uint32(spellId))
{
- TC_LOG_ERROR(LOG_FILTER_SQL, "Scriptname:`%s` spell (spell_id:%d) has no ranks of spell.", scriptName, fields[0].GetInt32());
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Scriptname: `%s` spell (Id: %d) is not first rank of spell.", scriptName, fields[0].GetInt32());
continue;
}
while (spellInfo)
@@ -4862,7 +4860,13 @@ void ObjectMgr::LoadSpellScriptNames()
}
}
else
+ {
+ if (spellInfo->IsRanked())
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Scriptname: `%s` spell (Id: %d) is ranked spell. Properly not all ranks are assigned to this script.", scriptName, spellId);
+
_spellScriptsStore.insert(SpellScriptsContainer::value_type(spellInfo->Id, GetScriptId(scriptName)));
+ }
+
++count;
}
while (result->NextRow());
diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp
index d1646705395..f6a3304c0ec 100644
--- a/src/server/game/Guilds/GuildMgr.cpp
+++ b/src/server/game/Guilds/GuildMgr.cpp
@@ -223,7 +223,7 @@ void GuildMgr::LoadGuilds()
}
while (result->NextRow());
- TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded %u guild members int %u ms", count, GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded %u guild members in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
}
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index e0cea01a9ca..8b92526bd62 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -1175,23 +1175,88 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32
return true;
}
-void SpellMgr::LoadSpellRanks()
+void SpellMgr::UnloadSpellInfoChains()
{
- uint32 oldMSTime = getMSTime();
+ for (SpellChainMap::iterator itr = mSpellChains.begin(); itr != mSpellChains.end(); ++itr)
+ mSpellInfoMap[itr->first]->ChainEntry = NULL;
+
+ mSpellChains.clear();
+}
+void SpellMgr::LoadSpellTalentRanks()
+{
// cleanup core data before reload - remove reference to ChainNode from SpellInfo
- for (SpellChainMap::iterator itr = mSpellChains.begin(); itr != mSpellChains.end(); ++itr)
+ UnloadSpellInfoChains();
+
+ for (uint32 i = 0; i < sTalentStore.GetNumRows(); ++i)
{
- mSpellInfoMap[itr->first]->ChainEntry = NULL;
+ TalentEntry const* talentInfo = sTalentStore.LookupEntry(i);
+ if (!talentInfo)
+ continue;
+
+ SpellInfo const* lastSpell = NULL;
+ for (uint8 rank = MAX_TALENT_RANK - 1; rank > 0; --rank)
+ {
+ if (talentInfo->RankID[rank])
+ {
+ lastSpell = GetSpellInfo(talentInfo->RankID[rank]);
+ break;
+ }
+ }
+
+ if (!lastSpell)
+ continue;
+
+ SpellInfo const* firstSpell = GetSpellInfo(talentInfo->RankID[0]);
+ if (!firstSpell)
+ {
+ TC_LOG_ERROR(LOG_FILTER_SPELLS_AURAS, "SpellMgr::LoadSpellTalentRanks: First Rank Spell %u for TalentEntry %u does not exist.", talentInfo->RankID[0], i);
+ continue;
+ }
+
+ SpellInfo const* prevSpell = NULL;
+ for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
+ {
+ uint32 spellId = talentInfo->RankID[rank];
+ if (!spellId)
+ break;
+
+ SpellInfo const* currentSpell = GetSpellInfo(spellId);
+ if (!currentSpell)
+ {
+ TC_LOG_ERROR(LOG_FILTER_SPELLS_AURAS, "SpellMgr::LoadSpellTalentRanks: Spell %u (Rank: %u) for TalentEntry %u does not exist.", spellId, rank + 1, i);
+ break;
+ }
+
+ SpellChainNode node;
+ node.first = firstSpell;
+ node.last = lastSpell;
+ node.rank = rank + 1;
+
+ node.prev = prevSpell;
+ node.next = node.rank < MAX_TALENT_RANK ? GetSpellInfo(talentInfo->RankID[rank + 1]) : NULL;
+
+ mSpellChains[spellId] = node;
+ mSpellInfoMap[spellId]->ChainEntry = &mSpellChains[spellId];
+
+ prevSpell = currentSpell;
+ }
}
- mSpellChains.clear();
+}
+
+void SpellMgr::LoadSpellRanks()
+{
+ // cleanup data and load spell ranks for talents from dbc
+ LoadSpellTalentRanks();
+
+ uint32 oldMSTime = getMSTime();
+
// 0 1 2
QueryResult result = WorldDatabase.Query("SELECT first_spell_id, spell_id, rank from spell_ranks ORDER BY first_spell_id, rank");
if (!result)
{
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 spell rank records. DB table `spell_ranks` is empty.");
-
return;
}
@@ -1268,6 +1333,10 @@ void SpellMgr::LoadSpellRanks()
{
++count;
int32 addedSpell = itr->first;
+
+ if (mSpellInfoMap[addedSpell]->ChainEntry)
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u (rank: %u, first: %u) listed in `spell_ranks` has already ChainEntry from dbc.", addedSpell, itr->second, lastSpell);
+
mSpellChains[addedSpell].first = GetSpellInfo(lastSpell);
mSpellChains[addedSpell].last = GetSpellInfo(rankChain.back().first);
mSpellChains[addedSpell].rank = itr->second;
@@ -1285,10 +1354,10 @@ void SpellMgr::LoadSpellRanks()
mSpellChains[addedSpell].next = GetSpellInfo(itr->first);
}
while (true);
- } while (!finished);
+ }
+ while (!finished);
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded %u spell rank records in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
-
}
void SpellMgr::LoadSpellRequired()
@@ -1324,14 +1393,14 @@ void SpellMgr::LoadSpellRequired()
continue;
}
- SpellInfo const* req_spell = GetSpellInfo(spell_req);
- if (!req_spell)
+ SpellInfo const* reqSpell = GetSpellInfo(spell_req);
+ if (!reqSpell)
{
TC_LOG_ERROR(LOG_FILTER_SQL, "req_spell %u in `spell_required` table is not found in dbcs, skipped", spell_req);
continue;
}
- if (GetFirstSpellInChain(spell_id) == GetFirstSpellInChain(spell_req))
+ if (spell->IsRankOf(reqSpell))
{
TC_LOG_ERROR(LOG_FILTER_SQL, "req_spell %u and spell_id %u in `spell_required` table are ranks of the same spell, entry not needed, skipped", spell_req, spell_id);
continue;
@@ -1794,52 +1863,76 @@ void SpellMgr::LoadSpellProcEvents()
}
uint32 count = 0;
- uint32 customProc = 0;
+
do
{
Field* fields = result->Fetch();
- uint32 entry = fields[0].GetUInt32();
+ int32 spellId = fields[0].GetInt32();
- SpellInfo const* spell = GetSpellInfo(entry);
- if (!spell)
+ bool allRanks = false;
+ if (spellId < 0)
{
- TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u listed in `spell_proc_event` does not exist", entry);
+ allRanks = true;
+ spellId = -spellId;
+ }
+
+ SpellInfo const* spellInfo = GetSpellInfo(spellId);
+ if (!spellInfo)
+ {
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u listed in `spell_proc_event` does not exist", spellId);
continue;
}
- SpellProcEventEntry spe;
+ if (allRanks)
+ {
+ if (!spellInfo->IsRanked())
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u listed in `spell_proc_event` with all ranks, but spell has no ranks.", spellId);
+
+ if (spellInfo->GetFirstRankSpell()->Id != uint32(spellId))
+ {
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u listed in `spell_proc_event` is not first rank of spell.", spellId);
+ continue;
+ }
+ }
- spe.schoolMask = fields[1].GetInt8();
- spe.spellFamilyName = fields[2].GetUInt16();
- spe.spellFamilyMask[0] = fields[3].GetUInt32();
- spe.spellFamilyMask[1] = fields[4].GetUInt32();
- spe.spellFamilyMask[2] = fields[5].GetUInt32();
- spe.procFlags = fields[6].GetUInt32();
- spe.procEx = fields[7].GetUInt32();
- spe.ppmRate = fields[8].GetFloat();
- spe.customChance = fields[9].GetFloat();
- spe.cooldown = fields[10].GetUInt32();
+ SpellProcEventEntry spellProcEvent;
- mSpellProcEventMap[entry] = spe;
+ spellProcEvent.schoolMask = fields[1].GetInt8();
+ spellProcEvent.spellFamilyName = fields[2].GetUInt16();
+ spellProcEvent.spellFamilyMask[0] = fields[3].GetUInt32();
+ spellProcEvent.spellFamilyMask[1] = fields[4].GetUInt32();
+ spellProcEvent.spellFamilyMask[2] = fields[5].GetUInt32();
+ spellProcEvent.procFlags = fields[6].GetUInt32();
+ spellProcEvent.procEx = fields[7].GetUInt32();
+ spellProcEvent.ppmRate = fields[8].GetFloat();
+ spellProcEvent.customChance = fields[9].GetFloat();
+ spellProcEvent.cooldown = fields[10].GetUInt32();
- if (spell->ProcFlags == 0)
+ while (spellInfo)
{
- if (spe.procFlags == 0)
+ if (mSpellProcEventMap.find(spellInfo->Id) != mSpellProcEventMap.end())
{
- TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u listed in `spell_proc_event` probally not triggered spell", entry);
- continue;
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u listed in `spell_proc_event` already has its first rank in table.", spellInfo->Id);
+ break;
}
- customProc++;
+
+ if (!spellInfo->ProcFlags && !spellProcEvent.procFlags)
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u listed in `spell_proc_event` probally not triggered spell", spellInfo->Id);
+
+ mSpellProcEventMap[spellInfo->Id] = spellProcEvent;
+
+ if (allRanks)
+ spellInfo = spellInfo->GetNextRankSpell();
+ else
+ break;
}
- ++count;
- } while (result->NextRow());
- if (customProc)
- TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded %u extra and %u custom spell proc event conditions in %u ms", count, customProc, GetMSTimeDiffToNow(oldMSTime));
- else
- TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded %u extra spell proc event conditions in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
+ ++count;
+ }
+ while (result->NextRow());
+ TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded %u extra spell proc event conditions in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
void SpellMgr::LoadSpellProcs()
@@ -1879,6 +1972,9 @@ void SpellMgr::LoadSpellProcs()
if (allRanks)
{
+ if (!spellInfo->IsRanked())
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u listed in `spell_proc` with all ranks, but spell has no ranks.", spellId);
+
if (spellInfo->GetFirstRankSpell()->Id != uint32(spellId))
{
TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u listed in `spell_proc` is not first rank of spell.", spellId);
@@ -1908,9 +2004,10 @@ void SpellMgr::LoadSpellProcs()
{
if (mSpellProcMap.find(spellInfo->Id) != mSpellProcMap.end())
{
- TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u listed in `spell_proc` has duplicate entry in the table", spellInfo->Id);
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u listed in `spell_proc` already has its first rank in table.", spellInfo->Id);
break;
}
+
SpellProcEntry procEntry = SpellProcEntry(baseProcEntry);
// take defaults from dbcs
@@ -2676,12 +2773,12 @@ void SpellMgr::LoadSpellInfoStore()
if (SpellEntry const* spellEntry = sSpellStore.LookupEntry(i))
mSpellInfoMap[i] = new SpellInfo(spellEntry, effectsBySpell[i].effects);
- TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded spell info store in %u ms", GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded SpellInfo store in %u ms", GetMSTimeDiffToNow(oldMSTime));
}
void SpellMgr::UnloadSpellInfoStore()
{
- for (uint32 i = 0; i < mSpellInfoMap.size(); ++i)
+ for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
{
if (mSpellInfoMap[i])
delete mSpellInfoMap[i];
@@ -2691,14 +2788,14 @@ void SpellMgr::UnloadSpellInfoStore()
void SpellMgr::UnloadSpellInfoImplicitTargetConditionLists()
{
- for (uint32 i = 0; i < mSpellInfoMap.size(); ++i)
+ for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
{
if (mSpellInfoMap[i])
mSpellInfoMap[i]->_UnloadImplicitTargetConditionLists();
}
}
-void SpellMgr::LoadSpellCustomAttr()
+void SpellMgr::LoadSpellInfoCustomAttributes()
{
uint32 oldMSTime = getMSTime();
@@ -2780,7 +2877,7 @@ void SpellMgr::LoadSpellCustomAttr()
if (enchant->type[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL)
continue;
- SpellInfo* procInfo = (SpellInfo*)GetSpellInfo(enchant->spellid[s]);
+ SpellInfo* procInfo = _GetSpellInfo(enchant->spellid[s]);
if (!procInfo)
continue;
@@ -2992,7 +3089,7 @@ void SpellMgr::LoadSpellCustomAttr()
CreatureAI::FillAISpellInfo();
- TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded spell custom attributes in %u ms", GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded SpellInfo custom attributes in %u ms", GetMSTimeDiffToNow(oldMSTime));
}
void SpellMgr::LoadSpellInfoCorrections()
@@ -3000,7 +3097,7 @@ void SpellMgr::LoadSpellInfoCorrections()
uint32 oldMSTime = getMSTime();
SpellInfo* spellInfo = NULL;
- for (uint32 i = 0; i < mSpellInfoMap.size(); ++i)
+ for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
{
spellInfo = (SpellInfo*)mSpellInfoMap[i];
if (!spellInfo)
@@ -3069,7 +3166,7 @@ void SpellMgr::LoadSpellInfoCorrections()
case 42821: // Headless Horseman - Wisp Flight Missile
spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(6); // 100 yards
break;
- case 36350: //They Must Burn Bomb Aura (self)
+ case 36350: // They Must Burn Bomb Aura (self)
spellInfo->Effects[EFFECT_0].TriggerSpell = 36325; // They Must Burn Bomb Drop (DND)
break;
case 49838: // Stop Time
@@ -3202,13 +3299,13 @@ void SpellMgr::LoadSpellInfoCorrections()
case 47204:
case 47205:
// add corruption to affected spells
- spellInfo->Effects[1].SpellClassMask[0] |= 2;
+ spellInfo->Effects[EFFECT_1].SpellClassMask[0] |= 2;
break;
case 51852: // The Eye of Acherus (no spawn in phase 2 in db)
- spellInfo->Effects[0].MiscValue |= 1;
+ spellInfo->Effects[EFFECT_0].MiscValue |= 1;
break;
case 51912: // Crafty's Ultra-Advanced Proto-Typical Shortening Blaster
- spellInfo->Effects[0].Amplitude = 3000;
+ spellInfo->Effects[EFFECT_0].Amplitude = 3000;
break;
case 29809: // Desecration Arm - 36 instead of 37 - typo? :/
spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_7_YARDS);
@@ -3239,17 +3336,17 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->Effects[EFFECT_1].ApplyAuraName = SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT;
break;
case 30421: // Nether Portal - Perseverence
- spellInfo->Effects[2].BasePoints += 30000;
+ spellInfo->Effects[EFFECT_2].BasePoints += 30000;
break;
case 51735: // Ebon Plague
case 51734:
case 51726:
spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS;
spellInfo->SpellFamilyFlags[2] = 0x10;
- spellInfo->Effects[1].ApplyAuraName = SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN;
+ spellInfo->Effects[EFFECT_1].ApplyAuraName = SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN;
break;
case 41913: // Parasitic Shadowfiend Passive
- spellInfo->Effects[0].ApplyAuraName = SPELL_AURA_DUMMY; // proc debuff, and summon infinite fiends
+ spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_DUMMY; // proc debuff, and summon infinite fiends
break;
case 27892: // To Anchor 1
case 27928: // To Anchor 1
@@ -3283,8 +3380,8 @@ void SpellMgr::LoadSpellInfoCorrections()
case 5176: // Wrath
case 2912: // Starfire
case 78674: // Starsurge
- spellInfo->Effects[1].Effect = SPELL_EFFECT_DUMMY;
- spellInfo->Effects[1].TargetA = TARGET_UNIT_CASTER;
+ spellInfo->Effects[EFFECT_1].Effect = SPELL_EFFECT_DUMMY;
+ spellInfo->Effects[EFFECT_1].TargetA = TARGET_UNIT_CASTER;
break;
case 70728: // Exploit Weakness (needs target selection script)
case 70840: // Devious Minds (needs target selection script)
@@ -3322,7 +3419,7 @@ void SpellMgr::LoadSpellInfoCorrections()
break;
case 64745: // Item - Death Knight T8 Tank 4P Bonus
case 64936: // Item - Warrior T8 Protection 4P Bonus
- spellInfo->Effects[0].BasePoints = 100; // 100% chance of procc'ing, not -10% (chance calculated in PrepareTriggersExecutedOnHit)
+ spellInfo->Effects[EFFECT_0].BasePoints = 100; // 100% chance of procc'ing, not -10% (chance calculated in PrepareTriggersExecutedOnHit)
break;
case 59414: // Pulsing Shockwave Aura (Loken)
// this flag breaks movement, remove it
@@ -3332,7 +3429,7 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->AuraInterruptFlags = AURA_INTERRUPT_FLAG_HITBYSPELL | AURA_INTERRUPT_FLAG_TAKE_DAMAGE;
break;
case 70650: // Death Knight T10 Tank 2P Bonus
- spellInfo->Effects[0].ApplyAuraName = SPELL_AURA_ADD_PCT_MODIFIER;
+ spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_ADD_PCT_MODIFIER;
break;
case 71838: // Drain Life - Bryntroll Normal
case 71839: // Drain Life - Bryntroll Heroic
@@ -3437,10 +3534,6 @@ void SpellMgr::LoadSpellInfoCorrections()
case 70861: // Sindragosa's Lair Teleport
spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DB);
break;
- case 69055: // Saber Lash (Lord Marrowgar)
- case 70814: // Saber Lash (Lord Marrowgar)
- spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_8_YARDS); // 8yd
- break;
case 69075: // Bone Storm (Lord Marrowgar)
case 70834: // Bone Storm (Lord Marrowgar)
case 70835: // Bone Storm (Lord Marrowgar)
diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h
index 69eedf25186..160ae74343c 100644
--- a/src/server/game/Spells/SpellMgr.h
+++ b/src/server/game/Spells/SpellMgr.h
@@ -694,10 +694,15 @@ class SpellMgr
SpellInfo const* GetSpellInfo(uint32 spellId) const { return spellId < GetSpellInfoStoreSize() ? mSpellInfoMap[spellId] : NULL; }
uint32 GetSpellInfoStoreSize() const { return mSpellInfoMap.size(); }
+ private:
+ SpellInfo* _GetSpellInfo(uint32 spellId) { return spellId < GetSpellInfoStoreSize() ? mSpellInfoMap[spellId] : NULL; }
+
// Modifiers
public:
// Loading data at server startup
+ void UnloadSpellInfoChains();
+ void LoadSpellTalentRanks();
void LoadSpellRanks();
void LoadSpellRequired();
void LoadSpellLearnSkills();
@@ -720,7 +725,7 @@ class SpellMgr
void LoadSpellInfoStore();
void UnloadSpellInfoStore();
void UnloadSpellInfoImplicitTargetConditionLists();
- void LoadSpellCustomAttr();
+ void LoadSpellInfoCustomAttributes();
void LoadSpellInfoCorrections();
private:
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index c9b90e2bf40..622ac03eac8 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1357,8 +1357,8 @@ void World::SetInitialWorldSettings()
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading SkillLineAbilityMultiMap Data...");
sSpellMgr->LoadSkillLineAbilityMap();
- TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading spell custom attributes...");
- sSpellMgr->LoadSpellCustomAttr();
+ TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading SpellInfo custom attributes...");
+ sSpellMgr->LoadSpellInfoCustomAttributes();
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading GameObject models...");
LoadGameObjectModelList();
diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp
index ddf57731864..89ea572d74b 100644
--- a/src/server/scripts/Commands/cs_learn.cpp
+++ b/src/server/scripts/Commands/cs_learn.cpp
@@ -116,8 +116,7 @@ public:
else
targetPlayer->learnSpell(spell, false);
- uint32 firstSpell = sSpellMgr->GetFirstSpellInChain(spell);
- if (GetTalentSpellCost(firstSpell))
+ if (GetTalentSpellCost(spellInfo->GetFirstRankSpell()->Id))
targetPlayer->SendTalentsInfoData(false);
return true;
@@ -178,8 +177,7 @@ public:
continue;
// skip spells with first rank learned as talent (and all talents then also)
- uint32 firstRank = sSpellMgr->GetFirstSpellInChain(spellInfo->Id);
- if (GetTalentSpellCost(firstRank) > 0)
+ if (GetTalentSpellCost(spellInfo->GetFirstRankSpell()->Id) > 0)
continue;
// skip broken spells
@@ -474,7 +472,7 @@ public:
}
if (allRanks)
- spellId = sSpellMgr->GetFirstSpellInChain (spellId);
+ spellId = sSpellMgr->GetFirstSpellInChain(spellId);
if (target->HasSpell(spellId))
target->removeSpell(spellId, false, !allRanks);
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index e0047a2592f..3c18d04c9bf 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -1586,6 +1586,7 @@ public:
// Guild data print variables defined so that they exist, but are not necessarily used
uint32 guildId = 0;
+ uint8 guildRankId = 0;
std::string guildName;
std::string guildRank;
std::string note;
@@ -1752,8 +1753,9 @@ public:
guildId = fields[0].GetUInt32();
guildName = fields[1].GetString();
guildRank = fields[2].GetString();
- note = fields[3].GetString();
- officeNote = fields[4].GetString();
+ guildRankId = fields[3].GetUInt8();
+ note = fields[4].GetString();
+ officeNote = fields[5].GetString();
}
}
}
@@ -1762,7 +1764,7 @@ public:
// Output I. LANG_PINFO_PLAYER
handler->PSendSysMessage(LANG_PINFO_PLAYER, target ? "" : handler->GetTrinityString(LANG_OFFLINE), nameLink.c_str(), lowguid);
- // Output II. LANG_PINFO_GM_ACTIVE
+ // Output II. LANG_PINFO_GM_ACTIVE if character is gamemaster
if (target && target->IsGameMaster())
handler->PSendSysMessage(LANG_PINFO_GM_ACTIVE);
@@ -1829,7 +1831,7 @@ public:
if (!guildName.empty())
{
handler->PSendSysMessage(LANG_PINFO_CHR_GUILD, guildName.c_str(), guildId);
- handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_RANK, guildRank.c_str());
+ handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_RANK, guildRank.c_str(), uint32(guildRankId));
if (!note.empty())
handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_NOTE, note.c_str());
if (!officeNote.empty())
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index 23e9d09eb1d..e20334156df 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -105,7 +105,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_SEL_CHARACTER_SPELLCOOLDOWNS, "SELECT spell, item, time FROM character_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_CHARACTER_DECLINEDNAMES, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_GUILD_MEMBER, "SELECT guildid, rank FROM guild_member WHERE guid = ?", CONNECTION_BOTH);
- PrepareStatement(CHAR_SEL_GUILD_MEMBER_EXTENDED, "SELECT g.guildid, g.name, gr.rname, gm.pnote, gm.offnote "
+ PrepareStatement(CHAR_SEL_GUILD_MEMBER_EXTENDED, "SELECT g.guildid, g.name, gr.rname, gr.rid, gm.pnote, gm.offnote "
"FROM guild g JOIN guild_member gm ON g.guildid = gm.guildid "
"JOIN guild_rank gr ON g.guildid = gr.guildid AND gm.rank = gr.rid WHERE gm.guid = ?", CONNECTION_BOTH);
PrepareStatement(CHAR_SEL_CHARACTER_ACHIEVEMENTS, "SELECT achievement, date FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC);