Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts: src/server/game/Entities/Player/Player.cpp src/server/game/Entities/Player/Player.h src/server/scripts/Spells/spell_dk.cpp
This commit is contained in:
commit
224da47952
33 files changed
+473
-340
No files matched your search
@@ -221,12 +221,12 @@ DROP TABLE IF EXISTS `banned_addons`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `banned_addons` (
|
||||
`Id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`Name` varchar(255) NOT NULL,
|
||||
`Version` varchar(255) NOT NULL DEFAULT '',
|
||||
`Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`Id`),
|
||||
UNIQUE KEY `idx_name_ver` (`Name`, `Version`)
|
||||
UNIQUE KEY `idx_name_ver` (`Name`,`Version`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
@@ -1746,7 +1746,7 @@ CREATE TABLE `guild` (
|
||||
`BorderStyle` tinyint(3) unsigned NOT NULL DEFAULT '0',
|
||||
`BorderColor` tinyint(3) unsigned NOT NULL DEFAULT '0',
|
||||
`BackgroundColor` tinyint(3) unsigned NOT NULL DEFAULT '0',
|
||||
`info` VARCHAR(500) NOT NULL DEFAULT '',
|
||||
`info` varchar(500) NOT NULL DEFAULT '',
|
||||
`motd` varchar(128) NOT NULL DEFAULT '',
|
||||
`createdate` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`BankMoney` bigint(20) unsigned NOT NULL DEFAULT '0',
|
||||
@@ -2683,4 +2683,4 @@ UNLOCK TABLES;
|
||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
||||
|
||||
-- Dump completed on 2013-02-04 16:22:06
|
||||
-- Dump completed on 2014-01-26 14:39:20
|
||||
@@ -1,23 +1,23 @@
|
||||
-- Add new permissions
|
||||
DELETE FROM `rbac_permissions` WHERE `id` BETWEEN 200 AND 216;
|
||||
INSERT INTO `rbac_permissions` (`id`, `name`) VALUES
|
||||
(200, 'Command: .rbac'),
|
||||
(201, 'Command: .rbac account'),
|
||||
(202, 'Command: .rbac account group'),
|
||||
(203, 'Command: .rbac account group add'),
|
||||
(204, 'Command: .rbac account group remove'),
|
||||
(205, 'Command: .rbac account role'),
|
||||
(206, 'Command: .rbac account role grant'),
|
||||
(207, 'Command: .rbac account role deny'),
|
||||
(208, 'Command: .rbac account role revoke'),
|
||||
(209, 'Command: .rbac account permission'),
|
||||
(210, 'Command: .rbac account permission grant'),
|
||||
(211, 'Command: .rbac account permission deny'),
|
||||
(212, 'Command: .rbac account permission revoke'),
|
||||
(213, 'Command: .rbac list'),
|
||||
(214, 'Command: .rbac list groups'),
|
||||
(215, 'Command: .rbac list roles'),
|
||||
(216, 'Command: .rbac list permissions');
|
||||
(200, 'Command: rbac'),
|
||||
(201, 'Command: rbac account'),
|
||||
(202, 'Command: rbac account group'),
|
||||
(203, 'Command: rbac account group add'),
|
||||
(204, 'Command: rbac account group remove'),
|
||||
(205, 'Command: rbac account role'),
|
||||
(206, 'Command: rbac account role grant'),
|
||||
(207, 'Command: rbac account role deny'),
|
||||
(208, 'Command: rbac account role revoke'),
|
||||
(209, 'Command: rbac account permission'),
|
||||
(210, 'Command: rbac account permission grant'),
|
||||
(211, 'Command: rbac account permission deny'),
|
||||
(212, 'Command: rbac account permission revoke'),
|
||||
(213, 'Command: rbac list'),
|
||||
(214, 'Command: rbac list groups'),
|
||||
(215, 'Command: rbac list roles'),
|
||||
(216, 'Command: rbac list permissions');
|
||||
|
||||
-- Add Permissions to "Administrator Commands Role"
|
||||
DELETE FROM `rbac_role_permissions` WHERE `roleId` = 4 AND `permissionId` BETWEEN 200 AND 216;
|
||||
|
||||
@@ -1,2 +1 @@
|
||||
ALTER TABLE `logs` CHANGE `type` `type` varchar(250);
|
||||
|
||||
ALTER TABLE `logs` CHANGE `type` `type` varchar(250) NOT NULL;
|
||||
@@ -0,0 +1,6 @@
|
||||
--
|
||||
UPDATE `creature_template` SET `faction_A` = 1214, `faction_H` = 1214 WHERE `entry` IN (13079,22683,32026);
|
||||
UPDATE `creature_template` SET `faction_A` = 1215, `faction_H` = 1215 WHERE `entry` IN (37481);
|
||||
UPDATE `creature_template` SET `minlevel`=80, `maxlevel`=80, `faction_A`=84, `faction_H`=84 WHERE `entry`=35401;
|
||||
UPDATE `creature_template` SET `minlevel`=81, `maxlevel`=81, `faction_A`=84, `faction_H`=84 WHERE `entry`=35403;
|
||||
UPDATE `creature_template` SET `faction_A` = 84, `faction_H` = 84 WHERE `entry` IN (37236);
|
||||
@@ -0,0 +1,4 @@
|
||||
--
|
||||
UPDATE `creature_template` SET `unit_class` = 4 WHERE `entry` IN (34777,35436,36357);
|
||||
UPDATE `creature_template` SET `difficulty_entry_1`=34114 WHERE `entry`=33855;
|
||||
UPDATE `creature_template` SET `minlevel`=81, `maxlevel`=81 WHERE `entry`=35405;
|
||||
@@ -0,0 +1,3 @@
|
||||
--
|
||||
UPDATE `creature_template` SET `faction_A` = 1216, `faction_H` = 1216 WHERE `entry` IN (13331,13422,22588,22608,31932,32125);
|
||||
UPDATE `creature_template` SET `faction_A` = 1214, `faction_H` = 1214 WHERE `entry` IN (13088,13316,22684,22733,31950,32043,13332,22589,32126);
|
||||
@@ -0,0 +1,2 @@
|
||||
--
|
||||
UPDATE `creature_template` SET `faction_A` = 1216, `faction_H` = 1216 WHERE `entry` IN (13086,13317,22670,22732,31918,31949,37267);
|
||||
@@ -0,0 +1,4 @@
|
||||
-- TDB 3.3.5a have faction 1214 for mob 37384, TDB 4.3.4 have the same faction for mob 13328 this makes the fix generic for both TDB.
|
||||
UPDATE `creature_template` SET `faction_A` = 1214, `faction_H` = 1214 WHERE `entry` IN (13328,22715,32063,37384);
|
||||
UPDATE `creature_template` SET `faction_A`=1693, `faction_H`=1693 WHERE `entry` IN (29062,31589,29096,31590,29098,31602,31590);
|
||||
UPDATE `creature_template` SET `faction_A`=14, `faction_H`=14 WHERE `entry` IN (31588,31600);
|
||||
@@ -0,0 +1,5 @@
|
||||
--
|
||||
UPDATE `creature_template` SET `faction_A` = 190, `faction_H` = 190 WHERE `entry` = 30794;
|
||||
UPDATE `creature_template` SET `difficulty_entry_1`=0 WHERE `entry`=30023;
|
||||
UPDATE `creature_template` SET `difficulty_entry_1`=22643, `difficulty_entry_2`=32027, `difficulty_entry_3`=37347 WHERE `entry`=12159;
|
||||
UPDATE `creature_template` SET `faction_A`=14, `faction_H`=14 WHERE `entry` IN (32027,37347);
|
||||
@@ -0,0 +1,3 @@
|
||||
--
|
||||
UPDATE `creature_template` SET `faction_A`=14, `faction_H`=14 WHERE `entry` IN (22643,28924,28925);
|
||||
UPDATE `creature_template` SET `faction_A`=16, `faction_H`=16 WHERE `entry` = 34114;
|
||||
@@ -0,0 +1,2 @@
|
||||
--
|
||||
UPDATE `creature_template` SET `faction_A`=1214, `faction_H`=1214 WHERE `entry` IN (13421,22609,31933);
|
||||
@@ -0,0 +1,2 @@
|
||||
--
|
||||
UPDATE `creature_template` SET `VehicleId`=0 WHERE `entry` IN (38156,38637,38638);
|
||||
@@ -0,0 +1,3 @@
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id`=46584;
|
||||
INSERT INTO `spell_script_names` (`spell_id` ,`ScriptName`) VALUES
|
||||
(46584,'spell_dk_raise_dead');
|
||||
@@ -0,0 +1,167 @@
|
||||
DROP TABLE IF EXISTS `spell_custom_attr`;
|
||||
CREATE TABLE IF NOT EXISTS `spell_custom_attr` (
|
||||
`entry` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'spell id',
|
||||
`attributes` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'SpellCustomAttributes',
|
||||
PRIMARY KEY (`entry`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='SpellInfo custom attributes';
|
||||
|
||||
SET @SPELL_ATTR0_CU_ENCHANT_PROC = 1,
|
||||
@SPELL_ATTR0_CU_CONE_BACK = 2,
|
||||
@SPELL_ATTR0_CU_CONE_LINE = 4,
|
||||
@SPELL_ATTR0_CU_SHARE_DAMAGE = 8,
|
||||
@SPELL_ATTR0_CU_NO_INITIAL_THREAT = 16,
|
||||
@SPELL_ATTR0_CU_AURA_CC = 64,
|
||||
@SPELL_ATTR0_CU_DIRECT_DAMAGE = 256,
|
||||
@SPELL_ATTR0_CU_CHARGE = 512,
|
||||
@SPELL_ATTR0_CU_PICKPOCKET = 1024,
|
||||
@SPELL_ATTR0_CU_NEGATIVE_EFF0 = 4096,
|
||||
@SPELL_ATTR0_CU_NEGATIVE_EFF1 = 8192,
|
||||
@SPELL_ATTR0_CU_NEGATIVE_EFF2 = 16384,
|
||||
@SPELL_ATTR0_CU_IGNORE_ARMOR = 32768,
|
||||
@SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER = 65536,
|
||||
@SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET = 131072;
|
||||
|
||||
INSERT INTO `spell_custom_attr` (`entry`, `attributes`) VALUES
|
||||
(1776, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
|
||||
(1777, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
|
||||
(8629, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
|
||||
(11285, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
|
||||
(11286, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
|
||||
(12540, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
|
||||
(13579, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
|
||||
(24698, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
|
||||
(28456, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
|
||||
(29425, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
|
||||
(34940, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
|
||||
(36862, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
|
||||
(38764, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
|
||||
(38863, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
|
||||
(52743, @SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER),
|
||||
(53, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(2589, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(2590, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(2591, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(7159, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(8627, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(8721, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(11279, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(11280, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(11281, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(15582, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(15657, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(22416, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(25300, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(26863, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(37685, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(48656, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(48657, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(703, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(8631, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(8632, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(8633, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(11289, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(11290, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(26839, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(26884, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(48675, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(48676, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(5221, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(6800, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(8992, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(9829, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(9830, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(27001, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(27002, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(48571, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(48572, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(8676, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(8724, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(8725, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(11267, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(11268, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(11269, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(27441, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(48689, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(48690, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(48691, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(6785, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(6787, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(9866, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(9867, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(27005, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(48578, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(48579, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(21987, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(23959, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(24825, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(58563, @SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET),
|
||||
(26029, @SPELL_ATTR0_CU_CONE_LINE),
|
||||
(37433, @SPELL_ATTR0_CU_CONE_LINE),
|
||||
(43140, @SPELL_ATTR0_CU_CONE_LINE),
|
||||
(43215, @SPELL_ATTR0_CU_CONE_LINE),
|
||||
(70461, @SPELL_ATTR0_CU_CONE_LINE),
|
||||
(72133, @SPELL_ATTR0_CU_CONE_LINE),
|
||||
(73788, @SPELL_ATTR0_CU_CONE_LINE),
|
||||
(73789, @SPELL_ATTR0_CU_CONE_LINE),
|
||||
(73790, @SPELL_ATTR0_CU_CONE_LINE),
|
||||
(24340, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(26558, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(28884, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(36837, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(38903, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(41276, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(57467, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(26789, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(31436, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(35181, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(40810, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(43267, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(43268, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(42384, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(45150, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(64688, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(72373, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(71904, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(70492, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(72505, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(72624, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(72625, @SPELL_ATTR0_CU_SHARE_DAMAGE),
|
||||
(18500, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(33086, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(49749, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(52890, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(53454, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(59446, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(62383, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(64777, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(65239, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(65919, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(67858, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(67859, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(67860, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(69293, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(74439, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(63278, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(62544, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(64588, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(66479, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(68505, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(62709, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(62626, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(64590, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(64342, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(64686, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(65147, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(68504, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(62874, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(68498, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(64591, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(63003, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(63010, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(68321, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(72255, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(72444, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(72445, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(72446, @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(64422, @SPELL_ATTR0_CU_SHARE_DAMAGE | @SPELL_ATTR0_CU_IGNORE_ARMOR),
|
||||
(72293, @SPELL_ATTR0_CU_NEGATIVE_EFF0);
|
||||
@@ -0,0 +1,11 @@
|
||||
UPDATE `item_template` SET `spellcharges_1`=0 WHERE `spellcharges_1` IS NULL;
|
||||
UPDATE `item_template` SET `spellcharges_2`=0 WHERE `spellcharges_2` IS NULL;
|
||||
UPDATE `item_template` SET `spellcharges_3`=0 WHERE `spellcharges_3` IS NULL;
|
||||
UPDATE `item_template` SET `spellcharges_4`=0 WHERE `spellcharges_4` IS NULL;
|
||||
UPDATE `item_template` SET `spellcharges_5`=0 WHERE `spellcharges_5` IS NULL;
|
||||
|
||||
ALTER TABLE `item_template` CHANGE `spellcharges_1` `spellcharges_1` SMALLINT( 6 ) NOT NULL DEFAULT '0',
|
||||
CHANGE `spellcharges_2` `spellcharges_2` SMALLINT( 6 ) NOT NULL DEFAULT '0',
|
||||
CHANGE `spellcharges_3` `spellcharges_3` SMALLINT( 6 ) NOT NULL DEFAULT '0',
|
||||
CHANGE `spellcharges_4` `spellcharges_4` SMALLINT( 6 ) NOT NULL DEFAULT '0',
|
||||
CHANGE `spellcharges_5` `spellcharges_5` SMALLINT( 6 ) NOT NULL DEFAULT '0';
|
||||
@@ -321,7 +321,7 @@ bool AuthSocket::_HandleLogonChallenge()
|
||||
|
||||
socket().recv((char *)&buf[0], 4);
|
||||
|
||||
EndianConvert(*((uint16*)(buf[0])));
|
||||
EndianConvertPtr<uint16>(&buf[0]);
|
||||
|
||||
uint16 remaining = ((sAuthLogonChallenge_C *)&buf[0])->size;
|
||||
TC_LOG_DEBUG("server.authserver", "[AuthChallenge] got header, body is %#04x bytes", remaining);
|
||||
@@ -341,11 +341,11 @@ bool AuthSocket::_HandleLogonChallenge()
|
||||
|
||||
// BigEndian code, nop in little endian case
|
||||
// size already converted
|
||||
EndianConvert(*((uint32*)(&ch->gamename[0])));
|
||||
EndianConvertPtr<uint32>(&ch->gamename[0]);
|
||||
EndianConvert(ch->build);
|
||||
EndianConvert(*((uint32*)(&ch->platform[0])));
|
||||
EndianConvert(*((uint32*)(&ch->os[0])));
|
||||
EndianConvert(*((uint32*)(&ch->country[0])));
|
||||
EndianConvertPtr<uint32>(&ch->platform[0]);
|
||||
EndianConvertPtr<uint32>(&ch->os[0]);
|
||||
EndianConvertPtr<uint32>(&ch->country[0]);
|
||||
EndianConvert(ch->timezone_bias);
|
||||
EndianConvert(ch->ip);
|
||||
|
||||
@@ -779,7 +779,7 @@ bool AuthSocket::_HandleReconnectChallenge()
|
||||
|
||||
socket().recv((char *)&buf[0], 4);
|
||||
|
||||
EndianConvert(*((uint16*)(buf[0])));
|
||||
EndianConvertPtr<uint16>(&buf[0]);
|
||||
|
||||
uint16 remaining = ((sAuthLogonChallenge_C *)&buf[0])->size;
|
||||
TC_LOG_DEBUG("server.authserver", "[ReconnectChallenge] got header, body is %#04x bytes", remaining);
|
||||
|
||||
@@ -151,9 +151,9 @@ enum AchievementCriteriaFlags
|
||||
{
|
||||
ACHIEVEMENT_CRITERIA_FLAG_SHOW_PROGRESS_BAR = 0x00000001, // Show progress as bar
|
||||
ACHIEVEMENT_CRITERIA_FLAG_HIDDEN = 0x00000002, // Not show criteria in client
|
||||
ACHIEVEMENT_CRITERIA_FLAG_UNK3 = 0x00000004, // BG related??
|
||||
ACHIEVEMENT_CRITERIA_FLAG_UNK4 = 0x00000008, //
|
||||
ACHIEVEMENT_CRITERIA_FLAG_UNK5 = 0x00000010, // not used
|
||||
ACHIEVEMENT_CRITERIA_FLAG_FAIL_ACHIEVEMENT = 0x00000004, // BG related??
|
||||
ACHIEVEMENT_CRITERIA_FLAG_RESET_ON_START = 0x00000008, //
|
||||
ACHIEVEMENT_CRITERIA_FLAG_IS_DATE = 0x00000010, // not used
|
||||
ACHIEVEMENT_CRITERIA_FLAG_MONEY_COUNTER = 0x00000020 // Displays counter as money
|
||||
};
|
||||
|
||||
|
||||
@@ -706,7 +706,7 @@ Player::Player(WorldSession* session): Unit(true), phaseMgr(this)
|
||||
m_focusRegenTimerCount = 0;
|
||||
m_weaponChangeTimer = 0;
|
||||
|
||||
m_zoneUpdateId = 0;
|
||||
m_zoneUpdateId = uint32(-1);
|
||||
m_zoneUpdateTimer = 0;
|
||||
|
||||
m_areaUpdateId = 0;
|
||||
@@ -24198,7 +24198,7 @@ uint32 Player::GetResurrectionSpellId()
|
||||
}
|
||||
|
||||
// Used in triggers for check "Only to targets that grant experience or honor" req
|
||||
bool Player::isHonorOrXPTarget(Unit const* victim)
|
||||
bool Player::isHonorOrXPTarget(Unit const* victim) const
|
||||
{
|
||||
uint8 v_level = victim->getLevel();
|
||||
uint8 k_grey = Trinity::XP::GetGrayLevel(getLevel());
|
||||
|
||||
@@ -2108,7 +2108,7 @@ class Player : public Unit, public GridObject<Player>
|
||||
bool IsAtRecruitAFriendDistance(WorldObject const* pOther) const;
|
||||
void RewardPlayerAndGroupAtKill(Unit* victim, bool isBattleGround);
|
||||
void RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject* pRewardSource);
|
||||
bool isHonorOrXPTarget(Unit const* victim);
|
||||
bool isHonorOrXPTarget(Unit const* victim) const;
|
||||
|
||||
bool GetsRecruitAFriendBonus(bool forXP);
|
||||
uint8 GetGrantableLevels() { return m_grantableLevels; }
|
||||
|
||||
@@ -1164,7 +1164,6 @@ void WorldSession::HandleMoveRootAck(WorldPacket& recvData)
|
||||
void WorldSession::HandleSetActionBarToggles(WorldPacket& recvData)
|
||||
{
|
||||
uint8 actionBar;
|
||||
|
||||
recvData >> actionBar;
|
||||
|
||||
if (!GetPlayer()) // ignore until not logged (check needed because STATUS_AUTHED)
|
||||
|
||||
@@ -406,7 +406,6 @@ void WorldSession::HandleSpiritHealerActivateOpcode(WorldPacket& recvData)
|
||||
TC_LOG_DEBUG("network", "WORLD: CMSG_SPIRIT_HEALER_ACTIVATE");
|
||||
|
||||
uint64 guid;
|
||||
|
||||
recvData >> guid;
|
||||
|
||||
Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_SPIRITHEALER);
|
||||
@@ -426,7 +425,6 @@ void WorldSession::HandleSpiritHealerActivateOpcode(WorldPacket& recvData)
|
||||
void WorldSession::SendSpiritResurrect()
|
||||
{
|
||||
_player->ResurrectPlayer(0.5f, true);
|
||||
|
||||
_player->DurabilityLossAll(0.25f, true);
|
||||
|
||||
// get corpse nearest graveyard
|
||||
|
||||
@@ -337,6 +337,9 @@ void MotionMaster::MoveKnockbackFrom(float srcX, float srcY, float speedXY, floa
|
||||
if (_owner->GetTypeId() == TYPEID_PLAYER)
|
||||
return;
|
||||
|
||||
if (speedXY <= 0.1f)
|
||||
return;
|
||||
|
||||
float x, y, z;
|
||||
float moveTimeHalf = speedZ / Movement::gravity;
|
||||
float dist = 2 * moveTimeHalf * speedXY;
|
||||
@@ -370,6 +373,8 @@ void MotionMaster::MoveJumpTo(float angle, float speedXY, float speedZ)
|
||||
void MotionMaster::MoveJump(float x, float y, float z, float speedXY, float speedZ, uint32 id)
|
||||
{
|
||||
TC_LOG_DEBUG("misc", "Unit (GUID: %u) jump to point (X: %f Y: %f Z: %f)", _owner->GetGUIDLow(), x, y, z);
|
||||
if (speedXY <= 0.1f)
|
||||
return;
|
||||
|
||||
float moveTimeHalf = speedZ / Movement::gravity;
|
||||
float max_height = -Movement::computeFallElevation(moveTimeHalf, false, -speedZ);
|
||||
|
||||
@@ -1171,77 +1171,6 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge
|
||||
float radius = m_spellInfo->Effects[effIndex].CalcRadius(m_caster) * m_spellValue->RadiusMod;
|
||||
SearchAreaTargets(targets, radius, center, referer, targetType.GetObjectType(), targetType.GetCheckType(), m_spellInfo->Effects[effIndex].ImplicitTargetConditions);
|
||||
|
||||
// Custom entries
|
||||
/// @todo remove those
|
||||
switch (m_spellInfo->Id)
|
||||
{
|
||||
case 46584: // Raise Dead
|
||||
{
|
||||
if (Player* playerCaster = m_caster->ToPlayer())
|
||||
{
|
||||
for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); ++itr)
|
||||
{
|
||||
switch ((*itr)->GetTypeId())
|
||||
{
|
||||
case TYPEID_UNIT:
|
||||
case TYPEID_PLAYER:
|
||||
{
|
||||
Unit* unitTarget = (*itr)->ToUnit();
|
||||
if (unitTarget->IsAlive() || !playerCaster->isHonorOrXPTarget(unitTarget)
|
||||
|| ((unitTarget->GetCreatureTypeMask() & (1 << (CREATURE_TYPE_HUMANOID-1))) == 0)
|
||||
|| (unitTarget->GetDisplayId() != unitTarget->GetNativeDisplayId()))
|
||||
break;
|
||||
AddUnitTarget(unitTarget, effMask, false);
|
||||
// no break;
|
||||
}
|
||||
case TYPEID_CORPSE: // wont work until corpses are allowed in target lists, but at least will send dest in packet
|
||||
m_targets.SetDst(*(*itr));
|
||||
return; // nothing more to do here
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return; // don't add targets to target map
|
||||
}
|
||||
// Corpse Explosion
|
||||
case 49158:
|
||||
case 51325:
|
||||
case 51326:
|
||||
case 51327:
|
||||
case 51328:
|
||||
// check if our target is not valid (spell can target ghoul or dead unit)
|
||||
if (!(m_targets.GetUnitTarget() && m_targets.GetUnitTarget()->GetDisplayId() == m_targets.GetUnitTarget()->GetNativeDisplayId() &&
|
||||
((m_targets.GetUnitTarget()->GetEntry() == 26125 && m_targets.GetUnitTarget()->GetOwnerGUID() == m_caster->GetGUID())
|
||||
|| m_targets.GetUnitTarget()->isDead())))
|
||||
{
|
||||
// remove existing targets
|
||||
CleanupTargetList();
|
||||
|
||||
for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); ++itr)
|
||||
{
|
||||
switch ((*itr)->GetTypeId())
|
||||
{
|
||||
case TYPEID_UNIT:
|
||||
case TYPEID_PLAYER:
|
||||
if (!(*itr)->ToUnit()->isDead())
|
||||
break;
|
||||
AddUnitTarget((*itr)->ToUnit(), 1 << effIndex, false);
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||
m_caster->ToPlayer()->RemoveSpellCooldown(m_spellInfo->Id, true);
|
||||
SendCastResult(SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW);
|
||||
finish(false);
|
||||
}
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
CallScriptObjectAreaTargetSelectHandlers(targets, effIndex);
|
||||
|
||||
if (!targets.empty())
|
||||
@@ -4930,8 +4859,7 @@ SpellCastResult Spell::CheckCast(bool strict)
|
||||
uint32 zone, area;
|
||||
m_caster->GetZoneAndAreaId(zone, area);
|
||||
|
||||
SpellCastResult locRes= m_spellInfo->CheckLocation(m_caster->GetMapId(), zone, area,
|
||||
m_caster->GetTypeId() == TYPEID_PLAYER ? m_caster->ToPlayer() : NULL);
|
||||
SpellCastResult locRes = m_spellInfo->CheckLocation(m_caster->GetMapId(), zone, area, m_caster->ToPlayer());
|
||||
if (locRes != SPELL_CAST_OK)
|
||||
return locRes;
|
||||
}
|
||||
|
||||
@@ -562,7 +562,7 @@ class Spell
|
||||
GameObject* focusObject;
|
||||
|
||||
// Damage and healing in effects need just calculate
|
||||
int32 m_damage; // Damge in effects count here
|
||||
int32 m_damage; // Damage in effects count here
|
||||
int32 m_healing; // Healing in effects count here
|
||||
|
||||
// ******************************************
|
||||
|
||||
@@ -559,11 +559,6 @@ void Spell::EffectDummy(SpellEffIndex effIndex)
|
||||
if (!unitTarget && !gameObjTarget && !itemTarget)
|
||||
return;
|
||||
|
||||
uint32 spell_id = 0;
|
||||
int32 bp = 0;
|
||||
bool triggered = true;
|
||||
SpellCastTargets targets;
|
||||
|
||||
// selection by spell family
|
||||
switch (m_spellInfo->SpellFamilyName)
|
||||
{
|
||||
@@ -600,60 +595,10 @@ void Spell::EffectDummy(SpellEffIndex effIndex)
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SPELLFAMILY_DEATHKNIGHT:
|
||||
switch (m_spellInfo->Id)
|
||||
{
|
||||
case 46584: // Raise Dead
|
||||
if (m_caster->GetTypeId() != TYPEID_PLAYER)
|
||||
return;
|
||||
|
||||
// Do we have talent Master of Ghouls?
|
||||
if (m_caster->HasAura(52143))
|
||||
// summon as pet
|
||||
bp = 52150;
|
||||
else
|
||||
// or guardian
|
||||
bp = 46585;
|
||||
|
||||
if (m_targets.HasDst())
|
||||
targets.SetDst(*m_targets.GetDstPos());
|
||||
else
|
||||
{
|
||||
targets.SetDst(*m_caster);
|
||||
// Corpse not found - take reagents (only not triggered cast can take them)
|
||||
triggered = false;
|
||||
}
|
||||
// Remove cooldown - summon spellls have category
|
||||
m_caster->ToPlayer()->RemoveSpellCooldown(m_spellInfo->Id, true);
|
||||
spell_id = 48289;
|
||||
break;
|
||||
// Raise dead - take reagents and trigger summon spells
|
||||
case 48289:
|
||||
if (m_targets.HasDst())
|
||||
targets.SetDst(*m_targets.GetDstPos());
|
||||
spell_id = CalculateDamage(0, NULL);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
//spells triggered by dummy effect should not miss
|
||||
if (spell_id)
|
||||
{
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id);
|
||||
|
||||
if (!spellInfo)
|
||||
{
|
||||
TC_LOG_ERROR("spells", "EffectDummy of spell %u: triggering unknown spell id %i\n", m_spellInfo->Id, spell_id);
|
||||
return;
|
||||
}
|
||||
|
||||
targets.SetUnitTarget(unitTarget);
|
||||
Spell* spell = new Spell(m_caster, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, m_originalCasterGUID, true);
|
||||
if (bp) spell->SetSpellValue(SPELLVALUE_BASE_POINT0, bp);
|
||||
spell->prepare(&targets);
|
||||
}
|
||||
|
||||
// pet auras
|
||||
if (PetAura const* petSpell = sSpellMgr->GetPetAura(m_spellInfo->Id, effIndex))
|
||||
{
|
||||
@@ -774,7 +719,7 @@ void Spell::EffectTriggerSpell(SpellEffIndex effIndex)
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id);
|
||||
if (!spellInfo)
|
||||
{
|
||||
TC_LOG_DEBUG("spells", "Spell::EffectTriggerSpell spell %u tried to trigger unknown spell %u", m_spellInfo->Id, triggered_spell_id);
|
||||
TC_LOG_ERROR("spells", "Spell::EffectTriggerSpell spell %u tried to trigger unknown spell %u", m_spellInfo->Id, triggered_spell_id);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -826,7 +771,7 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex)
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id);
|
||||
if (!spellInfo)
|
||||
{
|
||||
TC_LOG_DEBUG("spells", "Spell::EffectTriggerMissileSpell spell %u tried to trigger unknown spell %u", m_spellInfo->Id, triggered_spell_id);
|
||||
TC_LOG_ERROR("spells", "Spell::EffectTriggerMissileSpell spell %u tried to trigger unknown spell %u", m_spellInfo->Id, triggered_spell_id);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -2793,8 +2793,39 @@ void SpellMgr::UnloadSpellInfoImplicitTargetConditionLists()
|
||||
void SpellMgr::LoadSpellInfoCustomAttributes()
|
||||
{
|
||||
uint32 oldMSTime = getMSTime();
|
||||
|
||||
uint32 oldMSTime2 = oldMSTime;
|
||||
SpellInfo* spellInfo = NULL;
|
||||
|
||||
QueryResult result = WorldDatabase.Query("SELECT entry, attributes FROM spell_custom_attr");
|
||||
|
||||
if (!result)
|
||||
TC_LOG_INFO("server.loading", ">> Loaded 0 spell custom attributes from DB. DB table `spell_custom_attr` is empty.");
|
||||
else
|
||||
{
|
||||
uint32 count = 0;
|
||||
do
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
uint32 spellId = fields[0].GetUInt32();
|
||||
uint32 attributes = fields[1].GetUInt32();
|
||||
|
||||
spellInfo = mSpellInfoMap[spellId];
|
||||
if (!spellInfo)
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "Table `spell_custom_attr` has wrong spell (entry: %u), ignored.", spellId);
|
||||
continue;
|
||||
}
|
||||
|
||||
// TODO: validate attributes
|
||||
|
||||
spellInfo->AttributesCu |= attributes;
|
||||
++count;
|
||||
} while (result->NextRow());
|
||||
|
||||
TC_LOG_INFO("server.loading", ">> Loaded %u spell custom attributes from DB in %u ms", count, GetMSTimeDiffToNow(oldMSTime2));
|
||||
}
|
||||
|
||||
for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
|
||||
{
|
||||
spellInfo = mSpellInfoMap[i];
|
||||
@@ -2905,171 +2936,6 @@ void SpellMgr::LoadSpellInfoCustomAttributes()
|
||||
if (spellInfo->SpellVisual[0] == 3879)
|
||||
spellInfo->AttributesCu |= SPELL_ATTR0_CU_CONE_BACK;
|
||||
|
||||
switch (spellInfo->Id)
|
||||
{
|
||||
case 1776: // Gouge
|
||||
case 1777:
|
||||
case 8629:
|
||||
case 11285:
|
||||
case 11286:
|
||||
case 12540:
|
||||
case 13579:
|
||||
case 24698:
|
||||
case 28456:
|
||||
case 29425:
|
||||
case 34940:
|
||||
case 36862:
|
||||
case 38764:
|
||||
case 38863:
|
||||
case 52743: // Head Smack
|
||||
spellInfo->AttributesCu |= SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER;
|
||||
break;
|
||||
case 53: // Backstab
|
||||
case 2589:
|
||||
case 2590:
|
||||
case 2591:
|
||||
case 7159:
|
||||
case 8627:
|
||||
case 8721:
|
||||
case 11279:
|
||||
case 11280:
|
||||
case 11281:
|
||||
case 15582:
|
||||
case 15657:
|
||||
case 22416:
|
||||
case 25300:
|
||||
case 26863:
|
||||
case 37685:
|
||||
case 48656:
|
||||
case 48657:
|
||||
case 703: // Garrote
|
||||
case 8631:
|
||||
case 8632:
|
||||
case 8633:
|
||||
case 11289:
|
||||
case 11290:
|
||||
case 26839:
|
||||
case 26884:
|
||||
case 48675:
|
||||
case 48676:
|
||||
case 5221: // Shred
|
||||
case 6800:
|
||||
case 8992:
|
||||
case 9829:
|
||||
case 9830:
|
||||
case 27001:
|
||||
case 27002:
|
||||
case 48571:
|
||||
case 48572:
|
||||
case 8676: // Ambush
|
||||
case 8724:
|
||||
case 8725:
|
||||
case 11267:
|
||||
case 11268:
|
||||
case 11269:
|
||||
case 27441:
|
||||
case 48689:
|
||||
case 48690:
|
||||
case 48691:
|
||||
case 6785: // Ravage
|
||||
case 6787:
|
||||
case 9866:
|
||||
case 9867:
|
||||
case 27005:
|
||||
case 48578:
|
||||
case 48579:
|
||||
case 21987: // Lash of Pain
|
||||
case 23959: // Test Stab R50
|
||||
case 24825: // Test Backstab
|
||||
case 58563: // Assassinate Restless Lookout
|
||||
spellInfo->AttributesCu |= SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET;
|
||||
break;
|
||||
case 26029: // Dark Glare
|
||||
case 37433: // Spout
|
||||
case 43140: // Flame Breath
|
||||
case 43215: // Flame Breath
|
||||
case 70461: // Coldflame Trap
|
||||
case 72133: // Pain and Suffering
|
||||
case 73788: // Pain and Suffering
|
||||
case 73789: // Pain and Suffering
|
||||
case 73790: // Pain and Suffering
|
||||
spellInfo->AttributesCu |= SPELL_ATTR0_CU_CONE_LINE;
|
||||
break;
|
||||
case 24340: // Meteor
|
||||
case 26558: // Meteor
|
||||
case 28884: // Meteor
|
||||
case 36837: // Meteor
|
||||
case 38903: // Meteor
|
||||
case 41276: // Meteor
|
||||
case 57467: // Meteor
|
||||
case 26789: // Shard of the Fallen Star
|
||||
case 31436: // Malevolent Cleave
|
||||
case 35181: // Dive Bomb
|
||||
case 40810: // Saber Lash
|
||||
case 43267: // Saber Lash
|
||||
case 43268: // Saber Lash
|
||||
case 42384: // Brutal Swipe
|
||||
case 45150: // Meteor Slash
|
||||
case 64688: // Sonic Screech
|
||||
case 72373: // Shared Suffering
|
||||
case 71904: // Chaos Bane
|
||||
case 70492: // Ooze Eruption
|
||||
case 72505: // Ooze Eruption
|
||||
case 72624: // Ooze Eruption
|
||||
case 72625: // Ooze Eruption
|
||||
// ONLY SPELLS WITH SPELLFAMILY_GENERIC and EFFECT_SCHOOL_DAMAGE
|
||||
spellInfo->AttributesCu |= SPELL_ATTR0_CU_SHARE_DAMAGE;
|
||||
break;
|
||||
case 18500: // Wing Buffet
|
||||
case 33086: // Wild Bite
|
||||
case 49749: // Piercing Blow
|
||||
case 52890: // Penetrating Strike
|
||||
case 53454: // Impale
|
||||
case 59446: // Impale
|
||||
case 62383: // Shatter
|
||||
case 64777: // Machine Gun
|
||||
case 65239: // Machine Gun
|
||||
case 65919: // Impale
|
||||
case 67858: // Impale
|
||||
case 67859: // Impale
|
||||
case 67860: // Impale
|
||||
case 69293: // Wing Buffet
|
||||
case 74439: // Machine Gun
|
||||
case 63278: // Mark of the Faceless (General Vezax)
|
||||
case 62544: // Thrust (Argent Tournament)
|
||||
case 64588: // Thrust (Argent Tournament)
|
||||
case 66479: // Thrust (Argent Tournament)
|
||||
case 68505: // Thrust (Argent Tournament)
|
||||
case 62709: // Counterattack! (Argent Tournament)
|
||||
case 62626: // Break-Shield (Argent Tournament, Player)
|
||||
case 64590: // Break-Shield (Argent Tournament, Player)
|
||||
case 64342: // Break-Shield (Argent Tournament, NPC)
|
||||
case 64686: // Break-Shield (Argent Tournament, NPC)
|
||||
case 65147: // Break-Shield (Argent Tournament, NPC)
|
||||
case 68504: // Break-Shield (Argent Tournament, NPC)
|
||||
case 62874: // Charge (Argent Tournament, Player)
|
||||
case 68498: // Charge (Argent Tournament, Player)
|
||||
case 64591: // Charge (Argent Tournament, Player)
|
||||
case 63003: // Charge (Argent Tournament, NPC)
|
||||
case 63010: // Charge (Argent Tournament, NPC)
|
||||
case 68321: // Charge (Argent Tournament, NPC)
|
||||
case 72255: // Mark of the Fallen Champion (Deathbringer Saurfang)
|
||||
case 72444: // Mark of the Fallen Champion (Deathbringer Saurfang)
|
||||
case 72445: // Mark of the Fallen Champion (Deathbringer Saurfang)
|
||||
case 72446: // Mark of the Fallen Champion (Deathbringer Saurfang)
|
||||
spellInfo->AttributesCu |= SPELL_ATTR0_CU_IGNORE_ARMOR;
|
||||
break;
|
||||
case 64422: // Sonic Screech (Auriaya)
|
||||
spellInfo->AttributesCu |= SPELL_ATTR0_CU_SHARE_DAMAGE;
|
||||
spellInfo->AttributesCu |= SPELL_ATTR0_CU_IGNORE_ARMOR;
|
||||
break;
|
||||
case 72293: // Mark of the Fallen Champion (Deathbringer Saurfang)
|
||||
spellInfo->AttributesCu |= SPELL_ATTR0_CU_NEGATIVE_EFF0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (spellInfo->SpellFamilyName)
|
||||
{
|
||||
case SPELLFAMILY_WARRIOR:
|
||||
|
||||
@@ -576,16 +576,28 @@ void SpellScript::PreventHitDefaultEffect(SpellEffIndex effIndex)
|
||||
m_hitPreventDefaultEffectMask |= 1 << effIndex;
|
||||
}
|
||||
|
||||
int32 SpellScript::GetEffectValue()
|
||||
int32 SpellScript::GetEffectValue() const
|
||||
{
|
||||
if (!IsInEffectHook())
|
||||
{
|
||||
TC_LOG_ERROR("scripts", "Script: `%s` Spell: `%u`: function SpellScript::PreventHitDefaultEffect was called, but function has no effect in current hook!", m_scriptName->c_str(), m_scriptSpellId);
|
||||
TC_LOG_ERROR("scripts", "Script: `%s` Spell: `%u`: function SpellScript::GetEffectValue was called, but function has no effect in current hook!", m_scriptName->c_str(), m_scriptSpellId);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return m_spell->damage;
|
||||
}
|
||||
|
||||
void SpellScript::SetEffectValue(int32 value)
|
||||
{
|
||||
if (!IsInEffectHook())
|
||||
{
|
||||
TC_LOG_ERROR("scripts", "Script: `%s` Spell: `%u`: function SpellScript::SetEffectValue was called, but function has no effect in current hook!", m_scriptName->c_str(), m_scriptSpellId);
|
||||
return;
|
||||
}
|
||||
|
||||
m_spell->damage = value;
|
||||
}
|
||||
|
||||
Item* SpellScript::GetCastItem()
|
||||
{
|
||||
return m_spell->m_CastItem;
|
||||
|
||||
@@ -411,7 +411,8 @@ class SpellScript : public _SpellScript
|
||||
void PreventHitDefaultEffect(SpellEffIndex effIndex);
|
||||
|
||||
// method avalible only in EffectHandler method
|
||||
int32 GetEffectValue();
|
||||
int32 GetEffectValue() const;
|
||||
void SetEffectValue(int32 value);
|
||||
|
||||
// returns: cast item if present.
|
||||
Item* GetCastItem();
|
||||
|
||||
@@ -1837,7 +1837,6 @@ public:
|
||||
void IsSummonedBy(Unit*) OVERRIDE
|
||||
{
|
||||
DoCast(me, SPELL_EMERGE_VISUAL);
|
||||
DoZoneInCombat(me, 100.00f);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
|
||||
@@ -53,6 +53,8 @@ enum DeathKnightSpells
|
||||
SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED = 63622,
|
||||
SPELL_DK_ITEM_SIGIL_VENGEFUL_HEART = 64962,
|
||||
SPELL_DK_ITEM_T8_MELEE_4P_BONUS = 64736,
|
||||
SPELL_DK_MASTER_OF_GHOULS = 52143,
|
||||
SPELL_DK_RAISE_DEAD_USE_REAGENT = 48289,
|
||||
SPELL_DK_RUNIC_POWER_ENERGIZE = 49088,
|
||||
SPELL_DK_RUNE_TAP = 48982,
|
||||
SPELL_DK_SCENT_OF_BLOOD = 50422,
|
||||
@@ -1031,6 +1033,163 @@ class spell_dk_presence : public SpellScriptLoader
|
||||
}
|
||||
};
|
||||
|
||||
class RaiseDeadCheck
|
||||
{
|
||||
public:
|
||||
explicit RaiseDeadCheck(Player const* caster) : _caster(caster) { }
|
||||
|
||||
bool operator()(WorldObject* obj) const
|
||||
{
|
||||
if (Unit* target = obj->ToUnit())
|
||||
{
|
||||
if (!target->IsAlive()
|
||||
&& _caster->isHonorOrXPTarget(target)
|
||||
&& target->GetCreatureType() == CREATURE_TYPE_HUMANOID
|
||||
&& target->GetDisplayId() == target->GetNativeDisplayId())
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
Player const* _caster;
|
||||
};
|
||||
|
||||
|
||||
// 46584 - Raise Dead
|
||||
class spell_dk_raise_dead : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_dk_raise_dead() : SpellScriptLoader("spell_dk_raise_dead") { }
|
||||
|
||||
class spell_dk_raise_dead_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_dk_raise_dead_SpellScript);
|
||||
|
||||
bool Validate(SpellInfo const* spellInfo) OVERRIDE
|
||||
{
|
||||
if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_1].CalcValue())
|
||||
|| !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_2].CalcValue())
|
||||
|| !sSpellMgr->GetSpellInfo(SPELL_DK_RAISE_DEAD_USE_REAGENT)
|
||||
|| !sSpellMgr->GetSpellInfo(SPELL_DK_MASTER_OF_GHOULS))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Load() OVERRIDE
|
||||
{
|
||||
_result = SPELL_CAST_OK;
|
||||
_corpse = false;
|
||||
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
|
||||
}
|
||||
|
||||
SpellCastResult CheckCast()
|
||||
{
|
||||
/// process spell target selection before cast starts
|
||||
/// targets of effect_1 are used to check cast
|
||||
GetSpell()->SelectSpellTargets();
|
||||
/// cleanup spell target map, and fill it again on normal way
|
||||
GetSpell()->CleanupTargetList();
|
||||
/// _result is set in spell target selection
|
||||
return _result;
|
||||
}
|
||||
|
||||
SpellCastResult CheckReagents()
|
||||
{
|
||||
/// @workaround: there is no access to castresult of other spells, check it manually
|
||||
SpellInfo const* reagentSpell = sSpellMgr->GetSpellInfo(SPELL_DK_RAISE_DEAD_USE_REAGENT);
|
||||
Player* player = GetCaster()->ToPlayer();
|
||||
if (!player->CanNoReagentCast(reagentSpell))
|
||||
{
|
||||
for (uint32 i = 0; i < MAX_SPELL_REAGENTS; i++)
|
||||
{
|
||||
if (reagentSpell->Reagent[i] <= 0)
|
||||
continue;
|
||||
|
||||
if (!player->HasItemCount(reagentSpell->Reagent[i], reagentSpell->ReagentCount[i]))
|
||||
{
|
||||
Spell::SendCastResult(player, reagentSpell, 0, SPELL_FAILED_REAGENTS);
|
||||
return SPELL_FAILED_DONT_REPORT;
|
||||
}
|
||||
}
|
||||
}
|
||||
return SPELL_CAST_OK;
|
||||
}
|
||||
|
||||
void CheckTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
targets.remove_if(RaiseDeadCheck(GetCaster()->ToPlayer()));
|
||||
|
||||
if (targets.empty())
|
||||
{
|
||||
if (GetSpell()->getState() == SPELL_STATE_PREPARING)
|
||||
_result = CheckReagents();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
|
||||
targets.clear();
|
||||
targets.push_back(target);
|
||||
_corpse = true;
|
||||
}
|
||||
|
||||
void CheckTarget(WorldObject*& target)
|
||||
{
|
||||
// Don't add caster to target map, if we found a corpse to raise dead
|
||||
if (_corpse)
|
||||
target = NULL;
|
||||
}
|
||||
|
||||
void ConsumeReagents()
|
||||
{
|
||||
// No corpse found, take reagents
|
||||
if (!_corpse)
|
||||
GetCaster()->CastSpell(GetCaster(), SPELL_DK_RAISE_DEAD_USE_REAGENT, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST));
|
||||
}
|
||||
|
||||
uint32 GetGhoulSpellId()
|
||||
{
|
||||
// Do we have talent Master of Ghouls?
|
||||
if (GetCaster()->HasAura(SPELL_DK_MASTER_OF_GHOULS))
|
||||
// summon as pet
|
||||
return GetSpellInfo()->Effects[EFFECT_2].CalcValue();
|
||||
|
||||
// or guardian
|
||||
return GetSpellInfo()->Effects[EFFECT_1].CalcValue();
|
||||
}
|
||||
|
||||
void HandleRaiseDead(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(GetGhoulSpellId());
|
||||
SpellCastTargets targets;
|
||||
targets.SetDst(*GetHitUnit());
|
||||
|
||||
GetCaster()->CastSpell(targets, spellInfo, NULL, TRIGGERED_FULL_MASK);
|
||||
}
|
||||
|
||||
void Register() OVERRIDE
|
||||
{
|
||||
OnCheckCast += SpellCheckCastFn(spell_dk_raise_dead_SpellScript::CheckCast);
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_raise_dead_SpellScript::CheckTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY);
|
||||
OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dk_raise_dead_SpellScript::CheckTarget, EFFECT_2, TARGET_UNIT_CASTER);
|
||||
OnCast += SpellCastFn(spell_dk_raise_dead_SpellScript::ConsumeReagents);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_dk_raise_dead_SpellScript::HandleRaiseDead, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_dk_raise_dead_SpellScript::HandleRaiseDead, EFFECT_2, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
|
||||
private:
|
||||
SpellCastResult _result;
|
||||
bool _corpse;
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const OVERRIDE
|
||||
{
|
||||
return new spell_dk_raise_dead_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
// 59754 Rune Tap - Party
|
||||
class spell_dk_rune_tap_party : public SpellScriptLoader
|
||||
{
|
||||
@@ -1256,6 +1415,7 @@ void AddSC_deathknight_spell_scripts()
|
||||
new spell_dk_improved_unholy_presence();
|
||||
new spell_dk_necrotic_strike();
|
||||
new spell_dk_presence();
|
||||
new spell_dk_raise_dead();
|
||||
new spell_dk_rune_tap_party();
|
||||
new spell_dk_scent_of_blood();
|
||||
new spell_dk_scourge_strike();
|
||||
|
||||
@@ -57,6 +57,8 @@
|
||||
|
||||
#if defined(__cplusplus) && __cplusplus == 201103L
|
||||
# define COMPILER_HAS_CPP11_SUPPORT 1
|
||||
#elif _MSC_VER >= 1700
|
||||
# define COMPILER_HAS_CPP11_SUPPORT 1
|
||||
#else
|
||||
# define COMPILER_HAS_CPP11_SUPPORT 0
|
||||
#endif
|
||||
|
||||
@@ -47,9 +47,13 @@ namespace ByteConverter
|
||||
#if TRINITY_ENDIAN == TRINITY_BIGENDIAN
|
||||
template<typename T> inline void EndianConvert(T& val) { ByteConverter::apply<T>(&val); }
|
||||
template<typename T> inline void EndianConvertReverse(T&) { }
|
||||
template<typename T> inline void EndianConvertPtr(void* val) { ByteConverter::apply<T>(val); }
|
||||
template<typename T> inline void EndianConvertPtrReverse(void*) { }
|
||||
#else
|
||||
template<typename T> inline void EndianConvert(T&) { }
|
||||
template<typename T> inline void EndianConvertReverse(T& val) { ByteConverter::apply<T>(&val); }
|
||||
template<typename T> inline void EndianConvertPtr(void*) { }
|
||||
template<typename T> inline void EndianConvertPtrReverse(void* val) { ByteConverter::apply<T>(val); }
|
||||
#endif
|
||||
|
||||
template<typename T> void EndianConvert(T*); // will generate link error
|
||||
|
||||
@@ -510,6 +510,9 @@ void vutf8printf(FILE* out, const char *str, va_list* ap)
|
||||
wchar_t wtemp_buf[32*1024];
|
||||
|
||||
size_t temp_len = vsnprintf(temp_buf, 32*1024, str, *ap);
|
||||
//vsnprintf returns -1 if the buffer is too small
|
||||
if (temp_len == size_t(-1))
|
||||
temp_len = 32*1024-1;
|
||||
|
||||
size_t wtemp_len = 32*1024-1;
|
||||
Utf8toWStr(temp_buf, temp_len, wtemp_buf, wtemp_len);
|
||||
|
||||
Reference in new issue
Block a user