diff options
author | megamage <none@none> | 2009-01-22 22:44:27 -0600 |
---|---|---|
committer | megamage <none@none> | 2009-01-22 22:44:27 -0600 |
commit | ab4b9160f2d1d534832372422fd1e2bc514b808a (patch) | |
tree | ee5ec121b585b419ff8ec38193ec008d930e75da | |
parent | 4230318f962f5faeddf188d61a367a635a8bb81a (diff) |
*Update to Mangos 7151.
--HG--
branch : trunk
46 files changed, 668 insertions, 269 deletions
diff --git a/sql/TBC-WLK converter/readme.txt b/sql/TBC-WLK converter/readme.txt index aa327873859..2b44daaf5bb 100644 --- a/sql/TBC-WLK converter/readme.txt +++ b/sql/TBC-WLK converter/readme.txt @@ -2,4 +2,6 @@ convert TBC DB to WLK DB: 1. BACKUP your old db! 2. create a database called "mangos" and run mangos.sql. 3. run TBC-WLK_characters.sql in "characters" database. -4. run TBC-WLK_world.sql in "world" database.
\ No newline at end of file +4. run TBC-WLK_world.sql in "world" database. + +only to 7133. you need to manually apply mangos sql from 7141
\ No newline at end of file diff --git a/sql/mangos.sql b/sql/mangos.sql index 686c3a8fcf4..18939c78f77 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -22,7 +22,7 @@ DROP TABLE IF EXISTS `db_version`; CREATE TABLE `db_version` ( `version` varchar(120) default NULL, - `required_7133_02_mangos_spell_loot_template` bit(1) default NULL + `required_7150_01_mangos_playercreateinfo_spell` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -819,7 +819,7 @@ CREATE TABLE `creature_template` ( LOCK TABLES `creature_template` WRITE; /*!40000 ALTER TABLE `creature_template` DISABLE KEYS */; INSERT INTO `creature_template` VALUES -(1,1,10045,0,10045,0,'Waypoint(Only GM can see it)','Visual',NULL,1,1,64,64,0,0,0,35,35,0,0.91,1,0,14,15,0,100,2000,2200,4096,0,8,0,0,0,0,1.76,2.42,100,8,5242886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,3,0,1,0,0,0x82,''); +(1,1,10045,0,10045,0,'Waypoint(Only GM can see it)','Visual',NULL,1,1,64,64,0,0,0,35,35,0,0.91,1,0,14,15,0,100,2000,2200,4096,0,0,0,0,0,0,1.76,2.42,100,8,5242886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,3,0,1,0,0,0x82,''); /*!40000 ALTER TABLE `creature_template` ENABLE KEYS */; UNLOCK TABLES; @@ -1445,6 +1445,7 @@ CREATE TABLE `instance_template` ( `levelMin` tinyint(3) unsigned NOT NULL default '0', `levelMax` tinyint(3) unsigned NOT NULL default '0', `maxPlayers` tinyint(3) unsigned NOT NULL default '0', + `maxPlayersHeroic` tinyint(3) unsigned NOT NULL default '0', `reset_delay` int(10) unsigned NOT NULL default '0', `startLocX` float default NULL, `startLocY` float default NULL, @@ -1461,32 +1462,35 @@ CREATE TABLE `instance_template` ( LOCK TABLES `instance_template` WRITE; /*!40000 ALTER TABLE `instance_template` DISABLE KEYS */; INSERT INTO `instance_template` VALUES -(33,0,22,30,10,7200,NULL,NULL,NULL,NULL,''), -(34,0,24,32,10,7200,NULL,NULL,NULL,NULL,''), -(36,0,15,20,10,7200,NULL,NULL,NULL,NULL,''), -(43,0,15,21,10,7200,NULL,NULL,NULL,NULL,''), -(47,0,29,38,10,7200,NULL,NULL,NULL,NULL,''), -(48,0,24,32,10,7200,NULL,NULL,NULL,NULL,''), -(70,0,35,47,10,7200,NULL,NULL,NULL,NULL,''), -(90,0,29,38,10,7200,NULL,NULL,NULL,NULL,''), -(109,0,45,55,10,7200,NULL,NULL,NULL,NULL,''), -(129,0,37,46,10,7200,NULL,NULL,NULL,NULL,''), -(189,0,34,45,10,7200,NULL,NULL,NULL,NULL,''), -(209,0,44,54,10,7200,NULL,NULL,NULL,NULL,''), -(229,0,58,0,10,120000,78.5083,-225.044,49.839,5.1,''), -(230,0,52,0,5,7200,NULL,NULL,NULL,NULL,''), -(249,0,60,0,40,432000,NULL,NULL,NULL,NULL,''), -(289,0,57,0,5,7200,NULL,NULL,NULL,NULL,''), -(309,0,60,0,20,259200,NULL,NULL,NULL,NULL,''), -(329,0,58,60,5,7200,NULL,NULL,NULL,NULL,''), -(349,0,46,55,10,7200,NULL,NULL,NULL,NULL,''), -(389,0,13,18,10,7200,NULL,NULL,NULL,NULL,''), -(409,0,60,0,40,604800,NULL,NULL,NULL,NULL,''), -(429,0,55,60,5,7200,NULL,NULL,NULL,NULL,''), -(469,0,60,0,40,604800,NULL,NULL,NULL,NULL,''), -(509,0,60,0,20,259200,NULL,NULL,NULL,NULL,''), -(531,0,60,0,40,604800,NULL,NULL,NULL,NULL,''), -(533,0,60,0,40,604800,NULL,NULL,NULL,NULL,''); +(33,0,22,30,10,10,7200,NULL,NULL,NULL,NULL,''), +(34,0,24,32,10,10,7200,NULL,NULL,NULL,NULL,''), +(36,0,15,20,10,10,7200,NULL,NULL,NULL,NULL,''), +(43,0,15,21,10,10,7200,NULL,NULL,NULL,NULL,''), +(47,0,29,38,10,10,7200,NULL,NULL,NULL,NULL,''), +(48,0,24,32,10,10,7200,NULL,NULL,NULL,NULL,''), +(70,0,35,47,10,10,7200,NULL,NULL,NULL,NULL,''), +(90,0,29,38,10,10,7200,NULL,NULL,NULL,NULL,''), +(109,0,45,55,10,10,7200,NULL,NULL,NULL,NULL,''), +(129,0,37,46,10,10,7200,NULL,NULL,NULL,NULL,''), +(189,0,34,45,10,10,7200,NULL,NULL,NULL,NULL,''), +(209,0,44,54,10,10,7200,NULL,NULL,NULL,NULL,''), +(229,0,58,0,10,10,120000,78.5083,-225.044,49.839,5.1,''), +(230,0,52,0,5,5,7200,NULL,NULL,NULL,NULL,''), +(249,0,60,0,40,40,432000,NULL,NULL,NULL,NULL,''), +(289,0,57,0,5,5,7200,NULL,NULL,NULL,NULL,''), +(309,0,60,0,20,20,259200,NULL,NULL,NULL,NULL,''), +(329,0,58,60,5,5,7200,NULL,NULL,NULL,NULL,''), +(349,0,46,55,10,10,7200,NULL,NULL,NULL,NULL,''), +(389,0,13,18,10,10,7200,NULL,NULL,NULL,NULL,''), +(409,0,60,0,40,40,604800,NULL,NULL,NULL,NULL,''), +(429,0,55,60,5,5,7200,NULL,NULL,NULL,NULL,''), +(469,0,60,0,40,40,604800,NULL,NULL,NULL,NULL,''), +(509,0,60,0,20,20,259200,NULL,NULL,NULL,NULL,''), +(531,0,60,0,40,40,604800,NULL,NULL,NULL,NULL,''), +(533,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''), +(615,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''), +(616,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''), +(624,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''); /*!40000 ALTER TABLE `instance_template` ENABLE KEYS */; UNLOCK TABLES; @@ -11765,6 +11769,7 @@ INSERT INTO `playercreateinfo_spell` VALUES (7,9,22027,'Remove Insignia'), (7,9,22810,'Opening - No Text'), (7,9,45927,'Summon Friend'), +(7,9,58284,'Chaos Bolt Passive'), (7,9,61437,'Opening'), (8,1,78,'Heroic Strike'), (8,1,81,'Dodge'), @@ -12379,6 +12384,7 @@ INSERT INTO `playercreateinfo_spell` VALUES (10,9,28730,'Arcane Torrent'), (10,9,28734,'Mana Tap'), (10,9,28877,'Arcane Affinity'), +(10,9,58284,'Chaos Bolt Passive'), (11,1,78,'Heroic Strike'), (11,1,81,'Dodge'), (11,1,107,'Block'), @@ -17042,8 +17048,8 @@ INSERT INTO `spell_proc_event` VALUES (53221, 0x00000000, 9, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (53222, 0x00000000, 9, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (53224, 0x00000000, 9, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), -(53228, 0x00000000, 9, 0x00000020, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), -(53232, 0x00000000, 9, 0x00000020, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), +(53228, 0x00000000, 9, 0x00000020, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), +(53232, 0x00000000, 9, 0x00000020, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (53256, 0x00000000, 9, 0x00000800, 0x00800001, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53259, 0x00000000, 9, 0x00000800, 0x00800001, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53260, 0x00000000, 9, 0x00000800, 0x00800001, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), @@ -17059,6 +17065,9 @@ INSERT INTO `spell_proc_event` VALUES (53384, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53486, 0x00000000, 10, 0x00800000, 0x00028000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53488, 0x00000000, 10, 0x00800000, 0x00028000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), +(53501, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), +(53502, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), +(53503, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53551, 0x00000000, 10, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (53552, 0x00000000, 10, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (53553, 0x00000000, 10, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), diff --git a/sql/updates/6958_01_mangos_spell_proc_event.sql b/sql/updates/6958_01_mangos_spell_proc_event.sql index 06304a19e0e..7deab1f424a 100644 --- a/sql/updates/6958_01_mangos_spell_proc_event.sql +++ b/sql/updates/6958_01_mangos_spell_proc_event.sql @@ -20,7 +20,7 @@ CREATE TABLE `spell_proc_event` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- ---------------------------- --- Records +-- Records -- ---------------------------- INSERT INTO `spell_proc_event` VALUES (324, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3), @@ -703,4 +703,4 @@ INSERT INTO `spell_proc_event` VALUES (60572, 0x00000000, 11, 0x0000000090100000, 0x00000000, 0x00000000, 0, 0, 0), (60617, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000020, 0, 0, 0), (60826, 0x00000000, 15, 0x0000000001400000, 0x00000000, 0x00000000, 0, 0, 0), -(61324, 0x00000000, 10, 0x0002000000000000, 0x00000000, 0x00000000, 0, 0, 0);
\ No newline at end of file +(61324, 0x00000000, 10, 0x0002000000000000, 0x00000000, 0x00000000, 0, 0, 0); diff --git a/sql/updates/7044_01_mangos_spell_proc_event.sql b/sql/updates/7044_01_mangos_spell_proc_event.sql index 576d5611aef..8dc295b7316 100644 --- a/sql/updates/7044_01_mangos_spell_proc_event.sql +++ b/sql/updates/7044_01_mangos_spell_proc_event.sql @@ -14,4 +14,4 @@ INSERT INTO `spell_proc_event` VALUES (48111, 0x00, 0, 0x00000000, 0x00000000, 0 -- (48113) Prayer of Mending (Rank 3) DELETE FROM `spell_proc_event` WHERE `entry` IN (48113); -INSERT INTO `spell_proc_event` VALUES (48113, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x000A02A8, 0x00000000, 0.000000, 0.000000, 0);
\ No newline at end of file +INSERT INTO `spell_proc_event` VALUES (48113, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x000A02A8, 0x00000000, 0.000000, 0.000000, 0); diff --git a/sql/updates/7075_01_characters_character_spell.sql b/sql/updates/7075_01_characters_character_spell.sql index 4e6ef7ea93b..0ec8e2f2558 100644 --- a/sql/updates/7075_01_characters_character_spell.sql +++ b/sql/updates/7075_01_characters_character_spell.sql @@ -10,4 +10,4 @@ DELETE FROM character_spell WHERE `spell` IN ( /*old Shadow Resistance, leaned as racial passive of race 5 */ DELETE FROM character_spell USING character_spell INNER JOIN characters ON character_spell.guid = characters.guid -WHERE character_spell.spell = 20579 AND characters.race <> 5; +WHERE character_spell.spell = 20579 AND characters.race <> 5; diff --git a/sql/updates/7078_01_mangos_spell_proc_event.sql b/sql/updates/7078_01_mangos_spell_proc_event.sql index b5df2f7faa3..ba5369582a2 100644 --- a/sql/updates/7078_01_mangos_spell_proc_event.sql +++ b/sql/updates/7078_01_mangos_spell_proc_event.sql @@ -20,4 +20,4 @@ INSERT INTO `spell_proc_event` VALUES (44395, 0x00, 0, 0x00000000, 0x00000000, 0 DELETE FROM `spell_proc_event` WHERE `entry` IN (44396); INSERT INTO `spell_proc_event` VALUES (44396, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0); -
\ No newline at end of file + diff --git a/sql/updates/7141_01_mangos_instance_template.sql b/sql/updates/7141_01_mangos_instance_template.sql new file mode 100644 index 00000000000..b21905f3949 --- /dev/null +++ b/sql/updates/7141_01_mangos_instance_template.sql @@ -0,0 +1,12 @@ +ALTER TABLE db_version CHANGE COLUMN required_7133_02_mangos_spell_loot_template required_7141_01_mangos_instance_template bit; + +ALTER TABLE instance_template ADD maxPlayersHeroic tinyint(3) unsigned NOT NULL default '0' AFTER maxPlayers; + +UPDATE instance_template SET maxPlayersHeroic = maxPlayers; + +DELETE FROM instance_template WHERE map IN (533,615,616,624); +INSERT INTO instance_template VALUES +(533,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''), +(615,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''), +(616,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''), +(624,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''); diff --git a/sql/updates/7147_01_mangos_creature_template.sql b/sql/updates/7147_01_mangos_creature_template.sql new file mode 100644 index 00000000000..286718b8edb --- /dev/null +++ b/sql/updates/7147_01_mangos_creature_template.sql @@ -0,0 +1,4 @@ +ALTER TABLE db_version CHANGE COLUMN required_7141_01_mangos_instance_template required_7147_01_mangos_creature_template bit; + +UPDATE creature_template + SET family = 0 WHERE entry = 1; diff --git a/sql/updates/7149_01_mangos_spell_proc_event.sql b/sql/updates/7149_01_mangos_spell_proc_event.sql new file mode 100644 index 00000000000..1dcaf8e5e3d --- /dev/null +++ b/sql/updates/7149_01_mangos_spell_proc_event.sql @@ -0,0 +1,21 @@ +ALTER TABLE db_version CHANGE COLUMN required_7147_01_mangos_creature_template required_7149_01_mangos_spell_proc_event bit; + +-- (53501) Sheath of Light (Rank 1) +DELETE FROM `spell_proc_event` WHERE `entry` IN (53501); +INSERT INTO `spell_proc_event` VALUES (53501, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0); + +-- (53502) Sheath of Light (Rank 2) +DELETE FROM `spell_proc_event` WHERE `entry` IN (53502); +INSERT INTO `spell_proc_event` VALUES (53502, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0); + +-- (53503) Sheath of Light (Rank 3) +DELETE FROM `spell_proc_event` WHERE `entry` IN (53503); +INSERT INTO `spell_proc_event` VALUES (53503, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0); + +-- (53228) Rapid Recuperation (Rank 1) +DELETE FROM `spell_proc_event` WHERE `entry` IN (53228); +INSERT INTO `spell_proc_event` VALUES (53228, 0x00, 9, 0x00000020, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0); + +-- (53232) Rapid Recuperation (Rank 2) +DELETE FROM `spell_proc_event` WHERE `entry` IN (53232); +INSERT INTO `spell_proc_event` VALUES (53232, 0x00, 9, 0x00000020, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0); diff --git a/sql/updates/7150_01_mangos_playercreateinfo_spell.sql b/sql/updates/7150_01_mangos_playercreateinfo_spell.sql new file mode 100644 index 00000000000..aba3540be32 --- /dev/null +++ b/sql/updates/7150_01_mangos_playercreateinfo_spell.sql @@ -0,0 +1,10 @@ +ALTER TABLE db_version CHANGE COLUMN required_7149_01_mangos_spell_proc_event required_7150_01_mangos_playercreateinfo_spell bit; + +DELETE FROM `playercreateinfo_spell` WHERE Spell = 58284; + +INSERT INTO `playercreateinfo_spell` VALUES +(1,9,58284,'Chaos Bolt Passive'), +(2,9,58284,'Chaos Bolt Passive'), +(5,9,58284,'Chaos Bolt Passive'), +(7,9,58284,'Chaos Bolt Passive'), +(10,9,58284,'Chaos Bolt Passive'); diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index 598bca0087f..f920bf17b40 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -907,14 +907,30 @@ AchievementCriteriaEntryList const& AchievementGlobalMgr::GetAchievementCriteria void AchievementGlobalMgr::LoadAchievementCriteriaList() { + if(sAchievementCriteriaStore.GetNumRows()==0) + { + barGoLink bar(1); + bar.step(); + + sLog.outString(""); + sLog.outErrorDb(">> Loaded 0 achievement criteria."); + return; + } + + barGoLink bar( sAchievementCriteriaStore.GetNumRows() ); for (uint32 entryId = 0; entryId<sAchievementCriteriaStore.GetNumRows(); entryId++) { + bar.step(); + AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId); if(!criteria) continue; m_AchievementCriteriasByType[criteria->requiredType].push_back(criteria); } + + sLog.outString(); + sLog.outErrorDb(">> Loaded 0 achievement criteria.",m_AchievementCriteriasByType->size()); } @@ -923,15 +939,27 @@ void AchievementGlobalMgr::LoadCompletedAchievements() QueryResult *result = CharacterDatabase.Query("SELECT achievement FROM character_achievement GROUP BY achievement"); if(!result) + { + barGoLink bar(1); + bar.step(); + + sLog.outString(""); + sLog.outString(">> Loaded 0 realm completed achievements . DB table `character_achievement` is empty."); return; + } + barGoLink bar(result->GetRowCount()); do { + bar.step(); Field *fields = result->Fetch(); m_allCompletedAchievements.insert(fields[0].GetUInt32()); } while(result->NextRow()); delete result; + + sLog.outString(""); + sLog.outString(">> Loaded %u realm completed achievements.",m_allCompletedAchievements.size()); } void AchievementGlobalMgr::LoadRewards() @@ -948,7 +976,7 @@ void AchievementGlobalMgr::LoadRewards() bar.step(); sLog.outString(""); - sLog.outString(">> Loaded 0 achievement rewards. DB table `achievement_reward` is empty."); + sLog.outErrorDb(">> Loaded 0 achievement rewards. DB table `achievement_reward` is empty."); return; } @@ -956,9 +984,9 @@ void AchievementGlobalMgr::LoadRewards() do { - Field *fields = result->Fetch(); bar.step(); + Field *fields = result->Fetch(); uint32 entry = fields[0].GetUInt32(); if (!sAchievementStore.LookupEntry(entry)) { diff --git a/src/game/BattleGroundAB.cpp b/src/game/BattleGroundAB.cpp index 6388cacd698..0023c935db2 100644 --- a/src/game/BattleGroundAB.cpp +++ b/src/game/BattleGroundAB.cpp @@ -425,9 +425,9 @@ void BattleGroundAB::_NodeDeOccupied(uint8 node) { WorldSafeLocsEntry const *ClosestGrave = NULL; Player *plr; - for (std::vector<uint64>::iterator itr = ghost_list.begin(); itr != ghost_list.end(); ++itr) + for (std::vector<uint64>::const_iterator itr = ghost_list.begin(); itr != ghost_list.end(); ++itr) { - plr = objmgr.GetPlayer(*ghost_list.begin()); + plr = objmgr.GetPlayer(*itr); if( !plr ) continue; if( !ClosestGrave ) diff --git a/src/game/CalendarHandler.cpp b/src/game/CalendarHandler.cpp index 9c69e3a91f6..fd2858646c2 100644 --- a/src/game/CalendarHandler.cpp +++ b/src/game/CalendarHandler.cpp @@ -1,5 +1,5 @@ -/* - * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> +/* + * Copyright (C) 2005-2009 MaNGOS <http://www.mangosproject.org/> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index d30136993f3..498836ad5ee 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -84,7 +84,7 @@ bool LoginQueryHolder::Initialize() res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_declinedname WHERE guid = '%u'",GUID_LOPART(m_guid)); // in other case still be dummy query res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADGUILD, "SELECT guildid,rank FROM guild_member WHERE guid = '%u'", GUID_LOPART(m_guid)); - res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADARENAINFO, "SELECT arenateamid, played_week, played_season, personal_rating FROM arena_team_member WHERE guid='%u'", GUID_LOPART(m_guid)); + res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADARENAINFO, "SELECT arenateamid, played_week, played_season, personal_rating FROM arena_team_member WHERE guid='%u'", GUID_LOPART(m_guid)); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS, "SELECT achievement, date FROM character_achievement WHERE guid = '%u'", GUID_LOPART(m_guid)); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS,"SELECT criteria, counter, date FROM character_achievement_progress WHERE guid = '%u'", GUID_LOPART(m_guid)); diff --git a/src/game/Creature.h b/src/game/Creature.h index c27acf77415..8e4db98258e 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -174,7 +174,7 @@ struct CreatureInfo uint32 rangeattacktime; uint32 unit_flags; // enum UnitFlags mask values uint32 dynamicflags; - uint32 family; // enum CreatureFamily values for type==CREATURE_TYPE_BEAST, or 0 in another cases + uint32 family; // enum CreatureFamily values (optional) uint32 trainer_type; uint32 trainer_spell; uint32 classNum; diff --git a/src/game/GameEvent.cpp b/src/game/GameEvent.cpp index 9ceed9024c4..f08ba179797 100644 --- a/src/game/GameEvent.cpp +++ b/src/game/GameEvent.cpp @@ -190,50 +190,52 @@ void GameEvent::LoadFromDB() if( !result ) { mGameEvent.clear(); - sLog.outString(">> Table game_event is empty:"); + sLog.outString(">> Table game_event is empty!"); sLog.outString(); return; } uint32 count = 0; - barGoLink bar( result->GetRowCount() ); - do { - ++count; - Field *fields = result->Fetch(); + barGoLink bar( result->GetRowCount() ); + do + { + ++count; + Field *fields = result->Fetch(); - bar.step(); + bar.step(); - uint16 event_id = fields[0].GetUInt16(); - if(event_id==0) - { - sLog.outErrorDb("`game_event` game event id (%i) is reserved and can't be used.",event_id); - continue; - } + uint16 event_id = fields[0].GetUInt16(); + if(event_id==0) + { + sLog.outErrorDb("`game_event` game event id (%i) is reserved and can't be used.",event_id); + continue; + } - GameEventData& pGameEvent = mGameEvent[event_id]; - uint64 starttime = fields[1].GetUInt64(); - pGameEvent.start = time_t(starttime); - uint64 endtime = fields[2].GetUInt64(); - pGameEvent.end = time_t(endtime); - pGameEvent.occurence = fields[3].GetUInt32(); - pGameEvent.length = fields[4].GetUInt32(); - pGameEvent.description = fields[5].GetCppString(); - pGameEvent.state = (GameEventState)(fields[6].GetUInt8()); - pGameEvent.nextstart = 0; - - if(pGameEvent.length==0 && pGameEvent.state == GAMEEVENT_NORMAL) // length>0 is validity check - { - sLog.outErrorDb("`game_event` game event id (%i) isn't a world event and has length = 0, thus it can't be used.",event_id); - continue; - } + GameEventData& pGameEvent = mGameEvent[event_id]; + uint64 starttime = fields[1].GetUInt64(); + pGameEvent.start = time_t(starttime); + uint64 endtime = fields[2].GetUInt64(); + pGameEvent.end = time_t(endtime); + pGameEvent.occurence = fields[3].GetUInt32(); + pGameEvent.length = fields[4].GetUInt32(); + pGameEvent.description = fields[5].GetCppString(); + pGameEvent.state = (GameEventState)(fields[6].GetUInt8()); + pGameEvent.nextstart = 0; + + if(pGameEvent.length==0 && pGameEvent.state == GAMEEVENT_NORMAL) // length>0 is validity check + { + sLog.outErrorDb("`game_event` game event id (%i) isn't a world event and has length = 0, thus it can't be used.",event_id); + continue; + } - } while( result->NextRow() ); + } while( result->NextRow() ); + delete result; - sLog.outString(); - sLog.outString( ">> Loaded %u game events", count ); - delete result; + sLog.outString(); + sLog.outString( ">> Loaded %u game events", count ); + } // load game event saves // 0 1 2 @@ -346,8 +348,8 @@ void GameEvent::LoadFromDB() count = 0; if( !result ) { - barGoLink bar2(1); - bar2.step(); + barGoLink bar(1); + bar.step(); sLog.outString(); sLog.outString(">> Loaded %u creatures in game events", count ); @@ -355,12 +357,12 @@ void GameEvent::LoadFromDB() else { - barGoLink bar2( result->GetRowCount() ); + barGoLink bar( result->GetRowCount() ); do { Field *fields = result->Fetch(); - bar2.step(); + bar.step(); uint32 guid = fields[0].GetUInt32(); int16 event_id = fields[1].GetInt16(); @@ -378,9 +380,10 @@ void GameEvent::LoadFromDB() crelist.push_back(guid); } while( result->NextRow() ); + delete result; + sLog.outString(); sLog.outString( ">> Loaded %u creatures in game events", count ); - delete result; } mGameEventGameobjectGuids.resize(mGameEvent.size()*2-1); @@ -391,8 +394,8 @@ void GameEvent::LoadFromDB() count = 0; if( !result ) { - barGoLink bar3(1); - bar3.step(); + barGoLink bar(1); + bar.step(); sLog.outString(); sLog.outString(">> Loaded %u gameobjects in game events", count ); @@ -400,12 +403,12 @@ void GameEvent::LoadFromDB() else { - barGoLink bar3( result->GetRowCount() ); + barGoLink bar( result->GetRowCount() ); do { Field *fields = result->Fetch(); - bar3.step(); + bar.step(); uint32 guid = fields[0].GetUInt32(); int16 event_id = fields[1].GetInt16(); @@ -423,10 +426,10 @@ void GameEvent::LoadFromDB() golist.push_back(guid); } while( result->NextRow() ); + delete result; + sLog.outString(); sLog.outString( ">> Loaded %u gameobjects in game events", count ); - - delete result; } mGameEventModelEquip.resize(mGameEvent.size()); @@ -439,8 +442,8 @@ void GameEvent::LoadFromDB() count = 0; if( !result ) { - barGoLink bar3(1); - bar3.step(); + barGoLink bar(1); + bar.step(); sLog.outString(); sLog.outString(">> Loaded %u model/equipment changes in game events", count ); @@ -448,12 +451,12 @@ void GameEvent::LoadFromDB() else { - barGoLink bar3( result->GetRowCount() ); + barGoLink bar( result->GetRowCount() ); do { Field *fields = result->Fetch(); - bar3.step(); + bar.step(); uint32 guid = fields[0].GetUInt32(); uint16 event_id = fields[1].GetUInt16(); @@ -483,10 +486,10 @@ void GameEvent::LoadFromDB() equiplist.push_back(std::pair<uint32, ModelEquip>(guid, newModelEquipSet)); } while( result->NextRow() ); + delete result; + sLog.outString(); sLog.outString( ">> Loaded %u model/equipment changes in game events", count ); - - delete result; } mGameEventCreatureQuests.resize(mGameEvent.size()); @@ -496,8 +499,8 @@ void GameEvent::LoadFromDB() count = 0; if( !result ) { - barGoLink bar3(1); - bar3.step(); + barGoLink bar(1); + bar.step(); sLog.outString(); sLog.outString(">> Loaded %u quests additions in game events", count ); @@ -505,12 +508,12 @@ void GameEvent::LoadFromDB() else { - barGoLink bar3( result->GetRowCount() ); + barGoLink bar( result->GetRowCount() ); do { Field *fields = result->Fetch(); - bar3.step(); + bar.step(); uint32 id = fields[0].GetUInt32(); uint32 quest = fields[1].GetUInt32(); uint16 event_id = fields[2].GetUInt16(); @@ -569,10 +572,10 @@ void GameEvent::LoadFromDB() questlist.push_back(QuestRelation(id, quest)); } while( result->NextRow() ); + delete result; + sLog.outString(); sLog.outString( ">> Loaded %u quests additions in game events", count ); - - delete result; } // Load quest to (event,condition) mapping diff --git a/src/game/GameObject.h b/src/game/GameObject.h index 8638ba602bb..eccfae7bd70 100644 --- a/src/game/GameObject.h +++ b/src/game/GameObject.h @@ -351,7 +351,7 @@ struct GameObjectInfo uint32 state2Name; //3 } destructibleBuilding; //34 GAMEOBJECT_TYPE_TRAPDOOR - struct + struct { uint32 whenToPause; // 0 uint32 startOpen; // 1 diff --git a/src/game/Guild.cpp b/src/game/Guild.cpp index a34d4bee524..9dbba57ac12 100644 --- a/src/game/Guild.cpp +++ b/src/game/Guild.cpp @@ -1604,7 +1604,7 @@ void Guild::DisplayGuildBankLogs(WorldSession *session, uint8 TabId) { data << uint8((*itr)->LogEntry); data << uint64(MAKE_NEW_GUID((*itr)->PlayerGuid,0,HIGHGUID_PLAYER)); - if ((*itr)->LogEntry == GUILD_BANK_LOG_DEPOSIT_MONEY || + if ((*itr)->LogEntry == GUILD_BANK_LOG_DEPOSIT_MONEY || (*itr)->LogEntry == GUILD_BANK_LOG_WITHDRAW_MONEY || (*itr)->LogEntry == GUILD_BANK_LOG_REPAIR_MONEY || (*itr)->LogEntry == GUILD_BANK_LOG_UNK1 || @@ -1634,7 +1634,7 @@ void Guild::DisplayGuildBankLogs(WorldSession *session, uint8 TabId) { data << uint8((*itr)->LogEntry); data << uint64(MAKE_NEW_GUID((*itr)->PlayerGuid,0,HIGHGUID_PLAYER)); - if ((*itr)->LogEntry == GUILD_BANK_LOG_DEPOSIT_MONEY || + if ((*itr)->LogEntry == GUILD_BANK_LOG_DEPOSIT_MONEY || (*itr)->LogEntry == GUILD_BANK_LOG_WITHDRAW_MONEY || (*itr)->LogEntry == GUILD_BANK_LOG_REPAIR_MONEY || (*itr)->LogEntry == GUILD_BANK_LOG_UNK1 || diff --git a/src/game/InstanceSaveMgr.cpp b/src/game/InstanceSaveMgr.cpp index cb95dac6978..52e513b7c97 100644 --- a/src/game/InstanceSaveMgr.cpp +++ b/src/game/InstanceSaveMgr.cpp @@ -361,8 +361,8 @@ void InstanceSaveManager::PackInstances() bar.step(); } - sLog.outString(); sLog.outString( ">> Instance numbers remapped, next instance id is %u", InstanceNumber ); + sLog.outString(); } void InstanceSaveManager::LoadResetTimes() @@ -454,7 +454,7 @@ void InstanceSaveManager::LoadResetTimes() // add the global reset times to the priority queue for(uint32 i = 0; i < sInstanceTemplate.MaxEntry; i++) { - InstanceTemplate* temp = (InstanceTemplate*)objmgr.GetInstanceTemplate(i); + InstanceTemplate const* temp = objmgr.GetInstanceTemplate(i); if(!temp) continue; // only raid/heroic maps have a global reset time const MapEntry* entry = sMapStore.LookupEntry(temp->map); @@ -583,7 +583,7 @@ void InstanceSaveManager::_ResetOrWarnAll(uint32 mapid, bool warn, uint32 timeLe { // global reset for all instances of the given map // note: this isn't fast but it's meant to be executed very rarely - Map *map = (MapInstanced*)MapManager::Instance().GetBaseMap(mapid); + Map const *map = MapManager::Instance().GetBaseMap(mapid); if(!map->Instanceable()) return; uint64 now = (uint64)time(NULL); @@ -591,7 +591,7 @@ void InstanceSaveManager::_ResetOrWarnAll(uint32 mapid, bool warn, uint32 timeLe if(!warn) { // this is called one minute before the reset time - InstanceTemplate* temp = (InstanceTemplate*)objmgr.GetInstanceTemplate(mapid); + InstanceTemplate const* temp = objmgr.GetInstanceTemplate(mapid); if(!temp || !temp->reset_delay) { sLog.outError("InstanceSaveManager::ResetOrWarnAll: no instance template or reset delay for map %d", mapid); diff --git a/src/game/Map.cpp b/src/game/Map.cpp index 0919db4ebe1..d64a1736fe1 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -1767,10 +1767,10 @@ bool InstanceMap::CanEnter(Player *player) } // cannot enter if the instance is full (player cap), GMs don't count - InstanceTemplate const* iTemplate = objmgr.GetInstanceTemplate(GetId()); - if (!player->isGameMaster() && GetPlayersCountExceptGMs() >= iTemplate->maxPlayers) + uint32 maxPlayers = GetMaxPlayers(); + if (!player->isGameMaster() && GetPlayersCountExceptGMs() >= maxPlayers) { - sLog.outDetail("MAP: Instance '%u' of map '%s' cannot have more than '%u' players. Player '%s' rejected", GetInstanceId(), GetMapName(), iTemplate->maxPlayers, player->GetName()); + sLog.outDetail("MAP: Instance '%u' of map '%s' cannot have more than '%u' players. Player '%s' rejected", GetInstanceId(), GetMapName(), maxPlayers, player->GetName()); player->SendTransferAborted(GetId(), TRANSFER_ABORT_MAX_PLAYERS); return false; } @@ -2080,6 +2080,14 @@ void InstanceMap::SetResetSchedule(bool on) } } +uint32 InstanceMap::GetMaxPlayers() const +{ + InstanceTemplate const* iTemplate = objmgr.GetInstanceTemplate(GetId()); + if(!iTemplate) + return 0; + return IsHeroic() ? iTemplate->maxPlayersHeroic : iTemplate->maxPlayers; +} + /* ******* Battleground Instance Maps ******* */ BattleGroundMap::BattleGroundMap(uint32 id, time_t expiry, uint32 InstanceId) diff --git a/src/game/Map.h b/src/game/Map.h index bcdb4d9782c..0c4fbd0ece4 100644 --- a/src/game/Map.h +++ b/src/game/Map.h @@ -100,7 +100,8 @@ struct InstanceTemplate uint32 levelMin; uint32 levelMax; uint32 maxPlayers; - uint32 reset_delay; + uint32 maxPlayersHeroic; + uint32 reset_delay; // FIX ME: now exist normal/heroic raids with possible different time of reset. float startLocX; float startLocY; float startLocZ; @@ -384,6 +385,7 @@ class TRINITY_DLL_SPEC InstanceMap : public Map bool CanEnter(Player* player); void SendResetWarnings(uint32 timeLeft) const; void SetResetSchedule(bool on); + uint32 GetMaxPlayers() const; private: bool m_resetAfterUnload; bool m_unloadWhenEmpty; diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 50ed59d2486..24e97183ec8 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -258,7 +258,7 @@ void Object::DestroyForPlayer(Player *target) const void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2) const { uint16 unk_flags = ((GetTypeId() == TYPEID_PLAYER) ? ((Player*)this)->m_movementInfo.unk1 : 0); - + if(GetTypeId() == TYPEID_UNIT) if(((Creature*)this)->isVehicle()) unk_flags |= 0x20; // always allow pitch diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index ba74bd3b762..ccd78c4be20 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -843,6 +843,19 @@ void ObjectMgr::LoadCreatureTemplates() if((cInfo->npcflag & UNIT_NPC_FLAG_TRAINER) && cInfo->trainer_type >= MAX_TRAINER_TYPE) sLog.outErrorDb("Creature (Entry: %u) has wrong trainer type %u",cInfo->Entry,cInfo->trainer_type); + if(cInfo->type && !sCreatureTypeStore.LookupEntry(cInfo->type)) + { + sLog.outErrorDb("Creature (Entry: %u) has invalid creature type (%u) in `type`",cInfo->Entry,cInfo->type); + const_cast<CreatureInfo*>(cInfo)->type = CREATURE_TYPE_HUMANOID; + } + + // must exist or used hidden but used in data horse case + if(cInfo->family && !sCreatureFamilyStore.LookupEntry(cInfo->family) && cInfo->family != CREATURE_FAMILY_HORSE_CUSTOM ) + { + sLog.outErrorDb("Creature (Entry: %u) has invalid creature family (%u) in `family`",cInfo->Entry,cInfo->family); + const_cast<CreatureInfo*>(cInfo)->family = 0; + } + if(cInfo->InhabitType <= 0 || cInfo->InhabitType > INHABIT_ANYWHERE) { sLog.outErrorDb("Creature (Entry: %u) has wrong value (%u) in `InhabitType`, creature will not correctly walk/swim/fly",cInfo->Entry,cInfo->InhabitType); @@ -1542,18 +1555,36 @@ void ObjectMgr::LoadAuctions() { QueryResult *result = CharacterDatabase.Query("SELECT COUNT(*) FROM auctionhouse"); if( !result ) + { + barGoLink bar(1); + bar.step(); + sLog.outString(""); + sLog.outString(">> Loaded 0 auctions. DB table `auctionhouse` is empty."); return; + } Field *fields = result->Fetch(); uint32 AuctionCount=fields[0].GetUInt32(); delete result; if(!AuctionCount) + { + barGoLink bar(1); + bar.step(); + sLog.outString(""); + sLog.outString(">> Loaded 0 auctions. DB table `auctionhouse` is empty."); return; + } result = CharacterDatabase.Query( "SELECT id,auctioneerguid,itemguid,item_template,itemowner,buyoutprice,time,buyguid,lastbid,startbid,deposit,location FROM auctionhouse" ); if( !result ) + { + barGoLink bar(1); + bar.step(); + sLog.outString(""); + sLog.outString(">> Loaded 0 auctions. DB table `auctionhouse` is empty."); return; + } barGoLink bar( AuctionCount ); @@ -1594,7 +1625,6 @@ void ObjectMgr::LoadAuctions() sLog.outString(); sLog.outString( ">> Loaded %u auctions", AuctionCount ); - sLog.outString(); } void ObjectMgr::LoadItemLocales() @@ -2028,7 +2058,13 @@ void ObjectMgr::LoadAuctionItems() QueryResult *result = CharacterDatabase.Query( "SELECT data,itemguid,item_template FROM auctionhouse JOIN item_instance ON itemguid = guid" ); if( !result ) + { + barGoLink bar(1); + bar.step(); + sLog.outString(""); + sLog.outString(">> Loaded 0 auction items"); return; + } barGoLink bar( result->GetRowCount() ); @@ -2063,7 +2099,6 @@ void ObjectMgr::LoadAuctionItems() ++count; } while( result->NextRow() ); - delete result; sLog.outString(); @@ -4448,14 +4483,20 @@ void ObjectMgr::LoadInstanceTemplate() else if(!entry->HasResetTime()) continue; + //FIXME: now exist heroic instance, normal/heroic raid instances + // entry->resetTimeHeroic store reset time for both heroic mode instance (raid and non-raid) + // entry->resetTimeRaid store reset time for normal raid only + // for current state entry->resetTimeRaid == entry->resetTimeHeroic in case raid instances with heroic mode. + // but at some point wee need implement reset time dependen from raid insatance mode if(temp->reset_delay == 0) { // use defaults from the DBC - if(entry->SupportsHeroicMode()) + if(entry->resetTimeHeroic) // for both raid and non raids, read above { temp->reset_delay = entry->resetTimeHeroic / DAY; } else if (entry->resetTimeRaid && entry->map_type == MAP_RAID) + // for normal raid only { temp->reset_delay = entry->resetTimeRaid / DAY; } @@ -4633,14 +4674,27 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp) // 0 1 2 3 4 5 6 7 8 9 QueryResult* result = CharacterDatabase.PQuery("SELECT id,messageType,sender,receiver,itemTextId,has_items,expire_time,cod,checked,mailTemplateId FROM mail WHERE expire_time < '" I64FMTD "'", (uint64)basetime); if ( !result ) + { + barGoLink bar(1); + bar.step(); + sLog.outString(""); + sLog.outString(">> Only expired mails (need to be return or delete) or DB table `mail` is empty."); return; // any mails need to be returned or deleted - Field *fields; + } + //std::ostringstream delitems, delmails; //will be here for optimization //bool deletemail = false, deleteitem = false; //delitems << "DELETE FROM item_instance WHERE guid IN ( "; //delmails << "DELETE FROM mail WHERE id IN ( " + + barGoLink bar( result->GetRowCount() ); + uint32 count = 0; + Field *fields; + do { + bar.step(); + fields = result->Fetch(); Mail *m = new Mail; m->messageID = fields[0].GetUInt32(); @@ -4706,8 +4760,12 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp) //delmails << m->messageID << ", "; CharacterDatabase.PExecute("DELETE FROM mail WHERE id = '%u'", m->messageID); delete m; + ++count; } while (result->NextRow()); delete result; + + sLog.outString(); + sLog.outString( ">> Loaded %u mails", count ); } void ObjectMgr::LoadQuestAreaTriggers() @@ -4873,24 +4931,31 @@ uint32 ObjectMgr::GetNearestTaxiNode( float x, float y, float z, uint32 mapid, u for(uint32 i = 1; i < sTaxiNodesStore.GetNumRows(); ++i) { TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(i); - if(node && node->map_id == mapid && node->MountCreatureID[team == ALLIANCE ? 1 : 0]) + if(!node || node->map_id != mapid || !node->MountCreatureID[team == ALLIANCE ? 1 : 0]) + continue; + + uint8 field = (uint8)((i - 1) / 32); + uint32 submask = 1<<((i-1)%32); + + // skip not taxi network nodes + if((sTaxiNodesMask[field] & submask)==0) + continue; + + float dist2 = (node->x - x)*(node->x - x)+(node->y - y)*(node->y - y)+(node->z - z)*(node->z - z); + if(found) { - float dist2 = (node->x - x)*(node->x - x)+(node->y - y)*(node->y - y)+(node->z - z)*(node->z - z); - if(found) - { - if(dist2 < dist) - { - dist = dist2; - id = i; - } - } - else + if(dist2 < dist) { - found = true; dist = dist2; id = i; } } + else + { + found = true; + dist = dist2; + id = i; + } } return id; @@ -6626,11 +6691,22 @@ void ObjectMgr::LoadGameObjectForQuests() { mGameObjectForQuestSet.clear(); // need for reload case + if( !sGOStorage.MaxEntry ) + { + barGoLink bar( 1 ); + bar.step(); + sLog.outString(); + sLog.outString( ">> Loaded 0 GameObjects for quests" ); + return; + } + + barGoLink bar( sGOStorage.MaxEntry - 1 ); uint32 count = 0; // collect GO entries for GO that must activated for(uint32 go_entry = 1; go_entry < sGOStorage.MaxEntry; ++go_entry) { + bar.step(); GameObjectInfo const* goInfo = sGOStorage.LookupEntry<GameObjectInfo>(go_entry); if(!goInfo) continue; @@ -6665,7 +6741,7 @@ void ObjectMgr::LoadGameObjectForQuests() } sLog.outString(); - sLog.outString( ">> Loaded %u GameObject for quests", count ); + sLog.outString( ">> Loaded %u GameObjects for quests", count ); } bool ObjectMgr::LoadTrinityStrings(DatabaseType& db, char const* table, int32 min_value, int32 max_value) @@ -7211,11 +7287,10 @@ void ObjectMgr::LoadGameTele() ++count; } while (result->NextRow()); - delete result; sLog.outString(); - sLog.outString( ">> Loaded %u game tele's", count ); + sLog.outString( ">> Loaded %u GameTeleports", count ); } GameTele const* ObjectMgr::GetGameTele(const std::string& name) const @@ -7387,7 +7462,7 @@ void ObjectMgr::LoadTrainerSpell() delete result; sLog.outString(); - sLog.outString( ">> Loaded Trainers %d", count ); + sLog.outString( ">> Loaded %d Trainers", count ); } void ObjectMgr::LoadVendors() @@ -7665,16 +7740,30 @@ void ObjectMgr::LoadScriptNames() "SELECT DISTINCT(ScriptName) FROM areatrigger_scripts WHERE ScriptName <> '' " "UNION " "SELECT DISTINCT(script) FROM instance_template WHERE script <> ''"); - if(result) + + if( !result ) { - do - { - m_scriptNames.push_back((*result)[0].GetString()); - } while (result->NextRow()); - delete result; + barGoLink bar( 1 ); + bar.step(); + sLog.outString(); + sLog.outErrorDb(">> Loaded empty set of Script Names!"); + return; } + barGoLink bar( result->GetRowCount() ); + uint32 count = 0; + + do + { + bar.step(); + m_scriptNames.push_back((*result)[0].GetString()); + ++count; + } while (result->NextRow()); + delete result; + std::sort(m_scriptNames.begin(), m_scriptNames.end()); + sLog.outString(); + sLog.outString( ">> Loaded %d Script Names", count ); } uint32 ObjectMgr::GetScriptId(const char *name) diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp index e5fd0d037e4..6a39aeb6d3b 100644 --- a/src/game/Pet.cpp +++ b/src/game/Pet.cpp @@ -777,11 +777,10 @@ bool Pet::CreateBaseAtCreature(Creature* creature) SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, objmgr.GetXPForLevel(creature->getLevel())/4); SetUInt32Value(UNIT_NPC_FLAGS, 0); - CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(creature->GetCreatureInfo()->family); - if( char* familyname = cFamily->Name[sWorld.GetDefaultDbcLocale()] ) - SetName(familyname); + if(CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cinfo->family)) + SetName(cFamily->Name[sWorld.GetDefaultDbcLocale()]); else - SetName(creature->GetName()); + SetName(creature->GetNameForLocaleIdx(objmgr.GetDBCLocaleIndex())); if(cinfo->type == CREATURE_TYPE_BEAST) { diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 3a8ebeede4d..ccf3eefcb6f 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -301,6 +301,7 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this) m_comboPoints = 0; m_usedTalentCount = 0; + m_questRewardTalentCount = 0; m_regenTimer = 0; m_weaponChangeTimer = 0; @@ -430,7 +431,7 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this) for (int i = 0; i < MAX_COMBAT_RATING; i++) m_baseRatingValue[i] = 0; - + m_baseSpellDamage = 0; m_baseSpellHealing = 0; m_baseFeralAP = 0; @@ -2351,7 +2352,8 @@ void Player::InitTalentForLevel() } else { - uint32 talentPointsForLevel = uint32((level-9)*sWorld.getRate(RATE_TALENT)); + uint32 talentPointsForLevel = CalculateTalentsPoints(); + // if used more that have then reset if(m_usedTalentCount > talentPointsForLevel) { @@ -3273,8 +3275,7 @@ bool Player::resetTalents(bool no_cost) CharacterDatabase.PExecute("UPDATE characters set at_login = at_login & ~ %u WHERE guid ='%u'", uint32(AT_LOGIN_RESET_TALENTS), GetGUIDLow()); } - uint32 level = getLevel(); - uint32 talentPointsForLevel = level < 10 ? 0 : uint32((level-9)*sWorld.getRate(RATE_TALENT)); + uint32 talentPointsForLevel = CalculateTalentsPoints(); if (m_usedTalentCount == 0) { @@ -4654,7 +4655,7 @@ float Player::OCTRegenMPPerSpirit() void Player::ApplyRatingMod(CombatRating cr, int32 value, bool apply) { m_baseRatingValue[cr]+=(apply ? value : -value); - + int32 amount = uint32(m_baseRatingValue[cr]); // Apply bonus from SPELL_AURA_MOD_RATING_FROM_STAT // stat used stored in miscValueB for this aura @@ -10267,7 +10268,7 @@ uint8 Player::CanEquipItem( uint8 slot, uint16 &dest, Item *pItem, bool swap, bo if(!CanDualWield()) return EQUIP_ERR_CANT_DUAL_WIELD; } - else if (type == INVTYPE_2HWEAPON) + else if (type == INVTYPE_2HWEAPON) { if(!CanDualWield() || !CanTitanGrip()) return EQUIP_ERR_CANT_DUAL_WIELD; @@ -13011,6 +13012,12 @@ void Player::RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver SetTitle(titleEntry); } + if(pQuest->GetBonusTalents()) + { + m_questRewardTalentCount+=pQuest->GetBonusTalents(); + InitTalentForLevel(); + } + // Send reward mail if(pQuest->GetRewMailTemplateId()) { @@ -14732,16 +14739,15 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder ) _LoadSpells(holder->GetResult(PLAYER_LOGIN_QUERY_LOADSPELLS)); - // after spell load - InitTalentForLevel(); - learnSkillRewardedSpells(); - learnDefaultSpells(); - - // after spell load, learn rewarded spell if need also _LoadQuestStatus(holder->GetResult(PLAYER_LOGIN_QUERY_LOADQUESTSTATUS)); _LoadDailyQuestStatus(holder->GetResult(PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS)); + // after spell and quest load + InitTalentForLevel(); + learnSkillRewardedSpells(); + learnDefaultSpells(); + _LoadTutorials(holder->GetResult(PLAYER_LOGIN_QUERY_LOADTUTORIALS)); // must be before inventory (some items required reputation check) @@ -15404,6 +15410,9 @@ void Player::_LoadQuestStatus(QueryResult *result) if(CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(pQuest->GetCharTitleId())) SetTitle(titleEntry); } + + if(pQuest->GetBonusTalents()) + m_questRewardTalentCount+=pQuest->GetBonusTalents(); } sLog.outDebug("Quest status is {%u} for quest {%u} for player (GUID: %u)", questStatusData.m_status, quest_id, GetGUIDLow()); @@ -15680,29 +15689,29 @@ InstancePlayerBind* Player::BindToInstance(InstanceSave *save, bool permanent, b void Player::SendRaidInfo() { + uint32 counter = 0; + WorldPacket data(SMSG_RAID_INSTANCE_INFO, 4); - uint32 counter = 0, i; - for(i = 0; i < TOTAL_DIFFICULTIES; i++) - for (BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr) - if(itr->second.perm) counter++; + size_t p_counter = data.wpos(); + data << uint32(counter); // placeholder - data << counter; - for(i = 0; i < TOTAL_DIFFICULTIES; i++) + for(int i = 0; i < TOTAL_DIFFICULTIES; ++i) { for (BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr) { if(itr->second.perm) { InstanceSave *save = itr->second.save; - data << (save->GetMapId()); - data << (uint32)(save->GetResetTime() - time(NULL)); - data << save->GetInstanceId(); - data << uint32(counter); - counter--; + data << uint32(save->GetMapId()); + data << uint32(save->GetResetTime() - time(NULL)); + data << uint32(save->GetInstanceId()); + data << uint32(save->GetDifficulty()); + ++counter; } } } + data.put<uint32>(p_counter,counter); GetSession()->SendPacket(&data); } @@ -19251,7 +19260,7 @@ bool Player::isHonorOrXPTarget(Unit* pVictim) if(pVictim->GetTypeId() == TYPEID_UNIT) { - if (((Creature*)pVictim)->isTotem() || + if (((Creature*)pVictim)->isTotem() || ((Creature*)pVictim)->isPet() || ((Creature*)pVictim)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP_AT_KILL) return false; @@ -20060,7 +20069,7 @@ void Player::UpdateCharmedAI() void Player::ConvertRune(uint8 index, uint8 newType) { SetCurrentRune(index, newType); - + WorldPacket data(SMSG_CONVERT_RUNE, 2); data << uint8(index); data << uint8(newType); @@ -20125,3 +20134,20 @@ void Player::AutoStoreLootItem(uint8 bag, uint8 slot, uint32 loot_id, LootStore StoreNewItem (dest,lootItem->itemid,true,lootItem->randomPropertyId); } + +uint32 Player::CalculateTalentsPoints() const +{ + uint32 base_talent = getLevel() < 10 ? 0 : uint32((getLevel()-9)*sWorld.getRate(RATE_TALENT)); + + if(getClass() != CLASS_DEATH_KNIGHT) + return base_talent; + + uint32 talentPointsForLevel = + (getLevel() < 56 ? 0 : uint32((getLevel()-55)*sWorld.getRate(RATE_TALENT))) + + m_questRewardTalentCount; + + if(talentPointsForLevel > base_talent) + talentPointsForLevel = base_talent; + + return talentPointsForLevel; +} diff --git a/src/game/Player.h b/src/game/Player.h index d4ef1151b4e..1ea97f0b82a 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -443,7 +443,7 @@ enum PlayerFlags PLAYER_FLAGS_UNK18 = 0x00020000, // taxi benchmark mode (on/off) (2.0.1) PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually) PLAYER_FLAGS_UNK20 = 0x00080000, - PLAYER_FLAGS_UNK21 = 0x00100000, + PLAYER_FLAGS_UNK21 = 0x00100000, PLAYER_FLAGS_UNK22 = 0x00200000, PLAYER_FLAGS_UNK23 = 0x00400000, PLAYER_FLAGS_UNK24 = 0x00800000, // disabled all abilitys on tab except autoattack @@ -1494,6 +1494,8 @@ class TRINITY_DLL_SPEC Player : public Unit uint32 resetTalentsCost() const; void InitTalentForLevel(); + uint32 CalculateTalentsPoints() const; + void InitGlyphsForLevel(); void SetGlyphSlot(uint8 slot, uint32 slottype) { SetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot, slottype); } uint32 GetGlyphSlot(uint8 slot) { return GetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot); } @@ -2421,6 +2423,7 @@ class TRINITY_DLL_SPEC Player : public Unit uint32 m_resetTalentsCost; time_t m_resetTalentsTime; uint32 m_usedTalentCount; + uint32 m_questRewardTalentCount; // Social PlayerSocial *m_social; diff --git a/src/game/ScriptCalls.cpp b/src/game/ScriptCalls.cpp index 8c763809f63..693f27b1fb0 100644 --- a/src/game/ScriptCalls.cpp +++ b/src/game/ScriptCalls.cpp @@ -86,7 +86,8 @@ bool LoadScriptingModule(char const* libName) return false; } - printf("Scripts Library %s was successfully loaded.\n",name.c_str()); + sLog.outString(); + sLog.outString( ">>> Scripts Library %s was successfully loaded.\n", name.c_str() ); //heh we are still there :P we have a valid library //we reload script diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index adfc6af32ef..66db2a8a3e8 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -1588,6 +1588,7 @@ enum TrainerType // this is important #define MAX_TRAINER_TYPE 4 +// CreatureType.dbc enum CreatureType { CREATURE_TYPE_BEAST = 1, @@ -1607,6 +1608,7 @@ enum CreatureType uint32 const CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD = (1 << (CREATURE_TYPE_HUMANOID-1)) | (1 << (CREATURE_TYPE_UNDEAD-1)); +// CreatureFamily.dbc enum CreatureFamily { CREATURE_FAMILY_WOLF = 1, @@ -1618,6 +1620,7 @@ enum CreatureFamily CREATURE_FAMILY_CARRION_BIRD = 7, CREATURE_FAMILY_CRAB = 8, CREATURE_FAMILY_GORILLA = 9, + CREATURE_FAMILY_HORSE_CUSTOM = 10, // not exist in DBC but used for horse like beasts in DB CREATURE_FAMILY_RAPTOR = 11, CREATURE_FAMILY_TALLSTRIDER = 12, CREATURE_FAMILY_FELHUNTER = 15, diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 1530e0728fc..c80a3316f50 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -651,11 +651,12 @@ void Spell::prepareDataForTriggerSystem() case SPELLFAMILY_ROGUE: // For poisons need do it if (m_spellInfo->SpellFamilyFlags & 0x000000101001E000LL) m_canTrigger = true; break; - case SPELLFAMILY_HUNTER: // Hunter Rapid Killing/Explosive Trap Effect/Immolation Trap Effect/Frost Trap Aura/Snake Trap Effect - if (m_spellInfo->SpellFamilyFlags & 0x0100200000000014LL) m_canTrigger = true; + case SPELLFAMILY_HUNTER: // Hunter Rapid Killing/Explosive Trap Effect/Immolation Trap Effect/Frost Trap Aura/Snake Trap Effect/Explosive Shot + if (m_spellInfo->SpellFamilyFlags & 0x0100200000000214LL || + m_spellInfo->SpellFamilyFlags2 & 0x200) m_canTrigger = true; break; - case SPELLFAMILY_PALADIN: // For Holy Shock triggers need do it - if (m_spellInfo->SpellFamilyFlags & 0x0001000000200000LL) m_canTrigger = true; + case SPELLFAMILY_PALADIN: // For Judgements (all) / Holy Shock triggers need do it + if (m_spellInfo->SpellFamilyFlags & 0x0001000900B80400LL) m_canTrigger = true; break; } } @@ -4204,7 +4205,7 @@ uint8 Spell::CanCast(bool strict) break; } - // This is generic summon effect + // This is generic summon effect case SPELL_EFFECT_SUMMON: { switch(m_spellInfo->EffectMiscValueB[i]) diff --git a/src/game/Spell.h b/src/game/Spell.h index afe9776374d..d06862ad1fa 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -319,6 +319,7 @@ class Spell void EffectCharge(uint32 i); void EffectProspecting(uint32 i); void EffectMilling(uint32 i); + void EffectRenamePet(uint32 i); void EffectSendTaxi(uint32 i); void EffectSummonCritter(uint32 i); void EffectKnockBack(uint32 i); diff --git a/src/game/SpellAuraDefines.h b/src/game/SpellAuraDefines.h index 80d280eb22a..eb802d1c934 100644 --- a/src/game/SpellAuraDefines.h +++ b/src/game/SpellAuraDefines.h @@ -239,7 +239,7 @@ enum AuraType SPELL_AURA_HASTE_MELEE = 192, SPELL_AURA_MELEE_SLOW = 193, SPELL_AURA_MOD_IGNORE_ABSORB_SCHOOL = 194, - SPELL_AURA_MOD_DEPRICATED_2 = 195, // not used now, old SPELL_AURA_MOD_SPELL_HEALING_OF_INTELLECT + SPELL_AURA_MOD_IGNORE_ABSORB_FOR_SPELL = 195, SPELL_AURA_MOD_COOLDOWN = 196, // only 24818 Noxious Breath SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE = 197, SPELL_AURA_MOD_ALL_WEAPON_SKILLS = 198, @@ -271,7 +271,7 @@ enum AuraType SPELL_AURA_224 = 224, SPELL_AURA_PRAYER_OF_MENDING = 225, SPELL_AURA_PERIODIC_DUMMY = 226, - SPELL_AURA_227 = 227, + SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE = 227, SPELL_AURA_DETECT_STEALTH = 228, SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE = 229, SPELL_AURA_230 = 230, @@ -311,10 +311,10 @@ enum AuraType SPELL_AURA_264 = 264, SPELL_AURA_265 = 265, SPELL_AURA_266 = 266, - SPELL_AURA_267 = 267, + SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL = 267, SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT = 268, SPELL_AURA_269 = 269, - SPELL_AURA_270 = 270, + SPELL_AURA_MOD_IGNORE_TARGET_RESIST = 270, // Possibly need swap vs 195 aura used only in 1 spell Chaos Bolt Passive SPELL_AURA_MOD_DAMAGE_FROM_CASTER = 271, SPELL_AURA_272 = 272, SPELL_AURA_273 = 273, diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 471dbdfec16..6f6224795d1 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -249,7 +249,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]= &Aura::HandleModMeleeRangedSpeedPct, //192 SPELL_AURA_HASTE_MELEE &Aura::HandleModCombatSpeedPct, //193 SPELL_AURA_MELEE_SLOW (in fact combat (any type attack) speed pct) &Aura::HandleUnused, //194 SPELL_AURA_MOD_IGNORE_ABSORB_SCHOOL - &Aura::HandleUnused, //195 SPELL_AURA_MOD_DEPRICATED_2 not used now (old SPELL_AURA_MOD_SPELL_HEALING_OF_INTELLECT) + &Aura::HandleNoImmediateEffect, //195 SPELL_AURA_MOD_IGNORE_ABSORB_FOR_SPELL implement in Unit::CalculateSpellDamage &Aura::HandleNULL, //196 SPELL_AURA_MOD_COOLDOWN &Aura::HandleNoImmediateEffect, //197 SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE implemented in Unit::SpellCriticalBonus Unit::GetUnitCriticalChance &Aura::HandleUnused, //198 SPELL_AURA_MOD_ALL_WEAPON_SKILLS @@ -281,7 +281,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]= &Aura::HandleUnused, //224 unused &Aura::HandleNoImmediateEffect, //225 SPELL_AURA_PRAYER_OF_MENDING &Aura::HandleAuraPeriodicDummy, //226 SPELL_AURA_PERIODIC_DUMMY - &Aura::HandleNULL, //227 periodic trigger spell + &Aura::HandlePeriodicTriggerSpellWithValue, //227 SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE &Aura::HandleNoImmediateEffect, //228 stealth detection &Aura::HandleNULL, //229 SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE &Aura::HandleAuraModIncreaseMaxHealth, //230 Commanding Shout @@ -309,7 +309,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]= &Aura::HandleNULL, //252 haste all? &Aura::HandleNULL, //253 SPELL_AURA_MOD_BLOCK_CRIT_CHANCE &Aura::HandleNULL, //254 SPELL_AURA_MOD_DISARM_SHIELD disarm Shield - &Aura::HandleNULL, //255 SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT + &Aura::HandleNoImmediateEffect, //255 SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT implemented in Unit::SpellDamageBonus &Aura::HandleNoReagentUseAura, //256 SPELL_AURA_NO_REAGENT_USE Use SpellClassMask for spell select &Aura::HandleNULL, //257 SPELL_AURA_MOD_TARGET_RESIST_BY_SPELL_CLASS Use SpellClassMask for spell select &Aura::HandleNULL, //258 SPELL_AURA_MOD_SPELL_VISUAL @@ -321,10 +321,10 @@ pAuraHandler AuraHandler[TOTAL_AURAS]= &Aura::HandleNULL, //264 unused &Aura::HandleNULL, //265 unused &Aura::HandleNULL, //266 unused - &Aura::HandleNULL, //267 some immunity? + &Aura::HandleNoImmediateEffect, //267 SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL implemented in Unit::IsImmunedToSpellEffect &Aura::HandleAuraModAttackPowerOfStatPercent, //268 SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT &Aura::HandleNULL, //269 ignore DR effects? - &Aura::HandleNULL, //270 + &Aura::HandleNULL, //270 SPELL_AURA_MOD_IGNORE_TARGET_RESIST &Aura::HandleNoImmediateEffect, //271 SPELL_AURA_MOD_DAMAGE_FROM_CASTER implemented in Unit::SpellDamageBonus &Aura::HandleNULL, //272 reduce spell cast time? &Aura::HandleNULL, //273 @@ -344,7 +344,7 @@ Aura::Aura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, U m_spellmod(NULL), m_caster_guid(0), m_castItemGuid(castItem?castItem->GetGUID():0), m_target(target), m_timeCla(1000), m_periodicTimer(0), m_removeMode(AURA_REMOVE_BY_DEFAULT), m_AuraDRGroup(DIMINISHING_NONE), m_effIndex(eff), m_auraSlot(MAX_AURAS), m_auraFlags(AFLAG_NONE), m_auraLevel(1), m_procCharges(0), m_stackAmount(1), -m_positive(false), m_permanent(false), m_isPeriodic(false), m_isTrigger(false), m_isAreaAura(false), m_isPersistent(false), +m_positive(false), m_permanent(false), m_isPeriodic(false), m_isAreaAura(false), m_isPersistent(false), m_updated(false), m_isRemovedOnShapeLost(true), m_in_use(false) { assert(target); @@ -613,12 +613,7 @@ void Aura::Update(uint32 diff) m_periodicTimer += m_modifier.periodictime; if(!m_target->hasUnitState(UNIT_STAT_ISOLATED)) - { - if(m_isTrigger) - TriggerSpell(); - else - PeriodicTick(); - } + PeriodicTick(); } } } @@ -861,7 +856,7 @@ void Aura::_AddAura() // Conflagrate aura state on Immolate if (m_spellProto->SpellFamilyName == SPELLFAMILY_WARLOCK && m_spellProto->SpellFamilyFlags & 4) m_target->ModifyAuraState(AURA_STATE_IMMOLATE, true); - + // Faerie Fire (druid versions) if (m_spellProto->SpellFamilyName == SPELLFAMILY_DRUID && m_spellProto->SpellFamilyFlags & 0x0000000000000400LL) m_target->ModifyAuraState(AURA_STATE_FAERIE_FIRE, true); @@ -984,7 +979,7 @@ void Aura::_RemoveAura() for(Unit::AuraMap::iterator i = Auras.begin(); i != Auras.end(); ++i) { SpellEntry const *auraSpellInfo = (*i).second->GetSpellProto(); - if(auraSpellInfo->SpellFamilyName == m_spellProto->SpellFamilyName && + if(auraSpellInfo->SpellFamilyName == m_spellProto->SpellFamilyName && auraSpellInfo->SpellFamilyFlags == m_spellProto->SpellFamilyFlags ) { found = true; @@ -1204,6 +1199,7 @@ void Aura::HandleAddTargetTrigger(bool apply, bool Real) m_spellmod = NULL; } } + void Aura::TriggerSpell() { Unit* caster = GetCaster(); @@ -1215,8 +1211,6 @@ void Aura::TriggerSpell() // generic casting code with custom spells and target/caster customs uint32 trigger_spell_id = GetSpellProto()->EffectTriggerSpell[m_effIndex]; - uint64 originalCasterGUID = GetCasterGUID(); - SpellEntry const *triggeredSpellInfo = sSpellStore.LookupEntry(trigger_spell_id); SpellEntry const *auraSpellInfo = GetSpellProto(); uint32 auraId = auraSpellInfo->Id; @@ -1894,17 +1888,17 @@ void Aura::TriggerSpell() return; caster = target; - originalCasterGUID = 0; break; } // Mana Tide case 16191: { - caster->CastCustomSpell(target, trigger_spell_id, &m_modifier.m_amount, NULL, NULL, true, NULL, this, originalCasterGUID); + caster->CastCustomSpell(target, trigger_spell_id, &m_modifier.m_amount, NULL, NULL, true, NULL, this); return; } } } +<<<<<<< HEAD:src/game/SpellAuras.cpp if(!GetSpellMaxRange(sSpellRangeStore.LookupEntry(triggeredSpellInfo->rangeIndex))) target = m_target; //for druid dispel poison m_target->CastSpell(target, triggeredSpellInfo, true, 0, this, originalCasterGUID); @@ -1917,6 +1911,25 @@ Unit* Aura::GetTriggerTarget() const ((Player*)m_target)->GetSelection() :*/ m_target->GetUInt64Value(UNIT_FIELD_TARGET)); return target ? target : m_target; +======= + // All ok cast by default case + caster->CastSpell(target, triggeredSpellInfo, true, 0, this); +} + +void Aura::TriggerSpellWithValue() +{ + Unit* caster = GetCaster(); + Unit* target = GetTriggerTarget(); + + if(!caster || !target) + return; + + // generic casting code with custom spells and target/caster customs + uint32 trigger_spell_id = GetSpellProto()->EffectTriggerSpell[m_effIndex]; + int32 basepoints0 = this->GetModifier()->m_amount; + + caster->CastCustomSpell(target, trigger_spell_id, &basepoints0, 0, 0, true, 0, this); +>>>>>>> upstream/master:src/game/SpellAuras.cpp } /*********************************************************/ @@ -2052,14 +2065,14 @@ void Aura::HandleAuraDummy(bool apply, bool Real) if (caster && m_removeMode == AURA_REMOVE_BY_DEATH) { // Stop caster Arcane Missle chanelling on death - if (m_spellProto->SpellFamilyName == SPELLFAMILY_MAGE && + if (m_spellProto->SpellFamilyName == SPELLFAMILY_MAGE && m_spellProto->SpellFamilyFlags&0x0000000000000800LL) { caster->InterruptSpell(CURRENT_CHANNELED_SPELL); return; } // Stop caster Penance chanelling on death - if (m_spellProto->SpellFamilyName == SPELLFAMILY_PRIEST && + if (m_spellProto->SpellFamilyName == SPELLFAMILY_PRIEST && m_spellProto->SpellFamilyFlags2 & 0x00000080) { caster->InterruptSpell(CURRENT_CHANNELED_SPELL); @@ -3944,7 +3957,14 @@ void Aura::HandlePeriodicTriggerSpell(bool apply, bool Real) m_periodicTimer += m_modifier.periodictime; m_isPeriodic = apply; - m_isTrigger = apply; +} + +void Aura::HandlePeriodicTriggerSpellWithValue(bool apply, bool Real) +{ + if (m_periodicTimer <= 0) + m_periodicTimer += m_modifier.periodictime; + + m_isPeriodic = apply; } void Aura::HandlePeriodicEnergize(bool apply, bool Real) @@ -6087,6 +6107,16 @@ void Aura::PeriodicTick() PeriodicDummyTick(); break; } + case SPELL_AURA_PERIODIC_TRIGGER_SPELL: + { + TriggerSpell(); + break; + } + case SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE: + { + TriggerSpellWithValue(); + break; + } default: break; } @@ -6197,7 +6227,7 @@ void Aura::PeriodicDummyTick() // case 33208: break; // // Gossip NPC Periodic - Despawn // case 33209: break; - + // TODO: now its not periodic dummy - need move out from here // Aspect of the Viper case 34074: diff --git a/src/game/SpellAuras.h b/src/game/SpellAuras.h index 67bf2c439c0..9d680ff8db1 100644 --- a/src/game/SpellAuras.h +++ b/src/game/SpellAuras.h @@ -112,6 +112,7 @@ class TRINITY_DLL_SPEC Aura void HandleAuraModRegenInterrupt(bool Apply, bool Real); void HandleHaste(bool Apply, bool Real); void HandlePeriodicTriggerSpell(bool Apply, bool Real); + void HandlePeriodicTriggerSpellWithValue(bool apply, bool Real); void HandlePeriodicEnergize(bool Apply, bool Real); void HandleAuraModResistanceExclusive(bool Apply, bool Real); void HandleAuraModPetTalentsPoints(bool Apply, bool Real); @@ -260,7 +261,7 @@ class TRINITY_DLL_SPEC Aura uint8 GetAuraLevel() const { return m_auraLevel; } void SetAuraLevel(uint8 level) { m_auraLevel = level; } uint8 GetAuraCharges() const { return m_procCharges; } - void SetAuraCharges(uint8 charges) + void SetAuraCharges(uint8 charges) { if (m_procCharges == charges) return; @@ -268,7 +269,7 @@ class TRINITY_DLL_SPEC Aura SendAuraUpdate(false); } bool DropAuraCharge() // return true if last charge dropped - { + { if (m_procCharges == 0) return false; m_procCharges--; @@ -292,7 +293,6 @@ class TRINITY_DLL_SPEC Aura bool IsPermanent() const { return m_permanent; } bool IsAreaAura() const { return m_isAreaAura; } bool IsPeriodic() const { return m_isPeriodic; } - bool IsTrigger() const { return m_isTrigger; } bool IsPassive() const { return m_isPassive; } bool IsPersistent() const { return m_isPersistent; } bool IsDeathPersistent() const { return m_isDeathPersist; } @@ -319,6 +319,7 @@ class TRINITY_DLL_SPEC Aura DiminishingGroup getDiminishGroup() const { return m_AuraDRGroup; } void TriggerSpell(); + void TriggerSpellWithValue(); void PeriodicTick(); void PeriodicDummyTick(); @@ -355,7 +356,6 @@ class TRINITY_DLL_SPEC Aura bool m_positive:1; bool m_permanent:1; bool m_isPeriodic:1; - bool m_isTrigger:1; bool m_isAreaAura:1; bool m_isPassive:1; bool m_isPersistent:1; diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 27a51ee8b34..e7c67f4f41e 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -152,7 +152,7 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectSummonPlayer, // 85 SPELL_EFFECT_SUMMON_PLAYER &Spell::EffectActivateObject, // 86 SPELL_EFFECT_ACTIVATE_OBJECT &Spell::EffectUnused, // 87 SPELL_EFFECT_WMO_DAMAGE - &Spell::EffectUnused, // 88 SPELL_EFFECT_WMO_REPAIR + &Spell::EffectUnused, // 88 SPELL_EFFECT_WMO_REPAIR &Spell::EffectUnused, // 89 SPELL_EFFECT_WMO_CHANGE &Spell::EffectUnused, // 90 SPELL_EFFECT_KILL_CREDIT &Spell::EffectUnused, // 91 SPELL_EFFECT_THREAT_ALL one spell: zzOLDBrainwash @@ -221,9 +221,9 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectNULL, //154 unused &Spell::EffectTitanGrip, //155 SPELL_EFFECT_TITAN_GRIP Allows you to equip two-handed axes, maces and swords in one hand, but you attack $49152s1% slower than normal. &Spell::EffectNULL, //156 Add Socket - &Spell::EffectCreateItem, //157 SPELL_EFFECT_CREATE_ITEM_2 create/learn item/spell for profession - &Spell::EffectMilling, //158 milling - &Spell::EffectNULL //159 allow rename pet once again + &Spell::EffectCreateItem, //157 SPELL_EFFECT_CREATE_ITEM_2 create/learn item/spell for profession + &Spell::EffectMilling, //158 SPELL_EFFECT_MILLING milling + &Spell::EffectRenamePet //159 SPELL_EFFECT_ALLOW_RENAME_PET allow rename pet once again }; void Spell::EffectNULL(uint32 /*i*/) @@ -532,7 +532,7 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx) // Lookup for Deadly poison (only attacker applied) Unit::AuraList const& auras = unitTarget->GetAurasByType(SPELL_AURA_PERIODIC_DAMAGE); for(Unit::AuraList::const_iterator itr = auras.begin(); itr!=auras.end(); ++itr) - if( (*itr)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_ROGUE && + if( (*itr)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_ROGUE && (*itr)->GetSpellProto()->SpellFamilyFlags & 0x10000 && (*itr)->GetCasterGUID()==m_caster->GetGUID() ) { @@ -1016,7 +1016,7 @@ void Spell::EffectDummy(uint32 i) { Aura * dummy = m_caster->GetDummyAura(28734); if (dummy) - { + { int32 bp = damage * dummy->GetStackAmount(); m_caster->CastCustomSpell(m_caster, 28733, &bp, NULL, NULL, true); m_caster->RemoveAurasDueToSpell(28734); @@ -1354,7 +1354,7 @@ void Spell::EffectDummy(uint32 i) if (Aura *aura = m_caster->GetDummyAura(58367)) rage+=aura->GetModifier()->m_amount; - int32 basePoints0 = damage+int32(rage * m_spellInfo->DmgMultiplier[i] + + int32 basePoints0 = damage+int32(rage * m_spellInfo->DmgMultiplier[i] + m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.2f); m_caster->CastCustomSpell(unitTarget, 20647, &basePoints0, NULL, NULL, true, 0); m_caster->SetPower(POWER_RAGE,0); @@ -1819,7 +1819,7 @@ void Spell::EffectDummy(uint32 i) Unit::AuraList const& auraDummy = m_caster->GetAurasByType(SPELL_AURA_DUMMY); for(Unit::AuraList::const_iterator itr = auraDummy.begin(); itr != auraDummy.end(); ++itr) { - if( (*itr)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_SHAMAN && + if( (*itr)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_SHAMAN && (*itr)->GetSpellProto()->SpellFamilyFlags & 0x0000000000200000LL && (*itr)->GetCastItemGUID() == item->GetGUID()) { @@ -4370,9 +4370,16 @@ void Spell::SpellDamageWeaponDmg(uint32 i) Unit::AuraList const& list = unitTarget->GetAurasByType(SPELL_AURA_MOD_RESISTANCE); for(Unit::AuraList::const_iterator itr=list.begin();itr!=list.end();++itr) { +<<<<<<< HEAD:src/game/SpellEffects.cpp SpellEntry const *proto = (*itr)->GetSpellProto(); if(proto->SpellFamilyName == SPELLFAMILY_WARRIOR && proto->SpellFamilyFlags == SPELLFAMILYFLAG_WARRIOR_SUNDERARMOR) +======= + SpellEntry const *spellInfo = (*itr).second->GetSpellProto(); + if( spellInfo->SpellFamilyName == SPELLFAMILY_WARRIOR && + spellInfo->SpellFamilyFlags & 0x0000000000004000LL && + (*itr).second->GetCasterGUID() == m_caster->GetGUID()) +>>>>>>> upstream/master:src/game/SpellEffects.cpp { (*itr)->RefreshAura(); stack = (*itr)->GetStackAmount(); @@ -5017,7 +5024,7 @@ void Spell::EffectScriptEffect(uint32 effIndex) case 60893: // Northrend Alchemy Research case 61177: // Northrend Inscription Research case 61288: // Minor Inscription Research - case 61756: // Northrend Inscription Research (FAST QA VERSION) + case 61756: // Northrend Inscription Research (FAST QA VERSION) { if(!IsExplicitDiscoverySpell(m_spellInfo)) { @@ -6152,6 +6159,12 @@ void Spell::EffectSendTaxi(uint32 i) case 34905: //Stealth Flight mountid = 6851; break; + case 45883: //Amber Ledge to Beryl Point + mountid = 23524; + break; + case 46064: //Amber Ledge to Coldarra + mountid = 6371; + break; case 53335: //Stormwind Harbor Flight - Peaceful mountid = 6852; break; @@ -6652,7 +6665,7 @@ void Spell::EffectQuestFail(uint32 i) ((Player*)unitTarget)->FailQuest(m_spellInfo->EffectMiscValue[i]); } -void Spell::EffectActivateRune(uint32 i) +void Spell::EffectActivateRune(uint32 eff_idx) { if(m_caster->GetTypeId() != TYPEID_PLAYER) return; @@ -6664,14 +6677,14 @@ void Spell::EffectActivateRune(uint32 i) for(uint32 j = 0; j < MAX_RUNES; ++j) { - if(plr->GetRuneCooldown(j) && plr->GetCurrentRune(j) == m_spellInfo->EffectMiscValue[i]) + if(plr->GetRuneCooldown(j) && plr->GetCurrentRune(j) == m_spellInfo->EffectMiscValue[eff_idx]) { plr->SetRuneCooldown(j, 0); } } } -void Spell::EffectTitanGrip(uint32 i) +void Spell::EffectTitanGrip(uint32 /*eff_idx*/) { if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER) ((Player*)unitTarget)->SetCanTitanGrip(true); @@ -6682,3 +6695,12 @@ void Spell::EffectRedirectThreat(uint32 /*i*/) if(unitTarget) m_caster->SetReducedThreatPercent((uint32)damage, unitTarget->GetGUID()); } + +void Spell::EffectRenamePet(uint32 /*eff_idx*/) +{ + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_UNIT || + !((Creature*)unitTarget)->isPet() || ((Pet*)unitTarget)->getPetType() != HUNTER_PET) + return; + + unitTarget->SetByteValue(UNIT_FIELD_BYTES_2, 2, UNIT_RENAME_ALLOWED); +} diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 7ad3eceed94..9092b494013 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -364,7 +364,7 @@ SpellSpecific GetSpellSpecific(uint32 spellId) // only hunter aspects have this (but not all aspects in hunter family) if( spellInfo->SpellFamilyFlags & 0x0044000000380000LL || spellInfo->SpellFamilyFlags2 & 0x00003010) return SPELL_ASPECT; - + if( spellInfo->SpellFamilyFlags2 & 0x00000002 ) return SPELL_TRACKER; @@ -943,7 +943,7 @@ void SpellMgr::LoadSpellAffects() case 0: ptr = &spellInfo->EffectSpellClassMaskA[0]; break; case 1: ptr = &spellInfo->EffectSpellClassMaskB[0]; break; case 2: ptr = &spellInfo->EffectSpellClassMaskC[0]; break; - default: + default: continue; } if(ptr[0] == affect.SpellClassMask[0] || ptr[1] == affect.SpellClassMask[1] || ptr[2] == affect.SpellClassMask[2]) @@ -983,7 +983,7 @@ void SpellMgr::LoadSpellAffects() case 0: ptr = &spellInfo->EffectSpellClassMaskA[0]; break; case 1: ptr = &spellInfo->EffectSpellClassMaskB[0]; break; case 2: ptr = &spellInfo->EffectSpellClassMaskC[0]; break; - default: + default: continue; } if(ptr[0] || ptr[1] || ptr[2]) @@ -1687,8 +1687,10 @@ void SpellMgr::LoadSpellLearnSkills() // search auto-learned skills and add its to map also for use in unlearn spells/talents uint32 dbc_count = 0; + barGoLink bar( sSpellStore.GetNumRows() ); for(uint32 spell = 0; spell < sSpellStore.GetNumRows(); ++spell) { + bar.step(); SpellEntry const* entry = sSpellStore.LookupEntry(spell); if(!entry) @@ -2565,10 +2567,12 @@ void SpellMgr::LoadSkillLineAbilityMap() { mSkillLineAbilityMap.clear(); + barGoLink bar( sSkillLineAbilityStore.GetNumRows() ); uint32 count = 0; for (uint32 i = 0; i < sSkillLineAbilityStore.GetNumRows(); i++) { + bar.step(); SkillLineAbilityEntry const *SkillInfo = sSkillLineAbilityStore.LookupEntry(i); if(!SkillInfo) continue; @@ -2578,7 +2582,7 @@ void SpellMgr::LoadSkillLineAbilityMap() } sLog.outString(); - sLog.outString(">> Loaded %u SkillLineAbility MultiMap", count); + sLog.outString(">> Loaded %u SkillLineAbility MultiMap Data", count); } DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto, bool triggered) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index ddfd53657c6..79ec28dcb0c 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -1259,8 +1259,21 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage *damageInfo, int32 dama // Calculate absorb resist if(damage > 0) { - CalcAbsorbResist(pVictim, damageSchoolMask, SPELL_DIRECT_DAMAGE, damage, &damageInfo->absorb, &damageInfo->resist); - damage-= damageInfo->absorb + damageInfo->resist; + // lookup absorb/resist ignore auras on caster for spell + bool ignore = false; + Unit::AuraList const& ignoreAbsorb = GetAurasByType(SPELL_AURA_MOD_IGNORE_ABSORB_FOR_SPELL); + for(Unit::AuraList::const_iterator i = ignoreAbsorb.begin(); i != ignoreAbsorb.end(); ++i) + if ((*i)->isAffectedOnSpell(spellInfo)) + { + ignore = true; + break; + } + + if (!ignore) + { + CalcAbsorbResist(pVictim, damageSchoolMask, SPELL_DIRECT_DAMAGE, damage, &damageInfo->absorb, &damageInfo->resist); + damage-= damageInfo->absorb + damageInfo->resist; + } } else damage = 0; @@ -1947,7 +1960,7 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe // Remove all expired absorb auras if (existExpired) { - for(AuraList::const_iterator i = vSchoolAbsorb.begin(), next; i != vSchoolAbsorb.end();) + for(AuraList::const_iterator i = vSchoolAbsorb.begin(); i != vSchoolAbsorb.end();) { if ((*i)->GetModifier()->m_amount<=0) { @@ -2514,7 +2527,7 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit *pVictim, SpellEntry const *spell) // Can`t dodge from behind in PvP (but its possible in PvE) if (GetTypeId() == TYPEID_PLAYER && pVictim->GetTypeId() == TYPEID_PLAYER) canDodge = false; - // Can`t parry + // Can`t parry canParry = false; } // Check creatures flags_extra for disable parry @@ -4895,7 +4908,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu for(AuraMap::iterator iter = Auras.begin(); iter != Auras.end();) { SpellEntry const *spell = iter->second->GetSpellProto(); - if( spell->Mechanic == MECHANIC_STUN || + if( spell->Mechanic == MECHANIC_STUN || spell->EffectMechanic[iter->second->GetEffIndex()] == MECHANIC_STUN) { pVictim->RemoveAurasDueToSpell(spell->Id); @@ -5460,7 +5473,9 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu // Rapid Recuperation if ( dummySpell->SpellIconID == 3560 ) { - // mane regen from Rapid Killing + // This effect only from Rapid Killing (mana regen) + if (!(procSpell->SpellFamilyFlags & 0x0100000000000000LL)) + return false; triggered_spell_id = 56654; target = this; break; @@ -5486,6 +5501,22 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu target = this; break; } + // Righteous Vengeance + if (dummySpell->SpellIconID == 3025) + { + // 4 damage tick + basepoints0 = triggeredByAura->GetModifier()->m_amount*damage/400; + triggered_spell_id = 61840; + break; + } + // Sheath of Light + if (dummySpell->SpellIconID == 3030) + { + // 4 healing tick + basepoints0 = triggeredByAura->GetModifier()->m_amount*damage/400; + triggered_spell_id = 54203; + break; + } switch(dummySpell->Id) { // Judgement of Light @@ -5990,7 +6021,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu // Mark of Blood if (dummySpell->Id == 49005) { - // TODO: need more info (cooldowns/PPM) + // TODO: need more info (cooldowns/PPM) triggered_spell_id = 50424; break; } @@ -6647,6 +6678,15 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB return false; break; } + // Rapid Recuperation + case 53228: + case 53232: + { + // This effect only from Rapid Fire (ability cast) + if (!(procSpell->SpellFamilyFlags & 0x0000000000000020LL)) + return false; + break; + } } // Costum basepoints/target for exist spell @@ -7686,6 +7726,16 @@ uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint3 if( (*i)->GetCasterGUID() == GetGUID() && (*i)->isAffectedOnSpell(spellProto)) TakenTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f; + // Mod damage from spell mechanic + uint32 mechanicMask = GetAllSpellMechanicMask(spellProto); + if (mechanicMask) + { + AuraList const& mDamageDoneMechanic = pVictim->GetAurasByType(SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT); + for(AuraList::const_iterator i = mDamageDoneMechanic.begin();i != mDamageDoneMechanic.end(); ++i) + if(mechanicMask & uint32(1<<((*i)->GetModifier()->m_miscvalue))) + TakenTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f; + } + // Distribute Damage over multiple effects, reduce by AoE CastingTime = GetCastingTimeForBonus( spellProto, damagetype, CastingTime ); @@ -8056,7 +8106,7 @@ bool Unit::isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolM } // Glyph of Shadowburn if (spellProto->SpellFamilyName == SPELLFAMILY_WARLOCK && - spellProto->SpellFamilyFlags & 0x0000000000000080LL && + spellProto->SpellFamilyFlags & 0x0000000000000080LL && pVictim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT)) { AuraList const& mOverrideClassScript = GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); @@ -8456,6 +8506,13 @@ bool Unit::IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) con for(SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr) if(itr->type == aura) return true; + // Check for immune to application of harmful magical effects + AuraList const& immuneAuraApply = GetAurasByType(SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL); + for(AuraList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter) + if (spellInfo->Dispel == DISPEL_MAGIC && // Magic debuff + ((*iter)->GetModifier()->m_miscvalue & GetSpellSchoolMask(spellInfo)) && // Check school + !IsPositiveEffect(spellInfo->Id, index)) // Harmful + return true; } return false; diff --git a/src/game/Unit.h b/src/game/Unit.h index f48d17fd409..b2ff5287309 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -662,7 +662,7 @@ struct UnitActionBarEntry union { - struct + struct { uint16 SpellOrAction; uint16 Type; diff --git a/src/game/WaypointManager.cpp b/src/game/WaypointManager.cpp index fc0ca9e8007..bf999dbbc03 100644 --- a/src/game/WaypointManager.cpp +++ b/src/game/WaypointManager.cpp @@ -29,7 +29,7 @@ WaypointStore WaypointMgr; void WaypointStore::Free() { - waypoint_map.clear(); + waypoint_map.clear(); } void WaypointStore::Load() diff --git a/src/game/World.cpp b/src/game/World.cpp index 1607206cf40..fde4126db18 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -1110,7 +1110,7 @@ void World::SetInitialWorldSettings() sLog.outString( "Loading Script Names..."); objmgr.LoadScriptNames(); - sLog.outString( "Loading InstanceTemplate" ); + sLog.outString( "Loading InstanceTemplate..." ); objmgr.LoadInstanceTemplate(); sLog.outString( "Loading SkillLineAbilityMultiMap Data..." ); @@ -1123,6 +1123,7 @@ void World::SetInitialWorldSettings() sLog.outString( "Packing instances..." ); sInstanceSaveManager.PackInstances(); + sLog.outString(); sLog.outString( "Loading Localization strings..." ); objmgr.LoadCreatureLocales(); objmgr.LoadGameObjectLocales(); @@ -1132,6 +1133,8 @@ void World::SetInitialWorldSettings() objmgr.LoadPageTextLocales(); objmgr.LoadNpcOptionLocales(); objmgr.SetDBCLocaleIndex(GetDefaultDbcLocale()); // Get once for all the locale index of DBC language (console/broadcasts) + sLog.outString( ">>> Localization strings loaded" ); + sLog.outString(); sLog.outString( "Loading Page Texts..." ); objmgr.LoadPageTexts(); @@ -1197,7 +1200,10 @@ void World::SetInitialWorldSettings() objmgr.LoadCreatures(); sLog.outString( "Loading Creature Addon Data..." ); + sLog.outString(); objmgr.LoadCreatureAddons(); // must be after LoadCreatureTemplates() and LoadCreatures() + sLog.outString( ">>> Creature Addon Data loaded" ); + sLog.outString(); sLog.outString( "Loading Creature Respawn Data..." ); // must be after PackInstances() objmgr.LoadCreatureRespawnTimes(); @@ -1209,7 +1215,10 @@ void World::SetInitialWorldSettings() objmgr.LoadGameobjectRespawnTimes(); sLog.outString( "Loading Game Event Data..."); + sLog.outString(); gameeventmgr.LoadFromDB(); + sLog.outString( ">>> Game Event Data loaded" ); + sLog.outString(); sLog.outString( "Loading Weather Data..." ); objmgr.LoadWeatherZoneChances(); @@ -1218,7 +1227,10 @@ void World::SetInitialWorldSettings() objmgr.LoadQuests(); // must be loaded after DBCs, creature_template, item_template, gameobject tables sLog.outString( "Loading Quests Relations..." ); + sLog.outString(); objmgr.LoadQuestRelations(); // must be after quest load + sLog.outString( ">>> Quests Relations loaded" ); + sLog.outString(); sLog.outString( "Loading AreaTrigger definitions..." ); objmgr.LoadAreaTriggerTeleports(); // must be after item template load @@ -1253,8 +1265,11 @@ void World::SetInitialWorldSettings() sLog.outString( "Loading linked spells..." ); spellmgr.LoadSpellLinked(); - sLog.outString( "Loading player Create Info & Level Stats..." ); + sLog.outString( "Loading Player Create Info & Level Stats..." ); + sLog.outString(); objmgr.LoadPlayerInfo(); + sLog.outString( ">>> Player Create Info & Level Stats loaded" ); + sLog.outString(); sLog.outString( "Loading Exploration BaseXP Data..." ); objmgr.LoadExplorationBaseXP(); @@ -1275,7 +1290,10 @@ void World::SetInitialWorldSettings() objmgr.LoadSpellDisabledEntrys(); sLog.outString( "Loading Loot Tables..." ); + sLog.outString(); LoadLootTables(); + sLog.outString( ">>> Loot Tables loaded" ); + sLog.outString(); sLog.outString( "Loading Skill Discovery Table..." ); LoadSkillDiscoveryTable(); @@ -1286,22 +1304,22 @@ void World::SetInitialWorldSettings() sLog.outString( "Loading Skill Fishing base level requirements..." ); objmgr.LoadFishingBaseSkillLevel(); - sLog.outString( "Loading AchievementCriteriaList..." ); + sLog.outString( "Loading Achievements..." ); + sLog.outString(); achievementmgr.LoadAchievementCriteriaList(); - - sLog.outString( "Loading achievement rewards..." ); achievementmgr.LoadRewards(); - - sLog.outString( "Loading achievement reward locale strings..." ); achievementmgr.LoadRewardLocales(); - - sLog.outString( "Loading completed achievements..." ); achievementmgr.LoadCompletedAchievements(); + sLog.outString( ">>> Achievements loaded" ); + sLog.outString(); ///- Load dynamic data tables from the database sLog.outString( "Loading Auctions..." ); + sLog.outString(); objmgr.LoadAuctionItems(); objmgr.LoadAuctions(); + sLog.outString( ">>> Auctions loaded" ); + sLog.outString(); sLog.outString( "Loading Guilds..." ); objmgr.LoadGuilds(); @@ -1315,7 +1333,7 @@ void World::SetInitialWorldSettings() sLog.outString( "Loading ReservedNames..." ); objmgr.LoadReservedPlayersNames(); - sLog.outString( "Loading GameObject for quests..." ); + sLog.outString( "Loading GameObjects for quests..." ); objmgr.LoadGameObjectForQuests(); sLog.outString( "Loading BattleMasters..." ); @@ -1330,13 +1348,14 @@ void World::SetInitialWorldSettings() sLog.outString( "Loading Npc Options..." ); objmgr.LoadNpcOptions(); - sLog.outString( "Loading vendors..." ); + sLog.outString( "Loading Vendors..." ); objmgr.LoadVendors(); // must be after load CreatureTemplate and ItemTemplate - sLog.outString( "Loading trainers..." ); + sLog.outString( "Loading Trainers..." ); objmgr.LoadTrainerSpell(); // must be after load CreatureTemplate sLog.outString( "Loading Waypoints..." ); + sLog.outString(); WaypointMgr.Load(); sLog.outString( "Loading Creature Formations..." ); @@ -1351,12 +1370,15 @@ void World::SetInitialWorldSettings() ///- Load and initialize scripts sLog.outString( "Loading Scripts..." ); + sLog.outString(); objmgr.LoadQuestStartScripts(); // must be after load Creature/Gameobject(Template/Data) and QuestTemplate objmgr.LoadQuestEndScripts(); // must be after load Creature/Gameobject(Template/Data) and QuestTemplate objmgr.LoadSpellScripts(); // must be after load Creature/Gameobject(Template/Data) objmgr.LoadGameObjectScripts(); // must be after load Creature/Gameobject(Template/Data) objmgr.LoadEventScripts(); // must be after load Creature/Gameobject(Template/Data) objmgr.LoadWaypointScripts(); + sLog.outString( ">>> Scripts loaded" ); + sLog.outString(); sLog.outString( "Loading Scripts text locales..." ); // must be after Load*Scripts calls objmgr.LoadDbScriptStrings(); @@ -1475,6 +1497,7 @@ void World::DetectDBCLang() m_defaultDbcLocale = LocaleConstant(default_locale); sLog.outString("Using %s DBC Locale as default. All available DBC locales: %s",localeNames[m_defaultDbcLocale],availableLocalsStr.empty() ? "<none>" : availableLocalsStr.c_str()); + sLog.outString(); } void World::RecordTimeDiff(const char *text, ...) diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 78bc11f62e0..5bb52fe5de6 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -544,7 +544,7 @@ void WorldSession::LoadAccountData() if(!result) return; - do + do { Field *fields = result->Fetch(); diff --git a/src/shared/Database/DBCStores.cpp b/src/shared/Database/DBCStores.cpp index cf962bbf3e0..b9515713e8e 100644 --- a/src/shared/Database/DBCStores.cpp +++ b/src/shared/Database/DBCStores.cpp @@ -50,6 +50,7 @@ DBCStorage <ChrRacesEntry> sChrRacesStore(ChrRacesEntryfmt); DBCStorage <CreatureDisplayInfoEntry> sCreatureDisplayInfoStore(CreatureDisplayInfofmt); DBCStorage <CreatureFamilyEntry> sCreatureFamilyStore(CreatureFamilyfmt); DBCStorage <CreatureSpellDataEntry> sCreatureSpellDataStore(CreatureSpellDatafmt); +DBCStorage <CreatureTypeEntry> sCreatureTypeStore(CreatureTypefmt); DBCStorage <DurabilityQualityEntry> sDurabilityQualityStore(DurabilityQualityfmt); DBCStorage <DurabilityCostsEntry> sDurabilityCostsStore(DurabilityCostsfmt); @@ -192,7 +193,7 @@ void LoadDBCStores(const std::string& dataPath) { std::string dbcPath = dataPath+"dbc/"; - const uint32 DBCFilesCount = 69; + const uint32 DBCFilesCount = 70; barGoLink bar( DBCFilesCount ); @@ -223,7 +224,7 @@ void LoadDBCStores(const std::string& dataPath) LoadDBC(availableDbcLocales,bar,bad_dbc_files,sBattlemasterListStore, dbcPath,"BattlemasterList.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sBarberShopStyleStore, dbcPath,"BarberShopStyle.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCharStartOutfitStore, dbcPath,"CharStartOutfit.dbc"); - + LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCharTitlesStore, dbcPath,"CharTitles.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sChatChannelsStore, dbcPath,"ChatChannels.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sChrClassesStore, dbcPath,"ChrClasses.dbc"); @@ -231,6 +232,7 @@ void LoadDBCStores(const std::string& dataPath) LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCreatureDisplayInfoStore, dbcPath,"CreatureDisplayInfo.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCreatureFamilyStore, dbcPath,"CreatureFamily.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCreatureSpellDataStore, dbcPath,"CreatureSpellData.dbc"); + LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCreatureTypeStore, dbcPath,"CreatureType.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sDurabilityCostsStore, dbcPath,"DurabilityCosts.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sDurabilityQualityStore, dbcPath,"DurabilityQuality.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sEmotesTextStore, dbcPath,"EmotesText.dbc"); @@ -407,18 +409,6 @@ void LoadDBCStores(const std::string& dataPath) LoadDBC(availableDbcLocales,bar,bad_dbc_files,sTaxiNodesStore, dbcPath,"TaxiNodes.dbc"); - // Initialize global taxinodes mask - memset(sTaxiNodesMask,0,sizeof(sTaxiNodesMask)); - for(uint32 i = 1; i < sTaxiNodesStore.GetNumRows(); ++i) - { - if(sTaxiNodesStore.LookupEntry(i)) - { - uint8 field = (uint8)((i - 1) / 32); - uint32 submask = 1<<((i-1)%32); - sTaxiNodesMask[field] |= submask; - } - } - LoadDBC(availableDbcLocales,bar,bad_dbc_files,sTaxiPathStore, dbcPath,"TaxiPath.dbc"); for(uint32 i = 1; i < sTaxiPathStore.GetNumRows(); ++i) if(TaxiPathEntry const* entry = sTaxiPathStore.LookupEntry(i)) @@ -446,6 +436,47 @@ void LoadDBCStores(const std::string& dataPath) sTaxiPathNodesByPath[entry->path][entry->index] = TaxiPathNode(entry->mapid,entry->x,entry->y,entry->z,entry->actionFlag,entry->delay); sTaxiPathNodeStore.Clear(); + // Initialize global taxinodes mask + // include existed nodes that have at least single not spell base (scripted) path + { + std::set<uint32> spellPaths; + for(uint32 i = 1; i < sSpellStore.GetNumRows (); ++i) + if(SpellEntry const* sInfo = sSpellStore.LookupEntry (i)) + for(int j=0; j < 3; ++j) + if(sInfo->Effect[j]==123 /*SPELL_EFFECT_SEND_TAXI*/) + spellPaths.insert(sInfo->EffectMiscValue[j]); + + memset(sTaxiNodesMask,0,sizeof(sTaxiNodesMask)); + for(uint32 i = 1; i < sTaxiNodesStore.GetNumRows(); ++i) + { + if(!sTaxiNodesStore.LookupEntry(i)) + continue; + + TaxiPathSetBySource::const_iterator src_i = sTaxiPathSetBySource.find(i); + if(src_i!=sTaxiPathSetBySource.end() && !src_i->second.empty()) + { + bool ok = false; + for(TaxiPathSetForSource::const_iterator dest_i = src_i->second.begin();dest_i != src_i->second.end(); ++dest_i) + { + // not spell path + if(spellPaths.find(dest_i->second.ID)==spellPaths.end()) + { + ok = true; + break; + } + } + + if(!ok) + continue; + } + + // valid taxi netowrk node + uint8 field = (uint8)((i - 1) / 32); + uint32 submask = 1<<((i-1)%32); + sTaxiNodesMask[field] |= submask; + } + } + LoadDBC(availableDbcLocales,bar,bad_dbc_files,sTotemCategoryStore, dbcPath,"TotemCategory.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sVehicleStore, dbcPath,"Vehicle.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sVehicleSeatStore, dbcPath,"VehicleSeat.dbc"); @@ -476,11 +507,11 @@ void LoadDBCStores(const std::string& dataPath) // check at up-to-date DBC files (2425 is last item extended cost added in 3.0.1) // check at up-to-date DBC files (76 is last char title added in 3.0.1) // check at up-to-date DBC files (2311 is last area added in 3.0.1) - if( !sSpellStore.LookupEntry(54909) || - !sSkillLineAbilityStore.LookupEntry(19162) || + if( !sSpellStore.LookupEntry(54909) || + !sSkillLineAbilityStore.LookupEntry(19162) || !sMapStore.LookupEntry(619) || - !sGemPropertiesStore.LookupEntry(1361) || - !sItemExtendedCostStore.LookupEntry(2425) || + !sGemPropertiesStore.LookupEntry(1361) || + !sItemExtendedCostStore.LookupEntry(2425) || !sCharTitlesStore.LookupEntry(76) || !sAreaStore.LookupEntry(2311) ) { @@ -489,8 +520,7 @@ void LoadDBCStores(const std::string& dataPath) } sLog.outString(); - sLog.outString( ">> Loaded %d data stores", DBCFilesCount ); - sLog.outString(); + sLog.outString( ">> Initialized %d data stores", DBCFilesCount ); } SimpleFactionsList const* GetFactionTeamList(uint32 faction) diff --git a/src/shared/Database/DBCStores.h b/src/shared/Database/DBCStores.h index 66c55942975..89ae1557fcf 100644 --- a/src/shared/Database/DBCStores.h +++ b/src/shared/Database/DBCStores.h @@ -148,6 +148,7 @@ extern DBCStorage <ChrRacesEntry> sChrRacesStore; extern DBCStorage <CreatureDisplayInfoEntry> sCreatureDisplayInfoStore; extern DBCStorage <CreatureFamilyEntry> sCreatureFamilyStore; extern DBCStorage <CreatureSpellDataEntry> sCreatureSpellDataStore; +extern DBCStorage <CreatureTypeEntry> sCreatureTypeStore; extern DBCStorage <DurabilityCostsEntry> sDurabilityCostsStore; extern DBCStorage <DurabilityQualityEntry> sDurabilityQualityStore; extern DBCStorage <EmotesTextEntry> sEmotesTextStore; diff --git a/src/shared/Database/DBCStructure.h b/src/shared/Database/DBCStructure.h index fa61914a45a..26028245e6e 100644 --- a/src/shared/Database/DBCStructure.h +++ b/src/shared/Database/DBCStructure.h @@ -666,6 +666,14 @@ struct CreatureSpellDataEntry //uint32 availability[4]; // 4-7 m_availability[4] }; +struct CreatureTypeEntry +{ + uint32 ID; // 0 m_ID + //char* Name[16]; // 1-16 name + // 17 string flags + //uint32 no_expirience; // 18 no exp? critters, non-combat pets, gas cloud. +}; + struct DurabilityCostsEntry { uint32 Itemlvl; // 0 @@ -947,14 +955,15 @@ struct MapEntry bool IsBattleGround() const { return map_type == MAP_BATTLEGROUND; } bool IsBattleArena() const { return map_type == MAP_ARENA; } bool IsBattleGroundOrArena() const { return map_type == MAP_BATTLEGROUND || map_type == MAP_ARENA; } - bool SupportsHeroicMode() const { return resetTimeHeroic && !resetTimeRaid; } + bool SupportsHeroicMode() const { return resetTimeHeroic != 0; } bool HasResetTime() const { return resetTimeHeroic || resetTimeRaid; } bool IsMountAllowed() const { return !IsDungeon() || - MapID==568 || MapID==309 || MapID==209 || MapID==534 || - MapID==560 || MapID==509 || MapID==269; + MapID==209 || MapID==269 || MapID==309 || // TanarisInstance, CavernsOfTime, Zul'gurub + MapID==509 || MapID==534 || MapID==560 || // AhnQiraj, HyjalPast, HillsbradPast + MapID==568 || MapID==615 || MapID==616; // ZulAman, Obsidian Sanctrum, Eye Of Eternity } bool IsContinent() const @@ -1416,7 +1425,7 @@ struct VehicleEntry uint32 m_uiSeatIndicatorType; // 42 }; -struct VehicleSeatEntry +struct VehicleSeatEntry { uint32 m_ID; // 0 uint32 m_flags; // 1 diff --git a/src/shared/Database/DBCfmt.cpp b/src/shared/Database/DBCfmt.cpp index 33d3dc87ddc..a1090518e5b 100644 --- a/src/shared/Database/DBCfmt.cpp +++ b/src/shared/Database/DBCfmt.cpp @@ -35,6 +35,7 @@ const char ChrRacesEntryfmt[]="nxixiixxixxxxissssssssssssssssxxxxxxxxxxxxxxxxxxx const char CreatureDisplayInfofmt[]="nxxxfxxxxxxxxxxx"; const char CreatureFamilyfmt[]="nfifiiiiixssssssssssssssssxx"; const char CreatureSpellDatafmt[]="nxxxxxxxx"; +const char CreatureTypefmt[]="nxxxxxxxxxxxxxxxxxx"; const char DurabilityCostsfmt[]="niiiiiiiiiiiiiiiiiiiiiiiiiiiii"; const char DurabilityQualityfmt[]="nf"; const char EmoteEntryfmt[]="nxixxxxxxxxxxxxxxxx"; diff --git a/src/shared/Database/SQLStorage.cpp b/src/shared/Database/SQLStorage.cpp index 64ef4e3d6ad..c3bc9f6be71 100644 --- a/src/shared/Database/SQLStorage.cpp +++ b/src/shared/Database/SQLStorage.cpp @@ -39,8 +39,8 @@ const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiii"; const char PageTextfmt[]="isi"; const char SpellThreatfmt[]="ii"; -const char InstanceTemplatesrcfmt[]="iiiiiiffffs"; -const char InstanceTemplatedstfmt[]="iiiiiiffffi"; +const char InstanceTemplatesrcfmt[]="iiiiiiiffffs"; +const char InstanceTemplatedstfmt[]="iiiiiiiffffi"; SQLStorage sCreatureStorage(CreatureInfosrcfmt, CreatureInfodstfmt, "entry","creature_template"); SQLStorage sCreatureDataAddonStorage(CreatureDataAddonInfofmt,"guid","creature_addon"); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 31218cdc9f6..259099b4ecb 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7136" + #define REVISION_NR "7151" #endif // __REVISION_NR_H__ |