Merge branch 'master' into 308

Conflicts:
	src/game/Spell.cpp
This commit is contained in:
tomrus88 2008-12-29 00:50:48 +03:00
commit ec744de8f0
41 changed files with 3910 additions and 3714 deletions

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,706 @@
ALTER TABLE db_version CHANGE COLUMN required_6944_01_mangos_mangos_string required_6958_01_mangos_spell_proc_event bit;
DROP TABLE IF EXISTS `spell_proc_event`;
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for spell_proc_event
-- ----------------------------
CREATE TABLE `spell_proc_event` (
`entry` smallint(6) unsigned NOT NULL default '0',
`SchoolMask` tinyint(4) NOT NULL default '0',
`SpellFamilyName` smallint(6) unsigned NOT NULL default '0',
`SpellFamilyMask` bigint(40) unsigned NOT NULL default '0',
`procFlags` int(10) unsigned NOT NULL default '0',
`procEx` int(10) unsigned NOT NULL default '0',
`ppmRate` float NOT NULL default '0',
`CustomChance` float NOT NULL default '0',
`Cooldown` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`entry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `spell_proc_event` VALUES
(324, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(325, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(905, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(945, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(974, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(1463, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000400, 0, 0, 0),
(3232, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(5952, 0x00000000, 8, 0x0000000100000001, 0x00000000, 0x00000000, 0, 0, 0),
(6346, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000100, 0, 0, 0),
(7383, 0x00000001, 0, 0x0000000000000000, 0x00000000, 0x00000100, 0, 0, 0),
(7434, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(8134, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(8178, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(8494, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000400, 0, 0, 0),
(8495, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000400, 0, 0, 0),
(9452, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(9782, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(9784, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(9799, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(10191, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000400, 0, 0, 0),
(10192, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000400, 0, 0, 0),
(10193, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000400, 0, 0, 0),
(10431, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(10432, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(11095, 0x00000000, 3, 0x0000000000000010, 0x00000000, 0x00000000, 0, 0, 0),
(11103, 0x00000004, 3, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(11119, 0x00000004, 3, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(11120, 0x00000004, 3, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(11129, 0x00000000, 3, 0x0000004000C00017, 0x00000000, 0x00000000, 0, 0, 0),
(11180, 0x00000010, 3, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(11185, 0x00000000, 3, 0x0000000000000080, 0x00050000, 0x00000000, 0, 0, 0),
(11255, 0x00000000, 3, 0x0000000000004000, 0x00000000, 0x00000000, 0, 0, 0),
(12169, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(12281, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 6),
(12289, 0x00000000, 4, 0x0000000000000002, 0x00000000, 0x00000000, 0, 0, 0),
(12298, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(12311, 0x00000000, 4, 0x0000000100000800, 0x00000000, 0x00000000, 0, 0, 0),
(12317, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(12319, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(12322, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 2, 0, 0),
(12357, 0x00000004, 3, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(12358, 0x00000004, 3, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(12487, 0x00000000, 3, 0x0000000000000080, 0x00050000, 0x00000000, 0, 0, 0),
(12488, 0x00000000, 3, 0x0000000000000080, 0x00050000, 0x00000000, 0, 0, 0),
(12598, 0x00000000, 3, 0x0000000000004000, 0x00000000, 0x00000000, 0, 0, 0),
(12668, 0x00000000, 4, 0x0000000000000002, 0x00000000, 0x00000000, 0, 0, 0),
(12724, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(12725, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(12726, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(12727, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(12797, 0x00000000, 4, 0x0000000000000400, 0x00000000, 0x00000000, 0, 0, 0),
(12799, 0x00000000, 4, 0x0000000000000400, 0x00000000, 0x00000000, 0, 0, 0),
(12812, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 6),
(12813, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 6),
(12814, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 6),
(12815, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 6),
(12834, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(12846, 0x00000004, 3, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(12847, 0x00000004, 3, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(12848, 0x00000004, 3, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(12849, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(12867, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(12872, 0x00000000, 3, 0x0000000000000010, 0x00000000, 0x00000000, 0, 0, 0),
(12873, 0x00000000, 3, 0x0000000000000010, 0x00000000, 0x00000000, 0, 0, 0),
(12958, 0x00000000, 4, 0x0000000100000800, 0x00000000, 0x00000000, 0, 0, 0),
(12966, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(12967, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(12968, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(12969, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(12970, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(12971, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(12972, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(12973, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(12974, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(12999, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 4, 0, 0),
(13000, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 6, 0, 0),
(13001, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 8, 0, 0),
(13002, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 10, 0, 0),
(13045, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(13046, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(13047, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(13048, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(13165, 0x00000000, 9, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(13754, 0x00000000, 8, 0x0000000000000010, 0x00000000, 0x00000000, 0, 0, 0),
(13867, 0x00000000, 8, 0x0000000000000010, 0x00000000, 0x00000000, 0, 0, 0),
(13983, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000018, 0, 0, 0),
(14070, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000018, 0, 0, 0),
(14071, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000018, 0, 0, 0),
(14156, 0x00000000, 8, 0x00000000003E0000, 0x00000000, 0x00000000, 0, 0, 0),
(14160, 0x00000000, 8, 0x00000000003E0000, 0x00000000, 0x00000000, 0, 0, 0),
(14161, 0x00000000, 8, 0x00000000003E0000, 0x00000000, 0x00000000, 0, 0, 0),
(14186, 0x00000000, 8, 0x0000000240800508, 0x00000000, 0x00000002, 0, 0, 0),
(14190, 0x00000000, 8, 0x0000000240800508, 0x00000000, 0x00000002, 0, 0, 0),
(14193, 0x00000000, 8, 0x0000000240800508, 0x00000000, 0x00000002, 0, 0, 0),
(14194, 0x00000000, 8, 0x0000000240800508, 0x00000000, 0x00000002, 0, 0, 0),
(14195, 0x00000000, 8, 0x0000000240800508, 0x00000000, 0x00000002, 0, 0, 0),
(14318, 0x00000000, 9, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(14319, 0x00000000, 9, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(14320, 0x00000000, 9, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(14321, 0x00000000, 9, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(14322, 0x00000000, 9, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(14531, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(14774, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(14892, 0x00000000, 6, 0x0000000410001E00, 0x00000000, 0x00000002, 0, 0, 0),
(15088, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(15128, 0x00000004, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(15268, 0x00000000, 6, 0x000000020608A000, 0x00000000, 0x00000000, 0, 0, 0),
(15277, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 6, 0, 0),
(15286, 0x00000020, 6, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(15323, 0x00000000, 6, 0x000000020608A000, 0x00000000, 0x00000000, 0, 0, 0),
(15324, 0x00000000, 6, 0x000000020608A000, 0x00000000, 0x00000000, 0, 0, 0),
(15325, 0x00000000, 6, 0x000000020608A000, 0x00000000, 0x00000000, 0, 0, 0),
(15326, 0x00000000, 6, 0x000000020608A000, 0x00000000, 0x00000000, 0, 0, 0),
(15337, 0x00000000, 6, 0x0000000200002000, 0x00000000, 0x00000002, 0, 0, 0),
(15338, 0x00000000, 6, 0x0000000200002000, 0x00000000, 0x00000002, 0, 0, 0),
(15346, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 6, 0, 0),
(15362, 0x00000000, 6, 0x0000000410001E00, 0x00000000, 0x00000002, 0, 0, 0),
(15363, 0x00000000, 6, 0x0000000410001E00, 0x00000000, 0x00000002, 0, 0, 0),
(15600, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 1, 0, 0),
(16164, 0x00000000, 11, 0x0000000090100003, 0x00000000, 0x00000002, 0, 0, 0),
(16176, 0x00000000, 11, 0x00000000000001C0, 0x00000000, 0x00000002, 0, 0, 0),
(16180, 0x00000000, 11, 0x00000000000000C0, 0x00000000, 0x00000002, 0, 0, 0),
(16196, 0x00000000, 11, 0x00000000000000C0, 0x00000000, 0x00000002, 0, 0, 0),
(16198, 0x00000000, 11, 0x00000000000000C0, 0x00000000, 0x00000002, 0, 0, 0),
(16235, 0x00000000, 11, 0x00000000000001C0, 0x00000000, 0x00000002, 0, 0, 0),
(16240, 0x00000000, 11, 0x00000000000001C0, 0x00000000, 0x00000002, 0, 0, 0),
(16256, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(16257, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(16277, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(16278, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(16279, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(16280, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(16281, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(16282, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(16283, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(16284, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(16487, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(16489, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(16492, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(16550, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(16620, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 30),
(16624, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(16850, 0x00000000, 7, 0x0000000000000004, 0x00000000, 0x00000000, 0, 0, 0),
(16864, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 2, 0, 0),
(16880, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(16923, 0x00000000, 7, 0x0000000000000004, 0x00000000, 0x00000000, 0, 0, 0),
(16924, 0x00000000, 7, 0x0000000000000004, 0x00000000, 0x00000000, 0, 0, 0),
(16952, 0x00000000, 7, 0x0000040000039000, 0x00000000, 0x00000002, 0, 0, 0),
(16954, 0x00000000, 7, 0x0000040000039000, 0x00000000, 0x00000002, 0, 0, 0),
(16958, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(16961, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(17106, 0x00000000, 7, 0x0000000000080000, 0x00000000, 0x00000000, 0, 0, 0),
(17107, 0x00000000, 7, 0x0000000000080000, 0x00000000, 0x00000000, 0, 0, 0),
(17108, 0x00000000, 7, 0x0000000000080000, 0x00000000, 0x00000000, 0, 0, 0),
(17364, 0x00000008, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(17495, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(17793, 0x00000000, 5, 0x0000000000000001, 0x00000000, 0x00000002, 0, 0, 0),
(17794, 0x00000020, 0, 0x0000000000000000, 0x00000000, 0x00000001, 0, 0, 0),
(17796, 0x00000000, 5, 0x0000000000000001, 0x00000000, 0x00000002, 0, 0, 0),
(17797, 0x00000020, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(17798, 0x00000020, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(17799, 0x00000020, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(17800, 0x00000020, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(17801, 0x00000000, 5, 0x0000000000000001, 0x00000000, 0x00000002, 0, 0, 0),
(17802, 0x00000000, 5, 0x0000000000000001, 0x00000000, 0x00000002, 0, 0, 0),
(17803, 0x00000000, 5, 0x0000000000000001, 0x00000000, 0x00000002, 0, 0, 0),
(18073, 0x00000000, 5, 0x0000008000000060, 0x00000000, 0x00000000, 0, 0, 0),
(18094, 0x00000000, 5, 0x000000000000000A, 0x00000000, 0x00000000, 0, 0, 0),
(18095, 0x00000000, 5, 0x000000000000000A, 0x00000000, 0x00000000, 0, 0, 0),
(18096, 0x00000000, 5, 0x0000008000000060, 0x00000000, 0x00000000, 0, 0, 0),
(18119, 0x00000000, 5, 0x000010C0000003E5, 0x00000000, 0x00000000, 0, 0, 0),
(18120, 0x00000000, 5, 0x000010C0000003E5, 0x00000000, 0x00000000, 0, 0, 0),
(18820, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(19184, 0x00000000, 9, 0x0000200000000014, 0x00000000, 0x00000000, 0, 0, 0),
(19228, 0x00000000, 0, 0x0000000000000040, 0x00000000, 0x00000000, 0, 0, 0),
(19232, 0x00000000, 9, 0x0000000000000040, 0x00000000, 0x00000000, 0, 0, 0),
(19233, 0x00000000, 9, 0x0000000000000040, 0x00000000, 0x00000000, 0, 0, 0),
(19387, 0x00000000, 9, 0x0000200000000014, 0x00000000, 0x00000000, 0, 0, 0),
(19388, 0x00000000, 9, 0x0000200000000014, 0x00000000, 0x00000000, 0, 0, 0),
(19572, 0x00000000, 9, 0x0000000000800000, 0x00004000, 0x00000000, 0, 0, 0),
(19573, 0x00000000, 9, 0x0000000000800000, 0x00004000, 0x00000000, 0, 0, 0),
(20049, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(20056, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(20057, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(20128, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(20131, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(20132, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(20164, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 5, 0, 0),
(20165, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 20, 0, 0),
(20166, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 20, 0, 0),
(20182, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(20210, 0x00000000, 10, 0x00000000C0200000, 0x00000000, 0x00000002, 0, 0, 0),
(20212, 0x00000000, 10, 0x00000000C0200000, 0x00000000, 0x00000002, 0, 0, 0),
(20213, 0x00000000, 10, 0x00000000C0200000, 0x00000000, 0x00000002, 0, 0, 0),
(20214, 0x00000000, 10, 0x00000000C0200000, 0x00000000, 0x00000002, 0, 0, 0),
(20215, 0x00000000, 10, 0x00000000C0200000, 0x00000000, 0x00000002, 0, 0, 0),
(20234, 0x00000000, 10, 0x0000000000008000, 0x00000000, 0x00000000, 0, 0, 0),
(20235, 0x00000000, 10, 0x0000000000008000, 0x00000000, 0x00000000, 0, 0, 0),
(20375, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 7, 0, 0),
(20500, 0x00000000, 4, 0x0000000010000000, 0x00000000, 0x00000000, 0, 0, 0),
(20501, 0x00000000, 4, 0x0000000010000000, 0x00000000, 0x00000000, 0, 0, 0),
(20705, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(20911, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000070, 0, 0, 0),
(20925, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(20927, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(20928, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(21185, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 10),
(21882, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(21890, 0x00000000, 4, 0x0000036C2A764EEF, 0x00000000, 0x00000000, 0, 0, 0),
(22007, 0x00000000, 3, 0x0000000000200021, 0x00000000, 0x00010000, 0, 0, 0),
(22618, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(22648, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(23547, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000020, 0, 0, 0),
(23548, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(23551, 0x00000000, 11, 0x00000000000000C0, 0x00000000, 0x00000000, 0, 0, 0),
(23552, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(23572, 0x00000000, 11, 0x00000000000000C0, 0x00000000, 0x00000000, 0, 0, 0),
(23578, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 2, 0, 0),
(23581, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 2, 0, 0),
(23602, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(23686, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 2, 0, 0),
(23688, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(23689, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 4, 0, 0),
(23695, 0x00000000, 4, 0x0000000000000002, 0x00000000, 0x00000000, 0, 0, 0),
(23721, 0x00000000, 9, 0x0000000000000800, 0x00000000, 0x00000000, 0, 0, 0),
(23920, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000800, 0, 0, 0),
(24353, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(24389, 0x00000000, 3, 0x0000004000C00017, 0x00000000, 0x00000000, 0, 0, 0),
(24398, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(24658, 0x00000000, 0, 0x0000000000000000, 0x00014110, 0x00000000, 0, 0, 0),
(24905, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 15, 0, 0),
(24932, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 6),
(25050, 0x00000004, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(25296, 0x00000000, 9, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(25469, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(25472, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(25669, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 1, 0, 0),
(25899, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000070, 0, 0, 0),
(25988, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(26016, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 2, 0, 0),
(26107, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000064, 0, 0, 0),
(26119, 0x00000000, 10, 0x0000000090100003, 0x00000000, 0x00010000, 0, 0, 0),
(26128, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000008, 0, 0, 0),
(26135, 0x00000000, 10, 0x0000000000800000, 0x00000000, 0x00010000, 0, 0, 0),
(26480, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(26605, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(27044, 0x00000000, 9, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(27131, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000400, 0, 0, 0),
(27179, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(27419, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(27498, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(27521, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(27656, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(27774, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(27787, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(27811, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(27815, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(27816, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(28592, 0x00000010, 3, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(28593, 0x00000010, 3, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(28716, 0x00000000, 7, 0x0000000000000010, 0x00048000, 0x00000000, 0, 0, 0),
(28719, 0x00000000, 7, 0x0000000000000020, 0x00000000, 0x00000002, 0, 0, 0),
(28744, 0x00000000, 7, 0x0000000000000040, 0x00044000, 0x00000000, 0, 0, 0),
(28752, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(28789, 0x00000000, 10, 0x00000000C0000000, 0x00000000, 0x00000000, 0, 0, 0),
(28802, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(28809, 0x00000000, 6, 0x0000000000001000, 0x00000000, 0x00000002, 0, 0, 0),
(28812, 0x00000000, 8, 0x0000000002000006, 0x00000000, 0x00000002, 0, 0, 0),
(28816, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(28823, 0x00000000, 11, 0x00000000000000C0, 0x00000000, 0x00000000, 0, 0, 0),
(28847, 0x00000000, 7, 0x0000000000000020, 0x00000000, 0x00000000, 0, 0, 0),
(28849, 0x00000000, 11, 0x0000000000000080, 0x00000000, 0x00000000, 0, 0, 0),
(29074, 0x00000014, 3, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(29075, 0x00000014, 3, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(29076, 0x00000014, 3, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(29150, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(29179, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(29180, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(29385, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 7, 0, 0),
(29441, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000008, 0, 0, 1),
(29444, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000008, 0, 0, 1),
(29455, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(29501, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(29593, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000070, 0, 0, 0),
(29594, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000070, 0, 0, 0),
(29624, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(29625, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(29626, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(29632, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(29633, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(29634, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(29635, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(29636, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(29637, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(29801, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(29834, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(29838, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(29977, 0x00000000, 3, 0x0000004000C00017, 0x00000000, 0x00000000, 0, 0, 0),
(30003, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000800, 0, 0, 0),
(30160, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(30293, 0x00000000, 5, 0x000000C000000381, 0x00000000, 0x00000000, 0, 0, 0),
(30295, 0x00000000, 5, 0x000000C000000381, 0x00000000, 0x00000000, 0, 0, 0),
(30296, 0x00000000, 5, 0x000000C000000381, 0x00000000, 0x00000000, 0, 0, 0),
(30299, 0x00000024, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(30301, 0x00000024, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(30302, 0x00000024, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(30675, 0x00000000, 11, 0x0000000000000003, 0x00000000, 0x00000000, 0, 0, 0),
(30678, 0x00000000, 11, 0x0000000000000003, 0x00000000, 0x00000000, 0, 0, 0),
(30679, 0x00000000, 11, 0x0000000000000003, 0x00000000, 0x00000000, 0, 0, 0),
(30680, 0x00000000, 11, 0x0000000000000003, 0x00000000, 0x00000000, 0, 0, 0),
(30681, 0x00000000, 11, 0x0000000000000003, 0x00000000, 0x00000000, 0, 0, 0),
(30701, 0x0000001C, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(30705, 0x0000001C, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(30802, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(30803, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(30804, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(30805, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(30806, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(30807, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(30808, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(30809, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(30810, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(30811, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(30823, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 10.5, 0, 0),
(30881, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 5),
(30883, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 5),
(30884, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 5),
(30885, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 5),
(30886, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 5),
(30937, 0x00000020, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(31124, 0x00000000, 8, 0x000000002000000E, 0x00000000, 0x00000000, 0, 0, 0),
(31126, 0x00000000, 8, 0x000000002000000E, 0x00000000, 0x00000000, 0, 0, 0),
(31244, 0x00000000, 8, 0x00000009003E0000, 0x00000000, 0x00000004, 0, 0, 0),
(31245, 0x00000000, 8, 0x00000009003E0000, 0x00000000, 0x00000004, 0, 0, 0),
(31394, 0x00000020, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(31569, 0x00000000, 3, 0x0000000000010000, 0x00000000, 0x00000000, 0, 0, 0),
(31570, 0x00000000, 3, 0x0000000000010000, 0x00000000, 0x00000000, 0, 0, 0),
(31785, 0x00000000, 0, 0x0000000000000000, 0x00008800, 0x00000000, 0, 0, 0),
(31794, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(31801, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 20, 0, 0),
(31833, 0x00000000, 10, 0x0000000080000000, 0x00000000, 0x00000000, 0, 0, 0),
(31835, 0x00000000, 10, 0x0000000080000000, 0x00000000, 0x00000000, 0, 0, 0),
(31836, 0x00000000, 10, 0x0000000080000000, 0x00000000, 0x00000000, 0, 0, 0),
(31904, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(32385, 0x00000000, 5, 0x0000001100000402, 0x00000000, 0x00000000, 0, 0, 0),
(32387, 0x00000000, 5, 0x0000001100000402, 0x00000000, 0x00000000, 0, 0, 0),
(32392, 0x00000000, 5, 0x0000001100000402, 0x00000000, 0x00000000, 0, 0, 0),
(32393, 0x00000000, 5, 0x0000001100000402, 0x00000000, 0x00000000, 0, 0, 0),
(32394, 0x00000000, 5, 0x0000001100000402, 0x00000000, 0x00000000, 0, 0, 0),
(32587, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(32593, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(32594, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(32642, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(32734, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(32748, 0x00000000, 8, 0x0000000100000000, 0x00000140, 0x00000000, 0, 0, 0),
(32776, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(32777, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(32837, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 45),
(32844, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 2, 0, 0),
(32885, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(33076, 0x00000000, 0, 0x0000000000000000, 0x000A02A8, 0x00000000, 0, 0, 0),
(33089, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(33127, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 7, 0, 0),
(33142, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(33145, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(33146, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(33150, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(33151, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(33154, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(33191, 0x00000000, 6, 0x0000040000808000, 0x00000000, 0x00000000, 0, 0, 0),
(33192, 0x00000000, 6, 0x0000040000808000, 0x00000000, 0x00000000, 0, 0, 0),
(33193, 0x00000000, 6, 0x0000040000808000, 0x00000000, 0x00000000, 0, 0, 0),
(33299, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(33510, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 5, 0, 0),
(33648, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(33719, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000800, 0, 0, 0),
(33736, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(33746, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 10),
(33757, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(33759, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 10),
(33776, 0x00000000, 0, 0x0000000000000000, 0x00008800, 0x00000000, 0, 0, 0),
(33881, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(33882, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(33883, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(34080, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000008, 0, 0, 0),
(34138, 0x00000000, 11, 0x0000000000000080, 0x00000000, 0x00000000, 0, 0, 0),
(34139, 0x00000000, 10, 0x0000000040000000, 0x00000000, 0x00000000, 0, 0, 0),
(34258, 0x00000000, 10, 0x0000000800000400, 0x00000000, 0x00000000, 0, 0, 0),
(34262, 0x00000000, 10, 0x0000000000800000, 0x00000000, 0x00010000, 0, 0, 0),
(34320, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(34355, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(34497, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(34498, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(34499, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(34500, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(34502, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(34503, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(34584, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 30),
(34586, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 1.5, 0, 0),
(34598, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 45),
(34749, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000008, 0, 0, 0),
(34753, 0x00000000, 6, 0x0000000400001800, 0x00000000, 0x00000000, 0, 0, 0),
(34774, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 1.5, 0, 20),
(34783, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000800, 0, 0, 0),
(34827, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(34859, 0x00000000, 6, 0x0000000400001800, 0x00000000, 0x00000000, 0, 0, 0),
(34860, 0x00000000, 6, 0x0000000400001800, 0x00000000, 0x00000000, 0, 0, 0),
(34914, 0x00000020, 6, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(34916, 0x00000020, 6, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(34917, 0x00000020, 6, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(34935, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 8),
(34938, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 8),
(34939, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 8),
(34950, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(34954, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(35077, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 60),
(35080, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 1, 0, 60),
(35083, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 60),
(35086, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 60),
(35100, 0x00000000, 9, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(35102, 0x00000000, 9, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(35103, 0x00000000, 9, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(35121, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(36096, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000800, 0, 0, 0),
(36111, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(37165, 0x00000000, 8, 0x0000000000200400, 0x00000000, 0x00000000, 0, 0, 0),
(37168, 0x00000000, 8, 0x00000009003E0000, 0x00000000, 0x00000000, 0, 0, 0),
(37170, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 1, 0, 0),
(37173, 0x00000000, 8, 0x000001062CBC0598, 0x00000000, 0x00000000, 0, 0, 30),
(37189, 0x00000000, 10, 0x00000000C0000000, 0x00000000, 0x00000002, 0, 0, 60),
(37193, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(37195, 0x00000000, 10, 0x0000000000800000, 0x00000000, 0x00000000, 0, 0, 0),
(37197, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 45),
(37213, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(37214, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(37227, 0x00000000, 11, 0x00000000000001C0, 0x00000000, 0x00000002, 0, 0, 60),
(37237, 0x00000000, 11, 0x0000000000000001, 0x00000000, 0x00000002, 0, 0, 0),
(37247, 0x00000008, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 45),
(37377, 0x00000020, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(37384, 0x00000000, 5, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(37443, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(37514, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000020, 0, 0, 0),
(37516, 0x00000000, 4, 0x0000000000000400, 0x00000000, 0x00000000, 0, 0, 0),
(37519, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000030, 0, 0, 0),
(37523, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(37528, 0x00000000, 4, 0x0000000000000004, 0x00000000, 0x00000000, 0, 0, 0),
(37536, 0x00000000, 4, 0x0000000000010000, 0x00000000, 0x00000000, 0, 0, 0),
(37568, 0x00000000, 6, 0x0000000000000800, 0x00000000, 0x00000000, 0, 0, 0),
(37594, 0x00000000, 6, 0x0000000000001000, 0x00000000, 0x00000000, 0, 0, 0),
(37600, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(37601, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(37603, 0x00000000, 6, 0x0000000000008000, 0x00000000, 0x00000000, 0, 0, 0),
(37655, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 60),
(37657, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 3),
(38026, 0x00000001, 0, 0x0000000000000000, 0x00000000, 0x00000100, 0, 0, 0),
(38031, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(38290, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 1.6, 0, 0),
(38326, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(38327, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(38334, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 60),
(38347, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(38350, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(38394, 0x00000000, 5, 0x0000000000000006, 0x00000000, 0x00000000, 0, 0, 0),
(38857, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(39027, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(39372, 0x00000030, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(39437, 0x00000004, 5, 0x000000C000001364, 0x00000000, 0x00010000, 0, 0, 0),
(39442, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000001, 0, 0, 0),
(39443, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(39530, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(39958, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0.7, 0, 40),
(40407, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 6, 0, 0),
(40438, 0x00000000, 6, 0x0000000000008040, 0x00000000, 0x00000000, 0, 0, 0),
(40442, 0x00000000, 7, 0x0000044000000014, 0x00000000, 0x00000000, 0, 0, 0),
(40444, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(40458, 0x00000000, 4, 0x0000060102000000, 0x00000000, 0x00000000, 0, 0, 0),
(40463, 0x00000000, 11, 0x0000001000000081, 0x00000000, 0x00000000, 0, 0, 0),
(40470, 0x00000000, 10, 0x00000000C0800000, 0x00000000, 0x00000000, 0, 0, 0),
(40475, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 3, 0, 0),
(40478, 0x00000000, 5, 0x0000000000000002, 0x00000000, 0x00000000, 0, 0, 0),
(40482, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(40485, 0x00000000, 9, 0x0000000100000000, 0x00000000, 0x00000000, 0, 0, 0),
(40899, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(41034, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000400, 0, 0, 0),
(41260, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 10),
(41262, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 10),
(41381, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000100, 0, 0, 0),
(41393, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000020, 0, 0, 0),
(41434, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 2, 0, 45),
(41469, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 7, 0, 0),
(41635, 0x00000000, 0, 0x0000000000000000, 0x000A02A8, 0x00000000, 0, 0, 0),
(41989, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0.5, 0, 0),
(42083, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 45),
(42135, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 90),
(42136, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 90),
(42368, 0x00000000, 10, 0x0000000040000000, 0x00000000, 0x00000000, 0, 0, 0),
(42370, 0x00000000, 11, 0x0000000000000040, 0x00000000, 0x00000000, 0, 0, 0),
(43019, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000400, 0, 0, 0),
(43020, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000400, 0, 0, 0),
(43338, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(43443, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000800, 0, 0, 0),
(43726, 0x00000000, 10, 0x0000000040000000, 0x00000000, 0x00000000, 0, 0, 0),
(43728, 0x00000000, 11, 0x0000000000000080, 0x00000000, 0x00000000, 0, 0, 0),
(43737, 0x00000000, 7, 0x0000044000000000, 0x00000000, 0x00000000, 0, 0, 10),
(43739, 0x00000000, 7, 0x0000000000000002, 0x00000000, 0x00000000, 0, 0, 0),
(43741, 0x00000000, 10, 0x0000000080000000, 0x00000000, 0x00000000, 0, 0, 0),
(43745, 0x00000000, 10, 0x0000020000000000, 0x00000000, 0x00000000, 0, 0, 0),
(43748, 0x00000000, 11, 0x0000000090100000, 0x00000000, 0x00000000, 0, 0, 0),
(43750, 0x00000000, 11, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(43819, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00010000, 0, 0, 0),
(44404, 0x00000000, 3, 0x0000900020000021, 0x00000000, 0x00000000, 0, 0, 0),
(44835, 0x00000000, 7, 0x0000008000000000, 0x00000010, 0x00000000, 0, 0, 0),
(45054, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 15),
(45057, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 30),
(45234, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(45243, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(45244, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(45354, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 45),
(45481, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 45),
(45482, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 45),
(45483, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 45),
(45484, 0x00000000, 0, 0x0000000000000000, 0x00004000, 0x00000000, 0, 0, 45),
(46025, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(46092, 0x00000000, 10, 0x0000000040000000, 0x00000000, 0x00000000, 0, 0, 0),
(46098, 0x00000000, 11, 0x0000000000000080, 0x00000000, 0x00000000, 0, 0, 0),
(46569, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 45),
(46662, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 20),
(46832, 0x00000000, 7, 0x0000000000000001, 0x00000000, 0x00010000, 0, 0, 0),
(46854, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(46855, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(46867, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(46913, 0x00000000, 4, 0x0000040000000000, 0x00000000, 0x00000002, 0, 0, 0),
(46914, 0x00000000, 4, 0x0000040000000000, 0x00000000, 0x00000002, 0, 0, 0),
(46915, 0x00000000, 4, 0x0000040000000000, 0x00000000, 0x00000002, 0, 0, 0),
(46916, 0x00000000, 4, 0x0000040000000000, 0x00000000, 0x00000002, 0, 0, 0),
(46951, 0x00000000, 4, 0x0000004000000400, 0x00000000, 0x00000000, 0, 0, 0),
(46952, 0x00000000, 0, 0x0000004000000400, 0x00000000, 0x00000000, 0, 0, 0),
(46953, 0x00000000, 0, 0x0000004000000400, 0x00000000, 0x00000000, 0, 0, 0),
(47509, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(47511, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(47515, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(48835, 0x00000000, 10, 0x0000000800000000, 0x00000000, 0x00000000, 0, 0, 0),
(48837, 0x00000000, 11, 0x0000000090100000, 0x00000000, 0x00000000, 0, 0, 0),
(48951, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(48952, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(48988, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(49018, 0x00000000, 15, 0x0000000001400000, 0x00000000, 0x00000000, 0, 0, 0),
(49137, 0x00000000, 15, 0x0000400000000000, 0x00000000, 0x00000000, 0, 0, 0),
(49188, 0x00000000, 15, 0x0000000000000002, 0x00000000, 0x00000000, 0, 0, 0),
(49208, 0x00000000, 15, 0x0000000000440000, 0x00000000, 0x00000000, 0, 0, 0),
(49222, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(49280, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(49281, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(49283, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(49284, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(49503, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(49504, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(49529, 0x00000000, 15, 0x0000000001400000, 0x00000000, 0x00000000, 0, 0, 0),
(49530, 0x00000000, 15, 0x0000000001400000, 0x00000000, 0x00000000, 0, 0, 0),
(49531, 0x00000000, 15, 0x0000000001400000, 0x00000000, 0x00000000, 0, 0, 0),
(49532, 0x00000000, 15, 0x0000000001400000, 0x00000000, 0x00000000, 0, 0, 0),
(49657, 0x00000000, 15, 0x0000400000000000, 0x00000000, 0x00000000, 0, 0, 0),
(50781, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(51123, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(51127, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(51128, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(51129, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(51130, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(51346, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 10),
(51349, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 10),
(51352, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 10),
(51359, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 10),
(51466, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(51470, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(51625, 0x00000000, 8, 0x000000001000A000, 0x00000000, 0x00000000, 0, 0, 0),
(51626, 0x00000000, 8, 0x000000001000A000, 0x00000000, 0x00000000, 0, 0, 0),
(51627, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000070, 0, 0, 0),
(51628, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000070, 0, 0, 0),
(51629, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000070, 0, 0, 0),
(51634, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(51635, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(51636, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(51664, 0x00000000, 8, 0x0000000800020000, 0x00000000, 0x00000000, 0, 0, 0),
(51665, 0x00000000, 8, 0x0000000800020000, 0x00000000, 0x00000000, 0, 0, 0),
(51667, 0x00000000, 8, 0x0000000800020000, 0x00000000, 0x00000000, 0, 0, 0),
(51668, 0x00000000, 8, 0x0000000800020000, 0x00000000, 0x00000000, 0, 0, 0),
(51669, 0x00000000, 8, 0x0000000800020000, 0x00000000, 0x00000000, 0, 0, 0),
(51672, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000010, 0, 0, 1),
(51674, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000010, 0, 0, 1),
(51679, 0x00000000, 8, 0x0000000100000001, 0x00000000, 0x00000000, 0, 0, 0),
(51692, 0x00000000, 8, 0x0000000000000200, 0x00000000, 0x00000002, 0, 0, 0),
(51696, 0x00000000, 8, 0x0000000000000200, 0x00000000, 0x00000002, 0, 0, 0),
(51698, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 1),
(51700, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 1),
(51701, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 1),
(52420, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 30),
(52423, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000020, 0, 0, 0),
(52898, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(53137, 0x00000000, 15, 0x0000000001400000, 0x00000000, 0x00000000, 0, 0, 0),
(53138, 0x00000000, 15, 0x0000000001400000, 0x00000000, 0x00000000, 0, 0, 0),
(53215, 0x00000000, 9, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(53216, 0x00000000, 9, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(53217, 0x00000000, 9, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(53221, 0x00000000, 9, 0x0000000100000000, 0x00000000, 0x00000000, 0, 0, 0),
(53222, 0x00000000, 9, 0x0000000100000000, 0x00000000, 0x00000000, 0, 0, 0),
(53224, 0x00000000, 9, 0x0000000100000000, 0x00000000, 0x00000000, 0, 0, 0),
(53256, 0x00000000, 9, 0x0080000100000800, 0x00000000, 0x00000002, 0, 0, 0),
(53259, 0x00000000, 9, 0x0080000100000800, 0x00000000, 0x00000002, 0, 0, 0),
(53260, 0x00000000, 9, 0x0080000100000800, 0x00000000, 0x00000002, 0, 0, 0),
(53290, 0x00000000, 9, 0x8000000100000800, 0x00000000, 0x00000002, 0, 0, 0),
(53291, 0x00000000, 9, 0x8000000100000800, 0x00000000, 0x00000002, 0, 0, 0),
(53292, 0x00000000, 9, 0x8000000100000800, 0x00000000, 0x00000002, 0, 0, 0),
(53293, 0x00000000, 9, 0x8000000100000800, 0x00000000, 0x00000002, 0, 0, 0),
(53294, 0x00000000, 9, 0x8000000100000800, 0x00000000, 0x00000002, 0, 0, 0),
(53380, 0x00000000, 10, 0x0002000000800000, 0x00000000, 0x00000002, 0, 0, 0),
(53381, 0x00000000, 10, 0x0002000000800000, 0x00000000, 0x00000002, 0, 0, 0),
(53382, 0x00000000, 10, 0x0002000000800000, 0x00000000, 0x00000002, 0, 0, 0),
(53383, 0x00000000, 10, 0x0002000000800000, 0x00000000, 0x00000002, 0, 0, 0),
(53384, 0x00000000, 10, 0x0002000000800000, 0x00000000, 0x00000002, 0, 0, 0),
(53486, 0x00000000, 10, 0x0002800000800000, 0x00000000, 0x00000002, 0, 0, 0),
(53488, 0x00000000, 10, 0x0002800000800000, 0x00000000, 0x00000002, 0, 0, 0),
(53569, 0x00000000, 10, 0x0000000000200000, 0x00000000, 0x00000002, 0, 0, 0),
(53576, 0x00000000, 10, 0x0000000000200000, 0x00000000, 0x00000002, 0, 0, 0),
(54149, 0x00000000, 10, 0x0000000000200000, 0x00000000, 0x00000002, 0, 0, 0),
(54486, 0x00000000, 0, 0x0000900020000021, 0x00000000, 0x00000000, 0, 0, 0),
(54488, 0x00000000, 0, 0x0000900020000021, 0x00000000, 0x00000000, 0, 0, 0),
(54489, 0x00000000, 0, 0x0000900020000021, 0x00000000, 0x00000000, 0, 0, 0),
(54490, 0x00000000, 0, 0x0000900020000021, 0x00000000, 0x00000000, 0, 0, 0),
(54738, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(54841, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(55620, 0x00000000, 15, 0x0800000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(55623, 0x00000000, 15, 0x0800000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(55666, 0x00000000, 15, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(55667, 0x00000000, 15, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(55668, 0x00000000, 15, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(55669, 0x00000000, 15, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(55670, 0x00000000, 15, 0x0000000000000001, 0x00000000, 0x00000000, 0, 0, 0),
(55689, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(56342, 0x00000000, 9, 0x0000000000004000, 0x00000000, 0x00000000, 0, 0, 0),
(56343, 0x00000000, 9, 0x0000000000004000, 0x00000000, 0x00000000, 0, 0, 0),
(56344, 0x00000000, 9, 0x0000000000004000, 0x00000000, 0x00000000, 0, 0, 0),
(56451, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000000, 0, 0, 3),
(56611, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(56612, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(56613, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(56614, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(56636, 0x00000000, 4, 0x0000000000000020, 0x00000000, 0x00000000, 0, 0, 0),
(56637, 0x00000000, 4, 0x0000000000000020, 0x00000000, 0x00000000, 0, 0, 0),
(56638, 0x00000000, 4, 0x0000000000000020, 0x00000000, 0x00000000, 0, 0, 0),
(56821, 0x00000000, 8, 0x0000000000000002, 0x00000000, 0x00000002, 0, 0, 0),
(56822, 0x00000000, 15, 0x0000000000000002, 0x00000000, 0x00000000, 0, 0, 0),
(56834, 0x00000000, 15, 0x0000000000440000, 0x00000000, 0x00000000, 0, 0, 0),
(56835, 0x00000000, 15, 0x0000000000440000, 0x00000000, 0x00000000, 0, 0, 0),
(57878, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000010, 0, 0, 0),
(57880, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000010, 0, 0, 0),
(57881, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000010, 0, 0, 0),
(58357, 0x00000000, 4, 0x0000000000000040, 0x00000000, 0x00000002, 0, 0, 0),
(58364, 0x00000000, 4, 0x0000000000000400, 0x00000000, 0x00000000, 0, 0, 0),
(58372, 0x00000000, 4, 0x0000000000000002, 0x00000000, 0x00000000, 0, 0, 0),
(58386, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000020, 0, 0, 0),
(58616, 0x00000000, 15, 0x0000000000040000, 0x00000000, 0x00000000, 0, 0, 0),
(58620, 0x00000000, 15, 0x0000400000000000, 0x00000000, 0x00000000, 0, 0, 0),
(58626, 0x00000000, 15, 0x0000000002000000, 0x00000000, 0x00000000, 0, 0, 0),
(58631, 0x00000000, 15, 0x0000000000000002, 0x00000000, 0x00000000, 0, 0, 0),
(58642, 0x00000000, 15, 0x0800000000000000, 0x00000000, 0x00000000, 0, 0, 0),
(58644, 0x00000000, 15, 0x0000000400000000, 0x00000000, 0x00000000, 0, 0, 0),
(58647, 0x00000000, 15, 0x0000000400000000, 0x00000000, 0x00000000, 0, 0, 0),
(58676, 0x00000000, 15, 0x0000000800000000, 0x00000000, 0x00000000, 0, 0, 0),
(58677, 0x00000000, 15, 0x0000000000002000, 0x00000000, 0x00000000, 0, 0, 0),
(58872, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(58874, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000040, 0, 0, 0),
(58901, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(59057, 0x00000000, 15, 0x0000000000000002, 0x00000000, 0x00000000, 0, 0, 0),
(59176, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(59327, 0x00000000, 15, 0x0000000008000000, 0x00000000, 0x00000000, 0, 0, 0),
(59725, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000800, 0, 0, 0),
(60537, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000002, 0, 0, 0),
(60572, 0x00000000, 11, 0x0000000090100000, 0x00000000, 0x00000000, 0, 0, 0),
(60617, 0x00000000, 0, 0x0000000000000000, 0x00000000, 0x00000020, 0, 0, 0),
(60826, 0x00000000, 15, 0x0000000001400000, 0x00000000, 0x00000000, 0, 0, 0),
(61324, 0x00000000, 10, 0x0002000000000000, 0x00000000, 0x00000000, 0, 0, 0);

View file

@ -0,0 +1,5 @@
ALTER TABLE db_version CHANGE COLUMN required_6958_01_mangos_spell_proc_event required_6960_01_mangos_command bit;
DELETE FROM `command` WHERE `name` = 'modify runicpower';
INSERT INTO `command` VALUES
('modify runicpower',1,'Syntax: .modify runicpower #newrunicpower\r\n\r\nModify the runic power of the selected player. If no player is selected, modify your runic power.');

View file

@ -0,0 +1,6 @@
ALTER TABLE db_version CHANGE COLUMN required_6960_01_mangos_command required_6960_02_mangos_string bit;
DELETE FROM `mangos_string` WHERE `entry` IN (173,174);
INSERT INTO `mangos_string` VALUES
(173,'You changed runic power of %s to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(174,'%s changed your runic power to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);

View file

@ -0,0 +1,3 @@
ALTER TABLE db_version CHANGE COLUMN required_6960_02_mangos_string required_6961_01_mangos_command bit;
DELETE FROM `command` WHERE name = 'reload';

View file

@ -100,6 +100,10 @@ pkgdata_DATA = \
6940_01_mangos_spell_learn_spell.sql \
6941_01_mangos_spell_learn_spell.sql \
6944_01_mangos_mangos_string.sql \
6958_01_mangos_spell_proc_event.sql \
6960_01_mangos_command.sql \
6960_02_mangos_string.sql \
6961_01_mangos_command.sql \
README
## Additional files to include when running 'make dist'
@ -180,4 +184,8 @@ EXTRA_DIST = \
6940_01_mangos_spell_learn_spell.sql \
6941_01_mangos_spell_learn_spell.sql \
6944_01_mangos_mangos_string.sql \
6958_01_mangos_spell_proc_event.sql \
6960_01_mangos_command.sql \
6960_02_mangos_string.sql \
6961_01_mangos_command.sql \
README

View file

@ -171,7 +171,7 @@ void WorldSession::HandleArenaTeamInviteAcceptOpcode(WorldPacket & /*recv_data*/
if(!at)
return;
if(_player->GetArenaTeamIdFromDB(_player->GetGUIDLow(), at->GetType()))
if(_player->GetArenaTeamId(at->GetType()))
{
SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S,"","",ERR_ALREADY_IN_ARENA_TEAM); // already in arena team that size
return;

View file

@ -108,6 +108,7 @@ ChatCommand * ChatHandler::getCommandTable()
{ "hp", SEC_MODERATOR, false, &ChatHandler::HandleModifyHPCommand, "", NULL },
{ "mana", SEC_MODERATOR, false, &ChatHandler::HandleModifyManaCommand, "", NULL },
{ "rage", SEC_MODERATOR, false, &ChatHandler::HandleModifyRageCommand, "", NULL },
{ "runicpower", SEC_MODERATOR, false, &ChatHandler::HandleModifyRunicPowerCommand, "", NULL },
{ "energy", SEC_MODERATOR, false, &ChatHandler::HandleModifyEnergyCommand, "", NULL },
{ "money", SEC_MODERATOR, false, &ChatHandler::HandleModifyMoneyCommand, "", NULL },
{ "speed", SEC_MODERATOR, false, &ChatHandler::HandleModifySpeedCommand, "", NULL },
@ -294,7 +295,6 @@ ChatCommand * ChatHandler::getCommandTable()
{ "locales_page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesPageTextCommand, "", NULL },
{ "locales_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesQuestCommand, "", NULL },
{ "", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
@ -694,9 +694,9 @@ void ChatHandler::PSendSysMessage(int32 entry, ...)
{
const char *format = GetMangosString(entry);
va_list ap;
char str [1024];
char str [2048];
va_start(ap, entry);
vsnprintf(str,1024,format, ap );
vsnprintf(str,2048,format, ap );
va_end(ap);
SendSysMessage(str);
}
@ -704,9 +704,9 @@ void ChatHandler::PSendSysMessage(int32 entry, ...)
void ChatHandler::PSendSysMessage(const char *format, ...)
{
va_list ap;
char str [1024];
char str [2048];
va_start(ap, format);
vsnprintf(str,1024,format, ap );
vsnprintf(str,2048,format, ap );
va_end(ap);
SendSysMessage(str);
}

View file

@ -156,6 +156,7 @@ class ChatHandler
bool HandleModifyHPCommand(const char* args);
bool HandleModifyManaCommand(const char* args);
bool HandleModifyRageCommand(const char* args);
bool HandleModifyRunicPowerCommand(const char* args);
bool HandleModifyEnergyCommand(const char* args);
bool HandleModifyMoneyCommand(const char* args);
bool HandleModifyASpeedCommand(const char* args);
@ -195,7 +196,6 @@ class ChatHandler
bool HandleNpcWhisperCommand(const char* args);
bool HandleNpcYellCommand(const char* args);
bool HandleReloadCommand(const char* args);
bool HandleReloadAllCommand(const char* args);
bool HandleReloadAllAreaCommand(const char* args);
bool HandleReloadAllItemCommand(const char* args);

View file

@ -154,6 +154,7 @@ void WorldSession::HandleGroupInviteOpcode( WorldPacket & recv_data )
// ok, we do it
WorldPacket data(SMSG_GROUP_INVITE, 10); // guess size
data << uint8(1); // ok
data << GetPlayer()->GetName();
player->GetSession()->SendPacket(&data);

View file

@ -1195,18 +1195,19 @@ void Guild::LoadGuildBankFromDB()
delete result;
// 0 1 2 3
result = CharacterDatabase.PQuery("SELECT TabId, SlotId, item_guid, item_entry FROM guild_bank_item WHERE guildid='%u' ORDER BY TabId", Id);
// data needs to be at first place for Item::LoadFromDB
// 0 1 2 3 4
result = CharacterDatabase.PQuery("SELECT data, TabId, SlotId, item_guid, item_entry FROM guild_bank_item JOIN item_instance ON item_guid = guid WHERE guildid='%u' ORDER BY TabId", Id);
if(!result)
return;
do
{
Field *fields = result->Fetch();
uint8 TabId = fields[0].GetUInt8();
uint8 SlotId = fields[1].GetUInt8();
uint32 ItemGuid = fields[2].GetUInt32();
uint32 ItemEntry = fields[3].GetUInt32();
uint8 TabId = fields[1].GetUInt8();
uint8 SlotId = fields[2].GetUInt8();
uint32 ItemGuid = fields[3].GetUInt32();
uint32 ItemEntry = fields[4].GetUInt32();
if (TabId >= purchased_tabs || TabId >= GUILD_BANK_MAX_TABS)
{
@ -1229,7 +1230,7 @@ void Guild::LoadGuildBankFromDB()
}
Item *pItem = NewItemOrBag(proto);
if(!pItem->LoadFromDB(ItemGuid, 0))
if(!pItem->LoadFromDB(ItemGuid, 0, result))
{
CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE guildid='%u' AND TabId='%u' AND SlotId='%u'", Id, uint32(TabId), uint32(SlotId));
sLog.outError("Item GUID %u not found in item_instance, deleting from Guild Bank!", ItemGuid);

View file

@ -380,7 +380,7 @@ void WorldSession::HandleGuildDemoteOpcode(WorldPacket& recvPacket)
data << (uint8)3;
data << GetPlayer()->GetName();
data << plName;
data << guild->GetRankName(slot->RankId+1);
data << guild->GetRankName(slot->RankId);
guild->BroadcastPacket(&data);
}

View file

@ -168,7 +168,9 @@ enum MangosStrings
LANG_SOUND_NOT_EXIST = 170,
// 171, // not used
LANG_CONSOLE_COMMAND = 172,
// Room for more level 1 173-199 not used
LANG_YOU_CHANGE_RUNIC_POWER = 173,
LANG_YOURS_RUNIC_POWER_CHANGED = 174,
// Room for more level 1 175-199 not used
// level 2 chat
LANG_NO_SELECTION = 200,

View file

@ -827,6 +827,40 @@ bool ChatHandler::HandleModifyRageCommand(const char* args)
return true;
}
// Edit Player Runic Power
bool ChatHandler::HandleModifyRunicPowerCommand(const char* args)
{
if(!*args)
return false;
int32 rune = atoi((char*)args)*10;
int32 runem = atoi((char*)args)*10;
if (rune <= 0 || runem <= 0 || runem < rune)
{
SendSysMessage(LANG_BAD_VALUE);
SetSentErrorMessage(true);
return false;
}
Player *chr = getSelectedPlayer();
if (chr == NULL)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
PSendSysMessage(LANG_YOU_CHANGE_RUNIC_POWER, chr->GetName(), rune/10, runem/10);
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_RUNIC_POWER_CHANGED, GetName(), rune/10, runem/10);
chr->SetMaxPower(POWER_RUNIC_POWER,runem );
chr->SetPower(POWER_RUNIC_POWER, rune );
return true;
}
//Edit Player Faction
bool ChatHandler::HandleModifyFactionCommand(const char* args)
{

View file

@ -52,14 +52,6 @@
#include "InstanceData.h"
//reload commands
bool ChatHandler::HandleReloadCommand(const char* arg)
{
// this is error catcher for wrong table name in .reload commands
PSendSysMessage("Db table with name starting from '%s' not found and can't be reloaded.",arg);
SetSentErrorMessage(true);
return false;
}
bool ChatHandler::HandleReloadAllCommand(const char*)
{
HandleReloadAreaTriggerTeleportCommand("");

View file

@ -232,8 +232,6 @@ libmangosgame_a_SOURCES = \
TaxiHandler.cpp \
TemporarySummon.cpp \
TemporarySummon.h \
tools.cpp \
Tools.h \
TotemAI.cpp \
TotemAI.h \
Totem.cpp \

View file

@ -41,7 +41,6 @@
#include "SpellAuras.h"
#include "Pet.h"
#include "SocialMgr.h"
#include "Tools.h"
void WorldSession::HandleRepopRequestOpcode( WorldPacket & /*recv_data*/ )
{
@ -1649,7 +1648,7 @@ void WorldSession::HandleInspectAchievements( WorldPacket & recv_data )
{
CHECK_PACKET_SIZE(recv_data, 1);
uint64 guid;
if(!readGUID(recv_data, guid))
if(!recv_data.readPackGUID(guid))
return;
Player *player = objmgr.GetPlayer(guid);

View file

@ -1892,7 +1892,8 @@ void ObjectMgr::LoadItemPrototypes()
void ObjectMgr::LoadAuctionItems()
{
QueryResult *result = CharacterDatabase.Query( "SELECT itemguid,item_template FROM auctionhouse" );
// data needs to be at first place for Item::LoadFromDB
QueryResult *result = CharacterDatabase.Query( "SELECT data,itemguid,item_template FROM auctionhouse JOIN item_instance ON itemguid = guid" );
if( !result )
return;
@ -1907,8 +1908,8 @@ void ObjectMgr::LoadAuctionItems()
bar.step();
fields = result->Fetch();
uint32 item_guid = fields[0].GetUInt32();
uint32 item_template = fields[1].GetUInt32();
uint32 item_guid = fields[1].GetUInt32();
uint32 item_template = fields[2].GetUInt32();
ItemPrototype const *proto = GetItemPrototype(item_template);
@ -1920,7 +1921,7 @@ void ObjectMgr::LoadAuctionItems()
Item *item = NewItemOrBag(proto);
if(!item->LoadFromDB(item_guid,0))
if(!item->LoadFromDB(item_guid,0, result))
{
delete item;
continue;

View file

@ -1179,7 +1179,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x47E*/ { "CMSG_FORCE_SAY_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x47F*/ { "SMSG_HEALTH_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x480*/ { "SMSG_POWER_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x481*/ { "CMSG_GAMEOBJ_REPORT_USE", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x481*/ { "CMSG_GAMEOBJ_REPORT_USE", STATUS_LOGGEDIN, &WorldSession::HandleGameobjectReportUse },
/*0x482*/ { "SMSG_HIGHEST_THREAT_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x483*/ { "SMSG_THREAT_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x484*/ { "SMSG_THREAT_REMOVE", STATUS_NEVER, &WorldSession::Handle_ServerSide },

View file

@ -101,7 +101,7 @@ void Pet::RemoveFromWorld()
Unit::RemoveFromWorld();
}
bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool current )
bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool current )
{
m_loading = true;
@ -764,7 +764,6 @@ bool Pet::CreateBaseAtCreature(Creature* creature)
SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, 0);
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0);
SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, uint32((MaNGOS::XP::xp_to_level(creature->getLevel()))/4));
SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
SetUInt32Value(UNIT_NPC_FLAGS, 0);
CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(creature->GetCreatureInfo()->family);

View file

@ -133,7 +133,7 @@ class Pet : public Creature
bool Create (uint32 guidlow, Map *map, uint32 Entry, uint32 pet_number);
bool CreateBaseAtCreature(Creature* creature);
bool LoadPetFromDB( Unit* owner,uint32 petentry = 0,uint32 petnumber = 0, bool current = false );
bool LoadPetFromDB( Player* owner,uint32 petentry = 0,uint32 petnumber = 0, bool current = false );
void SavePetToDB(PetSaveMode mode);
void Remove(PetSaveMode mode, bool returnreagent = false);
static void DeleteFromDB(uint32 guidlow);

View file

@ -3521,27 +3521,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
}
// remove from arena teams
uint32 at_id = GetArenaTeamIdFromDB(playerguid,ARENA_TEAM_2v2);
if(at_id != 0)
{
ArenaTeam * at = objmgr.GetArenaTeamById(at_id);
if(at)
at->DelMember(playerguid);
}
at_id = GetArenaTeamIdFromDB(playerguid,ARENA_TEAM_3v3);
if(at_id != 0)
{
ArenaTeam * at = objmgr.GetArenaTeamById(at_id);
if(at)
at->DelMember(playerguid);
}
at_id = GetArenaTeamIdFromDB(playerguid,ARENA_TEAM_5v5);
if(at_id != 0)
{
ArenaTeam * at = objmgr.GetArenaTeamById(at_id);
if(at)
at->DelMember(playerguid);
}
LeaveAllArenaTeams(playerguid);
// the player was uninvited already on logout so just remove from group
QueryResult *resultGroup = CharacterDatabase.PQuery("SELECT leaderGuid FROM group_member WHERE memberGuid='%u'", guid);
@ -3582,15 +3562,16 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
MailItemsInfo mi;
if(has_items)
{
QueryResult *resultItems = CharacterDatabase.PQuery("SELECT item_guid,item_template FROM mail_items WHERE mail_id='%u'", mail_id);
// data needs to be at first place for Item::LoadFromDB
QueryResult *resultItems = CharacterDatabase.PQuery("SELECT data,item_guid,item_template FROM mail_items JOIN item_instance ON item_guid = guid WHERE mail_id='%u'", mail_id);
if(resultItems)
{
do
{
Field *fields2 = resultItems->Fetch();
uint32 item_guidlow = fields2[0].GetUInt32();
uint32 item_template = fields2[1].GetUInt32();
uint32 item_guidlow = fields2[1].GetUInt32();
uint32 item_template = fields2[2].GetUInt32();
ItemPrototype const* itemProto = objmgr.GetItemPrototype(item_template);
if(!itemProto)
@ -3600,7 +3581,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
}
Item *pItem = NewItemOrBag(itemProto);
if(!pItem->LoadFromDB(item_guidlow, MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER)))
if(!pItem->LoadFromDB(item_guidlow, MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER),resultItems))
{
pItem->FSetState(ITEM_REMOVED);
pItem->SaveToDB(); // it also deletes item object !
@ -4858,6 +4839,7 @@ void Player::UpdateWeaponSkill (WeaponAttackType attType)
void Player::UpdateCombatSkills(Unit *pVictim, WeaponAttackType attType, MeleeHitOutcome outcome, bool defence)
{
/* Not need, this checked on call this func from trigger system
switch(outcome)
{
case MELEE_HIT_CRIT:
@ -4870,7 +4852,7 @@ void Player::UpdateCombatSkills(Unit *pVictim, WeaponAttackType attType, MeleeHi
default:
break;
}
*/
uint32 plevel = getLevel(); // if defense than pVictim == attacker
uint32 greylevel = MaNGOS::XP::GetGrayLevel(plevel);
uint32 moblevel = pVictim->getLevelForTarget(this);
@ -6053,12 +6035,7 @@ bool Player::RewardHonor(Unit *uVictim, uint32 groupsize, float honor)
victim_guid = 0; // Don't show HK: <rank> message, only log.
}
if(k_level <= 5)
k_grey = 0;
else if( k_level <= 39 )
k_grey = k_level - 5 - k_level/10;
else
k_grey = k_level - 1 - k_level/5;
k_grey = MaNGOS::XP::GetGrayLevel(k_level);
if(v_level<=k_grey)
return false;
@ -6144,24 +6121,18 @@ void Player::ModifyArenaPoints( int32 value )
uint32 Player::GetGuildIdFromDB(uint64 guid)
{
std::ostringstream ss;
ss<<"SELECT guildid FROM guild_member WHERE guid='"<<guid<<"'";
QueryResult *result = CharacterDatabase.Query( ss.str().c_str() );
if( result )
{
uint32 v = result->Fetch()[0].GetUInt32();
delete result;
return v;
}
else
QueryResult* result = CharacterDatabase.PQuery("SELECT guildid FROM guild_member WHERE guid='%u'", GUID_LOPART(guid));
if(!result)
return 0;
uint32 id = result->Fetch()[0].GetUInt32();
delete result;
return id;
}
uint32 Player::GetRankFromDB(uint64 guid)
{
std::ostringstream ss;
ss<<"SELECT rank FROM guild_member WHERE guid='"<<guid<<"'";
QueryResult *result = CharacterDatabase.Query( ss.str().c_str() );
QueryResult *result = CharacterDatabase.PQuery( "SELECT rank FROM guild_member WHERE guid='%u'", GUID_LOPART(guid) );
if( result )
{
uint32 v = result->Fetch()[0].GetUInt32();
@ -6185,10 +6156,8 @@ uint32 Player::GetArenaTeamIdFromDB(uint64 guid, uint8 type)
uint32 Player::GetZoneIdFromDB(uint64 guid)
{
std::ostringstream ss;
ss<<"SELECT zone FROM characters WHERE guid='"<<GUID_LOPART(guid)<<"'";
QueryResult *result = CharacterDatabase.Query( ss.str().c_str() );
uint32 guidLow = GUID_LOPART(guid);
QueryResult *result = CharacterDatabase.PQuery( "SELECT zone FROM characters WHERE guid='%u'", guidLow );
if (!result)
return 0;
Field* fields = result->Fetch();
@ -6198,22 +6167,18 @@ uint32 Player::GetZoneIdFromDB(uint64 guid)
if (!zone)
{
// stored zone is zero, use generic and slow zone detection
ss.str("");
ss<<"SELECT map,position_x,position_y FROM characters WHERE guid='"<<GUID_LOPART(guid)<<"'";
result = CharacterDatabase.Query(ss.str().c_str());
result = CharacterDatabase.PQuery("SELECT map,position_x,position_y FROM characters WHERE guid='%u'", guidLow);
if( !result )
return 0;
fields = result->Fetch();
uint32 map = fields[0].GetUInt32();
uint32 map = fields[0].GetUInt32();
float posx = fields[1].GetFloat();
float posy = fields[2].GetFloat();
delete result;
zone = MapManager::Instance().GetZoneId(map,posx,posy);
ss.str("");
ss << "UPDATE characters SET zone='"<<zone<<"' WHERE guid='"<<GUID_LOPART(guid)<<"'";
CharacterDatabase.Execute(ss.str().c_str());
CharacterDatabase.PExecute("UPDATE characters SET zone='%u' WHERE guid='%u'", zone, guidLow);
}
return zone;
@ -6291,13 +6256,13 @@ void Player::UpdateZone(uint32 newZone)
if(zone->flags & AREA_FLAG_SANCTUARY) // in sanctuary
{
SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_SANCTUARY);
SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY);
if(sWorld.IsFFAPvPRealm())
RemoveFlag(PLAYER_FLAGS,PLAYER_FLAGS_FFA_PVP);
}
else
{
RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_SANCTUARY);
RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY);
}
if(zone->flags & AREA_FLAG_CAPITAL) // in capital city
@ -14615,15 +14580,16 @@ void Player::_LoadInventory(QueryResult *result, uint32 timediff)
// load mailed item which should receive current player
void Player::_LoadMailedItems(Mail *mail)
{
QueryResult* result = CharacterDatabase.PQuery("SELECT item_guid, item_template FROM mail_items WHERE mail_id='%u'", mail->messageID);
// data needs to be at first place for Item::LoadFromDB
QueryResult* result = CharacterDatabase.PQuery("SELECT data, item_guid, item_template FROM mail_items JOIN item_instance ON item_guid = guid WHERE mail_id='%u'", mail->messageID);
if(!result)
return;
do
{
Field *fields = result->Fetch();
uint32 item_guid_low = fields[0].GetUInt32();
uint32 item_template = fields[1].GetUInt32();
uint32 item_guid_low = fields[1].GetUInt32();
uint32 item_template = fields[2].GetUInt32();
mail->AddItem(item_guid_low, item_template);
@ -14639,7 +14605,7 @@ void Player::_LoadMailedItems(Mail *mail)
Item *item = NewItemOrBag(proto);
if(!item->LoadFromDB(item_guid_low, 0))
if(!item->LoadFromDB(item_guid_low, 0, result))
{
sLog.outError( "Player::_LoadMailedItems - Item in mail (%u) doesn't exist !!!! - item guid: %u, deleted from mail", mail->messageID, item_guid_low);
CharacterDatabase.PExecute("DELETE FROM mail_items WHERE item_guid = '%u'", item_guid_low);
@ -16628,6 +16594,27 @@ void Player::RemovePetitionsAndSigns(uint64 guid, uint32 type)
CharacterDatabase.CommitTransaction();
}
void Player::LeaveAllArenaTeams(uint64 guid)
{
QueryResult *result = CharacterDatabase.PQuery("SELECT arena_team_member.arenateamid FROM arena_team_member JOIN arena_team ON arena_team_member.arenateamid = arena_team.arenateamid WHERE guid='%u'", GUID_LOPART(guid));
if(!result)
return;
do
{
Field *fields = result->Fetch();
uint32 at_id = fields[0].GetUInt32();
if(at_id != 0)
{
ArenaTeam * at = objmgr.GetArenaTeamById(at_id);
if(at)
at->DelMember(guid);
}
} while (result->NextRow());
delete result;
}
void Player::SetRestBonus (float rest_bonus_new)
{
// Prevent resting on max level
@ -18471,6 +18458,26 @@ uint32 Player::GetResurrectionSpellId()
return spell_id;
}
// Used in triggers for check "Only to targets that grant experience or honor" req
bool Player::isHonorOrXPTarget(Unit* pVictim)
{
uint32 v_level = pVictim->getLevel();
uint32 k_grey = MaNGOS::XP::GetGrayLevel(getLevel());
// Victim level less gray level
if(v_level<=k_grey)
return false;
if(pVictim->GetTypeId() == TYPEID_UNIT)
{
if (((Creature*)pVictim)->isTotem() ||
((Creature*)pVictim)->isPet() ||
((Creature*)pVictim)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP_AT_KILL)
return false;
}
return true;
}
bool Player::RewardPlayerAndGroupAtKill(Unit* pVictim)
{
bool PvP = pVictim->isCharmedOwnedByPlayerOrPlayer();

View file

@ -425,8 +425,8 @@ enum PlayerFlags
PLAYER_FLAGS_UNK1 = 0x00001000, // played long time
PLAYER_FLAGS_UNK2 = 0x00002000, // played too long time
PLAYER_FLAGS_UNK3 = 0x00008000, // strange visual effect (2.0.1), looks like PLAYER_FLAGS_GHOST flag
PLAYER_FLAGS_SANCTUARY = 0x00010000, // player entered sanctuary
PLAYER_FLAGS_UNK4 = 0x00020000, // taxi benchmark mode (on/off) (2.0.1)
PLAYER_FLAGS_UNK4 = 0x00010000, // pre-3.0.3 PLAYER_FLAGS_SANCTUARY flag for player entered sanctuary
PLAYER_FLAGS_UNK5 = 0x00020000, // taxi benchmark mode (on/off) (2.0.1)
PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually)
};
@ -1598,6 +1598,7 @@ class MANGOS_DLL_SPEC Player : public Unit
static uint32 GetArenaTeamIdFromDB(uint64 guid, uint8 slot);
void SetArenaTeamIdInvited(uint32 ArenaTeamId) { m_ArenaTeamIdInvited = ArenaTeamId; }
uint32 GetArenaTeamIdInvited() { return m_ArenaTeamIdInvited; }
static void LeaveAllArenaTeams(uint64 guid);
void SetDifficulty(uint32 dungeon_difficulty) { m_dungeonDifficulty = dungeon_difficulty; }
uint8 GetDifficulty() { return m_dungeonDifficulty; }
@ -1759,6 +1760,7 @@ class MANGOS_DLL_SPEC Player : public Unit
bool IsAtGroupRewardDistance(WorldObject const* pRewardSource) const;
bool RewardPlayerAndGroupAtKill(Unit* pVictim);
bool isHonorOrXPTarget(Unit* pVictim);
FactionStateList m_factions;
ForcedReactions m_forcedReactions;

View file

@ -41,7 +41,6 @@
#include "CellImpl.h"
#include "Policies/SingletonImp.h"
#include "SharedDefines.h"
#include "Tools.h"
#include "LootMgr.h"
#include "VMapFactory.h"
#include "BattleGround.h"
@ -167,19 +166,19 @@ bool SpellCastTargets::read ( WorldPacket * data, Unit *caster )
// TARGET_FLAG_UNK2 is used for non-combat pets, maybe other?
if( m_targetMask & ( TARGET_FLAG_UNIT | TARGET_FLAG_UNK2 ))
if(!readGUID(*data, m_unitTargetGUID))
if(!data->readPackGUID(m_unitTargetGUID))
return false;
if( m_targetMask & ( TARGET_FLAG_OBJECT ))
if(!readGUID(*data, m_GOTargetGUID))
if(!data->readPackGUID(m_GOTargetGUID))
return false;
if(( m_targetMask & ( TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM )) && caster->GetTypeId() == TYPEID_PLAYER)
if(!readGUID(*data, m_itemTargetGUID))
if(!data->readPackGUID(m_itemTargetGUID))
return false;
if( m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE ) )
if(!readGUID(*data, m_CorpseTargetGUID))
if(!data->readPackGUID(m_CorpseTargetGUID))
return false;
if( m_targetMask & TARGET_FLAG_SOURCE_LOCATION )
@ -197,7 +196,7 @@ bool SpellCastTargets::read ( WorldPacket * data, Unit *caster )
if(data->rpos()+1+4+4+4 > data->size())
return false;
if(!readGUID(*data, m_unitTargetGUID))
if(!data->readPackGUID(m_unitTargetGUID))
return false;
*data >> m_destX >> m_destY >> m_destZ;
@ -317,6 +316,8 @@ Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 origi
m_spellSchoolMask = SpellSchoolMask(1 << pItem->GetProto()->Damage->DamageType);
}
}
// Set health leech amount to zero
m_healthLeech = 0;
if(originalCasterGUID)
m_originalCasterGUID = originalCasterGUID;
@ -680,6 +681,77 @@ void Spell::FillTargetMap()
}
}
void Spell::prepareDataForTriggerSystem()
{
//==========================================================================================
// Now fill data for trigger system, need know:
// Ñan spell trigger another or not ( m_canTrigger )
// Create base triggers flags for Attacker and Victim ( m_procAttacker and m_procVictim)
//==========================================================================================
// Fill flag can spell trigger or not
if (!m_IsTriggeredSpell)
m_canTrigger = true; // Normal cast - can trigger
else if (!m_triggeredByAuraSpell)
m_canTrigger = true; // Triggered from SPELL_EFFECT_TRIGGER_SPELL - can trigger
else // Exceptions (some periodic triggers)
{
m_canTrigger = false; // Triggered spells can`t trigger another
switch (m_spellInfo->SpellFamilyName)
{
case SPELLFAMILY_MAGE: // Arcane Missles triggers need do it
if (m_spellInfo->SpellFamilyFlags & 0x0000000000200000LL) m_canTrigger = true;
break;
case SPELLFAMILY_WARLOCK: // For Hellfire Effect / Rain of Fire / Seed of Corruption triggers need do it
if (m_spellInfo->SpellFamilyFlags & 0x0000800000000060LL) m_canTrigger = true;
break;
case SPELLFAMILY_HUNTER: // Hunter Explosive Trap Effect/Immolation Trap Effect/Frost Trap Aura/Snake Trap Effect
if (m_spellInfo->SpellFamilyFlags & 0x0000200000000014LL) m_canTrigger = true;
break;
case SPELLFAMILY_PALADIN: // For Holy Shock triggers need do it
if (m_spellInfo->SpellFamilyFlags & 0x0001000000200000LL) m_canTrigger = true;
break;
}
}
// Do not trigger from item cast spell
if (m_CastItem)
m_canTrigger = false;
// Get data for type of attack and fill base info for trigger
switch (m_spellInfo->DmgClass)
{
case SPELL_DAMAGE_CLASS_MELEE:
m_procAttacker = PROC_FLAG_SUCCESSFUL_MELEE_SPELL_HIT;
m_procVictim = PROC_FLAG_TAKEN_MELEE_SPELL_HIT;
break;
case SPELL_DAMAGE_CLASS_RANGED:
m_procAttacker = PROC_FLAG_SUCCESSFUL_RANGED_SPELL_HIT;
m_procVictim = PROC_FLAG_TAKEN_RANGED_SPELL_HIT;
break;
default:
if (IsPositiveSpell(m_spellInfo->Id)) // Check for positive spell
{
m_procAttacker = PROC_FLAG_SUCCESSFUL_POSITIVE_SPELL;
m_procVictim = PROC_FLAG_TAKEN_POSITIVE_SPELL;
}
else if (m_spellInfo->Id == 5019) // Wands
{
m_procAttacker = PROC_FLAG_SUCCESSFUL_RANGED_SPELL_HIT;
m_procVictim = PROC_FLAG_TAKEN_RANGED_SPELL_HIT;
}
else
{
m_procAttacker = PROC_FLAG_SUCCESSFUL_NEGATIVE_SPELL_HIT;
m_procVictim = PROC_FLAG_TAKEN_NEGATIVE_SPELL_HIT;
}
break;
}
// Hunter traps spells (for Entrapment trigger)
// Gives your Immolation Trap, Frost Trap, Explosive Trap, and Snake Trap ....
if (m_spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && m_spellInfo->SpellFamilyFlags & 0x0000200000000014LL)
m_procAttacker |= PROC_FLAG_ON_TRAP_ACTIVATION;
}
void Spell::CleanupTargetList()
{
m_UniqueTargetInfo.clear();
@ -836,83 +908,6 @@ void Spell::AddItemTarget(Item* pitem, uint32 effIndex)
m_UniqueItemInfo.push_back(target);
}
void Spell::doTriggers(SpellMissInfo missInfo, uint32 damage, SpellSchoolMask damageSchoolMask, uint32 block, uint32 absorb, bool crit)
{
// Do triggers depends from hit result (triggers on hit do in effects)
// Set aura states depends from hit result
if (missInfo!=SPELL_MISS_NONE)
{
// Miss/dodge/parry/block only for melee based spells
// Resist only for magic based spells
switch (missInfo)
{
case SPELL_MISS_MISS:
if(m_caster->GetTypeId()== TYPEID_PLAYER)
((Player*)m_caster)->UpdateWeaponSkill(BASE_ATTACK);
m_caster->CastMeleeProcDamageAndSpell(unitTarget, 0, damageSchoolMask, m_attackType, MELEE_HIT_MISS, m_spellInfo, m_IsTriggeredSpell);
break;
case SPELL_MISS_RESIST:
m_caster->ProcDamageAndSpell(unitTarget, PROC_FLAG_TARGET_RESISTS, PROC_FLAG_RESIST_SPELL, 0, damageSchoolMask, m_spellInfo, m_IsTriggeredSpell);
break;
case SPELL_MISS_DODGE:
if(unitTarget->GetTypeId() == TYPEID_PLAYER)
((Player*)unitTarget)->UpdateDefense();
// Overpower
if (m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->getClass() == CLASS_WARRIOR)
{
((Player*) m_caster)->AddComboPoints(unitTarget, 1);
m_caster->StartReactiveTimer( REACTIVE_OVERPOWER );
}
// Riposte
if (unitTarget->getClass() != CLASS_ROGUE)
{
unitTarget->ModifyAuraState(AURA_STATE_DEFENSE, true);
unitTarget->StartReactiveTimer( REACTIVE_DEFENSE );
}
m_caster->CastMeleeProcDamageAndSpell(unitTarget, 0, damageSchoolMask, m_attackType, MELEE_HIT_DODGE, m_spellInfo, m_IsTriggeredSpell);
break;
case SPELL_MISS_PARRY:
// Update victim defense ?
if(unitTarget->GetTypeId() == TYPEID_PLAYER)
((Player*)unitTarget)->UpdateDefense();
// Mongoose bite - set only Counterattack here
if (unitTarget->getClass() == CLASS_HUNTER)
{
unitTarget->ModifyAuraState(AURA_STATE_HUNTER_PARRY,true);
unitTarget->StartReactiveTimer( REACTIVE_HUNTER_PARRY );
}
else
{
unitTarget->ModifyAuraState(AURA_STATE_DEFENSE, true);
unitTarget->StartReactiveTimer( REACTIVE_DEFENSE );
}
m_caster->CastMeleeProcDamageAndSpell(unitTarget, 0, damageSchoolMask, m_attackType, MELEE_HIT_PARRY, m_spellInfo, m_IsTriggeredSpell);
break;
case SPELL_MISS_BLOCK:
unitTarget->ModifyAuraState(AURA_STATE_DEFENSE, true);
unitTarget->StartReactiveTimer( REACTIVE_DEFENSE );
m_caster->CastMeleeProcDamageAndSpell(unitTarget, 0, damageSchoolMask, m_attackType, MELEE_HIT_BLOCK, m_spellInfo, m_IsTriggeredSpell);
break;
// Trigger from this events not supported
case SPELL_MISS_EVADE:
case SPELL_MISS_IMMUNE:
case SPELL_MISS_IMMUNE2:
case SPELL_MISS_DEFLECT:
case SPELL_MISS_ABSORB:
// Trigger from reflects need do after get reflect result
case SPELL_MISS_REFLECT:
break;
default:
break;
}
}
}
void Spell::DoAllEffectOnTarget(TargetInfo *target)
{
if (target->processed) // Check target
@ -928,11 +923,27 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
if (!unit)
return;
// Get original caster (if exist) and calculate damage/healing from him data
Unit *caster = m_originalCasterGUID ? m_originalCaster : m_caster;
// Skip if m_originalCaster not avaiable
if (!caster)
return;
SpellMissInfo missInfo = target->missCondition;
// Need init unitTarget by default unit (can changed in code on reflect)
// Or on missInfo!=SPELL_MISS_NONE unitTarget undefined (but need in trigger subsystem)
unitTarget = unit;
// Reset damage/healing counter
m_damage = 0;
m_healing = 0;
// Fill base trigger info
uint32 procAttacker = m_procAttacker;
uint32 procVictim = m_procVictim;
uint32 procEx = PROC_EX_NONE;
if (missInfo==SPELL_MISS_NONE) // In case spell hit target, do all effect on that target
DoSpellHitOnUnit(unit, mask);
else if (missInfo == SPELL_MISS_REFLECT) // In case spell reflect from target, do all effect on caster (if hit)
@ -941,9 +952,103 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
DoSpellHitOnUnit(m_caster, mask);
}
// Do triggers only on miss/resist/parry/dodge
if (missInfo!=SPELL_MISS_NONE)
doTriggers(missInfo);
// All calculated do it!
// Do healing and triggers
if (m_healing)
{
bool crit = caster->isSpellCrit(NULL, m_spellInfo, m_spellSchoolMask);
uint32 addhealth = m_healing;
if (crit)
{
procEx |= PROC_EX_CRITICAL_HIT;
addhealth = caster->SpellCriticalBonus(m_spellInfo, addhealth, NULL);
}
else
procEx |= PROC_EX_NORMAL_HIT;
caster->SendHealSpellLog(unitTarget, m_spellInfo->Id, addhealth, crit);
// Do triggers for unit (reflect triggers passed on hit phase for correct drop charge)
if (m_canTrigger && missInfo != SPELL_MISS_REFLECT)
caster->ProcDamageAndSpell(unitTarget, procAttacker, procVictim, procEx, addhealth, m_attackType, m_spellInfo);
int32 gain = unitTarget->ModifyHealth( int32(addhealth) );
unitTarget->getHostilRefManager().threatAssist(caster, float(gain) * 0.5f, m_spellInfo);
if(caster->GetTypeId()==TYPEID_PLAYER)
if(BattleGround *bg = ((Player*)caster)->GetBattleGround())
bg->UpdatePlayerScore(((Player*)caster), SCORE_HEALING_DONE, gain);
}
// Do damage and triggers
else if (m_damage)
{
// Fill base damage struct (unitTarget - is real spell target)
SpellNonMeleeDamage damageInfo(caster, unitTarget, m_spellInfo->Id, m_spellSchoolMask);
// Add bonuses and fill damageInfo struct
caster->CalculateSpellDamage(&damageInfo, m_damage, m_spellInfo);
// Send log damage message to client
caster->SendSpellNonMeleeDamageLog(&damageInfo);
procEx = createProcExtendMask(&damageInfo, missInfo);
procVictim |= PROC_FLAG_TAKEN_ANY_DAMAGE;
// Do triggers for unit (reflect triggers passed on hit phase for correct drop charge)
if (m_canTrigger && missInfo != SPELL_MISS_REFLECT)
caster->ProcDamageAndSpell(unitTarget, procAttacker, procVictim, procEx, damageInfo.damage, m_attackType, m_spellInfo);
caster->DealSpellDamage(&damageInfo, true);
// Shadow Word: Death - deals damage equal to damage done to caster if victim is not killed
if (m_spellInfo->SpellFamilyName == SPELLFAMILY_PRIEST && m_spellInfo->SpellFamilyFlags&0x0000000200000000LL &&
caster != unitTarget && unitTarget->isAlive())
{
// Redirect damage to caster if victim Alive
damageInfo.target = caster;
damageInfo.absorb = 0;
damageInfo.resist = 0;
damageInfo.blocked = 0;
// Send log damage message to client
caster->SendSpellNonMeleeDamageLog(&damageInfo);
caster->DealSpellDamage(&damageInfo, true);
}
// Judgement of Blood
else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && m_spellInfo->SpellFamilyFlags & 0x0000000800000000LL && m_spellInfo->SpellIconID==153)
{
int32 damagePoint = damageInfo.damage * 33 / 100;
m_caster->CastCustomSpell(m_caster, 32220, &damagePoint, NULL, NULL, true);
}
// Bloodthirst
else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_WARRIOR && m_spellInfo->SpellFamilyFlags & 0x40000000000LL)
{
uint32 BTAura = 0;
switch(m_spellInfo->Id)
{
case 23881: BTAura = 23885; break;
case 23892: BTAura = 23886; break;
case 23893: BTAura = 23887; break;
case 23894: BTAura = 23888; break;
case 25251: BTAura = 25252; break;
case 30335: BTAura = 30339; break;
default:
sLog.outError("Spell::EffectSchoolDMG: Spell %u not handled in BTAura",m_spellInfo->Id);
break;
}
if (BTAura)
m_caster->CastSpell(m_caster,BTAura,true);
}
}
// Passive spell hits/misses or active spells only misses (only triggers)
else
{
// Fill base damage struct (unitTarget - is real spell target)
SpellNonMeleeDamage damageInfo(caster, unitTarget, m_spellInfo->Id, m_spellSchoolMask);
procEx = createProcExtendMask(&damageInfo, missInfo);
// Do triggers for unit (reflect triggers passed on hit phase for correct drop charge)
if (m_canTrigger && missInfo != SPELL_MISS_REFLECT)
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)
if(IS_CREATURE_GUID(target->targetGUID))
@ -1984,6 +2089,9 @@ void Spell::prepare(SpellCastTargets * targets, Aura* triggeredByAura)
return;
}
// Prepare data for triggers
prepareDataForTriggerSystem();
// calculate cast time (calculated after first CanCast check to prevent charge counting for first CanCast fail)
m_casttime = GetSpellCastTime(m_spellInfo, this);
@ -2137,15 +2245,6 @@ void Spell::cast(bool skipCheck)
SendCastResult(castResult);
SendSpellGo(); // we must send smsg_spell_go packet before m_castItem delete in TakeCastItem()...
// Pass cast spell event to handler (not send triggered by aura spells)
if (m_spellInfo->DmgClass != SPELL_DAMAGE_CLASS_MELEE && m_spellInfo->DmgClass != SPELL_DAMAGE_CLASS_RANGED && !m_triggeredByAuraSpell)
{
m_caster->ProcDamageAndSpell(m_targets.getUnitTarget(), PROC_FLAG_CAST_SPELL, PROC_FLAG_NONE, 0, SPELL_SCHOOL_MASK_NONE, m_spellInfo, m_IsTriggeredSpell);
// update pointers base at GUIDs to prevent access to non-existed already object
UpdatePointers(); // pointers can be invalidate at triggered spell casting
}
// Okay, everything is prepared. Now we need to distinguish between immediate and evented delayed spells
if (m_spellInfo->speed > 0.0f)
{
@ -2557,6 +2656,13 @@ void Spell::finish(bool ok)
}
}
// Heal caster for all health leech from all targets
if (m_healthLeech)
{
m_caster->ModifyHealth(m_healthLeech);
m_caster->SendHealSpellLog(m_caster, m_spellInfo->Id, uint32(m_healthLeech));
}
if (IsMeleeAttackResetSpell())
{
m_caster->resetAttackTimer(BASE_ATTACK);
@ -3529,8 +3635,12 @@ uint8 Spell::CanCast(bool strict)
//Must be behind the target.
if( m_spellInfo->AttributesEx2 == 0x100000 && (m_spellInfo->AttributesEx & 0x200) == 0x200 && target->HasInArc(M_PI, m_caster) )
{
SendInterrupted(2);
return SPELL_FAILED_NOT_BEHIND;
//Exclusion for Pounce: Facing Limitation was removed in 2.0.1, but it still uses the same, old Ex-Flags
if( m_spellInfo->SpellFamilyName != SPELLFAMILY_DRUID || m_spellInfo->SpellFamilyFlags != 0x0000000000020000LL )
{
SendInterrupted(2);
return SPELL_FAILED_NOT_BEHIND;
}
}
//Target must be facing you.
@ -3714,8 +3824,9 @@ uint8 Spell::CanCast(bool strict)
}
}
if(uint8 castResult = CheckRange(strict))
return castResult;
if(!m_triggeredByAuraSpell)
if(uint8 castResult = CheckRange(strict))
return castResult;
{
if(uint8 castResult = CheckPower())

View file

@ -480,10 +480,18 @@ class Spell
// -------------------------------------------
GameObject* focusObject;
// Damage and healing in effects need just calculate
int32 m_damage; // Damge in effects count here
int32 m_healing; // Healing in effects count here
int32 m_healthLeech; // Health leech in effects for all targets count here
//******************************************
// Spell trigger system
//******************************************
void doTriggers(SpellMissInfo missInfo, uint32 damage=0, SpellSchoolMask damageSchoolMask = SPELL_SCHOOL_MASK_NONE, uint32 block=0, uint32 absorb=0, bool crit=false);
bool m_canTrigger; // Can start trigger (m_IsTriggeredSpell can`t use for this)
uint32 m_procAttacker; // Attacker trigger flags
uint32 m_procVictim; // Victim trigger flags
void prepareDataForTriggerSystem();
//*****************************************
// Spell target subsystem

View file

@ -273,7 +273,7 @@ enum AuraType
SPELL_AURA_DETECT_STEALTH = 228,
SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE = 229,
SPELL_AURA_230 = 230,
SPELL_AURA_231 = 231,
SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE = 231,
SPELL_AURA_MECHANIC_DURATION_MOD = 232,
SPELL_AURA_233 = 233,
SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK = 234,

View file

@ -253,8 +253,8 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleNoImmediateEffect, //200 SPELL_AURA_MOD_XP_PCT implemented in Player::GiveXP
&Aura::HandleAuraAllowFlight, //201 SPELL_AURA_FLY this aura enable flight mode...
&Aura::HandleNoImmediateEffect, //202 SPELL_AURA_CANNOT_BE_DODGED implemented in Unit::RollPhysicalOutcomeAgainst
&Aura::HandleNoImmediateEffect, //203 SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE implemented in Unit::DoAttackDamage
&Aura::HandleNoImmediateEffect, //204 SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE implemented in Unit::DoAttackDamage
&Aura::HandleNoImmediateEffect, //203 SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE implemented in Unit::CalculateMeleeDamage and Unit::CalculateSpellDamage
&Aura::HandleNoImmediateEffect, //204 SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE implemented in Unit::CalculateMeleeDamage and Unit::CalculateSpellDamage
&Aura::HandleNULL, //205 vulnerable to school dmg?
&Aura::HandleNULL, //206 SPELL_AURA_MOD_SPEED_MOUNTED
&Aura::HandleAuraModIncreaseFlightSpeed, //207 SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED
@ -281,7 +281,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleNoImmediateEffect, //228 stealth detection
&Aura::HandleNULL, //229 SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE
&Aura::HandleAuraModIncreaseMaxHealth, //230 Commanding Shout
&Aura::HandleNULL, //231
&Aura::HandleNoImmediateEffect, //231 SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE
&Aura::HandleNoImmediateEffect, //232 SPELL_AURA_MECHANIC_DURATION_MOD implement in Unit::CalculateSpellDuration
&Aura::HandleNULL, //233 set model id to the one of the creature with id m_modifier.m_miscvalue
&Aura::HandleNoImmediateEffect, //234 SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK implement in Unit::CalculateSpellDuration
@ -1204,7 +1204,10 @@ void Aura::HandleAddModifier(bool apply, bool Real)
{
case 17941: // Shadow Trance
case 22008: // Netherwind Focus
case 31834: // Light's Grace
case 34754: // Clearcasting
case 34936: // Backlash
case 48108: // Hot Streak
m_procCharges = 1;
break;
}
@ -5786,11 +5789,15 @@ void Aura::PeriodicTick()
Unit* target = m_target; // aura can be deleted in DealDamage
SpellEntry const* spellProto = GetSpellProto();
pCaster->DealDamage(m_target, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), &cleanDamage, DOT, GetSpellSchoolMask(GetSpellProto()), GetSpellProto(), true);
// Set trigger flag
uint32 procAttacker = PROC_FLAG_ON_DO_PERIODIC;// | PROC_FLAG_SUCCESSFUL_HARMFUL_SPELL_HIT;
uint32 procVictim = PROC_FLAG_ON_TAKE_PERIODIC;// | PROC_FLAG_TAKEN_HARMFUL_SPELL_HIT;
pdamage = (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist);
if (pdamage)
procVictim|=PROC_FLAG_TAKEN_ANY_DAMAGE;
pCaster->ProcDamageAndSpell(target, procAttacker, procVictim, PROC_EX_NORMAL_HIT, pdamage, BASE_ATTACK, spellProto);
// DO NOT ACCESS MEMBERS OF THE AURA FROM NOW ON (DealDamage can delete aura)
pCaster->ProcDamageAndSpell(target, PROC_FLAG_NONE, PROC_FLAG_TAKE_DAMAGE, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), GetSpellSchoolMask(spellProto), spellProto);
pCaster->DealDamage(target, pdamage, &cleanDamage, DOT, GetSpellSchoolMask(spellProto), spellProto, true);
break;
}
case SPELL_AURA_PERIODIC_LEECH:
@ -5899,11 +5906,15 @@ void Aura::PeriodicTick()
SpellEntry const* spellProto = GetSpellProto();
float multiplier = spellProto->EffectMultipleValue[GetEffIndex()] > 0 ? spellProto->EffectMultipleValue[GetEffIndex()] : 1;
uint32 new_damage = pCaster->DealDamage(m_target, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), &cleanDamage, DOT, GetSpellSchoolMask(GetSpellProto()), GetSpellProto(), false);
// Set trigger flag
uint32 procAttacker = PROC_FLAG_ON_DO_PERIODIC;// | PROC_FLAG_SUCCESSFUL_HARMFUL_SPELL_HIT;
uint32 procVictim = PROC_FLAG_ON_TAKE_PERIODIC;// | PROC_FLAG_TAKEN_HARMFUL_SPELL_HIT;
pdamage = (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist);
if (pdamage)
procVictim|=PROC_FLAG_TAKEN_ANY_DAMAGE;
pCaster->ProcDamageAndSpell(target, procAttacker, procVictim, PROC_EX_NORMAL_HIT, pdamage, BASE_ATTACK, spellProto);
int32 new_damage = pCaster->DealDamage(target, pdamage, &cleanDamage, DOT, GetSpellSchoolMask(spellProto), spellProto, false);
// DO NOT ACCESS MEMBERS OF THE AURA FROM NOW ON (DealDamage can delete aura)
pCaster->ProcDamageAndSpell(target, PROC_FLAG_HEALED, PROC_FLAG_TAKE_DAMAGE, new_damage, GetSpellSchoolMask(spellProto), spellProto);
if (!target->isAlive() && pCaster->IsNonMeleeSpellCasted(false))
{
for (uint32 i = CURRENT_FIRST_NON_MELEE_SPELL; i < CURRENT_MAX_SPELL; i++)
@ -6005,9 +6016,11 @@ void Aura::PeriodicTick()
}
}
uint32 procAttacker = PROC_FLAG_ON_DO_PERIODIC;// | PROC_FLAG_SUCCESSFUL_HEAL;
uint32 procVictim = 0;//ROC_FLAG_ON_TAKE_PERIODIC | PROC_FLAG_TAKEN_HEAL;
// ignore item heals
if(procSpell && !haveCastItem)
pCaster->ProcDamageAndSpell(target,PROC_FLAG_NONE, PROC_FLAG_HEALED, pdamage, SPELL_SCHOOL_MASK_NONE, spellProto);
// if(procSpell && !haveCastItem)
// pCaster->ProcDamageAndSpell(target, procAttacker, procVictim, PROC_EX_NORMAL_HIT, pdamage, BASE_ATTACK, spellProto);
break;
}
case SPELL_AURA_PERIODIC_MANA_LEECH:
@ -6166,8 +6179,22 @@ void Aura::PeriodicTick()
gain = uint32(gain * GetSpellProto()->EffectMultipleValue[GetEffIndex()]);
SpellEntry const* spellProto = GetSpellProto();
//maybe has to be sent different to client, but not by SMSG_PERIODICAURALOG
pCaster->SpellNonMeleeDamageLog(m_target, GetId(), gain);
SpellNonMeleeDamage damageInfo(pCaster, m_target, spellProto->Id, spellProto->SchoolMask);
pCaster->CalculateSpellDamage(&damageInfo, gain, spellProto);
pCaster->SendSpellNonMeleeDamageLog(&damageInfo);
// Set trigger flag
uint32 procAttacker = PROC_FLAG_ON_DO_PERIODIC;// | PROC_FLAG_SUCCESSFUL_HARMFUL_SPELL_HIT;
uint32 procVictim = PROC_FLAG_ON_TAKE_PERIODIC;// | PROC_FLAG_TAKEN_HARMFUL_SPELL_HIT;
uint32 procEx = createProcExtendMask(&damageInfo, SPELL_MISS_NONE);
if (damageInfo.damage)
procVictim|=PROC_FLAG_TAKEN_ANY_DAMAGE;
pCaster->ProcDamageAndSpell(damageInfo.target, procAttacker, procVictim, procEx, damageInfo.damage, BASE_ATTACK, spellProto);
pCaster->DealSpellDamage(&damageInfo, true);
break;
}
// Here tick dummy auras

View file

@ -616,61 +616,7 @@ void Spell::EffectSchoolDMG(uint32 effect_idx)
}
if(damage >= 0)
{
uint32 finalDamage;
if(m_originalCaster) // m_caster only passive source of cast
finalDamage = m_originalCaster->SpellNonMeleeDamageLog(unitTarget, m_spellInfo->Id, damage, m_IsTriggeredSpell, true);
else
finalDamage = m_caster->SpellNonMeleeDamageLog(unitTarget, m_spellInfo->Id, damage, m_IsTriggeredSpell, true);
// post effects
switch(m_spellInfo->SpellFamilyName)
{
case SPELLFAMILY_WARRIOR:
{
// Bloodthirst
if(m_spellInfo->SpellFamilyFlags & 0x40000000000LL)
{
uint32 BTAura = 0;
switch(m_spellInfo->Id)
{
case 23881: BTAura = 23885; break;
case 23892: BTAura = 23886; break;
case 23893: BTAura = 23887; break;
case 23894: BTAura = 23888; break;
case 25251: BTAura = 25252; break;
case 30335: BTAura = 30339; break;
default:
sLog.outError("Spell::EffectSchoolDMG: Spell %u not handled in BTAura",m_spellInfo->Id);
break;
}
if (BTAura)
m_caster->CastSpell(m_caster,BTAura,true);
}
break;
}
case SPELLFAMILY_PRIEST:
{
// Shadow Word: Death
if(finalDamage > 0 && (m_spellInfo->SpellFamilyFlags & 0x0000000200000000LL) && unitTarget->isAlive())
// deals damage equal to damage done to caster if victim is not killed
m_caster->SpellNonMeleeDamageLog( m_caster, m_spellInfo->Id, finalDamage, m_IsTriggeredSpell, false);
break;
}
case SPELLFAMILY_PALADIN:
{
// Judgement of Blood
if(finalDamage > 0 && (m_spellInfo->SpellFamilyFlags & 0x0000000800000000LL) && m_spellInfo->SpellIconID==153)
{
int32 damagePoint = finalDamage * 33 / 100;
m_caster->CastCustomSpell(m_caster, 32220, &damagePoint, NULL, NULL, true);
}
break;
}
}
}
m_damage+= damage;
}
}
@ -1486,7 +1432,7 @@ void Spell::EffectDummy(uint32 i)
}
if(found)
m_caster->SpellNonMeleeDamageLog(unitTarget, m_spellInfo->Id, damage, m_IsTriggeredSpell, true);
m_damage+= damage;
return;
}
// Kill command
@ -2437,7 +2383,7 @@ void Spell::EffectPowerBurn(uint32 i)
modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_MULTIPLE_VALUE, multiplier);
new_damage = int32(new_damage*multiplier);
m_caster->SpellNonMeleeDamageLog(unitTarget, m_spellInfo->Id, new_damage, m_IsTriggeredSpell, true);
m_damage+=new_damage;
}
void Spell::EffectHeal( uint32 /*i*/ )
@ -2505,27 +2451,7 @@ void Spell::EffectHeal( uint32 /*i*/ )
else
addhealth = caster->SpellHealingBonus(m_spellInfo, addhealth,HEAL, unitTarget);
bool crit = caster->isSpellCrit(unitTarget, m_spellInfo, m_spellSchoolMask, m_attackType);
if (crit)
addhealth = caster->SpellCriticalBonus(m_spellInfo, addhealth, unitTarget);
caster->SendHealSpellLog(unitTarget, m_spellInfo->Id, addhealth, crit);
int32 gain = unitTarget->ModifyHealth( int32(addhealth) );
unitTarget->getHostilRefManager().threatAssist(m_caster, float(gain) * 0.5f, m_spellInfo);
if(caster->GetTypeId()==TYPEID_PLAYER)
if(BattleGround *bg = ((Player*)caster)->GetBattleGround())
bg->UpdatePlayerScore(((Player*)caster), SCORE_HEALING_DONE, gain);
// ignore item heals
if(m_CastItem)
return;
uint32 procHealer = PROC_FLAG_HEAL;
if (crit)
procHealer |= PROC_FLAG_CRIT_HEAL;
m_caster->ProcDamageAndSpell(unitTarget,procHealer,PROC_FLAG_HEALED,addhealth,SPELL_SCHOOL_MASK_NONE,m_spellInfo,m_IsTriggeredSpell);
m_healing+=addhealth;
}
}
@ -2602,6 +2528,8 @@ void Spell::EffectHealthLeech(uint32 i)
if(m_caster->GetTypeId() == TYPEID_PLAYER)
m_caster->SendHealSpellLog(m_caster, m_spellInfo->Id, uint32(new_damage));
}
// m_healthLeech+=tmpvalue;
// m_damage+=new_damage;
}
void Spell::DoCreateItem(uint32 i, uint32 itemtype)
@ -3283,7 +3211,7 @@ void Spell::EffectSummon(uint32 i)
uint32 level = m_caster->getLevel();
Pet* spawnCreature = new Pet(SUMMON_PET);
if(spawnCreature->LoadPetFromDB(m_caster,pet_entry))
if(m_caster->GetTypeId()==TYPEID_PLAYER && spawnCreature->LoadPetFromDB((Player*)m_caster,pet_entry))
{
// set timer for unsummon
int32 duration = GetSpellDuration(m_spellInfo);
@ -4099,7 +4027,7 @@ void Spell::EffectSummonPet(uint32 i)
Pet* NewSummon = new Pet;
// petentry==0 for hunter "call pet" (current pet summoned if any)
if(NewSummon->LoadPetFromDB(m_caster,petentry))
if(m_caster->GetTypeId() == TYPEID_PLAYER && NewSummon->LoadPetFromDB((Player*)m_caster,petentry))
{
if(NewSummon->getPetType()==SUMMON_PET)
{
@ -4184,7 +4112,8 @@ void Spell::EffectSummonPet(uint32 i)
// this enables pet details window (Shift+P)
// this enables popup window (pet dismiss, cancel), hunter pet additional flags set later
NewSummon->SetUInt32Value(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE);
if(m_caster->GetTypeId() == TYPEID_PLAYER)
NewSummon->SetUInt32Value(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE);
NewSummon->InitStatsForLevel(petlevel);
NewSummon->InitPetCreateSpells();
@ -4451,35 +4380,9 @@ void Spell::EffectWeaponDmg(uint32 i)
// prevent negative damage
uint32 eff_damage = uint32(bonus > 0 ? bonus : 0);
const uint32 nohitMask = HITINFO_ABSORB | HITINFO_RESIST | HITINFO_MISS;
uint32 hitInfo = 0;
VictimState victimState = VICTIMSTATE_NORMAL;
uint32 blocked_dmg = 0;
uint32 absorbed_dmg = 0;
uint32 resisted_dmg = 0;
CleanDamage cleanDamage = CleanDamage(0, BASE_ATTACK, MELEE_HIT_NORMAL );
m_caster->DoAttackDamage(unitTarget, &eff_damage, &cleanDamage, &blocked_dmg, m_spellSchoolMask, &hitInfo, &victimState, &absorbed_dmg, &resisted_dmg, m_attackType, m_spellInfo, m_IsTriggeredSpell);
if ((hitInfo & nohitMask) && m_attackType != RANGED_ATTACK) // not send ranged miss/etc
m_caster->SendAttackStateUpdate(hitInfo & nohitMask, unitTarget, 1, m_spellSchoolMask, eff_damage, absorbed_dmg, resisted_dmg, VICTIMSTATE_NORMAL, blocked_dmg);
bool criticalhit = (hitInfo & HITINFO_CRITICALHIT);
m_caster->SendSpellNonMeleeDamageLog(unitTarget, m_spellInfo->Id, eff_damage, m_spellSchoolMask, absorbed_dmg, resisted_dmg, false, blocked_dmg, criticalhit);
if (eff_damage > (absorbed_dmg + resisted_dmg + blocked_dmg))
{
eff_damage -= (absorbed_dmg + resisted_dmg + blocked_dmg);
}
else
{
cleanDamage.damage += eff_damage;
eff_damage = 0;
}
// SPELL_SCHOOL_NORMAL use for weapon-like threat and rage calculation
m_caster->DealDamage(unitTarget, eff_damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, true);
// Add melee damage bonuses (also check for negative)
m_caster->MeleeDamageBonus(unitTarget, &eff_damage, m_attackType, m_spellInfo);
m_damage+= eff_damage;
// Hemorrhage
if(m_spellInfo->SpellFamilyName==SPELLFAMILY_ROGUE && (m_spellInfo->SpellFamilyFlags & 0x2000000))
@ -4543,10 +4446,7 @@ void Spell::EffectHealMaxHealth(uint32 /*i*/)
uint32 heal = m_caster->GetMaxHealth();
int32 gain = unitTarget->ModifyHealth(heal);
unitTarget->getHostilRefManager().threatAssist(m_caster, float(gain) * 0.5f, m_spellInfo);
m_caster->SendHealSpellLog(unitTarget, m_spellInfo->Id, heal);
m_healing+=heal;
}
void Spell::EffectInterruptCast(uint32 /*i*/)
@ -5337,8 +5237,6 @@ void Spell::EffectApplyGlyph(uint32 i)
player->CastSpell(m_caster, gp->SpellId, true);
player->SetGlyph(m_glyphIndex, glyph);
if(m_CastItem)
player->DestroyItemCount(m_CastItem->GetEntry(), 1, true);
}
}
}
@ -5411,7 +5309,9 @@ void Spell::EffectSummonTotem(uint32 i)
}
pTotem->SetUInt32Value(UNIT_CREATED_BY_SPELL,m_spellInfo->Id);
pTotem->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE);
if(m_caster->GetTypeId() == TYPEID_PLAYER)
pTotem->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE);
pTotem->ApplySpellImmune(m_spellInfo->Id,IMMUNITY_STATE,SPELL_AURA_MOD_FEAR,true);
pTotem->ApplySpellImmune(m_spellInfo->Id,IMMUNITY_STATE,SPELL_AURA_TRANSFORM,true);

View file

@ -282,6 +282,16 @@ void WorldSession::HandleGameObjectUseOpcode( WorldPacket & recv_data )
obj->Use(_player);
}
void WorldSession::HandleGameobjectReportUse(WorldPacket& recvPacket)
{
CHECK_PACKET_SIZE(recvPacket,8);
uint64 guid;
recvPacket >> guid;
sLog.outDebug( "WORLD: Recvd CMSG_GAMEOBJ_REPORT_USE Message [in game guid: %u]", GUID_LOPART(guid));
}
void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
{
CHECK_PACKET_SIZE(recvPacket,1+4+1);

View file

@ -176,7 +176,7 @@ SpellSpecific GetSpellSpecific(uint32 spellId)
if (IsSealSpell(spellInfo))
return SPELL_SEAL;
if (spellInfo->SpellFamilyFlags & 0x10000100LL)
if (spellInfo->SpellFamilyFlags & 0x0000000011010002LL)
return SPELL_BLESSING;
if ((spellInfo->SpellFamilyFlags & 0x00000820180400LL) && (spellInfo->AttributesEx3 & 0x200))
@ -530,6 +530,17 @@ bool IsSingleTargetSpells(SpellEntry const *spellInfo1, SpellEntry const *spellI
return false;
}
bool IsAuraAddedBySpell(uint32 auraType, uint32 spellId)
{
SpellEntry const *spellproto = sSpellStore.LookupEntry(spellId);
if (!spellproto) return false;
for (int i = 0; i < 3; i++)
if (spellproto->EffectApplyAuraName[i] == auraType)
return true;
return false;
}
uint8 GetErrorAtShapeshiftedCast (SpellEntry const *spellInfo, uint32 form)
{
// talents that learn spells can have stance requirements that need ignore
@ -805,8 +816,8 @@ void SpellMgr::LoadSpellProcEvents()
uint32 count = 0;
// 0 1 2 3 4 5 6 7 8
QueryResult *result = WorldDatabase.Query("SELECT entry, SchoolMask, Category, SkillID, SpellFamilyName, SpellFamilyMask, procFlags, ppmRate, cooldown FROM spell_proc_event");
// 0 1 2 3 4 5 6 7 8
QueryResult *result = WorldDatabase.Query("SELECT entry, SchoolMask, SpellFamilyName, SpellFamilyMask, procFlags, procEx, ppmRate, CustomChance, Cooldown FROM spell_proc_event");
if( !result )
{
@ -820,7 +831,7 @@ void SpellMgr::LoadSpellProcEvents()
}
barGoLink bar( result->GetRowCount() );
uint32 customProc = 0;
do
{
Field *fields = result->Fetch();
@ -829,7 +840,8 @@ void SpellMgr::LoadSpellProcEvents()
uint16 entry = fields[0].GetUInt16();
if (!sSpellStore.LookupEntry(entry))
const SpellEntry *spell = sSpellStore.LookupEntry(entry);
if (!spell)
{
sLog.outErrorDb("Spell %u listed in `spell_proc_event` does not exist", entry);
continue;
@ -838,91 +850,101 @@ void SpellMgr::LoadSpellProcEvents()
SpellProcEventEntry spe;
spe.schoolMask = fields[1].GetUInt32();
spe.category = fields[2].GetUInt32();
spe.skillId = fields[3].GetUInt32();
spe.spellFamilyName = fields[4].GetUInt32();
spe.spellFamilyMask = fields[5].GetUInt64();
spe.procFlags = fields[6].GetUInt32();
spe.ppmRate = fields[7].GetFloat();
spe.spellFamilyName = fields[2].GetUInt32();
spe.spellFamilyMask = fields[3].GetUInt64();
spe.procFlags = fields[4].GetUInt32();
spe.procEx = fields[5].GetUInt32();
spe.ppmRate = fields[6].GetFloat();
spe.customChance = fields[7].GetFloat();
spe.cooldown = fields[8].GetUInt32();
mSpellProcEventMap[entry] = spe;
if (spell->procFlags==0)
{
if (spe.procFlags == 0)
{
sLog.outErrorDb("Spell %u listed in `spell_proc_event` probally not triggered spell", entry);
continue;
}
customProc++;
}
++count;
} while( result->NextRow() );
delete result;
sLog.outString();
sLog.outString( ">> Loaded %u spell proc event conditions", count );
/*
// Commented for now, as it still produces many errors (still quite many spells miss spell_proc_event)
for (uint32 id = 0; id < sSpellStore.GetNumRows(); ++id)
{
SpellEntry const* spellInfo = sSpellStore.LookupEntry(id);
if (!spellInfo)
continue;
bool found = false;
for (int effectId = 0; effectId < 3; ++effectId)
{
// at this moment check only SPELL_AURA_PROC_TRIGGER_SPELL
if( spellInfo->EffectApplyAuraName[effectId] == SPELL_AURA_PROC_TRIGGER_SPELL )
{
found = true;
break;
}
}
if(!found)
continue;
if(GetSpellProcEvent(id))
continue;
sLog.outErrorDb("Spell %u (%s) misses spell_proc_event",id,spellInfo->SpellName[sWorld.GetDBClang()]);
}
*/
if (customProc)
sLog.outString( ">> Loaded %u extra spell proc event conditions +%u custom", count, customProc );
else
sLog.outString( ">> Loaded %u extra spell proc event conditions", count );
}
bool SpellMgr::IsSpellProcEventCanTriggeredBy( SpellProcEventEntry const * spellProcEvent, SpellEntry const * procSpell, uint32 procFlags )
bool SpellMgr::IsSpellProcEventCanTriggeredBy(SpellProcEventEntry const * spellProcEvent, uint32 EventProcFlag, SpellEntry const * procSpell, uint32 procFlags, uint32 procExtra, bool active)
{
if((procFlags & spellProcEvent->procFlags) == 0)
// No extra req need
uint32 procEvent_procEx = PROC_EX_NONE;
// check prockFlags for condition
if((procFlags & EventProcFlag) == 0)
return false;
// Additional checks in case spell cast/hit/crit is the event
// Check (if set) school, category, skill line, spell talent mask
if(spellProcEvent->schoolMask && (!procSpell || (GetSpellSchoolMask(procSpell) & spellProcEvent->schoolMask) == 0))
return false;
if(spellProcEvent->category && (!procSpell || procSpell->Category != spellProcEvent->category))
return false;
if(spellProcEvent->skillId)
// Always trigger for this
if (EventProcFlag & (PROC_FLAG_KILLED | PROC_FLAG_KILL_AND_GET_XP))
return true;
if (spellProcEvent) // Exist event data
{
if (!procSpell)
return false;
// Store extra req
procEvent_procEx = spellProcEvent->procEx;
SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(procSpell->Id);
SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(procSpell->Id);
bool found = false;
for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
// For melee triggers
if (procSpell == NULL)
{
if(_spell_idx->second->skillId == spellProcEvent->skillId)
// Check (if set) for school (melee attack have Normal school)
if(spellProcEvent->schoolMask && (spellProcEvent->schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0)
return false;
}
else // For spells need check school/spell family/family mask
{
// Check (if set) for school
if(spellProcEvent->schoolMask && (spellProcEvent->schoolMask & procSpell->SchoolMask) == 0)
return false;
// Check (if set) for spellFamilyName
if(spellProcEvent->spellFamilyName && (spellProcEvent->spellFamilyName != procSpell->SpellFamilyName))
return false;
// spellFamilyName is Ok need check for spellFamilyMask if present
if(spellProcEvent->spellFamilyMask)
{
found = true;
break;
if ((spellProcEvent->spellFamilyMask & procSpell->SpellFamilyFlags) == 0)
return false;
active = true; // Spell added manualy -> so its active spell
}
}
if (!found)
return false;
}
if(spellProcEvent->spellFamilyName && (!procSpell || spellProcEvent->spellFamilyName != procSpell->SpellFamilyName))
return false;
if(spellProcEvent->spellFamilyMask && (!procSpell || (spellProcEvent->spellFamilyMask & procSpell->SpellFamilyFlags) == 0))
return false;
return true;
// Check for extra req (if none) and hit/crit
if (procEvent_procEx == PROC_EX_NONE)
{
// No extra req, so can trigger only for active (damage/healing present) and hit/crit
if((procExtra & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) && active)
return true;
}
else // Passive spells hits here only if resist/reflect/immune/evade
{
// Exist req for PROC_EX_EX_TRIGGER_ALWAYS
if (procEvent_procEx & PROC_EX_EX_TRIGGER_ALWAYS)
return true;
// Passive spells can`t trigger if need hit
if ((procEvent_procEx & PROC_EX_NORMAL_HIT) && !active)
return false;
// Check Extra Requirement like (hit/crit/miss/resist/parry/dodge/block/immune/reflect/absorb and other)
if (procEvent_procEx & procExtra)
return true;
}
return false;
}
void SpellMgr::LoadSpellElixirs()
@ -1728,8 +1750,10 @@ void SpellMgr::LoadSpellLearnSpells()
if(!sSpellStore.LookupEntry(dbc_node.spell))
continue;
// talent or passive spells or skill-step spells auto-casted, other required explicit dependent learning
dbc_node.autoLearned = GetTalentSpellCost(spell) > 0 || IsPassiveSpell(spell) || IsSpellHaveEffect(entry,SPELL_EFFECT_SKILL_STEP);
// talent or passive spells or skill-step spells auto-casted and not need dependent learning,
// pet teaching spells don't must be dependent learning (casted)
// other required explicit dependent learning
dbc_node.autoLearned = entry->EffectImplicitTargetA[i]==TARGET_PET || GetTalentSpellCost(spell) > 0 || IsPassiveSpell(spell) || IsSpellHaveEffect(entry,SPELL_EFFECT_SKILL_STEP);
SpellLearnSpellMap::const_iterator db_node_begin = GetBeginSpellLearnSpell(spell);
SpellLearnSpellMap::const_iterator db_node_end = GetEndSpellLearnSpell(spell);

View file

@ -301,7 +301,7 @@ inline bool IsSealSpell(SpellEntry const *spellInfo)
{
//Collection of all the seal family flags. No other paladin spell has any of those.
return spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN &&
( spellInfo->SpellFamilyFlags & 0x4000A000200LL );
( spellInfo->SpellFamilyFlags & 0x26000C000A000000LL );
}
inline bool IsElementalShield(SpellEntry const *spellInfo)
@ -339,6 +339,8 @@ bool IsPositiveTarget(uint32 targetA, uint32 targetB);
bool IsSingleTargetSpell(SpellEntry const *spellInfo);
bool IsSingleTargetSpells(SpellEntry const *spellInfo1, SpellEntry const *spellInfo2);
bool IsAuraAddedBySpell(uint32 auraType, uint32 spellId);
bool IsSpellAllowedInLocation(SpellEntry const *spellInfo,uint32 map_id,uint32 zone_id,uint32 area_id);
inline bool IsAreaEffectTarget( Targets target )
@ -462,50 +464,86 @@ typedef UNORDERED_MAP<uint32, SpellAffectEntry> SpellAffectMap;
// Spell proc event related declarations (accessed using SpellMgr functions)
enum ProcFlags
{
PROC_FLAG_NONE = 0x00000000, // None
PROC_FLAG_HIT_MELEE = 0x00000001, // On melee hit
PROC_FLAG_STRUCK_MELEE = 0x00000002, // On being struck melee
PROC_FLAG_KILL_XP_GIVER = 0x00000004, // On kill target giving XP or honor
PROC_FLAG_SPECIAL_DROP = 0x00000008, //
PROC_FLAG_DODGE = 0x00000010, // On dodge melee attack
PROC_FLAG_PARRY = 0x00000020, // On parry melee attack
PROC_FLAG_BLOCK = 0x00000040, // On block attack
PROC_FLAG_TOUCH = 0x00000080, // On being touched (for bombs, probably?)
PROC_FLAG_TARGET_LOW_HEALTH = 0x00000100, // On deal damage to enemy with 20% or less health
PROC_FLAG_LOW_HEALTH = 0x00000200, // On health dropped below 20%
PROC_FLAG_STRUCK_RANGED = 0x00000400, // On being struck ranged
PROC_FLAG_HIT_SPECIAL = 0x00000800, // (!)Removed, may be reassigned in future
PROC_FLAG_CRIT_MELEE = 0x00001000, // On crit melee
PROC_FLAG_STRUCK_CRIT_MELEE = 0x00002000, // On being critically struck in melee
PROC_FLAG_CAST_SPELL = 0x00004000, // On cast spell
PROC_FLAG_TAKE_DAMAGE = 0x00008000, // On take damage
PROC_FLAG_CRIT_SPELL = 0x00010000, // On crit spell
PROC_FLAG_HIT_SPELL = 0x00020000, // On hit spell
PROC_FLAG_STRUCK_CRIT_SPELL = 0x00040000, // On being critically struck by a spell
PROC_FLAG_HIT_RANGED = 0x00080000, // On getting ranged hit
PROC_FLAG_STRUCK_SPELL = 0x00100000, // On being struck by a spell
PROC_FLAG_TRAP = 0x00200000, // On trap activation (?)
PROC_FLAG_CRIT_RANGED = 0x00400000, // On getting ranged crit
PROC_FLAG_STRUCK_CRIT_RANGED = 0x00800000, // On being critically struck by a ranged attack
PROC_FLAG_RESIST_SPELL = 0x01000000, // On resist enemy spell
PROC_FLAG_TARGET_RESISTS = 0x02000000, // On enemy resisted spell
PROC_FLAG_TARGET_DODGE_OR_PARRY = 0x04000000, // On enemy dodges/parries
PROC_FLAG_HEAL = 0x08000000, // On heal
PROC_FLAG_CRIT_HEAL = 0x10000000, // On critical healing effect
PROC_FLAG_HEALED = 0x20000000, // On healing
PROC_FLAG_TARGET_BLOCK = 0x40000000, // On enemy blocks
PROC_FLAG_MISS = 0x80000000 // On miss melee attack
PROC_FLAG_NONE = 0x00000000,
PROC_FLAG_KILLED = 0x00000001, // 00 Killed by agressor
PROC_FLAG_KILL_AND_GET_XP = 0x00000002, // 01 Kill that yields experience or honor
PROC_FLAG_SUCCESSFUL_MILEE_HIT = 0x00000004, // 02 Successful melee auto attack
PROC_FLAG_TAKEN_MELEE_HIT = 0x00000008, // 03 Taken damage from melee auto attack hit
PROC_FLAG_SUCCESSFUL_MELEE_SPELL_HIT = 0x00000010, // 04 Successful attack by Spell that use melee weapon
PROC_FLAG_TAKEN_MELEE_SPELL_HIT = 0x00000020, // 05 Taken damage by Spell that use melee weapon
PROC_FLAG_SUCCESSFUL_RANGED_HIT = 0x00000040, // 06 Successful Ranged auto attack
PROC_FLAG_TAKEN_RANGED_HIT = 0x00000080, // 07 Taken damage from ranged auto attack
PROC_FLAG_SUCCESSFUL_RANGED_SPELL_HIT = 0x00000100, // 08 Successful Ranged attack by Spell that use ranged weapon
PROC_FLAG_TAKEN_RANGED_SPELL_HIT = 0x00000200, // 09 Taken damage by Spell that use ranged weapon
PROC_FLAG_SUCCESSFUL_POSITIVE_AOE_HIT = 0x00000400, // 10 Successful AoE (not 100% shure unused)
PROC_FLAG_TAKEN_POSITIVE_AOE = 0x00000800, // 11 Taken AoE (not 100% shure unused)
PROC_FLAG_SUCCESSFUL_AOE_SPELL_HIT = 0x00001000, // 12 Successful AoE damage spell hit (not 100% shure unused)
PROC_FLAG_TAKEN_AOE_SPELL_HIT = 0x00002000, // 13 Taken AoE damage spell hit (not 100% shure unused)
PROC_FLAG_SUCCESSFUL_POSITIVE_SPELL = 0x00004000, // 14 Successful cast positive spell (by default only on healing)
PROC_FLAG_TAKEN_POSITIVE_SPELL = 0x00008000, // 15 Taken positive spell hit (by default only on healing)
PROC_FLAG_SUCCESSFUL_NEGATIVE_SPELL_HIT = 0x00010000, // 16 Successful negative spell cast (by default only on damage)
PROC_FLAG_TAKEN_NEGATIVE_SPELL_HIT = 0x00020000, // 17 Taken negative spell (by default only on damage)
PROC_FLAG_ON_DO_PERIODIC = 0x00040000, // 18 Successful do periodic (damage / healing, determined from 14-17 flags)
PROC_FLAG_ON_TAKE_PERIODIC = 0x00080000, // 19 Taken spell periodic (damage / healing, determined from 14-17 flags)
PROC_FLAG_TAKEN_ANY_DAMAGE = 0x00100000, // 20 Taken any damage
PROC_FLAG_ON_TRAP_ACTIVATION = 0x00200000, // 21 On trap activation
PROC_FLAG_TAKEN_OFFHAND_HIT = 0x00400000, // 22 Taken off-hand melee attacks(not used)
PROC_FLAG_SUCCESSFUL_OFFHAND_HIT = 0x00800000 // 23 Successful off-hand melee attacks
};
#define MELEE_BASED_TRIGGER_MASK (PROC_FLAG_SUCCESSFUL_MILEE_HIT | \
PROC_FLAG_TAKEN_MELEE_HIT | \
PROC_FLAG_SUCCESSFUL_MELEE_SPELL_HIT | \
PROC_FLAG_TAKEN_MELEE_SPELL_HIT | \
PROC_FLAG_SUCCESSFUL_RANGED_HIT | \
PROC_FLAG_TAKEN_RANGED_HIT | \
PROC_FLAG_SUCCESSFUL_RANGED_SPELL_HIT | \
PROC_FLAG_TAKEN_RANGED_SPELL_HIT)
enum ProcFlagsEx
{
PROC_EX_NONE = 0x0000000, // If none can tigger on Hit/Crit only (passive spells MUST defined by SpellFamily flag)
PROC_EX_NORMAL_HIT = 0x0000001, // If set only from normal hit (only damage spells)
PROC_EX_CRITICAL_HIT = 0x0000002,
PROC_EX_MISS = 0x0000004,
PROC_EX_RESIST = 0x0000008,
PROC_EX_DODGE = 0x0000010,
PROC_EX_PARRY = 0x0000020,
PROC_EX_BLOCK = 0x0000040,
PROC_EX_EVADE = 0x0000080,
PROC_EX_IMMUNE = 0x0000100,
PROC_EX_DEFLECT = 0x0000200,
PROC_EX_ABSORB = 0x0000400,
PROC_EX_REFLECT = 0x0000800,
PROC_EX_INTERRUPT = 0x0001000, // Melee hit result can be Interrupt (not used)
PROC_EX_RESERVED1 = 0x0002000,
PROC_EX_RESERVED2 = 0x0004000,
PROC_EX_RESERVED3 = 0x0008000,
PROC_EX_EX_TRIGGER_ALWAYS = 0x0010000, // If set trigger always ( no matter another flags) used for drop charges
PROC_EX_EX_ONE_TIME_TRIGGER = 0x0020000 // If set trigger always but only one time (not used)
};
struct SpellProcEventEntry
{
uint32 schoolMask; // if nonzero - bit mask for matching proc condition based on spell candidate's school: Fire=2, Mask=1<<(2-1)=2
uint32 category; // if nonzero - match proc condition based on candidate spell's category
uint32 skillId; // if nonzero - for matching proc condition based on candidate spell's skillId from SkillLineAbility.dbc (Shadow Bolt = Destruction)
uint32 spellFamilyName; // if nonzero - for matching proc condition based on candidate spell's SpellFamilyNamer value
uint64 spellFamilyMask; // if nonzero - for matching proc condition based on candidate spell's SpellFamilyFlags (like auras 107 and 108 do)
uint32 procFlags; // bitmask for matching proc event
uint32 procEx; // proc Extend info (see ProcFlagsEx)
float ppmRate; // for melee (ranged?) damage spells - proc rate per minute. if zero, falls back to flat chance from Spell.dbc
float customChance; // Owerride chance (in most cases for debug only)
uint32 cooldown; // hidden cooldown used for some spell proc events, applied to _triggered_spell_
};
@ -707,7 +745,7 @@ class SpellMgr
return NULL;
}
static bool IsSpellProcEventCanTriggeredBy( SpellProcEventEntry const * spellProcEvent, SpellEntry const * procSpell, uint32 procFlags );
static bool IsSpellProcEventCanTriggeredBy( SpellProcEventEntry const * spellProcEvent, uint32 EventProcFlag, SpellEntry const * procSpell, uint32 procFlags, uint32 procExtra, bool active);
// Spell target coordinates
SpellTargetPosition const* GetSpellTargetPosition(uint32 spell_id) const

View file

@ -1,26 +0,0 @@
/*
* Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef MANGOS_TOOLS_H
#define MANGOS_TOOLS_H
#include "Common.h"
#include "WorldPacket.h"
bool readGUID(WorldPacket & data, uint64& guid);
void writeGUID(WorldPacket & data, uint64 & guid);
#endif

File diff suppressed because it is too large Load diff

View file

@ -596,6 +596,50 @@ struct CleanDamage
MeleeHitOutcome hitOutCome;
};
// Struct for use in Unit::CalculateMeleeDamage
// Need create structure like in SMSG_ATTACKERSTATEUPDATE opcode
struct CalcDamageInfo
{
Unit *attacker; // Attacker
Unit *target; // Target for damage
uint32 damageSchoolMask;
uint32 damage;
uint32 absorb;
uint32 resist;
uint32 blocked_amount;
uint32 HitInfo;
uint32 TargetState;
// Helper
WeaponAttackType attackType; //
uint32 procAttacker;
uint32 procVictim;
uint32 procEx;
uint32 cleanDamage; // Used only fo rage calcultion
MeleeHitOutcome hitOutCome; // TODO: remove this field (need use TargetState)
};
// Spell damage info structure based on structure sending in SMSG_SPELLNONMELEEDAMAGELOG opcode
struct SpellNonMeleeDamage{
SpellNonMeleeDamage(Unit *_attacker, Unit *_target, uint32 _SpellID, uint32 _schoolMask) :
attacker(_attacker), target(_target), SpellID(_SpellID), damage(0), schoolMask(_schoolMask),
absorb(0), resist(0), phusicalLog(false), unused(false), blocked(0), HitInfo(0), cleanDamage(0) {}
Unit *target;
Unit *attacker;
uint32 SpellID;
uint32 damage;
uint32 schoolMask;
uint32 absorb;
uint32 resist;
bool phusicalLog;
bool unused;
uint32 blocked;
uint32 HitInfo;
// Used for help
uint32 cleanDamage;
};
uint32 createProcExtendMask(SpellNonMeleeDamage *damageInfo, SpellMissInfo missCondition);
struct UnitActionBarEntry
{
union
@ -711,6 +755,8 @@ enum ReactiveType
// delay time next attack to prevent client attack animation problems
#define ATTACK_DISPLAY_DELAY 200
struct SpellProcEventEntry; // used only privately
class MANGOS_DLL_SPEC Unit : public WorldObject
{
public:
@ -719,7 +765,6 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
typedef std::multimap< spellEffectPair, Aura*> AuraMap;
typedef std::list<Aura *> AuraList;
typedef std::list<DiminishingReturn> Diminishing;
typedef std::set<AuraType> AuraTypeSet;
typedef std::set<uint32> ComboPointHolderSet;
typedef std::map<uint8, uint32> VisibleAuraMap;
@ -868,15 +913,23 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
uint16 GetMaxSkillValueForLevel(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; }
uint32 DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellEntry const *spellProto, bool durabilityLoss);
void DealFlatDamage(Unit *pVictim, SpellEntry const *spellInfo, uint32 *damage, CleanDamage *cleanDamage, bool *crit = false, bool isTriggeredSpell = false);
void DoAttackDamage(Unit *pVictim, uint32 *damage, CleanDamage *cleanDamage, uint32 *blocked_amount, SpellSchoolMask damageSchoolMask, uint32 *hitInfo, VictimState *victimState, uint32 *absorbDamage, uint32 *resistDamage, WeaponAttackType attType, SpellEntry const *spellCasted = NULL, bool isTriggeredSpell = false);
void CastMeleeProcDamageAndSpell(Unit* pVictim, uint32 damage, SpellSchoolMask damageSchoolMask, WeaponAttackType attType, MeleeHitOutcome outcome, SpellEntry const *spellCasted = NULL, bool isTriggeredSpell = false);
void ProcDamageAndSpell(Unit *pVictim, uint32 procAttacker, uint32 procVictim, uint32 damage = 0, SpellSchoolMask damageSchoolMask = SPELL_SCHOOL_MASK_NONE, SpellEntry const *procSpell = NULL, bool isTriggeredSpell = false, WeaponAttackType attType = BASE_ATTACK);
void ProcDamageAndSpell(Unit *pVictim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType = BASE_ATTACK, SpellEntry const *procSpell = NULL);
void ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellEntry const * procSpell, uint32 damage );
void HandleEmoteCommand(uint32 anim_id);
void AttackerStateUpdate (Unit *pVictim, WeaponAttackType attType = BASE_ATTACK, bool extra = false );
float MeleeMissChanceCalc(const Unit *pVictim, WeaponAttackType attType) const;
void CalculateMeleeDamage(Unit *pVictim, uint32 damage, CalcDamageInfo *damageInfo, WeaponAttackType attackType = BASE_ATTACK);
void DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss);
void CalculateSpellDamage(SpellNonMeleeDamage *damageInfo, int32 damage, SpellEntry const *spellInfo, WeaponAttackType attackType = BASE_ATTACK);
void DealSpellDamage(SpellNonMeleeDamage *damageInfo, bool durabilityLoss);
float MeleeSpellMissChance(Unit *pVictim, WeaponAttackType attType, int32 skillDiff, SpellEntry const *spell);
SpellMissInfo MeleeSpellHitResult(Unit *pVictim, SpellEntry const *spell);
SpellMissInfo MagicSpellHitResult(Unit *pVictim, SpellEntry const *spell);
SpellMissInfo SpellHitResult(Unit *pVictim, SpellEntry const *spell, bool canReflect = false);
@ -891,7 +944,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const* target = NULL) const;
float GetWeaponProcChance() const;
float GetPPMProcChance(uint32 WeaponSpeed, float PPM) const;
MeleeHitOutcome RollPhysicalOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, SpellEntry const *spellInfo);
MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType) const;
MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance, bool SpellCasted ) const;
@ -965,7 +1018,9 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
void DeMorph();
void SendAttackStateUpdate(CalcDamageInfo *damageInfo);
void SendAttackStateUpdate(uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount);
void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log);
void SendSpellNonMeleeDamageLog(Unit *target,uint32 SpellID,uint32 Damage, SpellSchoolMask damageSchoolMask,uint32 AbsorbedDamage, uint32 Resist,bool PhysicalDamage, uint32 Blocked, bool CriticalHit = false);
void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo);
@ -1241,7 +1296,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
int32 SpellBaseHealingBonusForVictim(SpellSchoolMask schoolMask, Unit *pVictim);
uint32 SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint32 damage, DamageEffectType damagetype);
uint32 SpellHealingBonus(SpellEntry const *spellProto, uint32 healamount, DamageEffectType damagetype, Unit *pVictim);
bool isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType);
bool isSpellBlocked(Unit *pVictim, SpellEntry const *spellProto, WeaponAttackType attackType = BASE_ATTACK);
bool isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType = BASE_ATTACK);
uint32 SpellCriticalBonus(SpellEntry const *spellProto, uint32 damage, Unit *pVictim);
void SetLastManaUse(uint32 spellCastTime) { m_lastManaUse = spellCastTime; }
@ -1381,12 +1437,11 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
void SendAttackStop(Unit* victim); // only from AttackStop(Unit*)
void SendAttackStart(Unit* pVictim); // only from Unit::AttackStart(Unit*)
void ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag, AuraTypeSet const& procAuraTypes, WeaponAttackType attType, SpellEntry const * procSpell, uint32 damage, SpellSchoolMask damageSchoolMask );
bool IsTriggeredAtSpellProcEvent( SpellEntry const* spellProto, SpellEntry const* procSpell, uint32 procFlag, WeaponAttackType attType, bool isVictim, uint32& cooldown );
bool HandleDummyAuraProc( Unit *pVictim, uint32 damage, Aura* triggeredByAura, SpellEntry const* procSpell, uint32 procFlag, uint32 cooldown);
bool HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredByAura, SpellEntry const* procSpell, uint32 procFlag, WeaponAttackType attType, uint32 cooldown);
bool HandleHasteAuraProc( Unit *pVictim, uint32 damage, Aura* triggeredByAura, SpellEntry const* procSpell, uint32 procFlag, uint32 cooldown);
bool HandleOverrideClassScriptAuraProc(Unit *pVictim, Aura* triggeredByAura, SpellEntry const *procSpell, uint32 cooldown);
bool IsTriggeredAtSpellProcEvent( Aura* aura, SpellEntry const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent );
bool HandleDummyAuraProc( Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
bool HandleHasteAuraProc( Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
bool HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
bool HandleOverrideClassScriptAuraProc(Unit *pVictim, Aura* triggredByAura, SpellEntry const *procSpell, uint32 cooldown);
bool HandleMeandingAuraProc(Aura* triggeredByAura);
uint32 m_state; // Even derived shouldn't modify

View file

@ -324,6 +324,7 @@ class MANGOS_DLL_SPEC WorldSession
void HandleGameObjectUseOpcode(WorldPacket& recPacket);
void HandleMeetingStoneInfo(WorldPacket& recPacket);
void HandleGameobjectReportUse(WorldPacket& recvPacket);
void HandleNameQueryOpcode(WorldPacket& recvPacket);

View file

@ -1,114 +0,0 @@
/*
* Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "Tools.h"
// THIS CAN BE A LOT FASTER
bool readGUID(WorldPacket & data, uint64& guid)
{
if(data.rpos()+1 > data.size())
return false;
uint8 guidmark=0;
uint8 bit;
uint8 shiftdata=0x1;
uint64 Temp=0;
guid = 0;
data >> guidmark;
for(int i=0;i<8;i++)
{
if(guidmark & shiftdata)
{
Temp = 0;
if(data.rpos()+1 > data.size())
return false;
data >> bit;
Temp = bit;
Temp <<= i*8;
guid |= Temp;
}
shiftdata=shiftdata<<1;
}
return true;
}
void writeGUID(WorldPacket & data, uint64 & guid)
{
uint8 RAWmask = 0;
uint8 PackedGuid[8] = {0,0,0,0,0,0,0,0};
int j = 1;
uint8 * test = (uint8*)&guid;
if (*test)
{
PackedGuid[j] = *test;
RAWmask |= 1;
++j;
}
if (*(test+1))
{
PackedGuid[j] = *(test+1);
RAWmask |= 2;
++j;
}
if (*(test+2))
{
PackedGuid[j] = *(test+2);
RAWmask |= 4;
++j;
}
if (*(test+3))
{
PackedGuid[j] = *(test+3);
RAWmask |= 8;
++j;
}
if (*(test+4))
{
PackedGuid[j] = *(test+4);
RAWmask |= 16;
++j;
}
if (*(test+5))
{
PackedGuid[j] = *(test+5);
RAWmask |= 32;
++j;
}
if (*(test+6))
{
PackedGuid[j] = *(test+6);
RAWmask |= 64;
++j;
}
if (*(test+7))
{
PackedGuid[j] = *(test+7);
RAWmask |= 128;
++j;
}
PackedGuid[0] = RAWmask;
data.append(PackedGuid,j);
}

View file

@ -241,6 +241,32 @@ class ByteBuffer
_rpos += len;
}
bool readPackGUID(uint64& guid)
{
if(rpos()+1 > size())
return false;
guid = 0;
uint8 guidmark=0;
(*this) >> guidmark;
for(int i=0;i<8;i++)
{
if(guidmark & (uint8(1) << i))
{
if(rpos()+1 > size())
return false;
uint8 bit;
(*this) >> bit;
guid |= (uint64(bit) << (i*8));
}
}
return true;
}
const uint8 *contents() const { return &_storage[0]; }
size_t size() const { return _storage.size(); }

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "6947"
#define REVISION_NR "6967"
#endif // __REVISION_NR_H__

View file

@ -842,12 +842,6 @@
<File
RelativePath="..\..\src\game\PlayerDump.h">
</File>
<File
RelativePath="..\..\src\game\tools.cpp">
</File>
<File
RelativePath="..\..\src\game\Tools.h">
</File>
</Filter>
<Filter
Name="References"

View file

@ -1294,14 +1294,6 @@
RelativePath="..\..\src\game\PlayerDump.h"
>
</File>
<File
RelativePath="..\..\src\game\tools.cpp"
>
</File>
<File
RelativePath="..\..\src\game\Tools.h"
>
</File>
</Filter>
<Filter
Name="References"

View file

@ -1296,14 +1296,6 @@
RelativePath="..\..\src\game\PlayerDump.h"
>
</File>
<File
RelativePath="..\..\src\game\tools.cpp"
>
</File>
<File
RelativePath="..\..\src\game\Tools.h"
>
</File>
</Filter>
<Filter
Name="References"