aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDuarte Duarte <dnpd.dd@gmail.com>2014-01-31 04:32:03 +0000
committerDuarte Duarte <dnpd.dd@gmail.com>2014-01-31 04:32:03 +0000
commitd749b721930311601b09b14e4e627d0f94ce2e11 (patch)
treec79678eb47acd4529454275834537d37529a70f3
parent9495194bf2c13d8e2ae097cf07b86240d3d8dc96 (diff)
Core&DB/Spells: Move custom spell attributes from code to DB, `spell_custom_attr` table
`spell_custom_attr` - `entry` uint PK - `attributes` uint (enum SpellCustomAttributes of SpellInfo.h)
-rw-r--r--sql/updates/world/2014_01_31_00_world_spell_custom_attr.sql167
-rw-r--r--src/server/game/Spells/SpellMgr.cpp198
2 files changed, 199 insertions, 166 deletions
diff --git a/sql/updates/world/2014_01_31_00_world_spell_custom_attr.sql b/sql/updates/world/2014_01_31_00_world_spell_custom_attr.sql
new file mode 100644
index 00000000000..54c9d84c7a9
--- /dev/null
+++ b/sql/updates/world/2014_01_31_00_world_spell_custom_attr.sql
@@ -0,0 +1,167 @@
+DROP TABLE IF EXISTS `spell_custom_attr`;
+CREATE TABLE IF NOT EXISTS `spell_custom_attr` (
+ `entry` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'spell id',
+ `attributes` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'SpellCustomAttributes',
+ PRIMARY KEY (`entry`)
+) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 COMMENT='SpellInfo custom attributes';
+
+SET @SPELL_ATTR0_CU_ENCHANT_PROC = 0x00000001,
+ @SPELL_ATTR0_CU_CONE_BACK = 0x00000002,
+ @SPELL_ATTR0_CU_CONE_LINE = 0x00000004,
+ @SPELL_ATTR0_CU_SHARE_DAMAGE = 0x00000008,
+ @SPELL_ATTR0_CU_NO_INITIAL_THREAT = 0x00000010,
+ @SPELL_ATTR0_CU_AURA_CC = 0x00000040,
+ @SPELL_ATTR0_CU_DIRECT_DAMAGE = 0x00000100,
+ @SPELL_ATTR0_CU_CHARGE = 0x00000200,
+ @SPELL_ATTR0_CU_PICKPOCKET = 0x00000400,
+ @SPELL_ATTR0_CU_NEGATIVE_EFF0 = 0x00001000,
+ @SPELL_ATTR0_CU_NEGATIVE_EFF1 = 0x00002000,
+ @SPELL_ATTR0_CU_NEGATIVE_EFF2 = 0x00004000,
+ @SPELL_ATTR0_CU_IGNORE_ARMOR = 0x00008000,
+ @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER = 0x00010000,
+ @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET = 0x00020000;
+
+INSERT INTO `spell_custom_attr` (`entry`, `attributes`) VALUES
+(1776, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
+(1777, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
+(8629, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
+(11285, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
+(11286, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
+(12540, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
+(13579, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
+(24698, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
+(28456, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
+(29425, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
+(34940, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
+(36862, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
+(38764, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
+(38863, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
+(52743, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
+(53, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(2589, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(2590, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(2591, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(7159, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(8627, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(8721, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(11279, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(11280, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(11281, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(15582, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(15657, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(22416, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(25300, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(26863, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(37685, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(48656, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(48657, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(703, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(8631, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(8632, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(8633, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(11289, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(11290, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(26839, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(26884, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(48675, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(48676, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(5221, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(6800, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(8992, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(9829, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(9830, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(27001, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(27002, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(48571, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(48572, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(8676, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(8724, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(8725, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(11267, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(11268, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(11269, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(27441, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(48689, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(48690, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(48691, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(6785, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(6787, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(9866, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(9867, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(27005, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(48578, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(48579, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(21987, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(23959, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(24825, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(58563, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
+(26029, @SPELL_ATTR0_CU_CONE_LINE),
+(37433, @SPELL_ATTR0_CU_CONE_LINE),
+(43140, @SPELL_ATTR0_CU_CONE_LINE),
+(43215, @SPELL_ATTR0_CU_CONE_LINE),
+(70461, @SPELL_ATTR0_CU_CONE_LINE),
+(72133, @SPELL_ATTR0_CU_CONE_LINE),
+(73788, @SPELL_ATTR0_CU_CONE_LINE),
+(73789, @SPELL_ATTR0_CU_CONE_LINE),
+(73790, @SPELL_ATTR0_CU_CONE_LINE),
+(24340, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(26558, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(28884, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(36837, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(38903, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(41276, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(57467, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(26789, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(31436, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(35181, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(40810, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(43267, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(43268, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(42384, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(45150, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(64688, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(72373, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(71904, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(70492, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(72505, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(72624, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(72625, @SPELL_ATTR0_CU_SHARE_DAMAGE),
+(18500, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(33086, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(49749, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(52890, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(53454, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(59446, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(62383, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(64777, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(65239, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(65919, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(67858, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(67859, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(67860, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(69293, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(74439, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(63278, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(62544, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(64588, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(66479, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(68505, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(62709, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(62626, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(64590, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(64342, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(64686, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(65147, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(68504, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(62874, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(68498, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(64591, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(63003, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(63010, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(68321, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(72255, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(72444, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(72445, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(72446, @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(64422, @SPELL_ATTR0_CU_SHARE_DAMAGE | @SPELL_ATTR0_CU_IGNORE_ARMOR),
+(72293, @SPELL_ATTR0_CU_NEGATIVE_EFF0);
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 8b31e749c62..eccb7863460 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -2714,8 +2714,39 @@ void SpellMgr::UnloadSpellInfoImplicitTargetConditionLists()
void SpellMgr::LoadSpellInfoCustomAttributes()
{
uint32 oldMSTime = getMSTime();
-
+ uint32 oldMSTime2 = oldMSTime;
SpellInfo* spellInfo = NULL;
+
+ QueryResult result = WorldDatabase.Query("SELECT entry, attributes FROM spell_custom_attr");
+
+ if (!result)
+ TC_LOG_INFO("server.loading", ">> Loaded 0 spell custom attributes from DB. DB table `spell_custom_attr` is empty.");
+ else
+ {
+ uint32 count = 0;
+ do
+ {
+ Field* fields = result->Fetch();
+
+ uint32 spellId = fields[0].GetUInt32();
+ uint32 attributes = fields[1].GetUInt32();
+
+ spellInfo = mSpellInfoMap[spellId];
+ if (!spellInfo)
+ {
+ TC_LOG_ERROR("sql.sql", "Table `spell_custom_attr` has wrong spell (entry: %u), ignored.", spellId);
+ continue;
+ }
+
+ // TODO: validate attributes
+
+ spellInfo->AttributesCu |= attributes;
+ ++count;
+ } while (result->NextRow());
+
+ TC_LOG_INFO("server.loading", ">> Loaded %u spell custom attributes from DB in %u ms", count, GetMSTimeDiffToNow(oldMSTime2));
+ }
+
for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
{
spellInfo = mSpellInfoMap[i];
@@ -2826,171 +2857,6 @@ void SpellMgr::LoadSpellInfoCustomAttributes()
if (spellInfo->SpellVisual[0] == 3879)
spellInfo->AttributesCu |= SPELL_ATTR0_CU_CONE_BACK;
- switch (spellInfo->Id)
- {
- case 1776: // Gouge
- case 1777:
- case 8629:
- case 11285:
- case 11286:
- case 12540:
- case 13579:
- case 24698:
- case 28456:
- case 29425:
- case 34940:
- case 36862:
- case 38764:
- case 38863:
- case 52743: // Head Smack
- spellInfo->AttributesCu |= SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER;
- break;
- case 53: // Backstab
- case 2589:
- case 2590:
- case 2591:
- case 7159:
- case 8627:
- case 8721:
- case 11279:
- case 11280:
- case 11281:
- case 15582:
- case 15657:
- case 22416:
- case 25300:
- case 26863:
- case 37685:
- case 48656:
- case 48657:
- case 703: // Garrote
- case 8631:
- case 8632:
- case 8633:
- case 11289:
- case 11290:
- case 26839:
- case 26884:
- case 48675:
- case 48676:
- case 5221: // Shred
- case 6800:
- case 8992:
- case 9829:
- case 9830:
- case 27001:
- case 27002:
- case 48571:
- case 48572:
- case 8676: // Ambush
- case 8724:
- case 8725:
- case 11267:
- case 11268:
- case 11269:
- case 27441:
- case 48689:
- case 48690:
- case 48691:
- case 6785: // Ravage
- case 6787:
- case 9866:
- case 9867:
- case 27005:
- case 48578:
- case 48579:
- case 21987: // Lash of Pain
- case 23959: // Test Stab R50
- case 24825: // Test Backstab
- case 58563: // Assassinate Restless Lookout
- spellInfo->AttributesCu |= SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET;
- break;
- case 26029: // Dark Glare
- case 37433: // Spout
- case 43140: // Flame Breath
- case 43215: // Flame Breath
- case 70461: // Coldflame Trap
- case 72133: // Pain and Suffering
- case 73788: // Pain and Suffering
- case 73789: // Pain and Suffering
- case 73790: // Pain and Suffering
- spellInfo->AttributesCu |= SPELL_ATTR0_CU_CONE_LINE;
- break;
- case 24340: // Meteor
- case 26558: // Meteor
- case 28884: // Meteor
- case 36837: // Meteor
- case 38903: // Meteor
- case 41276: // Meteor
- case 57467: // Meteor
- case 26789: // Shard of the Fallen Star
- case 31436: // Malevolent Cleave
- case 35181: // Dive Bomb
- case 40810: // Saber Lash
- case 43267: // Saber Lash
- case 43268: // Saber Lash
- case 42384: // Brutal Swipe
- case 45150: // Meteor Slash
- case 64688: // Sonic Screech
- case 72373: // Shared Suffering
- case 71904: // Chaos Bane
- case 70492: // Ooze Eruption
- case 72505: // Ooze Eruption
- case 72624: // Ooze Eruption
- case 72625: // Ooze Eruption
- // ONLY SPELLS WITH SPELLFAMILY_GENERIC and EFFECT_SCHOOL_DAMAGE
- spellInfo->AttributesCu |= SPELL_ATTR0_CU_SHARE_DAMAGE;
- break;
- case 18500: // Wing Buffet
- case 33086: // Wild Bite
- case 49749: // Piercing Blow
- case 52890: // Penetrating Strike
- case 53454: // Impale
- case 59446: // Impale
- case 62383: // Shatter
- case 64777: // Machine Gun
- case 65239: // Machine Gun
- case 65919: // Impale
- case 67858: // Impale
- case 67859: // Impale
- case 67860: // Impale
- case 69293: // Wing Buffet
- case 74439: // Machine Gun
- case 63278: // Mark of the Faceless (General Vezax)
- case 62544: // Thrust (Argent Tournament)
- case 64588: // Thrust (Argent Tournament)
- case 66479: // Thrust (Argent Tournament)
- case 68505: // Thrust (Argent Tournament)
- case 62709: // Counterattack! (Argent Tournament)
- case 62626: // Break-Shield (Argent Tournament, Player)
- case 64590: // Break-Shield (Argent Tournament, Player)
- case 64342: // Break-Shield (Argent Tournament, NPC)
- case 64686: // Break-Shield (Argent Tournament, NPC)
- case 65147: // Break-Shield (Argent Tournament, NPC)
- case 68504: // Break-Shield (Argent Tournament, NPC)
- case 62874: // Charge (Argent Tournament, Player)
- case 68498: // Charge (Argent Tournament, Player)
- case 64591: // Charge (Argent Tournament, Player)
- case 63003: // Charge (Argent Tournament, NPC)
- case 63010: // Charge (Argent Tournament, NPC)
- case 68321: // Charge (Argent Tournament, NPC)
- case 72255: // Mark of the Fallen Champion (Deathbringer Saurfang)
- case 72444: // Mark of the Fallen Champion (Deathbringer Saurfang)
- case 72445: // Mark of the Fallen Champion (Deathbringer Saurfang)
- case 72446: // Mark of the Fallen Champion (Deathbringer Saurfang)
- spellInfo->AttributesCu |= SPELL_ATTR0_CU_IGNORE_ARMOR;
- break;
- case 64422: // Sonic Screech (Auriaya)
- spellInfo->AttributesCu |= SPELL_ATTR0_CU_SHARE_DAMAGE;
- spellInfo->AttributesCu |= SPELL_ATTR0_CU_IGNORE_ARMOR;
- break;
- case 72293: // Mark of the Fallen Champion (Deathbringer Saurfang)
- spellInfo->AttributesCu |= SPELL_ATTR0_CU_NEGATIVE_EFF0;
- break;
- default:
- break;
- }
-
switch (spellInfo->SpellFamilyName)
{
case SPELLFAMILY_WARRIOR: