mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 22:37:03 +00:00
Merge branch 'master' into 310
Conflicts: src/game/Unit.cpp src/shared/Database/SQLStorage.cpp
This commit is contained in:
commit
abae3cac91
50 changed files with 468 additions and 150 deletions
|
|
@ -22,7 +22,7 @@
|
||||||
DROP TABLE IF EXISTS `db_version`;
|
DROP TABLE IF EXISTS `db_version`;
|
||||||
CREATE TABLE `db_version` (
|
CREATE TABLE `db_version` (
|
||||||
`version` varchar(120) default NULL,
|
`version` varchar(120) default NULL,
|
||||||
`required_7544_01_mangos_uptime` bit(1) default NULL
|
`required_7568_01_mangos_spell_proc_event` bit(1) default NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
@ -332,6 +332,7 @@ INSERT INTO `command` VALUES
|
||||||
('learn all_gm',2,'Syntax: .learn all_gm\r\n\r\nLearn all default spells for Game Masters.'),
|
('learn all_gm',2,'Syntax: .learn all_gm\r\n\r\nLearn all default spells for Game Masters.'),
|
||||||
('learn all_lang',1,'Syntax: .learn all_lang\r\n\r\nLearn all languages'),
|
('learn all_lang',1,'Syntax: .learn all_lang\r\n\r\nLearn all languages'),
|
||||||
('learn all_myclass',3,'Syntax: .learn all_myclass\r\n\r\nLearn all spells and talents available for his class.'),
|
('learn all_myclass',3,'Syntax: .learn all_myclass\r\n\r\nLearn all spells and talents available for his class.'),
|
||||||
|
('learn all_mypettalents',3,'Syntax: .learn all_mypettalents\r\n\r\nLearn all talents for your pet available for his creature type (only for hunter pets).'),
|
||||||
('learn all_myspells',3,'Syntax: .learn all_myspells\r\n\r\nLearn all spells (except talents and spells with first rank learned as talent) available for his class.'),
|
('learn all_myspells',3,'Syntax: .learn all_myspells\r\n\r\nLearn all spells (except talents and spells with first rank learned as talent) available for his class.'),
|
||||||
('learn all_mytalents',3,'Syntax: .learn all_mytalents\r\n\r\nLearn all talents (and spells with first rank learned as talent) available for his class.'),
|
('learn all_mytalents',3,'Syntax: .learn all_mytalents\r\n\r\nLearn all talents (and spells with first rank learned as talent) available for his class.'),
|
||||||
('learn all_recipes',2,'Syntax: .learn all_recipes [$profession]\r\rLearns all recipes of specified profession and sets skill level to max.\rExample: .learn all_recipes enchanting'),
|
('learn all_recipes',2,'Syntax: .learn all_recipes [$profession]\r\rLearns all recipes of specified profession and sets skill level to max.\rExample: .learn all_recipes enchanting'),
|
||||||
|
|
@ -1408,6 +1409,7 @@ CREATE TABLE `gameobject_template` (
|
||||||
`type` tinyint(3) unsigned NOT NULL default '0',
|
`type` tinyint(3) unsigned NOT NULL default '0',
|
||||||
`displayId` mediumint(8) unsigned NOT NULL default '0',
|
`displayId` mediumint(8) unsigned NOT NULL default '0',
|
||||||
`name` varchar(100) NOT NULL default '',
|
`name` varchar(100) NOT NULL default '',
|
||||||
|
`IconName` varchar(100) NOT NULL default '',
|
||||||
`castBarCaption` varchar(100) NOT NULL default '',
|
`castBarCaption` varchar(100) NOT NULL default '',
|
||||||
`faction` smallint(5) unsigned NOT NULL default '0',
|
`faction` smallint(5) unsigned NOT NULL default '0',
|
||||||
`flags` int(10) unsigned NOT NULL default '0',
|
`flags` int(10) unsigned NOT NULL default '0',
|
||||||
|
|
@ -2890,8 +2892,11 @@ INSERT INTO `mangos_string` VALUES
|
||||||
(1007,'Account %s NOT created (probably sql file format was updated)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(1007,'Account %s NOT created (probably sql file format was updated)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(1008,'Account %s NOT created (unknown error)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(1008,'Account %s NOT created (unknown error)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(1009,'Player %s (Guid: %u) Account %s (Id: %u) deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(1009,'Player %s (Guid: %u) Account %s (Id: %u) deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(1010,'| Account | Character | IP | GM | TBC |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(1010,'| Account | Character | IP | GM | Expansion |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(1011,'|<Error> | %20s |<Error> |<Er>|<Err>|',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(1011,'|<Error> | %20s |<Error> |<Er>| <Error> |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1012,'===========================================================================',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1013,'|%15s| %20s | %15s |%4d| %9d |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1014,'No online players.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(1100,'Account %s (Id: %u) have up to %u expansion allowed now.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(1100,'Account %s (Id: %u) have up to %u expansion allowed now.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(1101,'Message of the day changed to:\r\n%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(1101,'Message of the day changed to:\r\n%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(1102,'Message sent to %s: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(1102,'Message sent to %s: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
|
@ -2914,7 +2919,12 @@ INSERT INTO `mangos_string` VALUES
|
||||||
(1119,'You must use male or female as gender.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(1119,'You must use male or female as gender.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(1120,'You change gender of %s to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(1120,'You change gender of %s to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(1121,'Your gender changed to %s by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(1121,'Your gender changed to %s by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(1122,'(%u/%u +perm %u +temp %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
|
(1122,'(%u/%u +perm %u +temp %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1123,'Not pet found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1124,'Wrong pet type',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1125,'Your pet learned all talents',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1126,'Your pet talents have been reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1127,'Talents of %s\'s pet reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
|
||||||
/*!40000 ALTER TABLE `mangos_string` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `mangos_string` ENABLE KEYS */;
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
|
|
||||||
|
|
@ -16784,7 +16794,7 @@ INSERT INTO `spell_proc_event` VALUES
|
||||||
(24389, 0x00000000, 3, 0x00C00017, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(24389, 0x00000000, 3, 0x00C00017, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(24398, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
|
(24398, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
|
||||||
(24658, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00014110, 0x00000000, 0.000000, 0.000000, 0),
|
(24658, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00014110, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(24905, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 15.000000, 0.000000, 0),
|
(24905, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 15.000000, 0.000000, 0),
|
||||||
(24932, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 6),
|
(24932, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 6),
|
||||||
(25050, 0x00000004, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(25050, 0x00000004, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(25296, 0x00000000, 9, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(25296, 0x00000000, 9, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
|
|
@ -17296,12 +17306,12 @@ INSERT INTO `spell_proc_event` VALUES
|
||||||
(53551, 0x00000000, 10, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 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),
|
(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),
|
(53553, 0x00000000, 10, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(53569, 0x00000000, 10, 0x00200000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
|
(53569, 0x00000000, 10, 0x00200000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
|
||||||
(53576, 0x00000000, 10, 0x00200000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
|
(53576, 0x00000000, 10, 0x00200000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
|
||||||
(53601, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 6),
|
(53601, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 6),
|
||||||
(53671, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(53671, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(53673, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(53673, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(54149, 0x00000000, 10, 0x00200000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
|
(54149, 0x00000000, 10, 0x00200000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
|
||||||
(54151, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(54151, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(54154, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(54154, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(54155, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(54155, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
|
|
@ -17318,9 +17328,11 @@ INSERT INTO `spell_proc_event` VALUES
|
||||||
(54936, 0x00000000, 10, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(54936, 0x00000000, 10, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(54937, 0x00000000, 10, 0x80000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(54937, 0x00000000, 10, 0x80000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(54939, 0x00000000, 10, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(54939, 0x00000000, 10, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
|
(55380, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
|
||||||
(55440, 0x00000000, 11, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(55440, 0x00000000, 11, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(55620, 0x00000000, 15, 0x00000001, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(55620, 0x00000000, 15, 0x00000001, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(55623, 0x00000000, 15, 0x00000001, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(55623, 0x00000000, 15, 0x00000001, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
|
(55640, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
|
||||||
(55666, 0x00000000, 15, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(55666, 0x00000000, 15, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(55667, 0x00000000, 15, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(55667, 0x00000000, 15, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(55668, 0x00000000, 15, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(55668, 0x00000000, 15, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
|
|
@ -17329,6 +17341,8 @@ INSERT INTO `spell_proc_event` VALUES
|
||||||
(55677, 0x00000000, 6, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(55677, 0x00000000, 6, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(55680, 0x00000000, 6, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(55680, 0x00000000, 6, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(55689, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
|
(55689, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
|
||||||
|
(55768, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
|
||||||
|
(55776, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
|
||||||
(56218, 0x00000000, 5, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(56218, 0x00000000, 5, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(56333, 0x00000000, 9, 0x00000004, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(56333, 0x00000000, 9, 0x00000004, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(56336, 0x00000000, 9, 0x00000004, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(56336, 0x00000000, 9, 0x00000004, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
|
|
@ -17336,6 +17350,7 @@ INSERT INTO `spell_proc_event` VALUES
|
||||||
(56342, 0x00000000, 9, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(56342, 0x00000000, 9, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(56343, 0x00000000, 9, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(56343, 0x00000000, 9, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(56344, 0x00000000, 9, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(56344, 0x00000000, 9, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
|
(56355, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
|
||||||
(56364, 0x00000000, 3, 0x00000000, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(56364, 0x00000000, 3, 0x00000000, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(56451, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
|
(56451, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
|
||||||
(56611, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
|
(56611, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
|
||||||
|
|
@ -17401,6 +17416,9 @@ INSERT INTO `spell_proc_event` VALUES
|
||||||
(61188, 0x00000000, 5, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(61188, 0x00000000, 5, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(61257, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x000202A8, 0x00010000, 0.000000, 0.000000, 0),
|
(61257, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x000202A8, 0x00010000, 0.000000, 0.000000, 0),
|
||||||
(61324, 0x00000000, 10, 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(61324, 0x00000000, 10, 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
|
(61345, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
|
||||||
|
(61346, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
|
||||||
|
(61356, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
|
||||||
(61846, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0.000000, 0.000000, 0),
|
(61846, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0.000000, 0.000000, 0),
|
||||||
(61847, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0.000000, 0.000000, 0);
|
(61847, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0.000000, 0.000000, 0);
|
||||||
/*!40000 ALTER TABLE `spell_proc_event` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `spell_proc_event` ENABLE KEYS */;
|
||||||
|
|
|
||||||
9
sql/updates/7558_01_mangos_mangos_string.sql
Normal file
9
sql/updates/7558_01_mangos_mangos_string.sql
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
ALTER TABLE db_version CHANGE COLUMN required_7544_01_mangos_uptime required_7558_01_mangos_mangos_string bit;
|
||||||
|
|
||||||
|
DELETE FROM mangos_string WHERE entry IN (1123,1124,1125,1126,1127);
|
||||||
|
INSERT INTO mangos_string VALUES
|
||||||
|
(1123,'Not pet found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1124,'Wrong pet type',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1125,'Your pet learned all talents',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1126,'Your pet talents have been reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1127,'Talents of %s\'s pet reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
|
||||||
6
sql/updates/7558_02_mangos_command.sql
Normal file
6
sql/updates/7558_02_mangos_command.sql
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
ALTER TABLE db_version CHANGE COLUMN required_7558_01_mangos_mangos_string required_7558_02_mangos_command bit;
|
||||||
|
|
||||||
|
DELETE FROM `command` WHERE `name` IN ('learn all_mypettalents');
|
||||||
|
|
||||||
|
INSERT INTO `command` VALUES
|
||||||
|
('learn all_mypettalents',3,'Syntax: .learn all_mypettalents\r\n\r\nLearn all talents for your pet available for his creature type (only for hunter pets).');
|
||||||
4
sql/updates/7560_01_mangos_gameobject_template.sql
Normal file
4
sql/updates/7560_01_mangos_gameobject_template.sql
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
ALTER TABLE db_version CHANGE COLUMN required_7558_02_mangos_command required_7560_01_mangos_gameobject_template bit;
|
||||||
|
|
||||||
|
ALTER TABLE gameobject_template
|
||||||
|
ADD COLUMN IconName varchar(100) NOT NULL default '' AFTER name;
|
||||||
9
sql/updates/7565_01_mangos_mangos_string.sql
Normal file
9
sql/updates/7565_01_mangos_mangos_string.sql
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
ALTER TABLE db_version CHANGE COLUMN required_7560_01_mangos_gameobject_template required_7565_01_mangos_mangos_string bit;
|
||||||
|
|
||||||
|
DELETE FROM mangos_string WHERE entry IN(1010,1011,1012,1013,1014);
|
||||||
|
INSERT INTO mangos_string VALUES
|
||||||
|
(1010,'| Account | Character | IP | GM | Expansion |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1011,'|<Error> | %20s |<Error> |<Er>| <Error> |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1012,'===========================================================================',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1013,'|%15s| %20s | %15s |%4d| %9d |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
(1014,'No online players.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
|
||||||
49
sql/updates/7568_01_mangos_spell_proc_event.sql
Normal file
49
sql/updates/7568_01_mangos_spell_proc_event.sql
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
ALTER TABLE db_version CHANGE COLUMN required_7565_01_mangos_mangos_string required_7568_01_mangos_spell_proc_event bit;
|
||||||
|
|
||||||
|
-- (53569) Infusion of Light (Rank 1)
|
||||||
|
DELETE FROM `spell_proc_event` WHERE `entry` IN (53569);
|
||||||
|
INSERT INTO `spell_proc_event` VALUES (53569, 0x00, 10, 0x00200000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0);
|
||||||
|
|
||||||
|
-- (53576) Infusion of Light (Rank 2)
|
||||||
|
DELETE FROM `spell_proc_event` WHERE `entry` IN (53576);
|
||||||
|
INSERT INTO `spell_proc_event` VALUES (53576, 0x00, 10, 0x00200000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0);
|
||||||
|
|
||||||
|
-- (54149) Infusion of Light (Rank 2)
|
||||||
|
DELETE FROM `spell_proc_event` WHERE `entry` IN (54149);
|
||||||
|
INSERT INTO `spell_proc_event` VALUES (54149, 0x00, 10, 0x00200000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0);
|
||||||
|
|
||||||
|
-- (55776) Swordguard Embroidery ()
|
||||||
|
DELETE FROM `spell_proc_event` WHERE `entry` IN (55776);
|
||||||
|
INSERT INTO `spell_proc_event` VALUES (55776, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45);
|
||||||
|
|
||||||
|
-- (55768) Darkglow Embroidery ()
|
||||||
|
DELETE FROM `spell_proc_event` WHERE `entry` IN (55768);
|
||||||
|
INSERT INTO `spell_proc_event` VALUES (55768, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45);
|
||||||
|
|
||||||
|
-- (55640) Lightweave Embroidery ()
|
||||||
|
DELETE FROM `spell_proc_event` WHERE `entry` IN (55640);
|
||||||
|
INSERT INTO `spell_proc_event` VALUES (55640, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45);
|
||||||
|
|
||||||
|
-- (55380) Skyflare Swiftness ()
|
||||||
|
DELETE FROM `spell_proc_event` WHERE `entry` IN (55380);
|
||||||
|
INSERT INTO `spell_proc_event` VALUES (55380, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45);
|
||||||
|
|
||||||
|
-- (56355) Titanium Shield Spike ()
|
||||||
|
DELETE FROM `spell_proc_event` WHERE `entry` IN (56355);
|
||||||
|
INSERT INTO `spell_proc_event` VALUES (56355, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0);
|
||||||
|
|
||||||
|
-- (61345) Natures Grace ()
|
||||||
|
DELETE FROM `spell_proc_event` WHERE `entry` IN (61345);
|
||||||
|
INSERT INTO `spell_proc_event` VALUES (61345, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0);
|
||||||
|
|
||||||
|
-- (61346) Natures Grace ()
|
||||||
|
DELETE FROM `spell_proc_event` WHERE `entry` IN (61346);
|
||||||
|
INSERT INTO `spell_proc_event` VALUES (61346, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0);
|
||||||
|
|
||||||
|
-- (61356) Invigorating Earthsiege Diamond Passive ()
|
||||||
|
DELETE FROM `spell_proc_event` WHERE `entry` IN (61356);
|
||||||
|
INSERT INTO `spell_proc_event` VALUES (61356, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0);
|
||||||
|
|
||||||
|
-- (24905) Moonkin Form (Passive) (Passive)
|
||||||
|
DELETE FROM `spell_proc_event` WHERE `entry` IN (24905);
|
||||||
|
INSERT INTO `spell_proc_event` VALUES (24905, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 15.000000, 0.000000, 0);
|
||||||
|
|
@ -206,6 +206,11 @@ pkgdata_DATA = \
|
||||||
7544_02_characters_uptime.sql \
|
7544_02_characters_uptime.sql \
|
||||||
7546_01_characters_uptime.sql \
|
7546_01_characters_uptime.sql \
|
||||||
7546_02_realmd_uptime.sql \
|
7546_02_realmd_uptime.sql \
|
||||||
|
7558_01_mangos_mangos_string.sql \
|
||||||
|
7558_02_mangos_command.sql \
|
||||||
|
7560_01_mangos_gameobject_template.sql \
|
||||||
|
7565_01_mangos_mangos_string.sql \
|
||||||
|
7568_01_mangos_spell_proc_event.sql \
|
||||||
README
|
README
|
||||||
|
|
||||||
## Additional files to include when running 'make dist'
|
## Additional files to include when running 'make dist'
|
||||||
|
|
@ -392,4 +397,9 @@ EXTRA_DIST = \
|
||||||
7544_02_characters_uptime.sql \
|
7544_02_characters_uptime.sql \
|
||||||
7546_01_characters_uptime.sql \
|
7546_01_characters_uptime.sql \
|
||||||
7546_02_realmd_uptime.sql \
|
7546_02_realmd_uptime.sql \
|
||||||
|
7558_01_mangos_mangos_string.sql \
|
||||||
|
7558_02_mangos_command.sql \
|
||||||
|
7560_01_mangos_gameobject_template.sql \
|
||||||
|
7565_01_mangos_mangos_string.sql \
|
||||||
|
7568_01_mangos_spell_proc_event.sql \
|
||||||
README
|
README
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,9 @@ struct MANGOS_DLL_DECL ScriptedAI : public CreatureAI
|
||||||
// Called when hit by a spell
|
// Called when hit by a spell
|
||||||
void SpellHit(Unit *, const SpellEntry*){}
|
void SpellHit(Unit *, const SpellEntry*){}
|
||||||
|
|
||||||
|
// Called when spell hits creature's target
|
||||||
|
void SpellHitTarget(Unit*, const SpellEntry*) {}
|
||||||
|
|
||||||
Creature* m_creature;
|
Creature* m_creature;
|
||||||
|
|
||||||
//= Some useful helpers =========================
|
//= Some useful helpers =========================
|
||||||
|
|
|
||||||
|
|
@ -197,10 +197,8 @@ void AchievementMgr::SaveToDB()
|
||||||
|
|
||||||
if(need_execute)
|
if(need_execute)
|
||||||
{
|
{
|
||||||
CharacterDatabase.BeginTransaction ();
|
|
||||||
CharacterDatabase.Execute( ssdel.str().c_str() );
|
CharacterDatabase.Execute( ssdel.str().c_str() );
|
||||||
CharacterDatabase.Execute( ssins.str().c_str() );
|
CharacterDatabase.Execute( ssins.str().c_str() );
|
||||||
CharacterDatabase.CommitTransaction ();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -258,12 +256,10 @@ void AchievementMgr::SaveToDB()
|
||||||
|
|
||||||
if(need_execute_del || need_execute_ins)
|
if(need_execute_del || need_execute_ins)
|
||||||
{
|
{
|
||||||
CharacterDatabase.BeginTransaction ();
|
|
||||||
if(need_execute_del)
|
if(need_execute_del)
|
||||||
CharacterDatabase.Execute( ssdel.str().c_str() );
|
CharacterDatabase.Execute( ssdel.str().c_str() );
|
||||||
if(need_execute_ins)
|
if(need_execute_ins)
|
||||||
CharacterDatabase.Execute( ssins.str().c_str() );
|
CharacterDatabase.Execute( ssins.str().c_str() );
|
||||||
CharacterDatabase.CommitTransaction ();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -308,6 +304,9 @@ void AchievementMgr::LoadFromDB(QueryResult *achievementResult, QueryResult *cri
|
||||||
|
|
||||||
void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement)
|
void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement)
|
||||||
{
|
{
|
||||||
|
if(GetPlayer()->GetSession()->PlayerLoading())
|
||||||
|
return;
|
||||||
|
|
||||||
#ifdef MANGOS_DEBUG
|
#ifdef MANGOS_DEBUG
|
||||||
if((sLog.getLogFilter() & LOG_FILTER_ACHIEVEMENT_UPDATES)==0)
|
if((sLog.getLogFilter() & LOG_FILTER_ACHIEVEMENT_UPDATES)==0)
|
||||||
sLog.outDebug("AchievementMgr::SendAchievementEarned(%u)", achievement->ID);
|
sLog.outDebug("AchievementMgr::SendAchievementEarned(%u)", achievement->ID);
|
||||||
|
|
@ -515,9 +514,19 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
||||||
SetCriteriaProgress(achievementCriteria, GetPlayer()->getLevel());
|
SetCriteriaProgress(achievementCriteria, GetPlayer()->getLevel());
|
||||||
break;
|
break;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
|
case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
|
||||||
|
// update at loading or specific skill update
|
||||||
|
if(miscvalue1 && miscvalue1 != achievementCriteria->reach_skill_level.skillID)
|
||||||
|
continue;
|
||||||
if(uint32 skillvalue = GetPlayer()->GetBaseSkillValue(achievementCriteria->reach_skill_level.skillID))
|
if(uint32 skillvalue = GetPlayer()->GetBaseSkillValue(achievementCriteria->reach_skill_level.skillID))
|
||||||
SetCriteriaProgress(achievementCriteria, skillvalue);
|
SetCriteriaProgress(achievementCriteria, skillvalue);
|
||||||
break;
|
break;
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
|
||||||
|
// update at loading or specific skill update
|
||||||
|
if(miscvalue1 && miscvalue1 != achievementCriteria->learn_skill_level.skillID)
|
||||||
|
continue;
|
||||||
|
if(uint32 maxSkillvalue = GetPlayer()->GetPureMaxSkillValue(achievementCriteria->learn_skill_level.skillID))
|
||||||
|
SetCriteriaProgress(achievementCriteria, maxSkillvalue);
|
||||||
|
break;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
|
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
|
||||||
if(m_completedAchievements.find(achievementCriteria->complete_achievement.linkedAchievement) != m_completedAchievements.end())
|
if(m_completedAchievements.find(achievementCriteria->complete_achievement.linkedAchievement) != m_completedAchievements.end())
|
||||||
SetCriteriaProgress(achievementCriteria, 1);
|
SetCriteriaProgress(achievementCriteria, 1);
|
||||||
|
|
@ -909,7 +918,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
|
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING:
|
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING:
|
case ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
|
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK:
|
case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
|
case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
|
case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
|
||||||
|
|
@ -999,6 +1007,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
|
||||||
}
|
}
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
|
case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
|
||||||
return progress->counter >= achievementCriteria->reach_skill_level.skillLevel;
|
return progress->counter >= achievementCriteria->reach_skill_level.skillLevel;
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
|
||||||
|
return progress->counter >= (achievementCriteria->learn_skill_level.skillLevel * 75);
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
|
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
|
||||||
return progress->counter >= 1;
|
return progress->counter >= 1;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT:
|
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT:
|
||||||
|
|
|
||||||
|
|
@ -165,8 +165,8 @@ enum BG_AB_Sounds
|
||||||
BG_AB_SOUND_NODE_CLAIMED = 8192,
|
BG_AB_SOUND_NODE_CLAIMED = 8192,
|
||||||
BG_AB_SOUND_NODE_CAPTURED_ALLIANCE = 8173,
|
BG_AB_SOUND_NODE_CAPTURED_ALLIANCE = 8173,
|
||||||
BG_AB_SOUND_NODE_CAPTURED_HORDE = 8213,
|
BG_AB_SOUND_NODE_CAPTURED_HORDE = 8213,
|
||||||
BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE = 8174,
|
BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE = 8212,
|
||||||
BG_AB_SOUND_NODE_ASSAULTED_HORDE = 8212,
|
BG_AB_SOUND_NODE_ASSAULTED_HORDE = 8174,
|
||||||
BG_AB_SOUND_NEAR_VICTORY = 8456
|
BG_AB_SOUND_NEAR_VICTORY = 8456
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
#define __BATTLEGROUNDMGR_H
|
#define __BATTLEGROUNDMGR_H
|
||||||
|
|
||||||
#include "Common.h"
|
#include "Common.h"
|
||||||
|
#include "Policies/Singleton.h"
|
||||||
#include "BattleGround.h"
|
#include "BattleGround.h"
|
||||||
|
|
||||||
typedef std::map<uint32, BattleGround*> BattleGroundSet;
|
typedef std::map<uint32, BattleGround*> BattleGroundSet;
|
||||||
|
|
|
||||||
|
|
@ -217,6 +217,7 @@ ChatCommand * ChatHandler::getCommandTable()
|
||||||
{ "all_default", SEC_MODERATOR, false, &ChatHandler::HandleLearnAllDefaultCommand, "", NULL },
|
{ "all_default", SEC_MODERATOR, false, &ChatHandler::HandleLearnAllDefaultCommand, "", NULL },
|
||||||
{ "all_lang", SEC_MODERATOR, false, &ChatHandler::HandleLearnAllLangCommand, "", NULL },
|
{ "all_lang", SEC_MODERATOR, false, &ChatHandler::HandleLearnAllLangCommand, "", NULL },
|
||||||
{ "all_myclass", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMyClassCommand, "", NULL },
|
{ "all_myclass", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMyClassCommand, "", NULL },
|
||||||
|
{ "all_mypettalents",SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMyPetTalentsCommand,"", NULL },
|
||||||
{ "all_myspells", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMySpellsCommand, "", NULL },
|
{ "all_myspells", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMySpellsCommand, "", NULL },
|
||||||
{ "all_mytalents", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMyTalentsCommand, "", NULL },
|
{ "all_mytalents", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMyTalentsCommand, "", NULL },
|
||||||
{ "all_recipes", SEC_GAMEMASTER, false, &ChatHandler::HandleLearnAllRecipesCommand, "", NULL },
|
{ "all_recipes", SEC_GAMEMASTER, false, &ChatHandler::HandleLearnAllRecipesCommand, "", NULL },
|
||||||
|
|
|
||||||
|
|
@ -135,6 +135,7 @@ class ChatHandler
|
||||||
bool HandleLearnAllDefaultCommand(const char* args);
|
bool HandleLearnAllDefaultCommand(const char* args);
|
||||||
bool HandleLearnAllLangCommand(const char* args);
|
bool HandleLearnAllLangCommand(const char* args);
|
||||||
bool HandleLearnAllMyClassCommand(const char* args);
|
bool HandleLearnAllMyClassCommand(const char* args);
|
||||||
|
bool HandleLearnAllMyPetTalentsCommand(const char* args);
|
||||||
bool HandleLearnAllMySpellsCommand(const char* args);
|
bool HandleLearnAllMySpellsCommand(const char* args);
|
||||||
bool HandleLearnAllMyTalentsCommand(const char* args);
|
bool HandleLearnAllMyTalentsCommand(const char* args);
|
||||||
|
|
||||||
|
|
@ -391,11 +392,10 @@ class ChatHandler
|
||||||
bool HandleResetHonorCommand(const char * args);
|
bool HandleResetHonorCommand(const char * args);
|
||||||
bool HandleResetLevelCommand(const char * args);
|
bool HandleResetLevelCommand(const char * args);
|
||||||
bool HandleResetSpellsCommand(const char * args);
|
bool HandleResetSpellsCommand(const char * args);
|
||||||
|
|
||||||
bool HandleResetStatsCommand(const char * args);
|
bool HandleResetStatsCommand(const char * args);
|
||||||
bool HandleResetTalentsCommand(const char * args);
|
bool HandleResetTalentsCommand(const char * args);
|
||||||
|
|
||||||
bool HandleResetAllCommand(const char * args);
|
bool HandleResetAllCommand(const char * args);
|
||||||
|
|
||||||
bool HandleTicketCommand(const char* args);
|
bool HandleTicketCommand(const char* args);
|
||||||
bool HandleDelTicketCommand(const char* args);
|
bool HandleDelTicketCommand(const char* args);
|
||||||
bool HandleMaxSkillCommand(const char* args);
|
bool HandleMaxSkillCommand(const char* args);
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,7 @@ class Corpse : public WorldObject
|
||||||
void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); }
|
void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); }
|
||||||
void TextEmote(int32 textId, uint64 TargetGuid) { MonsterTextEmote(textId,TargetGuid); }
|
void TextEmote(int32 textId, uint64 TargetGuid) { MonsterTextEmote(textId,TargetGuid); }
|
||||||
void Whisper(int32 textId,uint64 receiver) { MonsterWhisper(textId,receiver); }
|
void Whisper(int32 textId,uint64 receiver) { MonsterWhisper(textId,receiver); }
|
||||||
|
void YellToZone(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYellToZone(textId,language,TargetGuid); }
|
||||||
|
|
||||||
GridReference<Corpse> &GetGridRef() { return m_gridRef; }
|
GridReference<Corpse> &GetGridRef() { return m_gridRef; }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1586,7 +1586,9 @@ SpellEntry const *Creature::reachWithSpellAttack(Unit *pVictim)
|
||||||
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(spellInfo->rangeIndex);
|
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(spellInfo->rangeIndex);
|
||||||
float range = GetSpellMaxRange(srange);
|
float range = GetSpellMaxRange(srange);
|
||||||
float minrange = GetSpellMinRange(srange);
|
float minrange = GetSpellMinRange(srange);
|
||||||
float dist = GetDistance(pVictim);
|
|
||||||
|
float dist = GetCombatDistance(pVictim);
|
||||||
|
|
||||||
//if(!isInFront( pVictim, range ) && spellInfo->AttributesEx )
|
//if(!isInFront( pVictim, range ) && spellInfo->AttributesEx )
|
||||||
// continue;
|
// continue;
|
||||||
if( dist > range || dist < minrange )
|
if( dist > range || dist < minrange )
|
||||||
|
|
@ -1632,7 +1634,9 @@ SpellEntry const *Creature::reachWithSpellCure(Unit *pVictim)
|
||||||
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(spellInfo->rangeIndex);
|
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(spellInfo->rangeIndex);
|
||||||
float range = GetSpellMaxRange(srange);
|
float range = GetSpellMaxRange(srange);
|
||||||
float minrange = GetSpellMinRange(srange);
|
float minrange = GetSpellMinRange(srange);
|
||||||
float dist = GetDistance(pVictim);
|
|
||||||
|
float dist = GetCombatDistance(pVictim);
|
||||||
|
|
||||||
//if(!isInFront( pVictim, range ) && spellInfo->AttributesEx )
|
//if(!isInFront( pVictim, range ) && spellInfo->AttributesEx )
|
||||||
// continue;
|
// continue;
|
||||||
if( dist > range || dist < minrange )
|
if( dist > range || dist < minrange )
|
||||||
|
|
|
||||||
|
|
@ -528,6 +528,7 @@ class MANGOS_DLL_SPEC Creature : public Unit
|
||||||
void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); }
|
void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); }
|
||||||
void TextEmote(int32 textId, uint64 TargetGuid, bool IsBossEmote = false) { MonsterTextEmote(textId,TargetGuid,IsBossEmote); }
|
void TextEmote(int32 textId, uint64 TargetGuid, bool IsBossEmote = false) { MonsterTextEmote(textId,TargetGuid,IsBossEmote); }
|
||||||
void Whisper(int32 textId, uint64 receiver, bool IsBossWhisper = false) { MonsterWhisper(textId,receiver,IsBossWhisper); }
|
void Whisper(int32 textId, uint64 receiver, bool IsBossWhisper = false) { MonsterWhisper(textId,receiver,IsBossWhisper); }
|
||||||
|
void YellToZone(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYellToZone(textId,language,TargetGuid); }
|
||||||
|
|
||||||
// overwrite WorldObject function for proper name localization
|
// overwrite WorldObject function for proper name localization
|
||||||
const char* GetNameForLocaleIdx(int32 locale_idx) const;
|
const char* GetNameForLocaleIdx(int32 locale_idx) const;
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
class Unit;
|
class Unit;
|
||||||
class Creature;
|
class Creature;
|
||||||
|
class WorldObject;
|
||||||
struct SpellEntry;
|
struct SpellEntry;
|
||||||
|
|
||||||
#define TIME_INTERVAL_LOOK 5000
|
#define TIME_INTERVAL_LOOK 5000
|
||||||
|
|
@ -79,6 +80,9 @@ class MANGOS_DLL_SPEC CreatureAI
|
||||||
// Called when hit by a spell
|
// Called when hit by a spell
|
||||||
virtual void SpellHit(Unit*, const SpellEntry*) {}
|
virtual void SpellHit(Unit*, const SpellEntry*) {}
|
||||||
|
|
||||||
|
// Called when spell hits creature's target
|
||||||
|
virtual void SpellHitTarget(Unit*, const SpellEntry*) {}
|
||||||
|
|
||||||
// Called when vitim entered water and creature can not enter water
|
// Called when vitim entered water and creature can not enter water
|
||||||
virtual bool canReachByRangeAttack(Unit*) { return false; }
|
virtual bool canReachByRangeAttack(Unit*) { return false; }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
#include "Policies/SingletonImp.h"
|
#include "Policies/SingletonImp.h"
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
#include "ProgressBar.h"
|
#include "ProgressBar.h"
|
||||||
|
#include "SharedDefines.h"
|
||||||
|
|
||||||
#include "DBCfmt.h"
|
#include "DBCfmt.h"
|
||||||
|
|
||||||
|
|
@ -126,6 +127,7 @@ static uint32 sTalentTabPages[12/*MAX_CLASSES*/][3];
|
||||||
|
|
||||||
DBCStorage <TaxiNodesEntry> sTaxiNodesStore(TaxiNodesEntryfmt);
|
DBCStorage <TaxiNodesEntry> sTaxiNodesStore(TaxiNodesEntryfmt);
|
||||||
TaxiMask sTaxiNodesMask;
|
TaxiMask sTaxiNodesMask;
|
||||||
|
TaxiMask sOldContinentsNodesMask;
|
||||||
|
|
||||||
// DBC used only for initialization sTaxiPathSetBySource at startup.
|
// DBC used only for initialization sTaxiPathSetBySource at startup.
|
||||||
TaxiPathSetBySource sTaxiPathSetBySource;
|
TaxiPathSetBySource sTaxiPathSetBySource;
|
||||||
|
|
@ -359,9 +361,13 @@ void LoadDBCStores(const std::string& dataPath)
|
||||||
if(!talentTabInfo)
|
if(!talentTabInfo)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// prevent memory corruption; otherwise cls will become 12 below
|
||||||
|
if ((talentTabInfo->ClassMask & CLASSMASK_ALL_PLAYABLE)==0)
|
||||||
|
continue;
|
||||||
|
|
||||||
// store class talent tab pages
|
// store class talent tab pages
|
||||||
uint32 cls = 1;
|
uint32 cls = 1;
|
||||||
for(uint32 m=1;!(m & talentTabInfo->ClassMask) && cls < 12 /*MAX_CLASSES*/;m <<=1, ++cls) {}
|
for(uint32 m=1;!(m & talentTabInfo->ClassMask) && cls < MAX_CLASSES;m <<=1, ++cls) {}
|
||||||
|
|
||||||
sTalentTabPages[cls][talentTabInfo->tabpage]=talentTabId;
|
sTalentTabPages[cls][talentTabInfo->tabpage]=talentTabId;
|
||||||
}
|
}
|
||||||
|
|
@ -407,9 +413,11 @@ void LoadDBCStores(const std::string& dataPath)
|
||||||
spellPaths.insert(sInfo->EffectMiscValue[j]);
|
spellPaths.insert(sInfo->EffectMiscValue[j]);
|
||||||
|
|
||||||
memset(sTaxiNodesMask,0,sizeof(sTaxiNodesMask));
|
memset(sTaxiNodesMask,0,sizeof(sTaxiNodesMask));
|
||||||
|
memset(sOldContinentsNodesMask,0,sizeof(sTaxiNodesMask));
|
||||||
for(uint32 i = 1; i < sTaxiNodesStore.GetNumRows(); ++i)
|
for(uint32 i = 1; i < sTaxiNodesStore.GetNumRows(); ++i)
|
||||||
{
|
{
|
||||||
if(!sTaxiNodesStore.LookupEntry(i))
|
TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(i);
|
||||||
|
if(!node)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
TaxiPathSetBySource::const_iterator src_i = sTaxiPathSetBySource.find(i);
|
TaxiPathSetBySource::const_iterator src_i = sTaxiPathSetBySource.find(i);
|
||||||
|
|
@ -430,10 +438,14 @@ void LoadDBCStores(const std::string& dataPath)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// valid taxi netowrk node
|
// valid taxi network node
|
||||||
uint8 field = (uint8)((i - 1) / 32);
|
uint8 field = (uint8)((i - 1) / 32);
|
||||||
uint32 submask = 1<<((i-1)%32);
|
uint32 submask = 1<<((i-1)%32);
|
||||||
sTaxiNodesMask[field] |= submask;
|
sTaxiNodesMask[field] |= submask;
|
||||||
|
|
||||||
|
// old continent node (+ nodes virtually at old continents, check explicitly to avoid loading map files for zone info)
|
||||||
|
if (node->map_id < 2 || i == 82 || i == 83 || i == 93 || i == 94)
|
||||||
|
sOldContinentsNodesMask[field] |= submask;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -132,6 +132,7 @@ extern DBCStorage <TalentTabEntry> sTalentTabStore;
|
||||||
extern DBCStorage <TaxiNodesEntry> sTaxiNodesStore;
|
extern DBCStorage <TaxiNodesEntry> sTaxiNodesStore;
|
||||||
extern DBCStorage <TaxiPathEntry> sTaxiPathStore;
|
extern DBCStorage <TaxiPathEntry> sTaxiPathStore;
|
||||||
extern TaxiMask sTaxiNodesMask;
|
extern TaxiMask sTaxiNodesMask;
|
||||||
|
extern TaxiMask sOldContinentsNodesMask;
|
||||||
extern TaxiPathSetBySource sTaxiPathSetBySource;
|
extern TaxiPathSetBySource sTaxiPathSetBySource;
|
||||||
extern TaxiPathNodesByPath sTaxiPathNodesByPath;
|
extern TaxiPathNodesByPath sTaxiPathNodesByPath;
|
||||||
extern DBCStorage <TotemCategoryEntry> sTotemCategoryStore;
|
extern DBCStorage <TotemCategoryEntry> sTotemCategoryStore;
|
||||||
|
|
|
||||||
|
|
@ -1293,6 +1293,9 @@ struct SpellEntry
|
||||||
//uint32 spellMissileID; // 230 m_spellMissileID not used
|
//uint32 spellMissileID; // 230 m_spellMissileID not used
|
||||||
//uint32 PowerDisplayId; // 231 PowerDisplay.dbc, new in 3.1
|
//uint32 PowerDisplayId; // 231 PowerDisplay.dbc, new in 3.1
|
||||||
|
|
||||||
|
// helpers
|
||||||
|
int32 CalculateSimpleValue(uint8 eff) const { return EffectBasePoints[eff]+int32(EffectBaseDice[eff]); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// prevent creating custom entries (copy data from original in fact)
|
// prevent creating custom entries (copy data from original in fact)
|
||||||
SpellEntry(SpellEntry const&); // DON'T must have implementation
|
SpellEntry(SpellEntry const&); // DON'T must have implementation
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,7 @@ class DynamicObject : public WorldObject
|
||||||
void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); }
|
void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); }
|
||||||
void TextEmote(int32 textId, uint64 TargetGuid) { MonsterTextEmote(textId,TargetGuid); }
|
void TextEmote(int32 textId, uint64 TargetGuid) { MonsterTextEmote(textId,TargetGuid); }
|
||||||
void Whisper(int32 textId,uint64 receiver) { MonsterWhisper(textId,receiver); }
|
void Whisper(int32 textId,uint64 receiver) { MonsterWhisper(textId,receiver); }
|
||||||
|
void YellToZone(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYellToZone(textId,language,TargetGuid); }
|
||||||
|
|
||||||
GridReference<DynamicObject> &GetGridRef() { return m_gridRef; }
|
GridReference<DynamicObject> &GetGridRef() { return m_gridRef; }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@
|
||||||
#include "Common.h"
|
#include "Common.h"
|
||||||
#include "SharedDefines.h"
|
#include "SharedDefines.h"
|
||||||
#include "Platform/Define.h"
|
#include "Platform/Define.h"
|
||||||
|
#include "Policies/Singleton.h"
|
||||||
|
|
||||||
#define max_ge_check_delay 86400 // 1 day in seconds
|
#define max_ge_check_delay 86400 // 1 day in seconds
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ struct GameObjectInfo
|
||||||
uint32 type;
|
uint32 type;
|
||||||
uint32 displayId;
|
uint32 displayId;
|
||||||
char *name;
|
char *name;
|
||||||
|
char *IconName;
|
||||||
char *castBarCaption;
|
char *castBarCaption;
|
||||||
uint32 faction;
|
uint32 faction;
|
||||||
uint32 flags;
|
uint32 flags;
|
||||||
|
|
@ -447,6 +448,7 @@ class MANGOS_DLL_SPEC GameObject : public WorldObject
|
||||||
void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); }
|
void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); }
|
||||||
void TextEmote(int32 textId, uint64 TargetGuid) { MonsterTextEmote(textId,TargetGuid); }
|
void TextEmote(int32 textId, uint64 TargetGuid) { MonsterTextEmote(textId,TargetGuid); }
|
||||||
void Whisper(int32 textId, uint64 receiver) { MonsterWhisper(textId,receiver); }
|
void Whisper(int32 textId, uint64 receiver) { MonsterWhisper(textId,receiver); }
|
||||||
|
void YellToZone(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYellToZone(textId,language,TargetGuid); }
|
||||||
|
|
||||||
// overwrite WorldObject function for proper name localization
|
// overwrite WorldObject function for proper name localization
|
||||||
const char* GetNameForLocaleIdx(int32 locale_idx) const;
|
const char* GetNameForLocaleIdx(int32 locale_idx) const;
|
||||||
|
|
|
||||||
|
|
@ -729,7 +729,10 @@ enum MangosStrings
|
||||||
LANG_CHARACTER_DELETED = 1009,
|
LANG_CHARACTER_DELETED = 1009,
|
||||||
LANG_ACCOUNT_LIST_HEADER = 1010,
|
LANG_ACCOUNT_LIST_HEADER = 1010,
|
||||||
LANG_ACCOUNT_LIST_ERROR = 1011,
|
LANG_ACCOUNT_LIST_ERROR = 1011,
|
||||||
// Room for more level 4 1012-1099 not used
|
LANG_ACCOUNT_LIST_BAR = 1012,
|
||||||
|
LANG_ACCOUNT_LIST_LINE = 1013,
|
||||||
|
LANG_ACCOUNT_LIST_EMPTY = 1014,
|
||||||
|
// Room for more level 4 1015-1099 not used
|
||||||
|
|
||||||
// Level 3 (continue)
|
// Level 3 (continue)
|
||||||
LANG_ACCOUNT_SETADDON = 1100,
|
LANG_ACCOUNT_SETADDON = 1100,
|
||||||
|
|
@ -755,7 +758,12 @@ enum MangosStrings
|
||||||
LANG_YOU_CHANGE_GENDER = 1120,
|
LANG_YOU_CHANGE_GENDER = 1120,
|
||||||
LANG_YOUR_GENDER_CHANGED = 1121,
|
LANG_YOUR_GENDER_CHANGED = 1121,
|
||||||
LANG_SKILL_VALUES = 1122,
|
LANG_SKILL_VALUES = 1122,
|
||||||
// Room for more level 3 1123-1199 not used
|
LANG_NO_PET_FOUND = 1123,
|
||||||
|
LANG_WRONG_PET_TYPE = 1124,
|
||||||
|
LANG_COMMAND_LEARN_PET_TALENTS = 1125,
|
||||||
|
LANG_RESET_PET_TALENTS = 1126,
|
||||||
|
LANG_RESET_PET_TALENTS_ONLINE = 1127,
|
||||||
|
// Room for more level 3 1128-1199 not used
|
||||||
|
|
||||||
// FREE IDS 1200-9999
|
// FREE IDS 1200-9999
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2432,6 +2432,11 @@ bool ChatHandler::HandleGoZoneXYCommand(const char* args)
|
||||||
|
|
||||||
float x = (float)atof(px);
|
float x = (float)atof(px);
|
||||||
float y = (float)atof(py);
|
float y = (float)atof(py);
|
||||||
|
|
||||||
|
// prevent accept wrong numeric args
|
||||||
|
if (x==0.0f && *px!='0' || y==0.0f && *py!='0')
|
||||||
|
return false;
|
||||||
|
|
||||||
uint32 areaid = cAreaId ? (uint32)atoi(cAreaId) : _player->GetZoneId();
|
uint32 areaid = cAreaId ? (uint32)atoi(cAreaId) : _player->GetZoneId();
|
||||||
|
|
||||||
AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaid);
|
AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaid);
|
||||||
|
|
|
||||||
|
|
@ -758,6 +758,7 @@ bool ChatHandler::HandleAccountSetGmLevelCommand(const char* args)
|
||||||
arg2 = arg1;
|
arg2 = arg1;
|
||||||
|
|
||||||
targetAccountId = targetPlayer->GetSession()->GetAccountId();
|
targetAccountId = targetPlayer->GetSession()->GetAccountId();
|
||||||
|
accmgr.GetName(targetAccountId, targetAccountName);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -791,7 +792,7 @@ bool ChatHandler::HandleAccountSetGmLevelCommand(const char* args)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// can set security level only for target with less security and to less security that we have
|
/// can set security level only for target with less security and to less security that we have
|
||||||
/// This is also reject self apply in fact
|
/// This will reject self apply by specify account name
|
||||||
if(HasLowerSecurityAccount(NULL,targetAccountId,true))
|
if(HasLowerSecurityAccount(NULL,targetAccountId,true))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
@ -804,7 +805,8 @@ bool ChatHandler::HandleAccountSetGmLevelCommand(const char* args)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(targetPlayer)
|
// This will prevent self apply by self target or no target
|
||||||
|
if(targetPlayer && m_session->GetPlayer()!=targetPlayer)
|
||||||
{
|
{
|
||||||
ChatHandler(targetPlayer).PSendSysMessage(LANG_YOURS_SECURITY_CHANGED,GetNameLink().c_str(), gm);
|
ChatHandler(targetPlayer).PSendSysMessage(LANG_YOURS_SECURITY_CHANGED,GetNameLink().c_str(), gm);
|
||||||
targetPlayer->GetSession()->SetSecurity(gm);
|
targetPlayer->GetSession()->SetSecurity(gm);
|
||||||
|
|
@ -1791,6 +1793,82 @@ bool ChatHandler::HandleLearnAllMyTalentsCommand(const char* /*args*/)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ChatHandler::HandleLearnAllMyPetTalentsCommand(const char* /*args*/)
|
||||||
|
{
|
||||||
|
Player* player = m_session->GetPlayer();
|
||||||
|
|
||||||
|
Pet* pet = player->GetPet();
|
||||||
|
if(!pet)
|
||||||
|
{
|
||||||
|
SendSysMessage(LANG_NO_PET_FOUND);
|
||||||
|
SetSentErrorMessage(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CreatureInfo const *ci = pet->GetCreatureInfo();
|
||||||
|
if(!ci)
|
||||||
|
{
|
||||||
|
SendSysMessage(LANG_WRONG_PET_TYPE);
|
||||||
|
SetSentErrorMessage(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CreatureFamilyEntry const *pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
|
||||||
|
if(!pet_family)
|
||||||
|
{
|
||||||
|
SendSysMessage(LANG_WRONG_PET_TYPE);
|
||||||
|
SetSentErrorMessage(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pet_family->petTalentType < 0) // not hunter pet
|
||||||
|
{
|
||||||
|
SendSysMessage(LANG_WRONG_PET_TYPE);
|
||||||
|
SetSentErrorMessage(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32 i = 0; i < sTalentStore.GetNumRows(); i++)
|
||||||
|
{
|
||||||
|
TalentEntry const *talentInfo = sTalentStore.LookupEntry(i);
|
||||||
|
if(!talentInfo)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
TalentTabEntry const *talentTabInfo = sTalentTabStore.LookupEntry( talentInfo->TalentTab );
|
||||||
|
if(!talentTabInfo)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// prevent learn talent for different family (cheating)
|
||||||
|
if(((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask)==0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// search highest talent rank
|
||||||
|
uint32 spellid = 0;
|
||||||
|
|
||||||
|
for(int rank = MAX_TALENT_RANK-1; rank >= 0; --rank)
|
||||||
|
{
|
||||||
|
if(talentInfo->RankID[rank]!=0)
|
||||||
|
{
|
||||||
|
spellid = talentInfo->RankID[rank];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!spellid) // ??? none spells in talent
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SpellEntry const* spellInfo = sSpellStore.LookupEntry(spellid);
|
||||||
|
if(!spellInfo || !SpellMgr::IsSpellValid(spellInfo,m_session->GetPlayer(),false))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// learn highest rank of talent and learn all non-talent spell ranks (recursive by tree)
|
||||||
|
pet->learnSpellHighRank(spellid);
|
||||||
|
}
|
||||||
|
|
||||||
|
SendSysMessage(LANG_COMMAND_LEARN_PET_TALENTS);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool ChatHandler::HandleLearnAllLangCommand(const char* /*args*/)
|
bool ChatHandler::HandleLearnAllLangCommand(const char* /*args*/)
|
||||||
{
|
{
|
||||||
// skipping UNIVERSAL language (0)
|
// skipping UNIVERSAL language (0)
|
||||||
|
|
@ -4644,9 +4722,9 @@ bool ChatHandler::HandleResetTalentsCommand(const char * args)
|
||||||
if (owner && owner->GetTypeId() == TYPEID_PLAYER)
|
if (owner && owner->GetTypeId() == TYPEID_PLAYER)
|
||||||
{
|
{
|
||||||
player = (Player *)owner;
|
player = (Player *)owner;
|
||||||
ChatHandler(player).SendSysMessage(LANG_RESET_TALENTS);
|
ChatHandler(player).SendSysMessage(LANG_RESET_PET_TALENTS);
|
||||||
if(m_session->GetPlayer()!=player)
|
if(m_session->GetPlayer()!=player)
|
||||||
PSendSysMessage(LANG_RESET_TALENTS_ONLINE,GetNameLink(player).c_str());
|
PSendSysMessage(LANG_RESET_PET_TALENTS_ONLINE,GetNameLink(player).c_str());
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1619,6 +1619,8 @@ float Map::GetHeight(float x, float y, float z, bool pUseVmaps) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "World.h"
|
||||||
|
|
||||||
uint16 Map::GetAreaFlag(float x, float y, float z) const
|
uint16 Map::GetAreaFlag(float x, float y, float z) const
|
||||||
{
|
{
|
||||||
uint16 areaflag;
|
uint16 areaflag;
|
||||||
|
|
@ -1646,7 +1648,13 @@ uint16 Map::GetAreaFlag(float x, float y, float z) const
|
||||||
case 1593:
|
case 1593:
|
||||||
case 2484:
|
case 2484:
|
||||||
case 2492:
|
case 2492:
|
||||||
if( (x < 6116 && x > 5568) && (y < 982 && y > 282) && z > 563.0f) areaflag = 2153; break;
|
if (x > 5568.0f && x < 6116.0f && y > 282.0f && y < 982.0f && z > 563.0f) areaflag = 2153; break;
|
||||||
|
// Maw of Neltharion (cave)
|
||||||
|
case 164: // Dragonblight
|
||||||
|
case 1797: // Obsidian Dragonshrine (Dragonblight)
|
||||||
|
case 1827: // Wintergrasp
|
||||||
|
case 2591: // The Cauldron of Flames (Wintergrasp)
|
||||||
|
if (x > 4364.0f && x < 4632.0f && y > 1545.0f && y < 1886.0f && z < 200.0f) areaflag = 1853; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return areaflag;
|
return areaflag;
|
||||||
|
|
|
||||||
|
|
@ -1179,6 +1179,10 @@ float WorldObject::GetAngle( const float x, const float y ) const
|
||||||
|
|
||||||
bool WorldObject::HasInArc(const float arcangle, const WorldObject* obj) const
|
bool WorldObject::HasInArc(const float arcangle, const WorldObject* obj) const
|
||||||
{
|
{
|
||||||
|
// always have self in arc
|
||||||
|
if(obj == this)
|
||||||
|
return true;
|
||||||
|
|
||||||
float arc = arcangle;
|
float arc = arcangle;
|
||||||
|
|
||||||
// move arc to range 0.. 2*pi
|
// move arc to range 0.. 2*pi
|
||||||
|
|
@ -1325,6 +1329,19 @@ void WorldObject::MonsterYell(int32 textId, uint32 language, uint64 TargetGuid)
|
||||||
cell_lock->Visit(cell_lock, message, *GetMap());
|
cell_lock->Visit(cell_lock, message, *GetMap());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WorldObject::MonsterYellToZone(int32 textId, uint32 language, uint64 TargetGuid)
|
||||||
|
{
|
||||||
|
MaNGOS::MonsterChatBuilder say_build(*this, CHAT_MSG_MONSTER_YELL, textId,language,TargetGuid);
|
||||||
|
MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> say_do(say_build);
|
||||||
|
|
||||||
|
uint32 zoneid = GetZoneId();
|
||||||
|
|
||||||
|
Map::PlayerList const& pList = GetMap()->GetPlayers();
|
||||||
|
for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr)
|
||||||
|
if(itr->getSource()->GetZoneId()==zoneid)
|
||||||
|
say_do(itr->getSource());
|
||||||
|
}
|
||||||
|
|
||||||
void WorldObject::MonsterTextEmote(int32 textId, uint64 TargetGuid, bool IsBossEmote)
|
void WorldObject::MonsterTextEmote(int32 textId, uint64 TargetGuid, bool IsBossEmote)
|
||||||
{
|
{
|
||||||
CellPair p = MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY());
|
CellPair p = MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY());
|
||||||
|
|
|
||||||
|
|
@ -456,6 +456,7 @@ class MANGOS_DLL_SPEC WorldObject : public Object
|
||||||
void MonsterYell(int32 textId, uint32 language, uint64 TargetGuid);
|
void MonsterYell(int32 textId, uint32 language, uint64 TargetGuid);
|
||||||
void MonsterTextEmote(int32 textId, uint64 TargetGuid, bool IsBossEmote = false);
|
void MonsterTextEmote(int32 textId, uint64 TargetGuid, bool IsBossEmote = false);
|
||||||
void MonsterWhisper(int32 textId, uint64 receiver, bool IsBossWhisper = false);
|
void MonsterWhisper(int32 textId, uint64 receiver, bool IsBossWhisper = false);
|
||||||
|
void MonsterYellToZone(int32 textId, uint32 language, uint64 TargetGuid);
|
||||||
void BuildMonsterChat(WorldPacket *data, uint8 msgtype, char const* text, uint32 language, char const* name, uint64 TargetGuid) const;
|
void BuildMonsterChat(WorldPacket *data, uint8 msgtype, char const* text, uint32 language, char const* name, uint64 TargetGuid) const;
|
||||||
|
|
||||||
void PlayDistanceSound(uint32 sound_id, Player* target = NULL);
|
void PlayDistanceSound(uint32 sound_id, Player* target = NULL);
|
||||||
|
|
|
||||||
|
|
@ -1750,3 +1750,12 @@ void Pet::CastPetAura(PetAura const* aura)
|
||||||
else
|
else
|
||||||
CastSpell(this, auraId, true);
|
CastSpell(this, auraId, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Pet::learnSpellHighRank(uint32 spellid)
|
||||||
|
{
|
||||||
|
learnSpell(spellid);
|
||||||
|
|
||||||
|
SpellChainMapNext const& nextMap = spellmgr.GetSpellChainNext();
|
||||||
|
for(SpellChainMapNext::const_iterator itr = nextMap.lower_bound(spellid); itr != nextMap.upper_bound(spellid); ++itr)
|
||||||
|
learnSpellHighRank(itr->second);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -190,6 +190,7 @@ class Pet : public Creature
|
||||||
|
|
||||||
bool addSpell(uint32 spell_id,uint16 active = ACT_DECIDE, PetSpellState state = PETSPELL_NEW, PetSpellType type = PETSPELL_NORMAL);
|
bool addSpell(uint32 spell_id,uint16 active = ACT_DECIDE, PetSpellState state = PETSPELL_NEW, PetSpellType type = PETSPELL_NORMAL);
|
||||||
bool learnSpell(uint32 spell_id);
|
bool learnSpell(uint32 spell_id);
|
||||||
|
void learnSpellHighRank(uint32 spellid);
|
||||||
void learnLevelupSpells();
|
void learnLevelupSpells();
|
||||||
bool unlearnSpell(uint32 spell_id);
|
bool unlearnSpell(uint32 spell_id);
|
||||||
bool removeSpell(uint32 spell_id);
|
bool removeSpell(uint32 spell_id);
|
||||||
|
|
|
||||||
|
|
@ -128,7 +128,18 @@ PlayerTaxi::PlayerTaxi()
|
||||||
|
|
||||||
void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint32 level)
|
void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint32 level)
|
||||||
{
|
{
|
||||||
// capital and taxi hub masks
|
// class specific initial known nodes
|
||||||
|
switch(chrClass)
|
||||||
|
{
|
||||||
|
case CLASS_DEATH_KNIGHT:
|
||||||
|
{
|
||||||
|
for(int i = 0; i < TaxiMaskSize; ++i)
|
||||||
|
m_taximask[i] |= sOldContinentsNodesMask[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// race specific initial known nodes: capital and taxi hub masks
|
||||||
switch(race)
|
switch(race)
|
||||||
{
|
{
|
||||||
case RACE_HUMAN: SetTaximaskNode(2); break; // Human
|
case RACE_HUMAN: SetTaximaskNode(2); break; // Human
|
||||||
|
|
@ -144,12 +155,6 @@ void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint32 leve
|
||||||
case RACE_DRAENEI: SetTaximaskNode(94); break; // Draenei
|
case RACE_DRAENEI: SetTaximaskNode(94); break; // Draenei
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(chrClass)
|
|
||||||
{
|
|
||||||
case CLASS_DEATH_KNIGHT: // TODO: figure out initial known nodes
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// new continent starting masks (It will be accessible only at new map)
|
// new continent starting masks (It will be accessible only at new map)
|
||||||
switch(Player::TeamForRace(race))
|
switch(Player::TeamForRace(race))
|
||||||
{
|
{
|
||||||
|
|
@ -4490,9 +4495,7 @@ float Player::GetTotalBaseModValue(BaseModGroup modGroup) const
|
||||||
|
|
||||||
uint32 Player::GetShieldBlockValue() const
|
uint32 Player::GetShieldBlockValue() const
|
||||||
{
|
{
|
||||||
BaseModGroup modGroup = SHIELD_BLOCK_VALUE;
|
float value = (m_auraBaseMod[SHIELD_BLOCK_VALUE][FLAT_MOD] + GetStat(STAT_STRENGTH) * 0.5f - 10)*m_auraBaseMod[SHIELD_BLOCK_VALUE][PCT_MOD];
|
||||||
|
|
||||||
float value = GetTotalBaseModValue(modGroup) + GetStat(STAT_STRENGTH) * 0.5f - 10;
|
|
||||||
|
|
||||||
value = (value < 0) ? 0 : value;
|
value = (value < 0) ? 0 : value;
|
||||||
|
|
||||||
|
|
@ -4819,7 +4822,7 @@ bool Player::UpdateSkill(uint32 skill_id, uint32 step)
|
||||||
new_value = max;
|
new_value = max;
|
||||||
|
|
||||||
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(new_value,max));
|
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(new_value,max));
|
||||||
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL);
|
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL,skill_id);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4958,7 +4961,7 @@ bool Player::UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL);
|
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL,SkillId);
|
||||||
sLog.outDebug("Player::UpdateSkillPro Chance=%3.1f%% taken", Chance/10.0);
|
sLog.outDebug("Player::UpdateSkillPro Chance=%3.1f%% taken", Chance/10.0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -5135,7 +5138,8 @@ void Player::SetSkill(uint32 id, uint16 currVal, uint16 maxVal)
|
||||||
{
|
{
|
||||||
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(currVal,maxVal));
|
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(currVal,maxVal));
|
||||||
learnSkillRewardedSpells(id, currVal);
|
learnSkillRewardedSpells(id, currVal);
|
||||||
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL);
|
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL,id);
|
||||||
|
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL,id);
|
||||||
}
|
}
|
||||||
else //remove
|
else //remove
|
||||||
{
|
{
|
||||||
|
|
@ -5168,7 +5172,8 @@ void Player::SetSkill(uint32 id, uint16 currVal, uint16 maxVal)
|
||||||
else
|
else
|
||||||
SetUInt32Value(PLAYER_SKILL_INDEX(i), MAKE_PAIR32(id,0));
|
SetUInt32Value(PLAYER_SKILL_INDEX(i), MAKE_PAIR32(id,0));
|
||||||
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(currVal,maxVal));
|
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(currVal,maxVal));
|
||||||
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL);
|
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL,id);
|
||||||
|
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL,id);
|
||||||
|
|
||||||
// apply skill bonuses
|
// apply skill bonuses
|
||||||
SetUInt32Value(PLAYER_SKILL_BONUS_INDEX(i),0);
|
SetUInt32Value(PLAYER_SKILL_BONUS_INDEX(i),0);
|
||||||
|
|
@ -18597,6 +18602,31 @@ bool Player::RewardPlayerAndGroupAtKill(Unit* pVictim)
|
||||||
return xp || honored_kill;
|
return xp || honored_kill;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Player::RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject* pRewardSource)
|
||||||
|
{
|
||||||
|
uint64 creature_guid = pRewardSource->GetTypeId()==TYPEID_UNIT ? pRewardSource->GetGUID() : uint64(0);
|
||||||
|
|
||||||
|
// prepare data for near group iteration
|
||||||
|
if(Group *pGroup = GetGroup())
|
||||||
|
{
|
||||||
|
for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
|
||||||
|
{
|
||||||
|
Player* pGroupGuy = itr->getSource();
|
||||||
|
if(!pGroupGuy)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(!pGroupGuy->IsAtGroupRewardDistance(pRewardSource))
|
||||||
|
continue; // member (alive or dead) or his corpse at req. distance
|
||||||
|
|
||||||
|
// quest objectives updated only for alive group member or dead but with not released body
|
||||||
|
if(pGroupGuy->isAlive()|| !pGroupGuy->GetCorpse())
|
||||||
|
pGroupGuy->KilledMonster(creature_id, creature_guid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // if (!pGroup)
|
||||||
|
KilledMonster(creature_id, creature_guid);
|
||||||
|
}
|
||||||
|
|
||||||
bool Player::IsAtGroupRewardDistance(WorldObject const* pRewardSource) const
|
bool Player::IsAtGroupRewardDistance(WorldObject const* pRewardSource) const
|
||||||
{
|
{
|
||||||
if(pRewardSource->GetDistance(this) <= sWorld.getConfig(CONFIG_GROUP_XP_DISTANCE))
|
if(pRewardSource->GetDistance(this) <= sWorld.getConfig(CONFIG_GROUP_XP_DISTANCE))
|
||||||
|
|
|
||||||
|
|
@ -1673,6 +1673,7 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
|
|
||||||
bool IsAtGroupRewardDistance(WorldObject const* pRewardSource) const;
|
bool IsAtGroupRewardDistance(WorldObject const* pRewardSource) const;
|
||||||
bool RewardPlayerAndGroupAtKill(Unit* pVictim);
|
bool RewardPlayerAndGroupAtKill(Unit* pVictim);
|
||||||
|
void RewardPlayerAndGroupAtEvent(uint32 creature_id,WorldObject* pRewardSource);
|
||||||
bool isHonorOrXPTarget(Unit* pVictim);
|
bool isHonorOrXPTarget(Unit* pVictim);
|
||||||
|
|
||||||
ReputationMgr& GetReputationMgr() { return m_reputationMgr; }
|
ReputationMgr& GetReputationMgr() { return m_reputationMgr; }
|
||||||
|
|
|
||||||
|
|
@ -699,7 +699,8 @@ uint16 PoolHandler::IsPartOfAPool(uint32 guid, uint32 type)
|
||||||
// Method that check chance integrity of the creatures and gameobjects in this pool
|
// Method that check chance integrity of the creatures and gameobjects in this pool
|
||||||
bool PoolHandler::CheckPool(uint16 pool_id)
|
bool PoolHandler::CheckPool(uint16 pool_id)
|
||||||
{
|
{
|
||||||
return mPoolGameobjectGroups[pool_id].CheckPool() &&
|
return pool_id <= max_pool_id &&
|
||||||
|
mPoolGameobjectGroups[pool_id].CheckPool() &&
|
||||||
mPoolCreatureGroups[pool_id].CheckPool() &&
|
mPoolCreatureGroups[pool_id].CheckPool() &&
|
||||||
mPoolPoolGroups[pool_id].CheckPool();
|
mPoolPoolGroups[pool_id].CheckPool();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
#define MANGOS_POOLHANDLER_H
|
#define MANGOS_POOLHANDLER_H
|
||||||
|
|
||||||
#include "Platform/Define.h"
|
#include "Platform/Define.h"
|
||||||
|
#include "Policies/Singleton.h"
|
||||||
#include "Creature.h"
|
#include "Creature.h"
|
||||||
#include "GameObject.h"
|
#include "GameObject.h"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -227,9 +227,11 @@ void WorldSession::HandleGameObjectQueryOpcode( WorldPacket & recv_data )
|
||||||
{
|
{
|
||||||
|
|
||||||
std::string Name;
|
std::string Name;
|
||||||
|
std::string IconName;
|
||||||
std::string CastBarCaption;
|
std::string CastBarCaption;
|
||||||
|
|
||||||
Name = info->name;
|
Name = info->name;
|
||||||
|
IconName = info->IconName;
|
||||||
CastBarCaption = info->castBarCaption;
|
CastBarCaption = info->castBarCaption;
|
||||||
|
|
||||||
int loc_idx = GetSessionDbLocaleIndex();
|
int loc_idx = GetSessionDbLocaleIndex();
|
||||||
|
|
@ -251,7 +253,7 @@ void WorldSession::HandleGameObjectQueryOpcode( WorldPacket & recv_data )
|
||||||
data << uint32(info->displayId);
|
data << uint32(info->displayId);
|
||||||
data << Name;
|
data << Name;
|
||||||
data << uint8(0) << uint8(0) << uint8(0); // name2, name3, name4
|
data << uint8(0) << uint8(0) << uint8(0); // name2, name3, name4
|
||||||
data << uint8(0); // 2.0.3, string
|
data << IconName; // 2.0.3, string. Icon name to use instead of default icon for go's (ex: "Attack" makes sword)
|
||||||
data << CastBarCaption; // 2.0.3, string. Text will appear in Cast Bar when using GO (ex: "Collecting")
|
data << CastBarCaption; // 2.0.3, string. Text will appear in Cast Bar when using GO (ex: "Collecting")
|
||||||
data << uint8(0); // 2.0.3, string
|
data << uint8(0); // 2.0.3, string
|
||||||
data.append(info->raw.data, 24);
|
data.append(info->raw.data, 24);
|
||||||
|
|
|
||||||
|
|
@ -444,7 +444,6 @@ void ReputationMgr::LoadFromDB(QueryResult *result)
|
||||||
|
|
||||||
void ReputationMgr::SaveToDB()
|
void ReputationMgr::SaveToDB()
|
||||||
{
|
{
|
||||||
CharacterDatabase.BeginTransaction();
|
|
||||||
for(FactionStateList::iterator itr = m_factions.begin(); itr != m_factions.end(); ++itr)
|
for(FactionStateList::iterator itr = m_factions.begin(); itr != m_factions.end(); ++itr)
|
||||||
{
|
{
|
||||||
if (itr->second.Changed)
|
if (itr->second.Changed)
|
||||||
|
|
@ -454,7 +453,6 @@ void ReputationMgr::SaveToDB()
|
||||||
itr->second.Changed = false;
|
itr->second.Changed = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CharacterDatabase.CommitTransaction();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReputationMgr::UpdateRankCounters( ReputationRank old_rank, ReputationRank new_rank )
|
void ReputationMgr::UpdateRankCounters( ReputationRank old_rank, ReputationRank new_rank )
|
||||||
|
|
|
||||||
|
|
@ -347,7 +347,7 @@ enum ItemQualities
|
||||||
#define SPELL_ATTR_EX4_UNK3 0x00000008 // 3
|
#define SPELL_ATTR_EX4_UNK3 0x00000008 // 3
|
||||||
#define SPELL_ATTR_EX4_UNK4 0x00000010 // 4 This will no longer cause guards to attack on use??
|
#define SPELL_ATTR_EX4_UNK4 0x00000010 // 4 This will no longer cause guards to attack on use??
|
||||||
#define SPELL_ATTR_EX4_UNK5 0x00000020 // 5
|
#define SPELL_ATTR_EX4_UNK5 0x00000020 // 5
|
||||||
#define SPELL_ATTR_EX4_UNK6 0x00000040 // 6
|
#define SPELL_ATTR_EX4_NOT_STEALABLE 0x00000040 // 6 although such auras might be dispellable, they cannot be stolen
|
||||||
#define SPELL_ATTR_EX4_UNK7 0x00000080 // 7
|
#define SPELL_ATTR_EX4_UNK7 0x00000080 // 7
|
||||||
#define SPELL_ATTR_EX4_UNK8 0x00000100 // 8
|
#define SPELL_ATTR_EX4_UNK8 0x00000100 // 8
|
||||||
#define SPELL_ATTR_EX4_UNK9 0x00000200 // 9
|
#define SPELL_ATTR_EX4_UNK9 0x00000200 // 9
|
||||||
|
|
|
||||||
|
|
@ -593,6 +593,9 @@ void Spell::FillTargetMap()
|
||||||
case SPELL_EFFECT_REPUTATION:
|
case SPELL_EFFECT_REPUTATION:
|
||||||
if(m_targets.getUnitTarget())
|
if(m_targets.getUnitTarget())
|
||||||
tmpUnitMap.push_back(m_targets.getUnitTarget());
|
tmpUnitMap.push_back(m_targets.getUnitTarget());
|
||||||
|
// Triggered spells have additional spell targets - cast them even if no explicit unit target is given (required for spell 50516 for example)
|
||||||
|
else if(m_spellInfo->Effect[i] == SPELL_EFFECT_TRIGGER_SPELL)
|
||||||
|
tmpUnitMap.push_back(m_caster);
|
||||||
break;
|
break;
|
||||||
case SPELL_EFFECT_SUMMON_PLAYER:
|
case SPELL_EFFECT_SUMMON_PLAYER:
|
||||||
if(m_caster->GetTypeId()==TYPEID_PLAYER && ((Player*)m_caster)->GetSelection())
|
if(m_caster->GetTypeId()==TYPEID_PLAYER && ((Player*)m_caster)->GetSelection())
|
||||||
|
|
@ -975,7 +978,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
|
||||||
// Get original caster (if exist) and calculate damage/healing from him data
|
// Get original caster (if exist) and calculate damage/healing from him data
|
||||||
Unit *caster = m_originalCaster ? m_originalCaster : m_caster;
|
Unit *caster = m_originalCaster ? m_originalCaster : m_caster;
|
||||||
|
|
||||||
// Skip if m_originalCaster not avaiable
|
// Skip if m_originalCaster not available
|
||||||
if (!caster)
|
if (!caster)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
@ -1067,17 +1070,21 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
|
||||||
caster->ProcDamageAndSpell(unit, procAttacker, procVictim, procEx, 0, m_attackType, m_spellInfo);
|
caster->ProcDamageAndSpell(unit, procAttacker, procVictim, procEx, 0, m_attackType, m_spellInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call scripted function for AI if this spell is casted upon a creature (except pets)
|
// Call scripted function for AI if this spell is casted upon a creature
|
||||||
if(IS_CREATURE_GUID(target->targetGUID))
|
if(unit->GetTypeId()==TYPEID_UNIT)
|
||||||
{
|
{
|
||||||
// cast at creature (or GO) quest objectives update at successful cast finished (+channel finished)
|
// cast at creature (or GO) quest objectives update at successful cast finished (+channel finished)
|
||||||
// ignore autorepeat/melee casts for speed (not exist quest for spells (hm... )
|
// ignore pets or autorepeat/melee casts for speed (not exist quest for spells (hm... )
|
||||||
if( m_caster->GetTypeId() == TYPEID_PLAYER && !IsAutoRepeat() && !IsNextMeleeSwingSpell() && !IsChannelActive() )
|
if( !((Creature*)unit)->isPet() && m_caster->GetTypeId() == TYPEID_PLAYER && !IsAutoRepeat() && !IsNextMeleeSwingSpell() && !IsChannelActive() )
|
||||||
((Player*)m_caster)->CastedCreatureOrGO(unit->GetEntry(),unit->GetGUID(),m_spellInfo->Id);
|
((Player*)m_caster)->CastedCreatureOrGO(unit->GetEntry(),unit->GetGUID(),m_spellInfo->Id);
|
||||||
|
|
||||||
if(((Creature*)unit)->AI())
|
if(((Creature*)unit)->AI())
|
||||||
((Creature*)unit)->AI()->SpellHit(m_caster ,m_spellInfo);
|
((Creature*)unit)->AI()->SpellHit(m_caster ,m_spellInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Call scripted function for AI if this spell is casted by a creature
|
||||||
|
if(m_caster->GetTypeId()==TYPEID_UNIT && ((Creature*)m_caster)->AI())
|
||||||
|
((Creature*)m_caster)->AI()->SpellHitTarget(unit,m_spellInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
|
void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
|
||||||
|
|
@ -4745,8 +4752,9 @@ SpellCastResult Spell::CheckRange(bool strict)
|
||||||
|
|
||||||
if(target && target != m_caster)
|
if(target && target != m_caster)
|
||||||
{
|
{
|
||||||
// distance from target center in checks
|
// distance from target in checks
|
||||||
float dist = m_caster->GetDistance(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ());
|
float dist = m_caster->GetCombatDistance(target);
|
||||||
|
|
||||||
if(dist > max_range)
|
if(dist > max_range)
|
||||||
return SPELL_FAILED_OUT_OF_RANGE; //0x5A;
|
return SPELL_FAILED_OUT_OF_RANGE; //0x5A;
|
||||||
if(dist < min_range)
|
if(dist < min_range)
|
||||||
|
|
|
||||||
|
|
@ -1253,6 +1253,7 @@ void Aura::HandleAddModifier(bool apply, bool Real)
|
||||||
case 34754: // Clearcasting
|
case 34754: // Clearcasting
|
||||||
case 34936: // Backlash
|
case 34936: // Backlash
|
||||||
case 48108: // Hot Streak
|
case 48108: // Hot Streak
|
||||||
|
case 51124: // Killing Machine
|
||||||
case 54741: // Firestarter
|
case 54741: // Firestarter
|
||||||
case 57761: // Fireball!
|
case 57761: // Fireball!
|
||||||
SetAuraCharges(1);
|
SetAuraCharges(1);
|
||||||
|
|
@ -2257,7 +2258,7 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
|
||||||
mod->value = m_modifier.m_amount;
|
mod->value = m_modifier.m_amount;
|
||||||
mod->type = SPELLMOD_PCT;
|
mod->type = SPELLMOD_PCT;
|
||||||
mod->spellId = GetId();
|
mod->spellId = GetId();
|
||||||
mod->mask = 0x0000000200000000LL;
|
mod->mask = 0x0000200000000000LL;
|
||||||
mod->mask2= 0LL;
|
mod->mask2= 0LL;
|
||||||
m_spellmod = mod;
|
m_spellmod = mod;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -294,7 +294,7 @@ void Spell::EffectEnvirinmentalDMG(uint32 i)
|
||||||
// Note: this hack with damage replace required until GO casting not implemented
|
// Note: this hack with damage replace required until GO casting not implemented
|
||||||
// environment damage spells already have around enemies targeting but this not help in case not existed GO casting support
|
// environment damage spells already have around enemies targeting but this not help in case not existed GO casting support
|
||||||
// currently each enemy selected explicitly and self cast damage, we prevent apply self casted spell bonuses/etc
|
// currently each enemy selected explicitly and self cast damage, we prevent apply self casted spell bonuses/etc
|
||||||
damage = m_spellInfo->EffectBasePoints[i]+m_spellInfo->EffectBaseDice[i];
|
damage = m_spellInfo->CalculateSimpleValue(i);
|
||||||
|
|
||||||
m_caster->CalcAbsorbResist(m_caster,GetSpellSchoolMask(m_spellInfo), SPELL_DIRECT_DAMAGE, damage, &absorb, &resist);
|
m_caster->CalcAbsorbResist(m_caster,GetSpellSchoolMask(m_spellInfo), SPELL_DIRECT_DAMAGE, damage, &absorb, &resist);
|
||||||
|
|
||||||
|
|
@ -1056,7 +1056,7 @@ void Spell::EffectDummy(uint32 i)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pCreature->SetHealth(health);
|
pCreature->SetHealth(health);
|
||||||
((Player*)m_caster)->KilledMonster(16992,pCreature->GetGUID());
|
((Player*)m_caster)->RewardPlayerAndGroupAtEvent(16992,pCreature);
|
||||||
|
|
||||||
if (pCreature->AI())
|
if (pCreature->AI())
|
||||||
pCreature->AI()->AttackStart(m_caster);
|
pCreature->AI()->AttackStart(m_caster);
|
||||||
|
|
@ -1107,6 +1107,24 @@ void Spell::EffectDummy(uint32 i)
|
||||||
m_caster->CastSpell(m_caster, 30452, true, NULL);
|
m_caster->CastSpell(m_caster, 30452, true, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
case 52308:
|
||||||
|
{
|
||||||
|
switch(i)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
uint32 spellID = m_spellInfo->CalculateSimpleValue(0);
|
||||||
|
uint32 reqAuraID = m_spellInfo->CalculateSimpleValue(1);
|
||||||
|
|
||||||
|
if (m_caster->HasAura(reqAuraID,0))
|
||||||
|
m_caster->CastSpell(m_caster,spellID,true,NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
return; // additional data for dummy[0]
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
case 53341:
|
case 53341:
|
||||||
case 53343:
|
case 53343:
|
||||||
{
|
{
|
||||||
|
|
@ -1114,21 +1132,8 @@ void Spell::EffectDummy(uint32 i)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case 58418: // Portal to Orgrimmar
|
case 58418: // Portal to Orgrimmar
|
||||||
{
|
|
||||||
if(!unitTarget)
|
|
||||||
return;
|
|
||||||
|
|
||||||
unitTarget->CastSpell(unitTarget, 58419, true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case 58420: // Portal to Stormwind
|
case 58420: // Portal to Stormwind
|
||||||
{
|
return; // implemented in EffectScript[0]
|
||||||
if(!unitTarget)
|
|
||||||
return;
|
|
||||||
|
|
||||||
unitTarget->CastSpell(unitTarget, 58421, true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//All IconID Check in there
|
//All IconID Check in there
|
||||||
|
|
@ -1340,31 +1345,6 @@ void Spell::EffectDummy(uint32 i)
|
||||||
m_caster->CastSpell(unitTarget, hurt, true, 0);
|
m_caster->CastSpell(unitTarget, hurt, true, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch(m_spellInfo->Id )
|
|
||||||
{
|
|
||||||
case 28598: // Touch of Weakness triggered spell
|
|
||||||
{
|
|
||||||
if(!unitTarget || !m_triggeredByAuraSpell)
|
|
||||||
return;
|
|
||||||
|
|
||||||
uint32 spellid = 0;
|
|
||||||
switch(m_triggeredByAuraSpell->Id)
|
|
||||||
{
|
|
||||||
case 2652: spellid = 2943; break; // Rank 1
|
|
||||||
case 19261: spellid = 19249; break; // Rank 2
|
|
||||||
case 19262: spellid = 19251; break; // Rank 3
|
|
||||||
case 19264: spellid = 19252; break; // Rank 4
|
|
||||||
case 19265: spellid = 19253; break; // Rank 5
|
|
||||||
case 19266: spellid = 19254; break; // Rank 6
|
|
||||||
case 25461: spellid = 25460; break; // Rank 7
|
|
||||||
default:
|
|
||||||
sLog.outError("Spell::EffectDummy: Spell 28598 triggered by unhandeled spell %u",m_triggeredByAuraSpell->Id);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
m_caster->CastSpell(unitTarget, spellid, true, NULL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case SPELLFAMILY_DRUID:
|
case SPELLFAMILY_DRUID:
|
||||||
// Starfall
|
// Starfall
|
||||||
|
|
@ -4285,11 +4265,9 @@ void Spell::EffectWeaponDmg(uint32 i)
|
||||||
}
|
}
|
||||||
|
|
||||||
// some spell specific modifiers
|
// some spell specific modifiers
|
||||||
bool customBonusDamagePercentMod = false;
|
|
||||||
bool spellBonusNeedWeaponDamagePercentMod = false; // if set applied weapon damage percent mode to spell bonus
|
bool spellBonusNeedWeaponDamagePercentMod = false; // if set applied weapon damage percent mode to spell bonus
|
||||||
|
|
||||||
float bonusDamagePercentMod = 1.0f; // applied to fixed effect damage bonus if set customBonusDamagePercentMod
|
float weaponDamagePercentMod = 1.0f; // applied to weapon damage and to fixed effect damage bonus
|
||||||
float weaponDamagePercentMod = 1.0f; // applied to weapon damage (and to fixed effect damage bonus if customBonusDamagePercentMod not set
|
|
||||||
float totalDamagePercentMod = 1.0f; // applied to final bonus+weapon damage
|
float totalDamagePercentMod = 1.0f; // applied to final bonus+weapon damage
|
||||||
bool normalized = false;
|
bool normalized = false;
|
||||||
|
|
||||||
|
|
@ -4328,14 +4306,8 @@ void Spell::EffectWeaponDmg(uint32 i)
|
||||||
}
|
}
|
||||||
case SPELLFAMILY_ROGUE:
|
case SPELLFAMILY_ROGUE:
|
||||||
{
|
{
|
||||||
// Ambush
|
|
||||||
if(m_spellInfo->SpellFamilyFlags & 0x00000200LL)
|
|
||||||
{
|
|
||||||
customBonusDamagePercentMod = true;
|
|
||||||
bonusDamagePercentMod = 2.5f; // 250%
|
|
||||||
}
|
|
||||||
// Mutilate (for each hand)
|
// Mutilate (for each hand)
|
||||||
else if(m_spellInfo->SpellFamilyFlags & 0x600000000LL)
|
if(m_spellInfo->SpellFamilyFlags & 0x600000000LL)
|
||||||
{
|
{
|
||||||
bool found = false;
|
bool found = false;
|
||||||
// fast check
|
// fast check
|
||||||
|
|
@ -4408,10 +4380,7 @@ void Spell::EffectWeaponDmg(uint32 i)
|
||||||
weaponDamagePercentMod *= float(CalculateDamage(j,unitTarget)) / 100.0f;
|
weaponDamagePercentMod *= float(CalculateDamage(j,unitTarget)) / 100.0f;
|
||||||
|
|
||||||
// applied only to prev.effects fixed damage
|
// applied only to prev.effects fixed damage
|
||||||
if(customBonusDamagePercentMod)
|
fixed_bonus = int32(fixed_bonus*weaponDamagePercentMod);
|
||||||
fixed_bonus = int32(fixed_bonus*bonusDamagePercentMod);
|
|
||||||
else
|
|
||||||
fixed_bonus = int32(fixed_bonus*weaponDamagePercentMod);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break; // not weapon damage effect, just skip
|
break; // not weapon damage effect, just skip
|
||||||
|
|
@ -4875,6 +4844,20 @@ void Spell::EffectScriptEffect(uint32 effIndex)
|
||||||
unitTarget->CastSpell(unitTarget, damage, false);
|
unitTarget->CastSpell(unitTarget, damage, false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 58418: // Portal to Orgrimmar
|
||||||
|
case 58420: // Portal to Stormwind
|
||||||
|
{
|
||||||
|
if(!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER || effIndex!=0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
uint32 spellID = m_spellInfo->CalculateSimpleValue(0);
|
||||||
|
uint32 questID = m_spellInfo->CalculateSimpleValue(1);
|
||||||
|
|
||||||
|
if( ((Player*)unitTarget)->GetQuestStatus(questID) == QUEST_STATUS_COMPLETE && !((Player*)unitTarget)->GetQuestRewardStatus (questID) )
|
||||||
|
unitTarget->CastSpell(unitTarget, spellID, true);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
// random spell learn instead placeholder
|
// random spell learn instead placeholder
|
||||||
case 60893: // Northrend Alchemy Research
|
case 60893: // Northrend Alchemy Research
|
||||||
case 61177: // Northrend Inscription Research
|
case 61177: // Northrend Inscription Research
|
||||||
|
|
@ -6454,7 +6437,7 @@ void Spell::EffectStealBeneficialBuff(uint32 i)
|
||||||
if (aur && (1<<aur->GetSpellProto()->Dispel) & dispelMask)
|
if (aur && (1<<aur->GetSpellProto()->Dispel) & dispelMask)
|
||||||
{
|
{
|
||||||
// Need check for passive? this
|
// Need check for passive? this
|
||||||
if (aur->IsPositive() && !aur->IsPassive())
|
if (aur->IsPositive() && !aur->IsPassive() && !(aur->GetSpellProto()->AttributesEx4 & SPELL_ATTR_EX4_NOT_STEALABLE))
|
||||||
steal_list.push_back(aur);
|
steal_list.push_back(aur);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -6512,7 +6495,7 @@ void Spell::EffectKillCredit(uint32 i)
|
||||||
if(!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
|
if(!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
((Player*)unitTarget)->KilledMonster(m_spellInfo->EffectMiscValue[i], 0);
|
((Player*)unitTarget)->RewardPlayerAndGroupAtEvent(m_spellInfo->EffectMiscValue[i], unitTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Spell::EffectQuestFail(uint32 i)
|
void Spell::EffectQuestFail(uint32 i)
|
||||||
|
|
|
||||||
|
|
@ -122,7 +122,8 @@ int32 CompareAuraRanks(uint32 spellId_1, uint32 effIndex_1, uint32 spellId_2, ui
|
||||||
if (spellId_1 == spellId_2) return 0;
|
if (spellId_1 == spellId_2) return 0;
|
||||||
|
|
||||||
int32 diff = spellInfo_1->EffectBasePoints[effIndex_1] - spellInfo_2->EffectBasePoints[effIndex_2];
|
int32 diff = spellInfo_1->EffectBasePoints[effIndex_1] - spellInfo_2->EffectBasePoints[effIndex_2];
|
||||||
if (spellInfo_1->EffectBasePoints[effIndex_1]+1 < 0 && spellInfo_2->EffectBasePoints[effIndex_2]+1 < 0) return -diff;
|
if (spellInfo_1->CalculateSimpleValue(effIndex_1) < 0 && spellInfo_2->CalculateSimpleValue(effIndex_2) < 0)
|
||||||
|
return -diff;
|
||||||
else return diff;
|
else return diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -339,7 +340,7 @@ bool IsPositiveEffect(uint32 spellId, uint32 effIndex)
|
||||||
case SPELL_AURA_MOD_DAMAGE_DONE: // dependent from bas point sign (negative -> negative)
|
case SPELL_AURA_MOD_DAMAGE_DONE: // dependent from bas point sign (negative -> negative)
|
||||||
case SPELL_AURA_MOD_HEALING_DONE:
|
case SPELL_AURA_MOD_HEALING_DONE:
|
||||||
{
|
{
|
||||||
if(spellproto->EffectBasePoints[effIndex]+int32(spellproto->EffectBaseDice[effIndex]) < 0)
|
if(spellproto->CalculateSimpleValue(effIndex) < 0)
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -437,7 +438,7 @@ bool IsPositiveEffect(uint32 spellId, uint32 effIndex)
|
||||||
switch(spellproto->EffectMiscValue[effIndex])
|
switch(spellproto->EffectMiscValue[effIndex])
|
||||||
{
|
{
|
||||||
case SPELLMOD_COST: // dependent from bas point sign (negative -> positive)
|
case SPELLMOD_COST: // dependent from bas point sign (negative -> positive)
|
||||||
if(spellproto->EffectBasePoints[effIndex]+int32(spellproto->EffectBaseDice[effIndex]) > 0)
|
if(spellproto->CalculateSimpleValue(effIndex) > 0)
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
@ -445,11 +446,11 @@ bool IsPositiveEffect(uint32 spellId, uint32 effIndex)
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case SPELL_AURA_MOD_HEALING_PCT:
|
case SPELL_AURA_MOD_HEALING_PCT:
|
||||||
if(spellproto->EffectBasePoints[effIndex]+int32(spellproto->EffectBaseDice[effIndex]) < 0)
|
if(spellproto->CalculateSimpleValue(effIndex) < 0)
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
case SPELL_AURA_MOD_SKILL:
|
case SPELL_AURA_MOD_SKILL:
|
||||||
if(spellproto->EffectBasePoints[effIndex]+int32(spellproto->EffectBaseDice[effIndex]) < 0)
|
if(spellproto->CalculateSimpleValue(effIndex) < 0)
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
case SPELL_AURA_FORCE_REACTION:
|
case SPELL_AURA_FORCE_REACTION:
|
||||||
|
|
@ -1774,10 +1775,10 @@ void SpellMgr::LoadSpellLearnSkills()
|
||||||
SpellLearnSkillNode dbc_node;
|
SpellLearnSkillNode dbc_node;
|
||||||
dbc_node.skill = entry->EffectMiscValue[i];
|
dbc_node.skill = entry->EffectMiscValue[i];
|
||||||
if ( dbc_node.skill != SKILL_RIDING )
|
if ( dbc_node.skill != SKILL_RIDING )
|
||||||
dbc_node.value = 1;
|
dbc_node.value = 1;
|
||||||
else
|
else
|
||||||
dbc_node.value = (entry->EffectBasePoints[i]+1)*75;
|
dbc_node.value = entry->CalculateSimpleValue(i)*75;
|
||||||
dbc_node.maxvalue = (entry->EffectBasePoints[i]+1)*75;
|
dbc_node.maxvalue = entry->CalculateSimpleValue(i)*75;
|
||||||
|
|
||||||
mSpellLearnSkills[spell] = dbc_node;
|
mSpellLearnSkills[spell] = dbc_node;
|
||||||
++dbc_count;
|
++dbc_count;
|
||||||
|
|
@ -2095,7 +2096,7 @@ void SpellMgr::LoadSpellPetAuras()
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
PetAura pa(pet, aura, spellInfo->EffectImplicitTargetA[i] == TARGET_PET, spellInfo->EffectBasePoints[i] + spellInfo->EffectBaseDice[i]);
|
PetAura pa(pet, aura, spellInfo->EffectImplicitTargetA[i] == TARGET_PET, spellInfo->CalculateSimpleValue(i));
|
||||||
mSpellPetAuraMap[spell] = pa;
|
mSpellPetAuraMap[spell] = pa;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2275,8 +2275,8 @@ bool Unit::isSpellBlocked(Unit *pVictim, SpellEntry const *spellProto, WeaponAtt
|
||||||
((Creature*)pVictim)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK )
|
((Creature*)pVictim)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
float blockChance = GetUnitBlockChance();
|
float blockChance = pVictim->GetUnitBlockChance();
|
||||||
blockChance += (GetWeaponSkillValue(attackType) - pVictim->GetMaxSkillValueForLevel() )*0.04;
|
blockChance += (int32(GetWeaponSkillValue(attackType)) - int32(pVictim->GetMaxSkillValueForLevel()))*0.04f;
|
||||||
if (roll_chance_f(blockChance))
|
if (roll_chance_f(blockChance))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -6355,7 +6355,7 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
|
||||||
}
|
}
|
||||||
// percent stored in effect 1 (class scripts) base points
|
// percent stored in effect 1 (class scripts) base points
|
||||||
int32 cost = originalSpell->manaCost + originalSpell->ManaCostPercentage * GetCreateMana() / 100;
|
int32 cost = originalSpell->manaCost + originalSpell->ManaCostPercentage * GetCreateMana() / 100;
|
||||||
basepoints0 = cost*(auraSpellInfo->EffectBasePoints[1]+1)/100;
|
basepoints0 = cost*auraSpellInfo->CalculateSimpleValue(1)/100;
|
||||||
trigger_spell_id = 20272;
|
trigger_spell_id = 20272;
|
||||||
target = this;
|
target = this;
|
||||||
}
|
}
|
||||||
|
|
@ -7360,6 +7360,16 @@ Unit* Unit::GetCharm() const
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float Unit::GetCombatDistance( const Unit* target ) const
|
||||||
|
{
|
||||||
|
float radius = target->GetFloatValue(UNIT_FIELD_COMBATREACH) + GetFloatValue(UNIT_FIELD_COMBATREACH);
|
||||||
|
float dx = GetPositionX() - target->GetPositionX();
|
||||||
|
float dy = GetPositionY() - target->GetPositionY();
|
||||||
|
float dz = GetPositionZ() - target->GetPositionZ();
|
||||||
|
float dist = sqrt((dx*dx) + (dy*dy) + (dz*dz)) - radius;
|
||||||
|
return ( dist > 0 ? dist : 0);
|
||||||
|
}
|
||||||
|
|
||||||
void Unit::SetPet(Pet* pet)
|
void Unit::SetPet(Pet* pet)
|
||||||
{
|
{
|
||||||
SetUInt64Value(UNIT_FIELD_SUMMON, pet ? pet->GetGUID() : 0);
|
SetUInt64Value(UNIT_FIELD_SUMMON, pet ? pet->GetGUID() : 0);
|
||||||
|
|
@ -7680,8 +7690,8 @@ uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint3
|
||||||
DotTicks = DotDuration / spellProto->EffectAmplitude[x];
|
DotTicks = DotDuration / spellProto->EffectAmplitude[x];
|
||||||
if(DotTicks)
|
if(DotTicks)
|
||||||
{
|
{
|
||||||
DoneAdvertisedBenefit /= DotTicks*int32(stack);
|
DoneAdvertisedBenefit = DoneAdvertisedBenefit * int32(stack) / DotTicks;
|
||||||
TakenAdvertisedBenefit /= DotTicks*int32(stack);
|
TakenAdvertisedBenefit = TakenAdvertisedBenefit * int32(stack) / DotTicks;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -8098,8 +8108,8 @@ uint32 Unit::SpellHealingBonus(Unit *pVictim, SpellEntry const *spellProto, uint
|
||||||
DotTicks = DotDuration / spellProto->EffectAmplitude[x];
|
DotTicks = DotDuration / spellProto->EffectAmplitude[x];
|
||||||
if(DotTicks)
|
if(DotTicks)
|
||||||
{
|
{
|
||||||
DoneAdvertisedBenefit /= DotTicks*int32(stack);
|
DoneAdvertisedBenefit = DoneAdvertisedBenefit * int32(stack) / DotTicks;
|
||||||
TakenAdvertisedBenefit /= DotTicks*int32(stack);
|
TakenAdvertisedBenefit = TakenAdvertisedBenefit * int32(stack) / DotTicks;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1113,6 +1113,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
Player* GetCharmerOrOwnerPlayerOrPlayerItself();
|
Player* GetCharmerOrOwnerPlayerOrPlayerItself();
|
||||||
|
float GetCombatDistance( const Unit* target ) const;
|
||||||
|
|
||||||
void SetPet(Pet* pet);
|
void SetPet(Pet* pet);
|
||||||
void SetCharm(Unit* pet);
|
void SetCharm(Unit* pet);
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "Utilities/UnorderedMap.h"
|
#include "Utilities/UnorderedMap.h"
|
||||||
|
#include "Policies/Singleton.h"
|
||||||
|
|
||||||
#define MAX_WAYPOINT_TEXT 5
|
#define MAX_WAYPOINT_TEXT 5
|
||||||
struct WaypointBehavior
|
struct WaypointBehavior
|
||||||
|
|
|
||||||
|
|
@ -75,16 +75,6 @@ float World::m_MaxVisibleDistanceInFlight = DEFAULT_VISIBILITY_DISTANCE;
|
||||||
float World::m_VisibleUnitGreyDistance = 0;
|
float World::m_VisibleUnitGreyDistance = 0;
|
||||||
float World::m_VisibleObjectGreyDistance = 0;
|
float World::m_VisibleObjectGreyDistance = 0;
|
||||||
|
|
||||||
// ServerMessages.dbc
|
|
||||||
enum ServerMessageType
|
|
||||||
{
|
|
||||||
SERVER_MSG_SHUTDOWN_TIME = 1,
|
|
||||||
SERVER_MSG_RESTART_TIME = 2,
|
|
||||||
SERVER_MSG_STRING = 3,
|
|
||||||
SERVER_MSG_SHUTDOWN_CANCELLED = 4,
|
|
||||||
SERVER_MSG_RESTART_CANCELLED = 5
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ScriptAction
|
struct ScriptAction
|
||||||
{
|
{
|
||||||
uint64 sourceGUID;
|
uint64 sourceGUID;
|
||||||
|
|
@ -2640,7 +2630,7 @@ void World::ShutdownMsg(bool show, Player* player)
|
||||||
{
|
{
|
||||||
std::string str = secsToTimeString(m_ShutdownTimer);
|
std::string str = secsToTimeString(m_ShutdownTimer);
|
||||||
|
|
||||||
uint32 msgid = (m_ShutdownMask & SHUTDOWN_MASK_RESTART) ? SERVER_MSG_RESTART_TIME : SERVER_MSG_SHUTDOWN_TIME;
|
ServerMessageType msgid = (m_ShutdownMask & SHUTDOWN_MASK_RESTART) ? SERVER_MSG_RESTART_TIME : SERVER_MSG_SHUTDOWN_TIME;
|
||||||
|
|
||||||
SendServerMessage(msgid,str.c_str(),player);
|
SendServerMessage(msgid,str.c_str(),player);
|
||||||
DEBUG_LOG("Server is %s in %s",(m_ShutdownMask & SHUTDOWN_MASK_RESTART ? "restart" : "shuttingdown"),str.c_str());
|
DEBUG_LOG("Server is %s in %s",(m_ShutdownMask & SHUTDOWN_MASK_RESTART ? "restart" : "shuttingdown"),str.c_str());
|
||||||
|
|
@ -2654,7 +2644,7 @@ void World::ShutdownCancel()
|
||||||
if(!m_ShutdownTimer || m_stopEvent)
|
if(!m_ShutdownTimer || m_stopEvent)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint32 msgid = (m_ShutdownMask & SHUTDOWN_MASK_RESTART) ? SERVER_MSG_RESTART_CANCELLED : SERVER_MSG_SHUTDOWN_CANCELLED;
|
ServerMessageType msgid = (m_ShutdownMask & SHUTDOWN_MASK_RESTART) ? SERVER_MSG_RESTART_CANCELLED : SERVER_MSG_SHUTDOWN_CANCELLED;
|
||||||
|
|
||||||
m_ShutdownMask = 0;
|
m_ShutdownMask = 0;
|
||||||
m_ShutdownTimer = 0;
|
m_ShutdownTimer = 0;
|
||||||
|
|
@ -2665,7 +2655,7 @@ void World::ShutdownCancel()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Send a server message to the user(s)
|
/// Send a server message to the user(s)
|
||||||
void World::SendServerMessage(uint32 type, const char *text, Player* player)
|
void World::SendServerMessage(ServerMessageType type, const char *text, Player* player)
|
||||||
{
|
{
|
||||||
WorldPacket data(SMSG_SERVER_MESSAGE, 50); // guess size
|
WorldPacket data(SMSG_SERVER_MESSAGE, 50); // guess size
|
||||||
data << uint32(type);
|
data << uint32(type);
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,16 @@ class SqlResultQueue;
|
||||||
class QueryResult;
|
class QueryResult;
|
||||||
class WorldSocket;
|
class WorldSocket;
|
||||||
|
|
||||||
|
// ServerMessages.dbc
|
||||||
|
enum ServerMessageType
|
||||||
|
{
|
||||||
|
SERVER_MSG_SHUTDOWN_TIME = 1,
|
||||||
|
SERVER_MSG_RESTART_TIME = 2,
|
||||||
|
SERVER_MSG_STRING = 3,
|
||||||
|
SERVER_MSG_SHUTDOWN_CANCELLED = 4,
|
||||||
|
SERVER_MSG_RESTART_CANCELLED = 5
|
||||||
|
};
|
||||||
|
|
||||||
enum ShutdownMask
|
enum ShutdownMask
|
||||||
{
|
{
|
||||||
SHUTDOWN_MASK_RESTART = 1,
|
SHUTDOWN_MASK_RESTART = 1,
|
||||||
|
|
@ -423,7 +433,7 @@ class World
|
||||||
void SendGlobalMessage(WorldPacket *packet, WorldSession *self = 0, uint32 team = 0);
|
void SendGlobalMessage(WorldPacket *packet, WorldSession *self = 0, uint32 team = 0);
|
||||||
void SendZoneMessage(uint32 zone, WorldPacket *packet, WorldSession *self = 0, uint32 team = 0);
|
void SendZoneMessage(uint32 zone, WorldPacket *packet, WorldSession *self = 0, uint32 team = 0);
|
||||||
void SendZoneText(uint32 zone, const char *text, WorldSession *self = 0, uint32 team = 0);
|
void SendZoneText(uint32 zone, const char *text, WorldSession *self = 0, uint32 team = 0);
|
||||||
void SendServerMessage(uint32 type, const char *text = "", Player* player = NULL);
|
void SendServerMessage(ServerMessageType type, const char *text = "", Player* player = NULL);
|
||||||
|
|
||||||
/// Are we in the middle of a shutdown?
|
/// Are we in the middle of a shutdown?
|
||||||
bool IsShutdowning() const { return m_ShutdownTimer > 0; }
|
bool IsShutdowning() const { return m_ShutdownTimer > 0; }
|
||||||
|
|
|
||||||
|
|
@ -166,12 +166,15 @@ bool ChatHandler::HandleAccountOnlineListCommand(const char* args)
|
||||||
///- Get the list of accounts ID logged to the realm
|
///- Get the list of accounts ID logged to the realm
|
||||||
QueryResult *resultDB = CharacterDatabase.Query("SELECT name,account FROM characters WHERE online > 0");
|
QueryResult *resultDB = CharacterDatabase.Query("SELECT name,account FROM characters WHERE online > 0");
|
||||||
if (!resultDB)
|
if (!resultDB)
|
||||||
|
{
|
||||||
|
SendSysMessage(LANG_ACCOUNT_LIST_EMPTY);
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
///- Display the list of account/characters online
|
///- Display the list of account/characters online
|
||||||
SendSysMessage("=====================================================================");
|
SendSysMessage(LANG_ACCOUNT_LIST_BAR);
|
||||||
SendSysMessage(LANG_ACCOUNT_LIST_HEADER);
|
SendSysMessage(LANG_ACCOUNT_LIST_HEADER);
|
||||||
SendSysMessage("=====================================================================");
|
SendSysMessage(LANG_ACCOUNT_LIST_BAR);
|
||||||
|
|
||||||
///- Circle through accounts
|
///- Circle through accounts
|
||||||
do
|
do
|
||||||
|
|
@ -188,7 +191,7 @@ bool ChatHandler::HandleAccountOnlineListCommand(const char* args)
|
||||||
if(resultLogin)
|
if(resultLogin)
|
||||||
{
|
{
|
||||||
Field *fieldsLogin = resultLogin->Fetch();
|
Field *fieldsLogin = resultLogin->Fetch();
|
||||||
PSendSysMessage("|%15s| %20s | %15s |%4d|%5d|",
|
PSendSysMessage(LANG_ACCOUNT_LIST_LINE,
|
||||||
fieldsLogin[0].GetString(),name.c_str(),fieldsLogin[1].GetString(),fieldsLogin[2].GetUInt32(),fieldsLogin[3].GetUInt32());
|
fieldsLogin[0].GetString(),name.c_str(),fieldsLogin[1].GetString(),fieldsLogin[2].GetUInt32(),fieldsLogin[3].GetUInt32());
|
||||||
|
|
||||||
delete resultLogin;
|
delete resultLogin;
|
||||||
|
|
@ -200,7 +203,7 @@ bool ChatHandler::HandleAccountOnlineListCommand(const char* args)
|
||||||
|
|
||||||
delete resultDB;
|
delete resultDB;
|
||||||
|
|
||||||
SendSysMessage("=====================================================================");
|
SendSysMessage(LANG_ACCOUNT_LIST_BAR);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,8 +31,8 @@ const char CreatureDataAddonInfofmt[]="iiiiiiis";
|
||||||
const char CreatureModelfmt[]="iffbi";
|
const char CreatureModelfmt[]="iffbi";
|
||||||
const char CreatureInfoAddonInfofmt[]="iiiiiiis";
|
const char CreatureInfoAddonInfofmt[]="iiiiiiis";
|
||||||
const char EquipmentInfofmt[]="iiii";
|
const char EquipmentInfofmt[]="iiii";
|
||||||
const char GameObjectInfosrcfmt[]="iiissiifiiiiiiiiiiiiiiiiiiiiiiiis";
|
const char GameObjectInfosrcfmt[]="iiisssiifiiiiiiiiiiiiiiiiiiiiiiiis";
|
||||||
const char GameObjectInfodstfmt[]="iiissiifiiiiiiiiiiiiiiiiiiiiiiiii";
|
const char GameObjectInfodstfmt[]="iiisssiifiiiiiiiiiiiiiiiiiiiiiiiii";
|
||||||
const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiisiiii";
|
const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiisiiii";
|
||||||
const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiii";
|
const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiii";
|
||||||
const char PageTextfmt[]="isi";
|
const char PageTextfmt[]="isi";
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7552"
|
#define REVISION_NR "7590"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue