mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-24 07:30:07 -04:00
*Update to Mangos 7151.
--HG-- branch : trunk
This commit is contained in:
@@ -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.
|
||||
4. run TBC-WLK_world.sql in "world" database.
|
||||
|
||||
only to 7133. you need to manually apply mangos sql from 7141
|
||||
+39
-30
@@ -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),
|
||||
|
||||
@@ -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);
|
||||
(61324, 0x00000000, 10, 0x0002000000000000, 0x00000000, 0x00000000, 0, 0, 0);
|
||||
|
||||
@@ -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);
|
||||
INSERT INTO `spell_proc_event` VALUES (48113, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x000A02A8, 0x00000000, 0.000000, 0.000000, 0);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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,'');
|
||||
@@ -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;
|
||||
@@ -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);
|
||||
@@ -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');
|
||||
@@ -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)
|
||||
return;
|
||||
{
|
||||
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))
|
||||
{
|
||||
|
||||
@@ -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 )
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+58
-55
@@ -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();
|
||||
|
||||
bar.step();
|
||||
|
||||
uint16 event_id = fields[0].GetUInt16();
|
||||
if(event_id==0)
|
||||
barGoLink bar( result->GetRowCount() );
|
||||
do
|
||||
{
|
||||
sLog.outErrorDb("`game_event` game event id (%i) is reserved and can't be used.",event_id);
|
||||
continue;
|
||||
}
|
||||
++count;
|
||||
Field *fields = result->Fetch();
|
||||
|
||||
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;
|
||||
bar.step();
|
||||
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
} while( result->NextRow() );
|
||||
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;
|
||||
|
||||
sLog.outString();
|
||||
sLog.outString( ">> Loaded %u game events", count );
|
||||
delete result;
|
||||
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() );
|
||||
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
|
||||
|
||||
@@ -351,7 +351,7 @@ struct GameObjectInfo
|
||||
uint32 state2Name; //3
|
||||
} destructibleBuilding;
|
||||
//34 GAMEOBJECT_TYPE_TRAPDOOR
|
||||
struct
|
||||
struct
|
||||
{
|
||||
uint32 whenToPause; // 0
|
||||
uint32 startOpen; // 1
|
||||
|
||||
+2
-2
@@ -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 ||
|
||||
|
||||
@@ -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);
|
||||
|
||||
+11
-3
@@ -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)
|
||||
|
||||
+3
-1
@@ -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;
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+115
-26
@@ -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)
|
||||
{
|
||||
if(dist2 < dist)
|
||||
{
|
||||
dist = dist2;
|
||||
id = i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
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)
|
||||
|
||||
+3
-4
@@ -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)
|
||||
{
|
||||
|
||||
+51
-25
@@ -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;
|
||||
}
|
||||
|
||||
+4
-1
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
+6
-5
@@ -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])
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
+52
-22
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
+34
-12
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
+65
-8
@@ -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;
|
||||
|
||||
+1
-1
@@ -662,7 +662,7 @@ struct UnitActionBarEntry
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
struct
|
||||
{
|
||||
uint16 SpellOrAction;
|
||||
uint16 Type;
|
||||
|
||||
@@ -29,7 +29,7 @@ WaypointStore WaypointMgr;
|
||||
|
||||
void WaypointStore::Free()
|
||||
{
|
||||
waypoint_map.clear();
|
||||
waypoint_map.clear();
|
||||
}
|
||||
|
||||
void WaypointStore::Load()
|
||||
|
||||
+35
-12
@@ -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, ...)
|
||||
|
||||
@@ -544,7 +544,7 @@ void WorldSession::LoadAccountData()
|
||||
if(!result)
|
||||
return;
|
||||
|
||||
do
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "7136"
|
||||
#define REVISION_NR "7151"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
||||
Reference in New Issue
Block a user