aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent_Michael <Vincent_Michael@gmx.de>2014-01-31 23:51:07 +0100
committerVincent_Michael <Vincent_Michael@gmx.de>2014-01-31 23:51:07 +0100
commit224da4795283d1314bd255611730a2b46f84f68c (patch)
tree9f118a2f9bafcce24ee3fd62057689bbd085d0d6
parent9316b947863dcac7675fc9e4cf43a44c4e678ab9 (diff)
parent19172ee4c26a12b844a7e1f435daed9bb44bf625 (diff)
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
-rw-r--r--sql/base/characters_database.sql8
-rw-r--r--sql/updates/auth/2013_08_30_00_auth_misc.sql34
-rw-r--r--sql/updates/auth/2013_11_11_00_auth_logs.sql3
-rw-r--r--sql/updates/world/2014_01_27_18_world_creature_template.sql6
-rw-r--r--sql/updates/world/2014_01_27_19_world_creature_template.sql4
-rw-r--r--sql/updates/world/2014_01_27_20_world_creature_template.sql3
-rw-r--r--sql/updates/world/2014_01_28_00_world_creature_template.sql2
-rw-r--r--sql/updates/world/2014_01_28_01_world_creature_template.sql4
-rw-r--r--sql/updates/world/2014_01_28_02_world_creature_template.sql5
-rw-r--r--sql/updates/world/2014_01_28_03_world_creature_template.sql3
-rw-r--r--sql/updates/world/2014_01_28_04_world_creature_template.sql2
-rw-r--r--sql/updates/world/2014_01_28_05_world_creature_template.sql2
-rw-r--r--sql/updates/world/2014_01_29_00_world_spell_script_names.sql3
-rw-r--r--sql/updates/world/2014_01_31_00_world_spell_custom_attr.sql167
-rw-r--r--sql/updates/world/2014_01_31_01_world_item_template.sql11
-rw-r--r--src/server/authserver/Server/AuthSocket.cpp12
-rw-r--r--src/server/game/DataStores/DBCEnums.h6
-rw-r--r--src/server/game/Entities/Player/Player.cpp4
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp1
-rw-r--r--src/server/game/Handlers/NPCHandler.cpp2
-rw-r--r--src/server/game/Movement/MotionMaster.cpp5
-rw-r--r--src/server/game/Spells/Spell.cpp74
-rw-r--r--src/server/game/Spells/Spell.h2
-rw-r--r--src/server/game/Spells/SpellEffects.cpp61
-rw-r--r--src/server/game/Spells/SpellMgr.cpp198
-rw-r--r--src/server/game/Spells/SpellScript.cpp16
-rw-r--r--src/server/game/Spells/SpellScript.h3
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp1
-rw-r--r--src/server/scripts/Spells/spell_dk.cpp160
-rw-r--r--src/server/shared/CompilerDefs.h2
-rw-r--r--src/server/shared/Utilities/ByteConverter.h4
-rw-r--r--src/server/shared/Utilities/Util.cpp3
33 files changed, 473 insertions, 340 deletions
diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql
index 599c05ce4cf..b3430b2b5ac 100644
--- a/sql/base/characters_database.sql
+++ b/sql/base/characters_database.sql
@@ -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
diff --git a/sql/updates/auth/2013_08_30_00_auth_misc.sql b/sql/updates/auth/2013_08_30_00_auth_misc.sql
index 1e790ce7e28..d433c479c63 100644
--- a/sql/updates/auth/2013_08_30_00_auth_misc.sql
+++ b/sql/updates/auth/2013_08_30_00_auth_misc.sql
@@ -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;
diff --git a/sql/updates/auth/2013_11_11_00_auth_logs.sql b/sql/updates/auth/2013_11_11_00_auth_logs.sql
index 4e4daa10e4b..dddda0d6743 100644
--- a/sql/updates/auth/2013_11_11_00_auth_logs.sql
+++ b/sql/updates/auth/2013_11_11_00_auth_logs.sql
@@ -1,2 +1 @@
-ALTER TABLE `logs` CHANGE `type` `type` varchar(250);
-
+ALTER TABLE `logs` CHANGE `type` `type` varchar(250) NOT NULL;
diff --git a/sql/updates/world/2014_01_27_18_world_creature_template.sql b/sql/updates/world/2014_01_27_18_world_creature_template.sql
new file mode 100644
index 00000000000..faad0b4ac7b
--- /dev/null
+++ b/sql/updates/world/2014_01_27_18_world_creature_template.sql
@@ -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);
diff --git a/sql/updates/world/2014_01_27_19_world_creature_template.sql b/sql/updates/world/2014_01_27_19_world_creature_template.sql
new file mode 100644
index 00000000000..a0127c48db8
--- /dev/null
+++ b/sql/updates/world/2014_01_27_19_world_creature_template.sql
@@ -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;
diff --git a/sql/updates/world/2014_01_27_20_world_creature_template.sql b/sql/updates/world/2014_01_27_20_world_creature_template.sql
new file mode 100644
index 00000000000..f28773dc0ec
--- /dev/null
+++ b/sql/updates/world/2014_01_27_20_world_creature_template.sql
@@ -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);
diff --git a/sql/updates/world/2014_01_28_00_world_creature_template.sql b/sql/updates/world/2014_01_28_00_world_creature_template.sql
new file mode 100644
index 00000000000..adb67b75ac5
--- /dev/null
+++ b/sql/updates/world/2014_01_28_00_world_creature_template.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_template` SET `faction_A` = 1216, `faction_H` = 1216 WHERE `entry` IN (13086,13317,22670,22732,31918,31949,37267);
diff --git a/sql/updates/world/2014_01_28_01_world_creature_template.sql b/sql/updates/world/2014_01_28_01_world_creature_template.sql
new file mode 100644
index 00000000000..725feaa6a3e
--- /dev/null
+++ b/sql/updates/world/2014_01_28_01_world_creature_template.sql
@@ -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);
diff --git a/sql/updates/world/2014_01_28_02_world_creature_template.sql b/sql/updates/world/2014_01_28_02_world_creature_template.sql
new file mode 100644
index 00000000000..81ec9d30f76
--- /dev/null
+++ b/sql/updates/world/2014_01_28_02_world_creature_template.sql
@@ -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);
diff --git a/sql/updates/world/2014_01_28_03_world_creature_template.sql b/sql/updates/world/2014_01_28_03_world_creature_template.sql
new file mode 100644
index 00000000000..eaf09f891e7
--- /dev/null
+++ b/sql/updates/world/2014_01_28_03_world_creature_template.sql
@@ -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;
diff --git a/sql/updates/world/2014_01_28_04_world_creature_template.sql b/sql/updates/world/2014_01_28_04_world_creature_template.sql
new file mode 100644
index 00000000000..ed8f6f0d5d3
--- /dev/null
+++ b/sql/updates/world/2014_01_28_04_world_creature_template.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_template` SET `faction_A`=1214, `faction_H`=1214 WHERE `entry` IN (13421,22609,31933);
diff --git a/sql/updates/world/2014_01_28_05_world_creature_template.sql b/sql/updates/world/2014_01_28_05_world_creature_template.sql
new file mode 100644
index 00000000000..c6b6ccc7252
--- /dev/null
+++ b/sql/updates/world/2014_01_28_05_world_creature_template.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_template` SET `VehicleId`=0 WHERE `entry` IN (38156,38637,38638);
diff --git a/sql/updates/world/2014_01_29_00_world_spell_script_names.sql b/sql/updates/world/2014_01_29_00_world_spell_script_names.sql
new file mode 100644
index 00000000000..6e37da1abcc
--- /dev/null
+++ b/sql/updates/world/2014_01_29_00_world_spell_script_names.sql
@@ -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');
diff --git a/sql/updates/world/2014_01_31_00_world_spell_custom_attr.sql b/sql/updates/world/2014_01_31_00_world_spell_custom_attr.sql
new file mode 100644
index 00000000000..488b09dc54e
--- /dev/null
+++ b/sql/updates/world/2014_01_31_00_world_spell_custom_attr.sql
@@ -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);
diff --git a/sql/updates/world/2014_01_31_01_world_item_template.sql b/sql/updates/world/2014_01_31_01_world_item_template.sql
new file mode 100644
index 00000000000..f47e96cf403
--- /dev/null
+++ b/sql/updates/world/2014_01_31_01_world_item_template.sql
@@ -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';
diff --git a/src/server/authserver/Server/AuthSocket.cpp b/src/server/authserver/Server/AuthSocket.cpp
index 8a2a6c67496..c7bb600024a 100644
--- a/src/server/authserver/Server/AuthSocket.cpp
+++ b/src/server/authserver/Server/AuthSocket.cpp
@@ -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);
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index 73319d5eefd..c650da7c83b 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -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
};
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 2324057169a..84d3b4de2fb 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -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());
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 0c4ce8b2c6e..5e159ef16d3 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -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; }
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index 8c9cc9c1338..b0514467667 100644
--- a/src/server/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
@@ -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)
diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp
index 48079c9c630..59ab27968f4 100644
--- a/src/server/game/Handlers/NPCHandler.cpp
+++ b/src/server/game/Handlers/NPCHandler.cpp
@@ -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
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp
index d8dee6dbe25..72bb0e1d56e 100644
--- a/src/server/game/Movement/MotionMaster.cpp
+++ b/src/server/game/Movement/MotionMaster.cpp
@@ -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);
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index f1a58cb7e91..f5396daef51 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -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;
}
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 1b415cd6cb8..0fa162f06c7 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -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
// ******************************************
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index f152e4f5976..ba8fd63f853 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -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;
}
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 104d9feb5fd..7f3b44a6f9d 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -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:
diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp
index c7eebb495c0..c0bcd477e5b 100644
--- a/src/server/game/Spells/SpellScript.cpp
+++ b/src/server/game/Spells/SpellScript.cpp
@@ -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;
diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index dfa494e38e6..6378a8bed9b 100644
--- a/src/server/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
@@ -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();
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
index 027a6843c87..1f4713415ac 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -1837,7 +1837,6 @@ public:
void IsSummonedBy(Unit*) OVERRIDE
{
DoCast(me, SPELL_EMERGE_VISUAL);
- DoZoneInCombat(me, 100.00f);
}
void JustDied(Unit* /*killer*/) OVERRIDE
diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp
index 76f2461bb28..d08623888b3 100644
--- a/src/server/scripts/Spells/spell_dk.cpp
+++ b/src/server/scripts/Spells/spell_dk.cpp
@@ -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();
diff --git a/src/server/shared/CompilerDefs.h b/src/server/shared/CompilerDefs.h
index 71b20a4d175..8a557328af4 100644
--- a/src/server/shared/CompilerDefs.h
+++ b/src/server/shared/CompilerDefs.h
@@ -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
diff --git a/src/server/shared/Utilities/ByteConverter.h b/src/server/shared/Utilities/ByteConverter.h
index bf1342a10e4..8eebb05bb13 100644
--- a/src/server/shared/Utilities/ByteConverter.h
+++ b/src/server/shared/Utilities/ByteConverter.h
@@ -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
diff --git a/src/server/shared/Utilities/Util.cpp b/src/server/shared/Utilities/Util.cpp
index 2149956c19f..f2a6f1b7622 100644
--- a/src/server/shared/Utilities/Util.cpp
+++ b/src/server/shared/Utilities/Util.cpp
@@ -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);