aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/2011_08_15_00_world_creature_loot_template.sql1
-rw-r--r--sql/updates/world/2011_08_18_00_world_vehicle_template_accessory.sql1
-rw-r--r--sql/updates/world/2011_08_18_01_world_misc.sql9
-rw-r--r--sql/updates/world/2011_08_18_02_world_achievement_criteria_data.sql6
-rw-r--r--sql/updates/world/2011_08_18_03_world_achievement_criteria_data.sql7
-rw-r--r--sql/updates/world/2011_08_18_04_world_spell_script_names.sql6
-rw-r--r--sql/updates/world/2011_08_19_01_world_spell_script_names.sql4
-rw-r--r--sql/updates/world/2011_08_19_02_world_spell_script_names.sql4
-rw-r--r--sql/updates/world/2011_08_19_03_world_spell_script_names.sql4
-rw-r--r--sql/updates/world/2011_08_20_00_world_achievement_criteria_data.sql11
-rw-r--r--sql/updates/world/2011_08_21_00_world_command.sql3
-rw-r--r--sql/updates/world/2011_08_21_01_world_command.sql1
-rw-r--r--sql/updates/world/2011_08_22_00_world_trinity_string.sql4
-rw-r--r--sql/updates/world/2011_08_23_00_world_creature_equip_template.sql3
-rw-r--r--sql/updates/world/2011_08_24_00_world_game_event.sql3
-rw-r--r--sql/updates/world/2011_08_24_01_world_conditions.sql4
-rw-r--r--sql/updates/world/2011_08_24_01_world_spell_script_names.sql4
-rw-r--r--sql/updates/world/2011_08_24_02_world_spell_script_names.sql4
-rw-r--r--sql/updates/world/2011_08_24_03_world_access_requirement.sql3
-rwxr-xr-xsrc/server/game/AI/CoreAI/CombatAI.cpp22
-rwxr-xr-xsrc/server/game/AI/CoreAI/CombatAI.h32
-rw-r--r--src/server/game/AI/CoreAI/GameObjectAI.cpp2
-rw-r--r--src/server/game/AI/CoreAI/GameObjectAI.h4
-rwxr-xr-xsrc/server/game/AI/CoreAI/GuardAI.cpp8
-rwxr-xr-xsrc/server/game/AI/CoreAI/GuardAI.h8
-rwxr-xr-xsrc/server/game/AI/CoreAI/PassiveAI.cpp10
-rwxr-xr-xsrc/server/game/AI/CoreAI/PassiveAI.h30
-rwxr-xr-xsrc/server/game/AI/CoreAI/PetAI.cpp29
-rwxr-xr-xsrc/server/game/AI/CoreAI/PetAI.h8
-rwxr-xr-xsrc/server/game/AI/CoreAI/ReactorAI.cpp4
-rwxr-xr-xsrc/server/game/AI/CoreAI/ReactorAI.h6
-rwxr-xr-xsrc/server/game/AI/CoreAI/TotemAI.cpp10
-rwxr-xr-xsrc/server/game/AI/CoreAI/TotemAI.h8
-rwxr-xr-xsrc/server/game/AI/CoreAI/UnitAI.cpp32
-rwxr-xr-xsrc/server/game/AI/CoreAI/UnitAI.h10
-rwxr-xr-xsrc/server/game/AI/CreatureAI.cpp32
-rwxr-xr-xsrc/server/game/AI/CreatureAIFactory.h24
-rwxr-xr-xsrc/server/game/AI/CreatureAIImpl.h4
-rwxr-xr-xsrc/server/game/AI/CreatureAISelector.cpp18
-rwxr-xr-xsrc/server/game/AI/CreatureAISelector.h6
-rwxr-xr-xsrc/server/game/AI/EventAI/CreatureEventAI.cpp268
-rwxr-xr-xsrc/server/game/AI/EventAI/CreatureEventAI.h28
-rwxr-xr-xsrc/server/game/AI/EventAI/CreatureEventAIMgr.cpp20
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.cpp160
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp114
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h8
-rwxr-xr-xsrc/server/game/AI/ScriptedAI/ScriptedSimpleAI.cpp60
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedSimpleAI.h4
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp108
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.h36
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp22
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h24
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp10
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h9
-rwxr-xr-xsrc/server/game/Accounts/AccountMgr.cpp135
-rwxr-xr-xsrc/server/game/Accounts/AccountMgr.h18
-rwxr-xr-xsrc/server/game/Battlegrounds/Battleground.cpp2
-rwxr-xr-xsrc/server/game/Battlegrounds/Zones/BattlegroundSA.cpp10
-rwxr-xr-xsrc/server/game/Chat/Chat.cpp4
-rwxr-xr-xsrc/server/game/Chat/Commands/Level3.cpp3
-rwxr-xr-xsrc/server/game/Combat/HostileRefManager.h8
-rwxr-xr-xsrc/server/game/Combat/ThreatManager.cpp2
-rwxr-xr-xsrc/server/game/Conditions/ConditionMgr.cpp34
-rwxr-xr-xsrc/server/game/Conditions/DisableMgr.cpp2
-rwxr-xr-xsrc/server/game/DataStores/DBCStores.cpp4
-rwxr-xr-xsrc/server/game/Entities/Creature/Creature.cpp6
-rwxr-xr-xsrc/server/game/Entities/Creature/Creature.h6
-rwxr-xr-xsrc/server/game/Entities/GameObject/GameObject.cpp7
-rwxr-xr-xsrc/server/game/Entities/GameObject/GameObject.h7
-rwxr-xr-xsrc/server/game/Entities/Object/Object.h2
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp77
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp127
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.h12
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.h12
-rwxr-xr-xsrc/server/game/Grids/Notifiers/GridNotifiers.cpp50
-rwxr-xr-xsrc/server/game/Grids/Notifiers/GridNotifiers.h53
-rwxr-xr-xsrc/server/game/Groups/Group.cpp2
-rwxr-xr-xsrc/server/game/Instances/InstanceScript.cpp17
-rwxr-xr-xsrc/server/game/Maps/Map.cpp6
-rwxr-xr-xsrc/server/game/Maps/Map.h20
-rwxr-xr-xsrc/server/game/Miscellaneous/Language.h3
-rwxr-xr-xsrc/server/game/Miscellaneous/SharedDefines.h139
-rwxr-xr-xsrc/server/game/Scripting/ScriptMgr.cpp20
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp2
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/MiscHandler.cpp9
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/MovementHandler.cpp2
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/PetHandler.cpp4
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/SpellHandler.cpp3
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuraEffects.cpp100
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h1
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuras.cpp2
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp807
-rwxr-xr-xsrc/server/game/Spells/Spell.h91
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp45
-rw-r--r--src/server/game/Spells/SpellInfo.cpp799
-rw-r--r--src/server/game/Spells/SpellInfo.h218
-rwxr-xr-xsrc/server/game/Spells/SpellMgr.cpp932
-rwxr-xr-xsrc/server/game/Spells/SpellMgr.h5
-rwxr-xr-xsrc/server/game/Spells/SpellScript.cpp5
-rwxr-xr-xsrc/server/game/Spells/SpellScript.h3
-rw-r--r--src/server/game/Tools/CharacterDatabaseCleaner.cpp1
-rw-r--r--[-rwxr-xr-x]src/server/game/Tools/PlayerDump.cpp16
-rwxr-xr-xsrc/server/game/Weather/Weather.h3
-rwxr-xr-xsrc/server/game/World/World.cpp2
-rw-r--r--src/server/scripts/Commands/cs_go.cpp87
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.h3
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp16
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/instance_blackrock_depths.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp8
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp2
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp8
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp6
-rw-r--r--src/server/scripts/Kalimdor/ashenvale.cpp2
-rw-r--r--src/server/scripts/Kalimdor/dustwallow_marsh.cpp4
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp2
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp8
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp4
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp2
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp4
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp4
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp1
-rw-r--r--src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp22
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp6
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp6
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp12
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp6
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp8
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp6
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp86
-rw-r--r--src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp38
-rw-r--r--src/server/scripts/Northrend/Naxxramas/naxxramas.h1
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp2
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp12
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_assembly_of_iron.cpp39
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp6
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp58
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_hodir.cpp39
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp8
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp2
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp4
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp2
-rw-r--r--src/server/scripts/Northrend/storm_peaks.cpp47
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp2
-rw-r--r--src/server/scripts/Outland/nagrand.cpp40
-rw-r--r--src/server/scripts/Spells/spell_dk.cpp2
-rw-r--r--src/server/scripts/Spells/spell_druid.cpp4
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp56
-rw-r--r--src/server/scripts/Spells/spell_hunter.cpp18
-rw-r--r--src/server/scripts/Spells/spell_item.cpp62
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp2
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp84
-rw-r--r--src/server/scripts/Spells/spell_rogue.cpp2
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp2
-rw-r--r--src/server/scripts/Spells/spell_warrior.cpp2
-rw-r--r--src/server/scripts/World/boss_emerald_dragons.cpp4
-rwxr-xr-xsrc/server/shared/Database/QueryResult.h4
160 files changed, 3493 insertions, 2478 deletions
diff --git a/sql/updates/world/2011_08_15_00_world_creature_loot_template.sql b/sql/updates/world/2011_08_15_00_world_creature_loot_template.sql
new file mode 100644
index 00000000000..a5bfd7c44a6
--- /dev/null
+++ b/sql/updates/world/2011_08_15_00_world_creature_loot_template.sql
@@ -0,0 +1 @@
+UPDATE `creature_loot_template` SET `maxcount`=3 WHERE `entry`=38401 AND `mincountOrRef`=-34248;
diff --git a/sql/updates/world/2011_08_18_00_world_vehicle_template_accessory.sql b/sql/updates/world/2011_08_18_00_world_vehicle_template_accessory.sql
new file mode 100644
index 00000000000..2659570e464
--- /dev/null
+++ b/sql/updates/world/2011_08_18_00_world_vehicle_template_accessory.sql
@@ -0,0 +1 @@
+UPDATE `vehicle_template_accessory` SET `seat_id`=1, `minion`=1 WHERE `entry`=29625;
diff --git a/sql/updates/world/2011_08_18_01_world_misc.sql b/sql/updates/world/2011_08_18_01_world_misc.sql
new file mode 100644
index 00000000000..0a01fc87763
--- /dev/null
+++ b/sql/updates/world/2011_08_18_01_world_misc.sql
@@ -0,0 +1,9 @@
+UPDATE `creature_template` SET `npcflag`=`npcflag`|0x1000000,`VehicleId`=165,`spell1`=54420,`AIName`='SmartAI',`InhabitType`=5 WHERE `entry`=29403;
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=29403;
+INSERT INTO `npc_spellclick_spells` VALUES
+(29403,49641,0,0,0,1,0,0,0);
+
+DELETE FROM `spell_scripts` WHERE `id`=54420;
+INSERT INTO `spell_scripts` (`id`,`effIndex`,`delay`,`command`,`datalong`,`datalong2`,`dataint`,`x`,`y`,`z`,`o`) VALUES
+(54420,1,0,18,0,0,0,0,0,0,0);
+
diff --git a/sql/updates/world/2011_08_18_02_world_achievement_criteria_data.sql b/sql/updates/world/2011_08_18_02_world_achievement_criteria_data.sql
new file mode 100644
index 00000000000..6c52e685054
--- /dev/null
+++ b/sql/updates/world/2011_08_18_02_world_achievement_criteria_data.sql
@@ -0,0 +1,6 @@
+DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (12747,12748,12749) AND `type`=12;
+INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`ScriptName`)
+VALUES
+(12747,12,1,0,''),
+(12748,12,1,0,''),
+(12749,12,1,0,'');
diff --git a/sql/updates/world/2011_08_18_03_world_achievement_criteria_data.sql b/sql/updates/world/2011_08_18_03_world_achievement_criteria_data.sql
new file mode 100644
index 00000000000..91e9715006d
--- /dev/null
+++ b/sql/updates/world/2011_08_18_03_world_achievement_criteria_data.sql
@@ -0,0 +1,7 @@
+DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (12740,12741,12744,12993) AND `type`=12;
+INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`ScriptName`)
+VALUES
+(12740,12,0,0,''),
+(12741,12,0,0,''),
+(12744,12,0,0,''),
+(12993,12,1,0,'');
diff --git a/sql/updates/world/2011_08_18_04_world_spell_script_names.sql b/sql/updates/world/2011_08_18_04_world_spell_script_names.sql
new file mode 100644
index 00000000000..a5ad44c5659
--- /dev/null
+++ b/sql/updates/world/2011_08_18_04_world_spell_script_names.sql
@@ -0,0 +1,6 @@
+DELETE FROM `spell_script_names` WHERE `spell_id`=64414;
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(64414,'spell_load_into_catapult');
+
+-- Update a wrongly entered spell
+UPDATE `creature_template` SET `spell6`=64414 WHERE `entry`=33167;
diff --git a/sql/updates/world/2011_08_19_01_world_spell_script_names.sql b/sql/updates/world/2011_08_19_01_world_spell_script_names.sql
new file mode 100644
index 00000000000..2a54a117c2c
--- /dev/null
+++ b/sql/updates/world/2011_08_19_01_world_spell_script_names.sql
@@ -0,0 +1,4 @@
+DELETE FROM `spell_script_names` WHERE `spell_id`=58886;
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`)
+VALUES
+(58886,'spell_magic_eater_food');
diff --git a/sql/updates/world/2011_08_19_02_world_spell_script_names.sql b/sql/updates/world/2011_08_19_02_world_spell_script_names.sql
new file mode 100644
index 00000000000..8035a77d778
--- /dev/null
+++ b/sql/updates/world/2011_08_19_02_world_spell_script_names.sql
@@ -0,0 +1,4 @@
+DELETE FROM `spell_script_names` WHERE `spell_id`=61889;
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`)
+VALUES
+(61889,'spell_assembly_meltdown');
diff --git a/sql/updates/world/2011_08_19_03_world_spell_script_names.sql b/sql/updates/world/2011_08_19_03_world_spell_script_names.sql
new file mode 100644
index 00000000000..adda3f57015
--- /dev/null
+++ b/sql/updates/world/2011_08_19_03_world_spell_script_names.sql
@@ -0,0 +1,4 @@
+DELETE FROM `spell_script_names` WHERE `spell_id`=20577;
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`)
+VALUES
+(20577,'spell_gen_cannibalize');
diff --git a/sql/updates/world/2011_08_20_00_world_achievement_criteria_data.sql b/sql/updates/world/2011_08_20_00_world_achievement_criteria_data.sql
new file mode 100644
index 00000000000..50cc98f9661
--- /dev/null
+++ b/sql/updates/world/2011_08_20_00_world_achievement_criteria_data.sql
@@ -0,0 +1,11 @@
+UPDATE `creature_template` SET `AIName`='', `ScriptName`='npc_kelthuzad_abomination' WHERE `entry`=16428;
+
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=16428;
+
+DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (7614, 7615) AND `type`=11;
+INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`ScriptName`)
+VALUES
+(7614,11,0,0,'achievement_just_cant_get_enough'),
+(7615,11,0,0,'achievement_just_cant_get_enough');
+
+DELETE FROM `disables` WHERE `entry` IN (7614, 7615);
diff --git a/sql/updates/world/2011_08_21_00_world_command.sql b/sql/updates/world/2011_08_21_00_world_command.sql
new file mode 100644
index 00000000000..f0b91cd3dfe
--- /dev/null
+++ b/sql/updates/world/2011_08_21_00_world_command.sql
@@ -0,0 +1,3 @@
+DELETE FROM `command` WHERE `name` = 'go xyz';
+INSERT INTO `command` VALUES
+('go xyz',1,'Syntax: .go xyz #x #y [#z [#mapid [#orientation]]]\r\n\r\nTeleport player to point with (#x,#y,#z) coordinates at map #mapid with orientation #orientation. If z is not provided, ground/water level will be used. If mapid is not provided, the current map will be used. If #orientation is not provided, the current orientation will be used.');
diff --git a/sql/updates/world/2011_08_21_01_world_command.sql b/sql/updates/world/2011_08_21_01_world_command.sql
new file mode 100644
index 00000000000..0d814210871
--- /dev/null
+++ b/sql/updates/world/2011_08_21_01_world_command.sql
@@ -0,0 +1 @@
+DELETE FROM `command` WHERE `name` = 'go xy';
diff --git a/sql/updates/world/2011_08_22_00_world_trinity_string.sql b/sql/updates/world/2011_08_22_00_world_trinity_string.sql
new file mode 100644
index 00000000000..b6737833a65
--- /dev/null
+++ b/sql/updates/world/2011_08_22_00_world_trinity_string.sql
@@ -0,0 +1,4 @@
+DELETE FROM `trinity_string` WHERE `entry`=1136;
+INSERT INTO `trinity_string` (`entry`,`content_default`,`content_loc1`,`content_loc2`,`content_loc3`,`content_loc4`,`content_loc5`,`content_loc6`,`content_loc7`,`content_loc8`)
+VALUES
+(1136,'Character %s has never been banned!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
diff --git a/sql/updates/world/2011_08_23_00_world_creature_equip_template.sql b/sql/updates/world/2011_08_23_00_world_creature_equip_template.sql
new file mode 100644
index 00000000000..dc388b96f7c
--- /dev/null
+++ b/sql/updates/world/2011_08_23_00_world_creature_equip_template.sql
@@ -0,0 +1,3 @@
+DELETE FROM `creature_equip_template` WHERE `entry`=2475;
+INSERT INTO `creature_equip_template` (`entry`,`itemEntry1`,`itemEntry2`,`itemEntry3`) VALUES
+(2475,39659,0,0);
diff --git a/sql/updates/world/2011_08_24_00_world_game_event.sql b/sql/updates/world/2011_08_24_00_world_game_event.sql
new file mode 100644
index 00000000000..e8a12ce8f6c
--- /dev/null
+++ b/sql/updates/world/2011_08_24_00_world_game_event.sql
@@ -0,0 +1,3 @@
+-- Resync Darkmoon Faerie
+UPDATE `game_event` SET `start_time`='2011-10-02 00:01:00' WHERE `eventEntry`=5;
+UPDATE `game_event` SET `start_time`='2011-11-06 00:01:00' WHERE `eventEntry`=3;
diff --git a/sql/updates/world/2011_08_24_01_world_conditions.sql b/sql/updates/world/2011_08_24_01_world_conditions.sql
new file mode 100644
index 00000000000..7c2eb323733
--- /dev/null
+++ b/sql/updates/world/2011_08_24_01_world_conditions.sql
@@ -0,0 +1,4 @@
+DELETE FROM `conditions` WHERE `SourceEntry`=32146;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`)
+VALUES
+(13,0,32146,0,18,1,18240,0,0,'','Spell Liquid Fire can only be cast at Sunspring Villager');
diff --git a/sql/updates/world/2011_08_24_01_world_spell_script_names.sql b/sql/updates/world/2011_08_24_01_world_spell_script_names.sql
new file mode 100644
index 00000000000..5370158f1a5
--- /dev/null
+++ b/sql/updates/world/2011_08_24_01_world_spell_script_names.sql
@@ -0,0 +1,4 @@
+DELETE FROM `spell_script_names` WHERE `spell_id`=32146;
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`)
+VALUES
+(32146,'spell_q9874_liquid_fire');
diff --git a/sql/updates/world/2011_08_24_02_world_spell_script_names.sql b/sql/updates/world/2011_08_24_02_world_spell_script_names.sql
new file mode 100644
index 00000000000..1799d408747
--- /dev/null
+++ b/sql/updates/world/2011_08_24_02_world_spell_script_names.sql
@@ -0,0 +1,4 @@
+DELETE FROM `spell_script_names` WHERE `spell_id`=54190;
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`)
+VALUES
+(54190,'spell_q12805_lifeblood_dummy');
diff --git a/sql/updates/world/2011_08_24_03_world_access_requirement.sql b/sql/updates/world/2011_08_24_03_world_access_requirement.sql
new file mode 100644
index 00000000000..96fc93e7804
--- /dev/null
+++ b/sql/updates/world/2011_08_24_03_world_access_requirement.sql
@@ -0,0 +1,3 @@
+UPDATE access_requirement SET level_min=75 WHERE mapId=632 AND difficulty=0;
+UPDATE access_requirement SET level_min=75 WHERE mapId=658 AND difficulty=0;
+UPDATE access_requirement SET level_min=75 WHERE mapId=668 AND difficulty=0;
diff --git a/src/server/game/AI/CoreAI/CombatAI.cpp b/src/server/game/AI/CoreAI/CombatAI.cpp
index d35710aa40f..67e75633b05 100755
--- a/src/server/game/AI/CoreAI/CombatAI.cpp
+++ b/src/server/game/AI/CoreAI/CombatAI.cpp
@@ -22,7 +22,7 @@
#include "Vehicle.h"
#include "ObjectAccessor.h"
-int AggressorAI::Permissible(const Creature *creature)
+int AggressorAI::Permissible(const Creature* creature)
{
// have some hostile factions, it will be selected by IsHostileTo check at MoveInLineOfSight
if (!creature->isCivilian() && !creature->IsNeutralToAll())
@@ -81,7 +81,7 @@ void CombatAI::JustDied(Unit* killer)
me->CastSpell(killer, *i, true);
}
-void CombatAI::EnterCombat(Unit *who)
+void CombatAI::EnterCombat(Unit* who)
{
for (SpellVct::iterator i = spells.begin(); i != spells.end(); ++i)
{
@@ -127,7 +127,7 @@ void CasterAI::InitializeAI()
m_attackDist = MELEE_RANGE;
}
-void CasterAI::EnterCombat(Unit *who)
+void CasterAI::EnterCombat(Unit* who)
{
if (spells.empty())
return;
@@ -173,7 +173,7 @@ void CasterAI::UpdateAI(const uint32 diff)
//ArcherAI
//////////////
-ArcherAI::ArcherAI(Creature *c) : CreatureAI(c)
+ArcherAI::ArcherAI(Creature* c) : CreatureAI(c)
{
if (!me->m_spells[0])
sLog->outError("ArcherAI set for creature (entry = %u) with spell1=0. AI will do nothing", me->GetEntry());
@@ -187,7 +187,7 @@ ArcherAI::ArcherAI(Creature *c) : CreatureAI(c)
me->m_SightDistance = me->m_CombatDistance;
}
-void ArcherAI::AttackStart(Unit *who)
+void ArcherAI::AttackStart(Unit* who)
{
if (!who)
return;
@@ -222,7 +222,7 @@ void ArcherAI::UpdateAI(const uint32 /*diff*/)
//TurretAI
//////////////
-TurretAI::TurretAI(Creature *c) : CreatureAI(c)
+TurretAI::TurretAI(Creature* c) : CreatureAI(c)
{
if (!me->m_spells[0])
sLog->outError("TurretAI set for creature (entry = %u) with spell1=0. AI will do nothing", me->GetEntry());
@@ -242,7 +242,7 @@ bool TurretAI::CanAIAttack(const Unit* /*who*/) const
return true;
}
-void TurretAI::AttackStart(Unit *who)
+void TurretAI::AttackStart(Unit* who)
{
if (who)
me->Attack(who, false);
@@ -260,7 +260,7 @@ void TurretAI::UpdateAI(const uint32 /*diff*/)
//VehicleAI
//////////////
-VehicleAI::VehicleAI(Creature *c) : CreatureAI(c), m_vehicle(c->GetVehicleKit()), m_IsVehicleInUse(false), m_ConditionsTimer(VEHICLE_CONDITION_CHECK_TIME)
+VehicleAI::VehicleAI(Creature* c) : CreatureAI(c), m_vehicle(c->GetVehicleKit()), m_IsVehicleInUse(false), m_ConditionsTimer(VEHICLE_CONDITION_CHECK_TIME)
{
LoadConditions();
m_DoDismiss = false;
@@ -318,11 +318,11 @@ void VehicleAI::CheckConditions(const uint32 diff)
for (SeatMap::iterator itr = m_vehicle->Seats.begin(); itr != m_vehicle->Seats.end(); ++itr)
if (Unit* passenger = ObjectAccessor::GetUnit(*m_vehicle->GetBase(), itr->second.Passenger))
{
- if (Player* plr = passenger->ToPlayer())
+ if (Player* player = passenger->ToPlayer())
{
- if (!sConditionMgr->IsPlayerMeetToConditions(plr, conditions))
+ if (!sConditionMgr->IsPlayerMeetToConditions(player, conditions))
{
- plr->ExitVehicle();
+ player->ExitVehicle();
return;//check other pessanger in next tick
}
}
diff --git a/src/server/game/AI/CoreAI/CombatAI.h b/src/server/game/AI/CoreAI/CombatAI.h
index 94f11ba8431..fca964826d3 100755
--- a/src/server/game/AI/CoreAI/CombatAI.h
+++ b/src/server/game/AI/CoreAI/CombatAI.h
@@ -28,10 +28,10 @@ class Creature;
class AggressorAI : public CreatureAI
{
public:
- explicit AggressorAI(Creature *c) : CreatureAI(c) {}
+ explicit AggressorAI(Creature* c) : CreatureAI(c) {}
void UpdateAI(const uint32);
- static int Permissible(const Creature *);
+ static int Permissible(const Creature*);
};
typedef std::vector<uint32> SpellVct;
@@ -39,14 +39,14 @@ typedef std::vector<uint32> SpellVct;
class CombatAI : public CreatureAI
{
public:
- explicit CombatAI(Creature *c) : CreatureAI(c) {}
+ explicit CombatAI(Creature* c) : CreatureAI(c) {}
void InitializeAI();
void Reset();
void EnterCombat(Unit* who);
void JustDied(Unit* killer);
void UpdateAI(const uint32 diff);
- static int Permissible(const Creature *);
+ static int Permissible(const Creature*);
protected:
EventMap events;
SpellVct spells;
@@ -55,7 +55,7 @@ class CombatAI : public CreatureAI
class CasterAI : public CombatAI
{
public:
- explicit CasterAI(Creature *c) : CombatAI(c) { m_attackDist = MELEE_RANGE; }
+ explicit CasterAI(Creature* c) : CombatAI(c) { m_attackDist = MELEE_RANGE; }
void InitializeAI();
void AttackStart(Unit* victim) { AttackStartCaster(victim, m_attackDist); }
void UpdateAI(const uint32 diff);
@@ -67,11 +67,11 @@ class CasterAI : public CombatAI
struct ArcherAI : public CreatureAI
{
public:
- explicit ArcherAI(Creature *c);
- void AttackStart(Unit *who);
+ explicit ArcherAI(Creature* c);
+ void AttackStart(Unit* who);
void UpdateAI(const uint32 diff);
- static int Permissible(const Creature *);
+ static int Permissible(const Creature*);
protected:
float m_minRange;
};
@@ -79,12 +79,12 @@ struct ArcherAI : public CreatureAI
struct TurretAI : public CreatureAI
{
public:
- explicit TurretAI(Creature *c);
- bool CanAIAttack(const Unit *who) const;
- void AttackStart(Unit *who);
+ explicit TurretAI(Creature* c);
+ bool CanAIAttack(const Unit* who) const;
+ void AttackStart(Unit* who);
void UpdateAI(const uint32 diff);
- static int Permissible(const Creature *);
+ static int Permissible(const Creature*);
protected:
float m_minRange;
};
@@ -94,13 +94,13 @@ struct TurretAI : public CreatureAI
struct VehicleAI : public CreatureAI
{
public:
- explicit VehicleAI(Creature *c);
+ explicit VehicleAI(Creature* c);
void UpdateAI(const uint32 diff);
- static int Permissible(const Creature *);
+ static int Permissible(const Creature*);
void Reset();
- void MoveInLineOfSight(Unit *) {}
- void AttackStart(Unit *) {}
+ void MoveInLineOfSight(Unit*) {}
+ void AttackStart(Unit*) {}
void OnCharmed(bool apply);
private:
diff --git a/src/server/game/AI/CoreAI/GameObjectAI.cpp b/src/server/game/AI/CoreAI/GameObjectAI.cpp
index 7262530d7ac..28c42a8ccdb 100644
--- a/src/server/game/AI/CoreAI/GameObjectAI.cpp
+++ b/src/server/game/AI/CoreAI/GameObjectAI.cpp
@@ -26,4 +26,4 @@ int GameObjectAI::Permissible(const GameObject* go)
return PERMIT_BASE_NO;
}
-NullGameObjectAI::NullGameObjectAI(GameObject *g) : GameObjectAI(g) {} \ No newline at end of file
+NullGameObjectAI::NullGameObjectAI(GameObject* g) : GameObjectAI(g) {} \ No newline at end of file
diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h
index ed3a5b47e76..8d0e0508113 100644
--- a/src/server/game/AI/CoreAI/GameObjectAI.h
+++ b/src/server/game/AI/CoreAI/GameObjectAI.h
@@ -30,7 +30,7 @@ class GameObjectAI
protected:
GameObject* const go;
public:
- explicit GameObjectAI(GameObject *g) : go(g) {}
+ explicit GameObjectAI(GameObject* g) : go(g) {}
virtual ~GameObjectAI() {}
virtual void UpdateAI(const uint32 /*diff*/) {}
@@ -54,7 +54,7 @@ class GameObjectAI
class NullGameObjectAI : public GameObjectAI
{
public:
- explicit NullGameObjectAI(GameObject *g);
+ explicit NullGameObjectAI(GameObject* g);
void UpdateAI(const uint32 /*diff*/) {}
diff --git a/src/server/game/AI/CoreAI/GuardAI.cpp b/src/server/game/AI/CoreAI/GuardAI.cpp
index 1ebc9e69078..237bc479074 100755
--- a/src/server/game/AI/CoreAI/GuardAI.cpp
+++ b/src/server/game/AI/CoreAI/GuardAI.cpp
@@ -40,8 +40,8 @@ bool GuardAI::CanSeeAlways(WorldObject const* obj)
if (!obj->isType(TYPEMASK_UNIT))
return false;
- std::list<HostileReference *> t_list = me->getThreatManager().getThreatList();
- for (std::list<HostileReference *>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
+ std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
+ for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
{
if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()))
if (unit == obj)
@@ -140,6 +140,6 @@ void GuardAI::UpdateAI(const uint32 /*diff*/)
void GuardAI::JustDied(Unit* killer)
{
- if (Player* pkiller = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
- me->SendZoneUnderAttackMessage(pkiller);
+ if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
+ me->SendZoneUnderAttackMessage(player);
}
diff --git a/src/server/game/AI/CoreAI/GuardAI.h b/src/server/game/AI/CoreAI/GuardAI.h
index 7b9c8d6808c..c0b80ac5174 100755
--- a/src/server/game/AI/CoreAI/GuardAI.h
+++ b/src/server/game/AI/CoreAI/GuardAI.h
@@ -34,15 +34,15 @@ class GuardAI : public ScriptedAI
public:
- explicit GuardAI(Creature *c);
+ explicit GuardAI(Creature* c);
- void MoveInLineOfSight(Unit *);
+ void MoveInLineOfSight(Unit*);
void EnterEvadeMode();
- void JustDied(Unit *);
+ void JustDied(Unit*);
bool CanSeeAlways(WorldObject const* obj);
void UpdateAI(const uint32);
- static int Permissible(const Creature *);
+ static int Permissible(const Creature*);
private:
uint64 i_victimGuid;
diff --git a/src/server/game/AI/CoreAI/PassiveAI.cpp b/src/server/game/AI/CoreAI/PassiveAI.cpp
index 1b449f44fbd..4107179f6f7 100755
--- a/src/server/game/AI/CoreAI/PassiveAI.cpp
+++ b/src/server/game/AI/CoreAI/PassiveAI.cpp
@@ -20,9 +20,9 @@
#include "Creature.h"
#include "TemporarySummon.h"
-PassiveAI::PassiveAI(Creature *c) : CreatureAI(c) { me->SetReactState(REACT_PASSIVE); }
-PossessedAI::PossessedAI(Creature *c) : CreatureAI(c) { me->SetReactState(REACT_PASSIVE); }
-NullCreatureAI::NullCreatureAI(Creature *c) : CreatureAI(c) { me->SetReactState(REACT_PASSIVE); }
+PassiveAI::PassiveAI(Creature* c) : CreatureAI(c) { me->SetReactState(REACT_PASSIVE); }
+PossessedAI::PossessedAI(Creature* c) : CreatureAI(c) { me->SetReactState(REACT_PASSIVE); }
+NullCreatureAI::NullCreatureAI(Creature* c) : CreatureAI(c) { me->SetReactState(REACT_PASSIVE); }
void PassiveAI::UpdateAI(const uint32)
{
@@ -59,7 +59,7 @@ void PossessedAI::KilledUnit(Unit* victim)
victim->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
}
-void CritterAI::DamageTaken(Unit* /*done_by*/, uint32 &)
+void CritterAI::DamageTaken(Unit* /*done_by*/, uint32&)
{
if (!me->HasUnitState(UNIT_STAT_FLEEING))
me->SetControlled(true, UNIT_STAT_FLEEING);
@@ -72,7 +72,7 @@ void CritterAI::EnterEvadeMode()
CreatureAI::EnterEvadeMode();
}
-void TriggerAI::IsSummonedBy(Unit *summoner)
+void TriggerAI::IsSummonedBy(Unit* summoner)
{
if (me->m_spells[0])
me->CastSpell(me, me->m_spells[0], false, 0, 0, summoner->GetGUID());
diff --git a/src/server/game/AI/CoreAI/PassiveAI.h b/src/server/game/AI/CoreAI/PassiveAI.h
index be78918c608..e23fb41d608 100755
--- a/src/server/game/AI/CoreAI/PassiveAI.h
+++ b/src/server/game/AI/CoreAI/PassiveAI.h
@@ -25,21 +25,21 @@
class PassiveAI : public CreatureAI
{
public:
- explicit PassiveAI(Creature *c);
+ explicit PassiveAI(Creature* c);
- void MoveInLineOfSight(Unit *) {}
- void AttackStart(Unit *) {}
+ void MoveInLineOfSight(Unit*) {}
+ void AttackStart(Unit*) {}
void UpdateAI(const uint32);
- static int Permissible(const Creature *) { return PERMIT_BASE_IDLE; }
+ static int Permissible(const Creature*) { return PERMIT_BASE_IDLE; }
};
class PossessedAI : public CreatureAI
{
public:
- explicit PossessedAI(Creature *c);
+ explicit PossessedAI(Creature* c);
- void MoveInLineOfSight(Unit *) {}
+ void MoveInLineOfSight(Unit*) {}
void AttackStart(Unit* target);
void UpdateAI(const uint32);
void EnterEvadeMode() {}
@@ -47,37 +47,37 @@ class PossessedAI : public CreatureAI
void JustDied(Unit*);
void KilledUnit(Unit* victim);
- static int Permissible(const Creature *) { return PERMIT_BASE_IDLE; }
+ static int Permissible(const Creature*) { return PERMIT_BASE_IDLE; }
};
class NullCreatureAI : public CreatureAI
{
public:
- explicit NullCreatureAI(Creature *c);
+ explicit NullCreatureAI(Creature* c);
- void MoveInLineOfSight(Unit *) {}
- void AttackStart(Unit *) {}
+ void MoveInLineOfSight(Unit*) {}
+ void AttackStart(Unit*) {}
void UpdateAI(const uint32) {}
void EnterEvadeMode() {}
void OnCharmed(bool /*apply*/) {}
- static int Permissible(const Creature *) { return PERMIT_BASE_IDLE; }
+ static int Permissible(const Creature*) { return PERMIT_BASE_IDLE; }
};
class CritterAI : public PassiveAI
{
public:
- explicit CritterAI(Creature *c) : PassiveAI(c) {}
+ explicit CritterAI(Creature* c) : PassiveAI(c) {}
- void DamageTaken(Unit *done_by, uint32 & /*damage*/);
+ void DamageTaken(Unit* done_by, uint32& /*damage*/);
void EnterEvadeMode();
};
class TriggerAI : public NullCreatureAI
{
public:
- explicit TriggerAI(Creature *c) : NullCreatureAI(c) {}
- void IsSummonedBy(Unit *summoner);
+ explicit TriggerAI(Creature* c) : NullCreatureAI(c) {}
+ void IsSummonedBy(Unit* summoner);
};
#endif
diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp
index ff67e3b344b..0d8841dafd3 100755
--- a/src/server/game/AI/CoreAI/PetAI.cpp
+++ b/src/server/game/AI/CoreAI/PetAI.cpp
@@ -30,7 +30,7 @@
#include "Group.h"
#include "SpellInfo.h"
-int PetAI::Permissible(const Creature *creature)
+int PetAI::Permissible(const Creature* creature)
{
if (creature->isPet())
return PERMIT_BASE_SPECIAL;
@@ -38,7 +38,7 @@ int PetAI::Permissible(const Creature *creature)
return PERMIT_BASE_NO;
}
-PetAI::PetAI(Creature *c) : CreatureAI(c), i_tracker(TIME_INTERVAL_LOOK)
+PetAI::PetAI(Creature* c) : CreatureAI(c), i_tracker(TIME_INTERVAL_LOOK)
{
m_AllySet.clear();
UpdateAllies();
@@ -107,7 +107,7 @@ void PetAI::UpdateAI(const uint32 diff)
}
else if (owner && me->GetCharmInfo()) //no victim
{
- Unit *nextTarget = SelectNextTarget();
+ Unit* nextTarget = SelectNextTarget();
if (me->HasReactState(REACT_PASSIVE))
_stopAttack();
@@ -134,7 +134,7 @@ void PetAI::UpdateAI(const uint32 diff)
if (!spellID)
continue;
- SpellInfo const *spellInfo = sSpellMgr->GetSpellInfo(spellID);
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);
if (!spellInfo)
continue;
@@ -239,30 +239,30 @@ void PetAI::UpdateAI(const uint32 diff)
void PetAI::UpdateAllies()
{
Unit* owner = me->GetCharmerOrOwner();
- Group *pGroup = NULL;
+ Group* group = NULL;
m_updateAlliesTimer = 10*IN_MILLISECONDS; //update friendly targets every 10 seconds, lesser checks increase performance
if (!owner)
return;
else if (owner->GetTypeId() == TYPEID_PLAYER)
- pGroup = owner->ToPlayer()->GetGroup();
+ group = owner->ToPlayer()->GetGroup();
//only pet and owner/not in group->ok
- if (m_AllySet.size() == 2 && !pGroup)
+ if (m_AllySet.size() == 2 && !group)
return;
//owner is in group; group members filled in already (no raid -> subgroupcount = whole count)
- if (pGroup && !pGroup->isRaidGroup() && m_AllySet.size() == (pGroup->GetMembersCount() + 2))
+ if (group && !group->isRaidGroup() && m_AllySet.size() == (group->GetMembersCount() + 2))
return;
m_AllySet.clear();
m_AllySet.insert(me->GetGUID());
- if (pGroup) //add group
+ if (group) //add group
{
- for (GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
+ for (GroupReference *itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
{
Player* Target = itr->getSource();
- if (!Target || !pGroup->SameSubGroup((Player*)owner, Target))
+ if (!Target || !group->SameSubGroup((Player*)owner, Target))
continue;
if (Target->GetGUID() == owner->GetGUID())
@@ -289,7 +289,7 @@ void PetAI::KilledUnit(Unit* victim)
me->AttackStop();
me->GetCharmInfo()->SetIsCommandAttack(false);
- Unit *nextTarget = SelectNextTarget();
+ Unit* nextTarget = SelectNextTarget();
if (nextTarget)
AttackStart(nextTarget);
@@ -307,10 +307,13 @@ void PetAI::AttackStart(Unit* target)
targetHasCC = _CheckTargetCC(target);
+ if (Unit* owner = me->GetOwner())
+ owner->SetInCombatWith(target);
+
DoAttack(target, true);
}
-Unit *PetAI::SelectNextTarget()
+Unit* PetAI::SelectNextTarget()
{
// Provides next target selection after current target death
diff --git a/src/server/game/AI/CoreAI/PetAI.h b/src/server/game/AI/CoreAI/PetAI.h
index 2e0e451ef28..9f0472cfe4d 100755
--- a/src/server/game/AI/CoreAI/PetAI.h
+++ b/src/server/game/AI/CoreAI/PetAI.h
@@ -29,20 +29,20 @@ class PetAI : public CreatureAI
{
public:
- explicit PetAI(Creature *c);
+ explicit PetAI(Creature* c);
void EnterEvadeMode();
void JustDied(Unit* /*who*/) { _stopAttack(); }
void UpdateAI(const uint32);
- static int Permissible(const Creature *);
+ static int Permissible(const Creature*);
void KilledUnit(Unit* /*victim*/);
void AttackStart(Unit* target);
void MovementInform(uint32 moveType, uint32 data);
private:
- bool _isVisible(Unit *) const;
+ bool _isVisible(Unit*) const;
bool _needToStop(void);
void _stopAttack(void);
@@ -54,7 +54,7 @@ class PetAI : public CreatureAI
std::set<uint64> m_AllySet;
uint32 m_updateAlliesTimer;
- Unit *SelectNextTarget();
+ Unit* SelectNextTarget();
void HandleReturnMovement();
void DoAttack(Unit* target, bool chase);
bool _CanAttack(Unit* target);
diff --git a/src/server/game/AI/CoreAI/ReactorAI.cpp b/src/server/game/AI/CoreAI/ReactorAI.cpp
index e2d1c8f601c..df914fbf500 100755
--- a/src/server/game/AI/CoreAI/ReactorAI.cpp
+++ b/src/server/game/AI/CoreAI/ReactorAI.cpp
@@ -26,7 +26,7 @@
#define REACTOR_VISIBLE_RANGE (26.46f)
int
-ReactorAI::Permissible(const Creature *creature)
+ReactorAI::Permissible(const Creature* creature)
{
if (creature->isCivilian() || creature->IsNeutralToAll())
return PERMIT_BASE_REACTIVE;
@@ -35,7 +35,7 @@ ReactorAI::Permissible(const Creature *creature)
}
void
-ReactorAI::MoveInLineOfSight(Unit *)
+ReactorAI::MoveInLineOfSight(Unit*)
{
}
diff --git a/src/server/game/AI/CoreAI/ReactorAI.h b/src/server/game/AI/CoreAI/ReactorAI.h
index 5328634c231..e66b382ef68 100755
--- a/src/server/game/AI/CoreAI/ReactorAI.h
+++ b/src/server/game/AI/CoreAI/ReactorAI.h
@@ -27,12 +27,12 @@ class ReactorAI : public CreatureAI
{
public:
- explicit ReactorAI(Creature *c) : CreatureAI(c) {}
+ explicit ReactorAI(Creature* c) : CreatureAI(c) {}
- void MoveInLineOfSight(Unit *);
+ void MoveInLineOfSight(Unit*);
void UpdateAI(const uint32);
- static int Permissible(const Creature *);
+ static int Permissible(const Creature*);
};
#endif
diff --git a/src/server/game/AI/CoreAI/TotemAI.cpp b/src/server/game/AI/CoreAI/TotemAI.cpp
index f1106f2dc28..96da4c4f4e2 100755
--- a/src/server/game/AI/CoreAI/TotemAI.cpp
+++ b/src/server/game/AI/CoreAI/TotemAI.cpp
@@ -28,7 +28,7 @@
#include "CellImpl.h"
int
-TotemAI::Permissible(const Creature *creature)
+TotemAI::Permissible(const Creature* creature)
{
if (creature->isTotem())
return PERMIT_BASE_PROACTIVE;
@@ -36,13 +36,13 @@ TotemAI::Permissible(const Creature *creature)
return PERMIT_BASE_NO;
}
-TotemAI::TotemAI(Creature *c) : CreatureAI(c), i_victimGuid(0)
+TotemAI::TotemAI(Creature* c) : CreatureAI(c), i_victimGuid(0)
{
ASSERT(c->isTotem());
}
void
-TotemAI::MoveInLineOfSight(Unit *)
+TotemAI::MoveInLineOfSight(Unit*)
{
}
@@ -61,7 +61,7 @@ TotemAI::UpdateAI(const uint32 /*diff*/)
return;
// Search spell
- SpellInfo const *spellInfo = sSpellMgr->GetSpellInfo(me->ToTotem()->GetSpell());
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(me->ToTotem()->GetSpell());
if (!spellInfo)
return;
@@ -99,7 +99,7 @@ TotemAI::UpdateAI(const uint32 /*diff*/)
}
void
-TotemAI::AttackStart(Unit *)
+TotemAI::AttackStart(Unit*)
{
// Sentry totem sends ping on attack
if (me->GetEntry() == SENTRY_TOTEM_ENTRY && me->GetOwner()->GetTypeId() == TYPEID_PLAYER)
diff --git a/src/server/game/AI/CoreAI/TotemAI.h b/src/server/game/AI/CoreAI/TotemAI.h
index f99e345450d..4791c3af92a 100755
--- a/src/server/game/AI/CoreAI/TotemAI.h
+++ b/src/server/game/AI/CoreAI/TotemAI.h
@@ -29,14 +29,14 @@ class TotemAI : public CreatureAI
{
public:
- explicit TotemAI(Creature *c);
+ explicit TotemAI(Creature* c);
- void MoveInLineOfSight(Unit *);
- void AttackStart(Unit *);
+ void MoveInLineOfSight(Unit*);
+ void AttackStart(Unit*);
void EnterEvadeMode();
void UpdateAI(const uint32);
- static int Permissible(const Creature *);
+ static int Permissible(const Creature*);
private:
uint64 i_victimGuid;
diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp
index 0a89820defd..91de52db9f8 100755
--- a/src/server/game/AI/CoreAI/UnitAI.cpp
+++ b/src/server/game/AI/CoreAI/UnitAI.cpp
@@ -91,7 +91,7 @@ Unit* UnitAI::SelectTarget(SelectAggroTarget targetType, uint32 position, float
return SelectTarget(targetType, position, DefaultTargetSelector(me, dist, playerOnly, aura));
}
-void UnitAI::SelectTargetList(std::list<Unit*> &targetList, uint32 num, SelectAggroTarget targetType, float dist, bool playerOnly, int32 aura)
+void UnitAI::SelectTargetList(std::list<Unit*>& targetList, uint32 num, SelectAggroTarget targetType, float dist, bool playerOnly, int32 aura)
{
SelectTargetList(targetList, DefaultTargetSelector(me, dist, playerOnly, aura), num, targetType);
}
@@ -109,9 +109,9 @@ void UnitAI::DoAddAuraToAllHostilePlayers(uint32 spellid)
std::list<HostileReference*>& threatlist = me->getThreatManager().getThreatList();
for (std::list<HostileReference*>::iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
{
- if (Unit *pTemp = Unit::GetUnit(*me, (*itr)->getUnitGuid()))
- if (pTemp->GetTypeId() == TYPEID_PLAYER)
- me->AddAura(spellid, pTemp);
+ if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()))
+ if (unit->GetTypeId() == TYPEID_PLAYER)
+ me->AddAura(spellid, unit);
}
}else
return;
@@ -124,9 +124,9 @@ void UnitAI::DoCastToAllHostilePlayers(uint32 spellid, bool triggered)
std::list<HostileReference*>& threatlist = me->getThreatManager().getThreatList();
for (std::list<HostileReference*>::iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
{
- if (Unit *pTemp = Unit::GetUnit(*me, (*itr)->getUnitGuid()))
- if (pTemp->GetTypeId() == TYPEID_PLAYER)
- me->CastSpell(pTemp, spellid, triggered);
+ if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()))
+ if (unit->GetTypeId() == TYPEID_PLAYER)
+ me->CastSpell(unit, spellid, triggered);
}
}else
return;
@@ -143,8 +143,8 @@ void UnitAI::DoCast(uint32 spellId)
case AITARGET_VICTIM: target = me->getVictim(); break;
case AITARGET_ENEMY:
{
- const SpellInfo * spellInfo = sSpellMgr->GetSpellInfo(spellId);
- bool playerOnly = spellInfo->AttributesEx3 & SPELL_ATTR3_PLAYERS_ONLY;
+ const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(spellId);
+ bool playerOnly = spellInfo->AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_PLAYERS;
//float range = GetSpellMaxRange(spellInfo, false);
target = SelectTarget(SELECT_TARGET_RANDOM, 0, spellInfo->GetMaxRange(false), playerOnly);
break;
@@ -153,8 +153,8 @@ void UnitAI::DoCast(uint32 spellId)
case AITARGET_BUFF: target = me; break;
case AITARGET_DEBUFF:
{
- const SpellInfo * spellInfo = sSpellMgr->GetSpellInfo(spellId);
- bool playerOnly = spellInfo->AttributesEx3 & SPELL_ATTR3_PLAYERS_ONLY;
+ const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(spellId);
+ bool playerOnly = spellInfo->AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_PLAYERS;
float range = spellInfo->GetMaxRange(false);
DefaultTargetSelector targetSelector(me, range, playerOnly, -(int32)spellId);
@@ -178,8 +178,8 @@ void UnitAI::FillAISpellInfo()
{
AISpellInfo = new AISpellInfoType[sSpellMgr->GetSpellInfoStoreSize()];
- AISpellInfoType *AIInfo = AISpellInfo;
- const SpellInfo * spellInfo;
+ AISpellInfoType* AIInfo = AISpellInfo;
+ const SpellInfo* spellInfo;
for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i, ++AIInfo)
{
@@ -206,9 +206,9 @@ void UnitAI::FillAISpellInfo()
uint32 targetType = spellInfo->Effects[j].TargetA.GetTarget();
if (targetType == TARGET_UNIT_TARGET_ENEMY
- || targetType == TARGET_DST_TARGET_ENEMY)
+ || targetType == TARGET_DEST_TARGET_ENEMY)
UPDATE_TARGET(AITARGET_VICTIM)
- else if (targetType == TARGET_UNIT_AREA_ENEMY_DST)
+ else if (targetType == TARGET_UNIT_DEST_AREA_ENEMY)
UPDATE_TARGET(AITARGET_ENEMY)
if (spellInfo->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA)
@@ -230,7 +230,7 @@ void PlayerAI::OnCharmed(bool apply) { me->IsAIEnabled = apply; }
void SimpleCharmedAI::UpdateAI(const uint32 /*diff*/)
{
- Creature *charmer = me->GetCharmer()->ToCreature();
+ Creature* charmer = me->GetCharmer()->ToCreature();
//kill self if charm aura has infinite duration
if (charmer->IsInEvadeMode())
diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h
index f17c74fe7cf..ec00b53b5ca 100755
--- a/src/server/game/AI/CoreAI/UnitAI.h
+++ b/src/server/game/AI/CoreAI/UnitAI.h
@@ -60,7 +60,7 @@ struct DefaultTargetSelector : public std::unary_function<Unit* , bool>
// dist: if 0: ignored, if > 0: maximum distance to the reference unit, if < 0: minimum distance to the reference unit
// playerOnly: self explaining
// aura: if 0: ignored, if > 0: the target shall have the aura, if < 0, the target shall NOT have the aura
- DefaultTargetSelector(Unit const* pUnit, float dist, bool playerOnly, int32 aura) : me(pUnit), m_dist(dist), m_playerOnly(playerOnly), m_aura(aura) {}
+ DefaultTargetSelector(Unit const* unit, float dist, bool playerOnly, int32 aura) : me(unit), m_dist(dist), m_playerOnly(playerOnly), m_aura(aura) {}
bool operator()(Unit const* target) const
{
@@ -128,7 +128,7 @@ class UnitAI
// predicate shall extend std::unary_function<Unit* , bool>
template <class PREDICATE> Unit* SelectTarget(SelectAggroTarget targetType, uint32 position, PREDICATE const& predicate)
{
- const std::list<HostileReference* > &threatlist = me->getThreatManager().getThreatList();
+ const std::list<HostileReference*>& threatlist = me->getThreatManager().getThreatList();
if (position >= threatlist.size())
return NULL;
@@ -172,11 +172,11 @@ class UnitAI
return NULL;
}
- void SelectTargetList(std::list<Unit*> &targetList, uint32 num, SelectAggroTarget targetType, float dist = 0.0f, bool playerOnly = false, int32 aura = 0);
+ void SelectTargetList(std::list<Unit*>& targetList, uint32 num, SelectAggroTarget targetType, float dist = 0.0f, bool playerOnly = false, int32 aura = 0);
// Select the targets satifying the predicate.
// predicate shall extend std::unary_function<Unit* , bool>
- template <class PREDICATE> void SelectTargetList(std::list<Unit*> &targetList, PREDICATE const& predicate, uint32 maxTargets, SelectAggroTarget targetType)
+ template <class PREDICATE> void SelectTargetList(std::list<Unit*>& targetList, PREDICATE const& predicate, uint32 maxTargets, SelectAggroTarget targetType)
{
std::list<HostileReference*> const& threatlist = me->getThreatManager().getThreatList();
if (threatlist.empty())
@@ -247,7 +247,7 @@ class PlayerAI : public UnitAI
protected:
Player* const me;
public:
- explicit PlayerAI(Player* p) : UnitAI((Unit*)p), me(p) {}
+ explicit PlayerAI(Player* player) : UnitAI((Unit*)player), me(player) {}
void OnCharmed(bool apply);
};
diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp
index ee822d9df40..b72556dbab1 100755
--- a/src/server/game/AI/CreatureAI.cpp
+++ b/src/server/game/AI/CreatureAI.cpp
@@ -34,8 +34,8 @@ void CreatureAI::OnCharmed(bool /*apply*/)
me->IsAIEnabled = false;
}
-AISpellInfoType * UnitAI::AISpellInfo;
- AISpellInfoType * GetAISpellInfo(uint32 i) { return &CreatureAI::AISpellInfo[i]; }
+AISpellInfoType* UnitAI::AISpellInfo;
+AISpellInfoType* GetAISpellInfo(uint32 i) { return &CreatureAI::AISpellInfo[i]; }
void CreatureAI::Talk(uint8 id, uint64 WhisperGuid)
{
@@ -50,7 +50,7 @@ void CreatureAI::DoZoneInCombat(Creature* creature /*= NULL*/)
if (!creature->CanHaveThreatList())
return;
- Map *map = creature->GetMap();
+ Map* map = creature->GetMap();
if (!map->IsDungeon()) //use IsDungeon instead of Instanceable, in case battlegrounds will be instantiated
{
sLog->outError("DoZoneInCombat call for map that isn't an instance (creature entry = %d)", creature->GetTypeId() == TYPEID_UNIT ? creature->ToCreature()->GetEntry() : 0);
@@ -63,7 +63,7 @@ void CreatureAI::DoZoneInCombat(Creature* creature /*= NULL*/)
creature->AI()->AttackStart(target);
else if (creature->isSummon())
{
- if (Unit *summoner = creature->ToTempSummon()->GetSummoner())
+ if (Unit* summoner = creature->ToTempSummon()->GetSummoner())
{
Unit* target = summoner->getAttackerForHelper();
if (!target && summoner->CanHaveThreatList() && !summoner->getThreatManager().isThreatListEmpty())
@@ -80,23 +80,23 @@ void CreatureAI::DoZoneInCombat(Creature* creature /*= NULL*/)
return;
}
- Map::PlayerList const &PlList = map->GetPlayers();
+ Map::PlayerList const& playerList = map->GetPlayers();
- if (PlList.isEmpty())
+ if (playerList.isEmpty())
return;
- for (Map::PlayerList::const_iterator i = PlList.begin(); i != PlList.end(); ++i)
+ for (Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr)
{
- if (Player* pPlayer = i->getSource())
+ if (Player* player = itr->getSource())
{
- if (pPlayer->isGameMaster())
+ if (player->isGameMaster())
continue;
- if (pPlayer->isAlive())
+ if (player->isAlive())
{
- creature->SetInCombatWith(pPlayer);
- pPlayer->SetInCombatWith(creature);
- creature->AddThreat(pPlayer, 0.0f);
+ creature->SetInCombatWith(player);
+ player->SetInCombatWith(creature);
+ creature->AddThreat(player, 0.0f);
}
/* Causes certain things to never leave the threat list (Priest Lightwell, etc):
@@ -112,7 +112,7 @@ void CreatureAI::DoZoneInCombat(Creature* creature /*= NULL*/)
// scripts does not take care about MoveInLineOfSight loops
// MoveInLineOfSight can be called inside another MoveInLineOfSight and cause stack overflow
-void CreatureAI::MoveInLineOfSight_Safe(Unit *who)
+void CreatureAI::MoveInLineOfSight_Safe(Unit* who)
{
if (m_MoveInLineOfSight_locked == true)
return;
@@ -121,7 +121,7 @@ void CreatureAI::MoveInLineOfSight_Safe(Unit *who)
m_MoveInLineOfSight_locked = false;
}
-void CreatureAI::MoveInLineOfSight(Unit *who)
+void CreatureAI::MoveInLineOfSight(Unit* who)
{
if (me->getVictim())
return;
@@ -146,7 +146,7 @@ void CreatureAI::EnterEvadeMode()
if (!me->GetVehicle()) // otherwise me will be in evade mode forever
{
- if (Unit *owner = me->GetCharmerOrOwner())
+ if (Unit* owner = me->GetCharmerOrOwner())
{
me->GetMotionMaster()->Clear(false);
me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle(), MOTION_SLOT_ACTIVE);
diff --git a/src/server/game/AI/CreatureAIFactory.h b/src/server/game/AI/CreatureAIFactory.h
index ba0de3a4ddd..4cedb3d9545 100755
--- a/src/server/game/AI/CreatureAIFactory.h
+++ b/src/server/game/AI/CreatureAIFactory.h
@@ -25,24 +25,24 @@
struct SelectableAI : public FactoryHolder<CreatureAI>, public Permissible<Creature>
{
- SelectableAI(const char *id) : FactoryHolder<CreatureAI>(id) {}
+ SelectableAI(const char* id) : FactoryHolder<CreatureAI>(id) {}
};
template<class REAL_AI>
struct CreatureAIFactory : public SelectableAI
{
- CreatureAIFactory(const char *name) : SelectableAI(name) {}
+ CreatureAIFactory(const char* name) : SelectableAI(name) {}
- CreatureAI* Create(void *) const;
+ CreatureAI* Create(void*) const;
- int Permit(const Creature *c) const { return REAL_AI::Permissible(c); }
+ int Permit(const Creature* c) const { return REAL_AI::Permissible(c); }
};
template<class REAL_AI>
inline CreatureAI*
-CreatureAIFactory<REAL_AI>::Create(void *data) const
+CreatureAIFactory<REAL_AI>::Create(void* data) const
{
- Creature* creature = reinterpret_cast<Creature *>(data);
+ Creature* creature = reinterpret_cast<Creature*>(data);
return (new REAL_AI(creature));
}
@@ -53,24 +53,24 @@ typedef FactoryHolder<CreatureAI>::FactoryHolderRepository CreatureAIRepository;
//GO
struct SelectableGameObjectAI : public FactoryHolder<GameObjectAI>, public Permissible<GameObject>
{
- SelectableGameObjectAI(const char *id) : FactoryHolder<GameObjectAI>(id) {}
+ SelectableGameObjectAI(const char* id) : FactoryHolder<GameObjectAI>(id) {}
};
template<class REAL_GO_AI>
struct GameObjectAIFactory : public SelectableGameObjectAI
{
- GameObjectAIFactory(const char *name) : SelectableGameObjectAI(name) {}
+ GameObjectAIFactory(const char* name) : SelectableGameObjectAI(name) {}
- GameObjectAI* Create(void *) const;
+ GameObjectAI* Create(void*) const;
- int Permit(const GameObject *g) const { return REAL_GO_AI::Permissible(g); }
+ int Permit(const GameObject* g) const { return REAL_GO_AI::Permissible(g); }
};
template<class REAL_GO_AI>
inline GameObjectAI*
-GameObjectAIFactory<REAL_GO_AI>::Create(void *data) const
+GameObjectAIFactory<REAL_GO_AI>::Create(void* data) const
{
- GameObject* go = reinterpret_cast<GameObject *>(data);
+ GameObject* go = reinterpret_cast<GameObject*>(data);
return (new REAL_GO_AI(go));
}
diff --git a/src/server/game/AI/CreatureAIImpl.h b/src/server/game/AI/CreatureAIImpl.h
index 5bb0580ae7c..7e57082827c 100755
--- a/src/server/game/AI/CreatureAIImpl.h
+++ b/src/server/game/AI/CreatureAIImpl.h
@@ -524,7 +524,7 @@ struct AISpellInfoType
float maxRange;
};
- AISpellInfoType * GetAISpellInfo(uint32 i);
+AISpellInfoType* GetAISpellInfo(uint32 i);
inline void CreatureAI::SetGazeOn(Unit* target)
{
@@ -615,7 +615,7 @@ inline void UnitAI::DoCastAOE(uint32 spellId, bool triggered)
me->CastSpell((Unit*)NULL, spellId, triggered);
}
-inline Creature* CreatureAI::DoSummon(uint32 entry, const Position &pos, uint32 despawnTime, TempSummonType summonType)
+inline Creature* CreatureAI::DoSummon(uint32 entry, const Position& pos, uint32 despawnTime, TempSummonType summonType)
{
return me->SummonCreature(entry, pos, summonType, despawnTime);
}
diff --git a/src/server/game/AI/CreatureAISelector.cpp b/src/server/game/AI/CreatureAISelector.cpp
index f7e760c7b79..5b7ee7750bc 100755
--- a/src/server/game/AI/CreatureAISelector.cpp
+++ b/src/server/game/AI/CreatureAISelector.cpp
@@ -28,9 +28,9 @@
namespace FactorySelector
{
- CreatureAI* selectAI(Creature *creature)
+ CreatureAI* selectAI(Creature* creature)
{
- const CreatureAICreator *ai_factory = NULL;
+ const CreatureAICreator* ai_factory = NULL;
CreatureAIRegistry& ai_registry(*CreatureAIRepository::instance());
if (creature->isPet())
@@ -77,11 +77,11 @@ namespace FactorySelector
{
int best_val = -1;
typedef CreatureAIRegistry::RegistryMapType RMT;
- RMT const &l = ai_registry.GetRegisteredItems();
+ RMT const& l = ai_registry.GetRegisteredItems();
for (RMT::const_iterator iter = l.begin(); iter != l.end(); ++iter)
{
- const CreatureAICreator *factory = iter->second;
- const SelectableAI *p = dynamic_cast<const SelectableAI *>(factory);
+ const CreatureAICreator* factory = iter->second;
+ const SelectableAI* p = dynamic_cast<const SelectableAI*>(factory);
ASSERT(p != NULL);
int val = p->Permit(creature);
if (val > best_val)
@@ -99,11 +99,11 @@ namespace FactorySelector
return (ai_factory == NULL ? new NullCreatureAI(creature) : ai_factory->Create(creature));
}
- MovementGenerator* selectMovementGenerator(Creature *creature)
+ MovementGenerator* selectMovementGenerator(Creature* creature)
{
MovementGeneratorRegistry& mv_registry(*MovementGeneratorRepository::instance());
ASSERT(creature->GetCreatureInfo() != NULL);
- const MovementGeneratorCreator *mv_factory = mv_registry.GetRegistryItem(creature->GetDefaultMovementType());
+ const MovementGeneratorCreator* mv_factory = mv_registry.GetRegistryItem(creature->GetDefaultMovementType());
/* if (mv_factory == NULL)
{
@@ -128,9 +128,9 @@ namespace FactorySelector
}
- GameObjectAI* SelectGameObjectAI(GameObject *go)
+ GameObjectAI* SelectGameObjectAI(GameObject* go)
{
- const GameObjectAICreator *ai_factory = NULL;
+ const GameObjectAICreator* ai_factory = NULL;
GameObjectAIRegistry& ai_registry(*GameObjectAIRepository::instance());
ai_factory = ai_registry.GetRegistryItem(go->GetAIName());
diff --git a/src/server/game/AI/CreatureAISelector.h b/src/server/game/AI/CreatureAISelector.h
index 4b45a73c64d..64bf96c01af 100755
--- a/src/server/game/AI/CreatureAISelector.h
+++ b/src/server/game/AI/CreatureAISelector.h
@@ -27,9 +27,9 @@ class GameObject;
namespace FactorySelector
{
- CreatureAI* selectAI(Creature *);
- MovementGenerator* selectMovementGenerator(Creature *);
- GameObjectAI* SelectGameObjectAI(GameObject *);
+ CreatureAI* selectAI(Creature*);
+ MovementGenerator* selectMovementGenerator(Creature*);
+ GameObjectAI* SelectGameObjectAI(GameObject*);
}
#endif
diff --git a/src/server/game/AI/EventAI/CreatureEventAI.cpp b/src/server/game/AI/EventAI/CreatureEventAI.cpp
index a1a3cc6c48a..d09939c3243 100755
--- a/src/server/game/AI/EventAI/CreatureEventAI.cpp
+++ b/src/server/game/AI/EventAI/CreatureEventAI.cpp
@@ -48,14 +48,14 @@ bool CreatureEventAIHolder::UpdateRepeatTimer(Creature* creature, uint32 repeatM
return true;
}
-int CreatureEventAI::Permissible(const Creature *creature)
+int CreatureEventAI::Permissible(const Creature* creature)
{
if (creature->GetAIName() == "EventAI")
return PERMIT_BASE_SPECIAL;
return PERMIT_BASE_NO;
}
-CreatureEventAI::CreatureEventAI(Creature *c) : CreatureAI(c)
+CreatureEventAI::CreatureEventAI(Creature* c) : CreatureAI(c)
{
// Need make copy for filter unneeded steps and safe in case table reload
CreatureEventAI_Event_Map::const_iterator CreatureEvents = sEventAIMgr->GetCreatureEventAIMap().find(me->GetEntry());
@@ -106,16 +106,16 @@ CreatureEventAI::CreatureEventAI(Creature *c) : CreatureAI(c)
}
}
-bool CreatureEventAI::ProcessEvent(CreatureEventAIHolder& pHolder, Unit* pActionInvoker /*=NULL*/)
+bool CreatureEventAI::ProcessEvent(CreatureEventAIHolder& holder, Unit* actionInvoker /*=NULL*/)
{
- if (!pHolder.Enabled || pHolder.Time)
+ if (!holder.Enabled || holder.Time)
return false;
//Check the inverse phase mask (event doesn't trigger if current phase bit is set in mask)
- if (pHolder.Event.event_inverse_phase_mask & (1 << m_Phase))
+ if (holder.Event.event_inverse_phase_mask & (1 << m_Phase))
return false;
- CreatureEventAI_Event const& event = pHolder.Event;
+ CreatureEventAI_Event const& event = holder.Event;
//Check event conditions based on the event type, also reset events
switch (event.event_type)
@@ -125,14 +125,14 @@ bool CreatureEventAI::ProcessEvent(CreatureEventAIHolder& pHolder, Unit* pAction
return false;
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.timer.repeatMin, event.timer.repeatMax);
+ holder.UpdateRepeatTimer(me, event.timer.repeatMin, event.timer.repeatMax);
break;
case EVENT_T_TIMER_OOC:
if (me->isInCombat())
return false;
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.timer.repeatMin, event.timer.repeatMax);
+ holder.UpdateRepeatTimer(me, event.timer.repeatMin, event.timer.repeatMax);
break;
case EVENT_T_HP:
{
@@ -145,7 +145,7 @@ bool CreatureEventAI::ProcessEvent(CreatureEventAIHolder& pHolder, Unit* pAction
return false;
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.percent_range.repeatMin, event.percent_range.repeatMax);
+ holder.UpdateRepeatTimer(me, event.percent_range.repeatMin, event.percent_range.repeatMax);
break;
}
case EVENT_T_MANA:
@@ -159,14 +159,14 @@ bool CreatureEventAI::ProcessEvent(CreatureEventAIHolder& pHolder, Unit* pAction
return false;
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.percent_range.repeatMin, event.percent_range.repeatMax);
+ holder.UpdateRepeatTimer(me, event.percent_range.repeatMin, event.percent_range.repeatMax);
break;
}
case EVENT_T_AGGRO:
break;
case EVENT_T_KILL:
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.kill.repeatMin, event.kill.repeatMax);
+ holder.UpdateRepeatTimer(me, event.kill.repeatMin, event.kill.repeatMax);
break;
case EVENT_T_DEATH:
case EVENT_T_EVADE:
@@ -175,15 +175,15 @@ bool CreatureEventAI::ProcessEvent(CreatureEventAIHolder& pHolder, Unit* pAction
//Spell hit is special case, param1 and param2 handled within CreatureEventAI::SpellHit
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.spell_hit.repeatMin, event.spell_hit.repeatMax);
+ holder.UpdateRepeatTimer(me, event.spell_hit.repeatMin, event.spell_hit.repeatMax);
break;
case EVENT_T_RANGE:
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.range.repeatMin, event.range.repeatMax);
+ holder.UpdateRepeatTimer(me, event.range.repeatMin, event.range.repeatMax);
break;
case EVENT_T_OOC_LOS:
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.ooc_los.repeatMin, event.ooc_los.repeatMax);
+ holder.UpdateRepeatTimer(me, event.ooc_los.repeatMin, event.ooc_los.repeatMax);
break;
case EVENT_T_RESET:
case EVENT_T_SPAWNED:
@@ -199,7 +199,7 @@ bool CreatureEventAI::ProcessEvent(CreatureEventAIHolder& pHolder, Unit* pAction
return false;
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.percent_range.repeatMin, event.percent_range.repeatMax);
+ holder.UpdateRepeatTimer(me, event.percent_range.repeatMin, event.percent_range.repeatMax);
break;
}
case EVENT_T_TARGET_CASTING:
@@ -207,21 +207,21 @@ bool CreatureEventAI::ProcessEvent(CreatureEventAIHolder& pHolder, Unit* pAction
return false;
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.target_casting.repeatMin, event.target_casting.repeatMax);
+ holder.UpdateRepeatTimer(me, event.target_casting.repeatMin, event.target_casting.repeatMax);
break;
case EVENT_T_FRIENDLY_HP:
{
if (!me->isInCombat())
return false;
- Unit* pUnit = DoSelectLowestHpFriendly((float)event.friendly_hp.radius, event.friendly_hp.hpDeficit);
- if (!pUnit)
+ Unit* unit = DoSelectLowestHpFriendly((float)event.friendly_hp.radius, event.friendly_hp.hpDeficit);
+ if (!unit)
return false;
- pActionInvoker = pUnit;
+ actionInvoker = unit;
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.friendly_hp.repeatMin, event.friendly_hp.repeatMax);
+ holder.UpdateRepeatTimer(me, event.friendly_hp.repeatMin, event.friendly_hp.repeatMax);
break;
}
case EVENT_T_FRIENDLY_IS_CC:
@@ -237,10 +237,10 @@ bool CreatureEventAI::ProcessEvent(CreatureEventAIHolder& pHolder, Unit* pAction
return false;
//We don't really care about the whole list, just return first available
- pActionInvoker = *(pList.begin());
+ actionInvoker = *(pList.begin());
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.friendly_is_cc.repeatMin, event.friendly_is_cc.repeatMax);
+ holder.UpdateRepeatTimer(me, event.friendly_is_cc.repeatMin, event.friendly_is_cc.repeatMax);
break;
}
case EVENT_T_FRIENDLY_MISSING_BUFF:
@@ -253,24 +253,24 @@ bool CreatureEventAI::ProcessEvent(CreatureEventAIHolder& pHolder, Unit* pAction
return false;
//We don't really care about the whole list, just return first available
- pActionInvoker = *(pList.begin());
+ actionInvoker = *(pList.begin());
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.friendly_buff.repeatMin, event.friendly_buff.repeatMax);
+ holder.UpdateRepeatTimer(me, event.friendly_buff.repeatMin, event.friendly_buff.repeatMax);
break;
}
case EVENT_T_SUMMONED_UNIT:
{
//Prevent event from occuring on no unit or non creatures
- if (!pActionInvoker || pActionInvoker->GetTypeId() != TYPEID_UNIT)
+ if (!actionInvoker || actionInvoker->GetTypeId() != TYPEID_UNIT)
return false;
//Creature id doesn't match up
- if (pActionInvoker->ToCreature()->GetEntry() != event.summon_unit.creatureId)
+ if (actionInvoker->ToCreature()->GetEntry() != event.summon_unit.creatureId)
return false;
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.summon_unit.repeatMin, event.summon_unit.repeatMax);
+ holder.UpdateRepeatTimer(me, event.summon_unit.repeatMin, event.summon_unit.repeatMax);
break;
}
case EVENT_T_TARGET_MANA:
@@ -284,7 +284,7 @@ bool CreatureEventAI::ProcessEvent(CreatureEventAIHolder& pHolder, Unit* pAction
return false;
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.percent_range.repeatMin, event.percent_range.repeatMax);
+ holder.UpdateRepeatTimer(me, event.percent_range.repeatMin, event.percent_range.repeatMax);
break;
}
case EVENT_T_REACHED_HOME:
@@ -299,49 +299,49 @@ bool CreatureEventAI::ProcessEvent(CreatureEventAIHolder& pHolder, Unit* pAction
return false;
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.buffed.repeatMin, event.buffed.repeatMax);
+ holder.UpdateRepeatTimer(me, event.buffed.repeatMin, event.buffed.repeatMax);
break;
}
case EVENT_T_TARGET_BUFFED:
{
//Prevent event from occuring on no unit
- if (!pActionInvoker)
+ if (!actionInvoker)
return false;
//Note: checked only aura for effect 0, if need check aura for effect 1/2 then
// possible way: pack in event.buffed.amount 2 uint16 (ammount+effectIdx)
- Aura const* aura = pActionInvoker->GetAura(event.buffed.spellId);
+ Aura const* aura = actionInvoker->GetAura(event.buffed.spellId);
if (!aura || aura->GetStackAmount() < event.buffed.amount)
return false;
//Repeat Timers
- pHolder.UpdateRepeatTimer(me, event.buffed.repeatMin, event.buffed.repeatMax);
+ holder.UpdateRepeatTimer(me, event.buffed.repeatMin, event.buffed.repeatMax);
break;
}
default:
- sLog->outErrorDb("CreatureEventAI: Creature %u using Event %u has invalid Event Type(%u), missing from ProcessEvent() Switch.", me->GetEntry(), pHolder.Event.event_id, pHolder.Event.event_type);
+ sLog->outErrorDb("CreatureEventAI: Creature %u using Event %u has invalid Event Type(%u), missing from ProcessEvent() Switch.", me->GetEntry(), holder.Event.event_id, holder.Event.event_type);
break;
}
//Disable non-repeatable events
- if (!(pHolder.Event.event_flags & EFLAG_REPEATABLE))
- pHolder.Enabled = false;
+ if (!(holder.Event.event_flags & EFLAG_REPEATABLE))
+ holder.Enabled = false;
//Store random here so that all random actions match up
uint32 rnd = rand();
//Return if chance for event is not met
- if (pHolder.Event.event_chance <= rnd % 100)
+ if (holder.Event.event_chance <= rnd % 100)
return false;
//Process actions
for (uint8 j = 0; j < MAX_ACTIONS; ++j)
- ProcessAction(pHolder.Event.action[j], rnd, pHolder.Event.event_id, pActionInvoker);
+ ProcessAction(holder.Event.action[j], rnd, holder.Event.event_id, actionInvoker);
return true;
}
-void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32 rnd, uint32 EventId, Unit* pActionInvoker)
+void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32 rnd, uint32 eventId, Unit* actionInvoker)
{
switch (action.type)
{
@@ -361,11 +361,11 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
{
Unit* target = NULL;
- if (pActionInvoker)
+ if (actionInvoker)
{
- if (pActionInvoker->GetTypeId() == TYPEID_PLAYER)
- target = pActionInvoker;
- else if (Unit* owner = pActionInvoker->GetOwner())
+ if (actionInvoker->GetTypeId() == TYPEID_PLAYER)
+ target = actionInvoker;
+ else if (Unit* owner = actionInvoker->GetOwner())
{
if (owner->GetTypeId() == TYPEID_PLAYER)
target = owner;
@@ -442,7 +442,7 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
}
case ACTION_T_CAST:
{
- Unit* target = GetTargetByType(action.cast.target, pActionInvoker);
+ Unit* target = GetTargetByType(action.cast.target, actionInvoker);
Unit* caster = me;
if (!target)
@@ -496,29 +496,29 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
}
else
- sLog->outErrorDb("CreatureEventAI: event %d creature %d attempt to cast spell that doesn't exist %d", EventId, me->GetEntry(), action.cast.spellId);
+ sLog->outErrorDb("CreatureEventAI: event %d creature %d attempt to cast spell that doesn't exist %d", eventId, me->GetEntry(), action.cast.spellId);
}
break;
}
case ACTION_T_SUMMON:
{
- Unit* target = GetTargetByType(action.summon.target, pActionInvoker);
+ Unit* target = GetTargetByType(action.summon.target, actionInvoker);
- Creature* pCreature = NULL;
+ Creature* creature = NULL;
if (action.summon.duration)
- pCreature = me->SummonCreature(action.summon.creatureId, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, action.summon.duration);
+ creature = me->SummonCreature(action.summon.creatureId, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, action.summon.duration);
else
- pCreature = me->SummonCreature(action.summon.creatureId, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0);
+ creature = me->SummonCreature(action.summon.creatureId, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0);
- if (!pCreature)
- sLog->outErrorDb("CreatureEventAI: failed to spawn creature %u. Spawn event %d is on creature %d", action.summon.creatureId, EventId, me->GetEntry());
+ if (!creature)
+ sLog->outErrorDb("CreatureEventAI: failed to spawn creature %u. Spawn event %d is on creature %d", action.summon.creatureId, eventId, me->GetEntry());
else if (action.summon.target != TARGET_T_SELF && target)
- pCreature->AI()->AttackStart(target);
+ creature->AI()->AttackStart(target);
break;
}
case ACTION_T_THREAT_SINGLE_PCT:
- if (Unit* target = GetTargetByType(action.threat_single_pct.target, pActionInvoker))
+ if (Unit* target = GetTargetByType(action.threat_single_pct.target, actionInvoker))
me->getThreatManager().modifyThreatPercent(target, action.threat_single_pct.percent);
break;
case ACTION_T_THREAT_ALL_PCT:
@@ -530,18 +530,18 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
break;
}
case ACTION_T_QUEST_EVENT:
- if (Unit* target = GetTargetByType(action.quest_event.target, pActionInvoker))
+ if (Unit* target = GetTargetByType(action.quest_event.target, actionInvoker))
if (target->GetTypeId() == TYPEID_PLAYER)
target->ToPlayer()->AreaExploredOrEventHappens(action.quest_event.questId);
break;
case ACTION_T_CAST_EVENT:
- if (Unit* target = GetTargetByType(action.cast_event.target, pActionInvoker))
+ if (Unit* target = GetTargetByType(action.cast_event.target, actionInvoker))
if (target->GetTypeId() == TYPEID_PLAYER)
target->ToPlayer()->CastedCreatureOrGO(action.cast_event.creatureId, me->GetGUID(), action.cast_event.spellId);
break;
case ACTION_T_SET_UNIT_FIELD:
{
- Unit* target = GetTargetByType(action.set_unit_field.target, pActionInvoker);
+ Unit* target = GetTargetByType(action.set_unit_field.target, actionInvoker);
// not allow modify important for integrity object fields
if (action.set_unit_field.field < OBJECT_END || action.set_unit_field.field >= UNIT_END)
@@ -553,11 +553,11 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
break;
}
case ACTION_T_SET_UNIT_FLAG:
- if (Unit* target = GetTargetByType(action.unit_flag.target, pActionInvoker))
+ if (Unit* target = GetTargetByType(action.unit_flag.target, actionInvoker))
target->SetFlag(UNIT_FIELD_FLAGS, action.unit_flag.value);
break;
case ACTION_T_REMOVE_UNIT_FLAG:
- if (Unit* target = GetTargetByType(action.unit_flag.target, pActionInvoker))
+ if (Unit* target = GetTargetByType(action.unit_flag.target, actionInvoker))
target->RemoveFlag(UNIT_FIELD_FLAGS, action.unit_flag.value);
break;
case ACTION_T_AUTO_ATTACK:
@@ -608,12 +608,12 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
int32 new_phase = int32(m_Phase)+action.set_inc_phase.step;
if (new_phase < 0)
{
- sLog->outErrorDb("CreatureEventAI: Event %d decrease m_Phase under 0. CreatureEntry = %d", EventId, me->GetEntry());
+ sLog->outErrorDb("CreatureEventAI: Event %d decrease m_Phase under 0. CreatureEntry = %d", eventId, me->GetEntry());
m_Phase = 0;
}
else if (new_phase >= MAX_PHASE)
{
- sLog->outErrorDb("CreatureEventAI: Event %d incremented m_Phase above %u. m_Phase mask cannot be used with phases past %u. CreatureEntry = %d", EventId, MAX_PHASE-1, MAX_PHASE-1, me->GetEntry());
+ sLog->outErrorDb("CreatureEventAI: Event %d incremented m_Phase above %u. m_Phase mask cannot be used with phases past %u. CreatureEntry = %d", eventId, MAX_PHASE-1, MAX_PHASE-1, me->GetEntry());
m_Phase = MAX_PHASE-1;
}
else
@@ -628,9 +628,9 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
me->DoFleeToGetAssistance();
break;
case ACTION_T_QUEST_EVENT_ALL:
- if (pActionInvoker && pActionInvoker->GetTypeId() == TYPEID_PLAYER)
+ if (actionInvoker && actionInvoker->GetTypeId() == TYPEID_PLAYER)
{
- if (Unit* Temp = Unit::GetUnit(*me, pActionInvoker->GetGUID()))
+ if (Unit* Temp = Unit::GetUnit(*me, actionInvoker->GetGUID()))
if (Temp->GetTypeId() == TYPEID_PLAYER)
Temp->ToPlayer()->GroupEventHappens(action.quest_event_all.questId, me);
}
@@ -645,7 +645,7 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
break;
}
case ACTION_T_REMOVEAURASFROMSPELL:
- if (Unit* target = GetTargetByType(action.remove_aura.target, pActionInvoker))
+ if (Unit* target = GetTargetByType(action.remove_aura.target, actionInvoker))
target->RemoveAurasDueToSpell(action.remove_aura.spellId);
break;
case ACTION_T_RANGED_MOVEMENT:
@@ -664,80 +664,80 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
if (action.random_phase_range.phaseMin <= action.random_phase_range.phaseMax)
m_Phase = urand(action.random_phase_range.phaseMin, action.random_phase_range.phaseMax);
else
- sLog->outErrorDb("CreatureEventAI: ACTION_T_RANDOM_PHASE_RANGE cannot have Param2 < Param1. Event = %d. CreatureEntry = %d", EventId, me->GetEntry());
+ sLog->outErrorDb("CreatureEventAI: ACTION_T_RANDOM_PHASE_RANGE cannot have Param2 < Param1. Event = %d. CreatureEntry = %d", eventId, me->GetEntry());
break;
case ACTION_T_SUMMON_ID:
{
- Unit* target = GetTargetByType(action.summon_id.target, pActionInvoker);
+ Unit* target = GetTargetByType(action.summon_id.target, actionInvoker);
CreatureEventAI_Summon_Map::const_iterator i = sEventAIMgr->GetCreatureEventAISummonMap().find(action.summon_id.spawnId);
if (i == sEventAIMgr->GetCreatureEventAISummonMap().end())
{
- sLog->outErrorDb("CreatureEventAI: failed to spawn creature %u. Summon map index %u does not exist. EventID %d. CreatureID %d", action.summon_id.creatureId, action.summon_id.spawnId, EventId, me->GetEntry());
+ sLog->outErrorDb("CreatureEventAI: failed to spawn creature %u. Summon map index %u does not exist. EventID %d. CreatureID %d", action.summon_id.creatureId, action.summon_id.spawnId, eventId, me->GetEntry());
return;
}
- Creature* pCreature = NULL;
+ Creature* creature = NULL;
if ((*i).second.SpawnTimeSecs)
- pCreature = me->SummonCreature(action.summon_id.creatureId, (*i).second.position_x, (*i).second.position_y, (*i).second.position_z, (*i).second.orientation, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, (*i).second.SpawnTimeSecs);
+ creature = me->SummonCreature(action.summon_id.creatureId, (*i).second.position_x, (*i).second.position_y, (*i).second.position_z, (*i).second.orientation, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, (*i).second.SpawnTimeSecs);
else
- pCreature = me->SummonCreature(action.summon_id.creatureId, (*i).second.position_x, (*i).second.position_y, (*i).second.position_z, (*i).second.orientation, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0);
+ creature = me->SummonCreature(action.summon_id.creatureId, (*i).second.position_x, (*i).second.position_y, (*i).second.position_z, (*i).second.orientation, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0);
- if (!pCreature)
- sLog->outErrorDb("CreatureEventAI: failed to spawn creature %u. EventId %d.Creature %d", action.summon_id.creatureId, EventId, me->GetEntry());
+ if (!creature)
+ sLog->outErrorDb("CreatureEventAI: failed to spawn creature %u. EventId %d.Creature %d", action.summon_id.creatureId, eventId, me->GetEntry());
else if (action.summon_id.target != TARGET_T_SELF && target)
- pCreature->AI()->AttackStart(target);
+ creature->AI()->AttackStart(target);
break;
}
case ACTION_T_KILLED_MONSTER:
//first attempt player who tapped creature
- if (Player* pPlayer = me->GetLootRecipient())
- pPlayer->RewardPlayerAndGroupAtEvent(action.killed_monster.creatureId, pPlayer); // pPlayer as param is a hacky solution not to use GUID
+ if (Player* player = me->GetLootRecipient())
+ player->RewardPlayerAndGroupAtEvent(action.killed_monster.creatureId, player); // player as param is a hacky solution not to use GUID
else
{
- //if not available, use pActionInvoker
- if (Unit* pTarget = GetTargetByType(action.killed_monster.target, pActionInvoker))
- if (Player* pPlayer2 = pTarget->GetCharmerOrOwnerPlayerOrPlayerItself())
- pPlayer2->RewardPlayerAndGroupAtEvent(action.killed_monster.creatureId, pPlayer2);
+ //if not available, use actionInvoker
+ if (Unit* target = GetTargetByType(action.killed_monster.target, actionInvoker))
+ if (Player* player2 = target->GetCharmerOrOwnerPlayerOrPlayerItself())
+ player2->RewardPlayerAndGroupAtEvent(action.killed_monster.creatureId, player2);
}
break;
case ACTION_T_SET_INST_DATA:
{
- InstanceScript* pInst = (InstanceScript*)me->GetInstanceScript();
- if (!pInst)
+ InstanceScript* instance = (InstanceScript*)me->GetInstanceScript();
+ if (!instance)
{
- sLog->outErrorDb("CreatureEventAI: Event %d attempt to set instance data without instance script. Creature %d", EventId, me->GetEntry());
+ sLog->outErrorDb("CreatureEventAI: Event %d attempt to set instance data without instance script. Creature %d", eventId, me->GetEntry());
return;
}
- pInst->SetData(action.set_inst_data.field, action.set_inst_data.value);
+ instance->SetData(action.set_inst_data.field, action.set_inst_data.value);
break;
}
case ACTION_T_SET_INST_DATA64:
{
- Unit* target = GetTargetByType(action.set_inst_data64.target, pActionInvoker);
+ Unit* target = GetTargetByType(action.set_inst_data64.target, actionInvoker);
if (!target)
{
- sLog->outErrorDb("CreatureEventAI: Event %d attempt to set instance data64 but Target == NULL. Creature %d", EventId, me->GetEntry());
+ sLog->outErrorDb("CreatureEventAI: Event %d attempt to set instance data64 but Target == NULL. Creature %d", eventId, me->GetEntry());
return;
}
- InstanceScript* pInst = (InstanceScript*)me->GetInstanceScript();
- if (!pInst)
+ InstanceScript* instance = (InstanceScript*)me->GetInstanceScript();
+ if (!instance)
{
- sLog->outErrorDb("CreatureEventAI: Event %d attempt to set instance data64 without instance script. Creature %d", EventId, me->GetEntry());
+ sLog->outErrorDb("CreatureEventAI: Event %d attempt to set instance data64 without instance script. Creature %d", eventId, me->GetEntry());
return;
}
- pInst->SetData64(action.set_inst_data64.field, target->GetGUID());
+ instance->SetData64(action.set_inst_data64.field, target->GetGUID());
break;
}
case ACTION_T_UPDATE_TEMPLATE:
if (me->GetEntry() == action.update_template.creatureId)
{
- sLog->outErrorDb("CreatureEventAI: Event %d ACTION_T_UPDATE_TEMPLATE call with param1 == current entry. Creature %d", EventId, me->GetEntry());
+ sLog->outErrorDb("CreatureEventAI: Event %d ACTION_T_UPDATE_TEMPLATE call with param1 == current entry. Creature %d", eventId, me->GetEntry());
return;
}
@@ -747,7 +747,7 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
if (me->isDead())
{
- sLog->outErrorDb("CreatureEventAI: Event %d ACTION_T_DIE on dead creature. Creature %d", EventId, me->GetEntry());
+ sLog->outErrorDb("CreatureEventAI: Event %d ACTION_T_DIE on dead creature. Creature %d", eventId, me->GetEntry());
return;
}
me->Kill(me);
@@ -792,14 +792,14 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
break;
case ACTION_T_SUMMON_GO:
{
- GameObject* pObject = NULL;
+ GameObject* object = NULL;
float x, y, z;
me->GetPosition(x, y, z);
- pObject = me->SummonGameObject(action.raw.param1, x, y, z, 0, 0, 0, 0, 0, action.raw.param2);
- if (!pObject)
+ object = me->SummonGameObject(action.raw.param1, x, y, z, 0, 0, 0, 0, 0, action.raw.param2);
+ if (!object)
{
- sLog->outErrorDb("TSCR: EventAI failed to spawn object %u. Spawn event %d is on creature %d", action.raw.param1, EventId, me->GetEntry());
+ sLog->outErrorDb("TSCR: EventAI failed to spawn object %u. Spawn event %d is on creature %d", action.raw.param1, eventId, me->GetEntry());
}
break;
}
@@ -955,19 +955,19 @@ void CreatureEventAI::KilledUnit(Unit* victim)
}
}
-void CreatureEventAI::JustSummoned(Creature* pUnit)
+void CreatureEventAI::JustSummoned(Creature* unit)
{
- if (m_bEmptyList || !pUnit)
+ if (m_bEmptyList || !unit)
return;
for (CreatureEventAIList::iterator i = m_CreatureEventAIList.begin(); i != m_CreatureEventAIList.end(); ++i)
{
if ((*i).Event.event_type == EVENT_T_SUMMONED_UNIT)
- ProcessEvent(*i, pUnit);
+ ProcessEvent(*i, unit);
}
}
-void CreatureEventAI::EnterCombat(Unit *enemy)
+void CreatureEventAI::EnterCombat(Unit* enemy)
{
//Check for on combat start events
if (!m_bEmptyList)
@@ -999,7 +999,7 @@ void CreatureEventAI::EnterCombat(Unit *enemy)
m_EventDiff = 0;
}
-void CreatureEventAI::AttackStart(Unit *who)
+void CreatureEventAI::AttackStart(Unit* who)
{
if (!who)
return;
@@ -1047,7 +1047,7 @@ void CreatureEventAI::MoveInLineOfSight(Unit *who)
CreatureAI::MoveInLineOfSight(who);
}
-void CreatureEventAI::SpellHit(Unit* pUnit, const SpellInfo* pSpell)
+void CreatureEventAI::SpellHit(Unit* unit, const SpellInfo* spell)
{
if (m_bEmptyList)
@@ -1056,9 +1056,9 @@ void CreatureEventAI::SpellHit(Unit* pUnit, const SpellInfo* pSpell)
for (CreatureEventAIList::iterator i = m_CreatureEventAIList.begin(); i != m_CreatureEventAIList.end(); ++i)
if ((*i).Event.event_type == EVENT_T_SPELLHIT)
//If spell id matches (or no spell id) & if spell school matches (or no spell school)
- if (!(*i).Event.spell_hit.spellId || pSpell->Id == (*i).Event.spell_hit.spellId)
- if (pSpell->SchoolMask & (*i).Event.spell_hit.schoolMask)
- ProcessEvent(*i, pUnit);
+ if (!(*i).Event.spell_hit.spellId || spell->Id == (*i).Event.spell_hit.spellId)
+ if (spell->SchoolMask & (*i).Event.spell_hit.schoolMask)
+ ProcessEvent(*i, unit);
}
void CreatureEventAI::UpdateAI(const uint32 diff)
@@ -1152,9 +1152,9 @@ inline int32 CreatureEventAI::GetRandActionParam(uint32 rnd, int32 param1, int32
return 0;
}
-inline Unit* CreatureEventAI::GetTargetByType(uint32 Target, Unit* pActionInvoker)
+inline Unit* CreatureEventAI::GetTargetByType(uint32 target, Unit* actionInvoker)
{
- switch (Target)
+ switch (target)
{
case TARGET_T_SELF:
return me;
@@ -1169,23 +1169,23 @@ inline Unit* CreatureEventAI::GetTargetByType(uint32 Target, Unit* pActionInvoke
case TARGET_T_HOSTILE_RANDOM_NOT_TOP:
return SelectTarget(SELECT_TARGET_RANDOM, 1);
case TARGET_T_ACTION_INVOKER:
- return pActionInvoker;
+ return actionInvoker;
default:
return NULL;
};
}
-Unit* CreatureEventAI::DoSelectLowestHpFriendly(float range, uint32 MinHPDiff)
+Unit* CreatureEventAI::DoSelectLowestHpFriendly(float range, uint32 minHPDiff)
{
CellPair p(Trinity::ComputeCellPair(me->GetPositionX(), me->GetPositionY()));
Cell cell(p);
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
- Unit* pUnit = NULL;
+ Unit* unit = NULL;
- Trinity::MostHPMissingInRange u_check(me, range, MinHPDiff);
- Trinity::UnitLastSearcher<Trinity::MostHPMissingInRange> searcher(me, pUnit, u_check);
+ Trinity::MostHPMissingInRange u_check(me, range, minHPDiff);
+ Trinity::UnitLastSearcher<Trinity::MostHPMissingInRange> searcher(me, unit, u_check);
/*
typedef TYPELIST_4(GameObject, Creature*except pets*, DynamicObject, Corpse*Bones*) AllGridObjectTypes;
@@ -1194,7 +1194,7 @@ Unit* CreatureEventAI::DoSelectLowestHpFriendly(float range, uint32 MinHPDiff)
TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::MostHPMissingInRange>, GridTypeMapContainer > grid_unit_searcher(searcher);
cell.Visit(p, grid_unit_searcher, *me->GetMap(), *me, range);
- return pUnit;
+ return unit;
}
void CreatureEventAI::DoFindFriendlyCC(std::list<Creature*>& _list, float range)
@@ -1230,9 +1230,9 @@ void CreatureEventAI::DoFindFriendlyMissingBuff(std::list<Creature*>& _list, flo
// *********************************
// *** Functions used globally ***
-void CreatureEventAI::DoScriptText(int32 textEntry, WorldObject* pSource, Unit* target)
+void CreatureEventAI::DoScriptText(int32 textEntry, WorldObject* source, Unit* target)
{
- if (!pSource)
+ if (!source)
{
sLog->outErrorDb("CreatureEventAI: DoScriptText entry %i, invalid Source pointer.", textEntry);
return;
@@ -1240,7 +1240,7 @@ void CreatureEventAI::DoScriptText(int32 textEntry, WorldObject* pSource, Unit*
if (textEntry >= 0)
{
- sLog->outErrorDb("CreatureEventAI: DoScriptText with source entry %u (TypeId=%u, guid=%u) attempts to process text entry %i, but text entry must be negative.", pSource->GetEntry(), pSource->GetTypeId(), pSource->GetGUIDLow(), textEntry);
+ sLog->outErrorDb("CreatureEventAI: DoScriptText with source entry %u (TypeId=%u, guid=%u) attempts to process text entry %i, but text entry must be negative.", source->GetEntry(), source->GetTypeId(), source->GetGUIDLow(), textEntry);
return;
}
@@ -1248,7 +1248,7 @@ void CreatureEventAI::DoScriptText(int32 textEntry, WorldObject* pSource, Unit*
if (i == sEventAIMgr->GetCreatureEventAITextMap().end())
{
- sLog->outErrorDb("CreatureEventAI: DoScriptText with source entry %u (TypeId=%u, guid=%u) could not find text entry %i.", pSource->GetEntry(), pSource->GetTypeId(), pSource->GetGUIDLow(), textEntry);
+ sLog->outErrorDb("CreatureEventAI: DoScriptText with source entry %u (TypeId=%u, guid=%u) could not find text entry %i.", source->GetEntry(), source->GetTypeId(), source->GetGUIDLow(), textEntry);
return;
}
@@ -1257,75 +1257,75 @@ void CreatureEventAI::DoScriptText(int32 textEntry, WorldObject* pSource, Unit*
if ((*i).second.SoundId)
{
if (GetSoundEntriesStore()->LookupEntry((*i).second.SoundId))
- pSource->PlayDirectSound((*i).second.SoundId);
+ source->PlayDirectSound((*i).second.SoundId);
else
sLog->outErrorDb("CreatureEventAI: DoScriptText entry %i tried to process invalid sound id %u.", textEntry, (*i).second.SoundId);
}
if ((*i).second.Emote)
{
- if (pSource->GetTypeId() == TYPEID_UNIT || pSource->GetTypeId() == TYPEID_PLAYER)
+ if (source->GetTypeId() == TYPEID_UNIT || source->GetTypeId() == TYPEID_PLAYER)
{
- ((Unit*)pSource)->HandleEmoteCommand((*i).second.Emote);
+ ((Unit*)source)->HandleEmoteCommand((*i).second.Emote);
}
else
- sLog->outErrorDb("CreatureEventAI: DoScriptText entry %i tried to process emote for invalid TypeId (%u).", textEntry, pSource->GetTypeId());
+ sLog->outErrorDb("CreatureEventAI: DoScriptText entry %i tried to process emote for invalid TypeId (%u).", textEntry, source->GetTypeId());
}
switch((*i).second.Type)
{
case CHAT_TYPE_SAY:
- pSource->MonsterSay(textEntry, (*i).second.Language, target ? target->GetGUID() : 0);
+ source->MonsterSay(textEntry, (*i).second.Language, target ? target->GetGUID() : 0);
break;
case CHAT_TYPE_YELL:
- pSource->MonsterYell(textEntry, (*i).second.Language, target ? target->GetGUID() : 0);
+ source->MonsterYell(textEntry, (*i).second.Language, target ? target->GetGUID() : 0);
break;
case CHAT_TYPE_TEXT_EMOTE:
- pSource->MonsterTextEmote(textEntry, target ? target->GetGUID() : 0);
+ source->MonsterTextEmote(textEntry, target ? target->GetGUID() : 0);
break;
case CHAT_TYPE_BOSS_EMOTE:
- pSource->MonsterTextEmote(textEntry, target ? target->GetGUID() : 0, true);
+ source->MonsterTextEmote(textEntry, target ? target->GetGUID() : 0, true);
break;
case CHAT_TYPE_WHISPER:
{
if (target && target->GetTypeId() == TYPEID_PLAYER)
- pSource->MonsterWhisper(textEntry, target->GetGUID());
+ source->MonsterWhisper(textEntry, target->GetGUID());
else sLog->outErrorDb("CreatureEventAI: DoScriptText entry %i cannot whisper without target unit (TYPEID_PLAYER).", textEntry);
}break;
case CHAT_TYPE_BOSS_WHISPER:
{
if (target && target->GetTypeId() == TYPEID_PLAYER)
- pSource->MonsterWhisper(textEntry, target->GetGUID(), true);
+ source->MonsterWhisper(textEntry, target->GetGUID(), true);
else sLog->outErrorDb("CreatureEventAI: DoScriptText entry %i cannot whisper without target unit (TYPEID_PLAYER).", textEntry);
}break;
case CHAT_TYPE_ZONE_YELL:
- pSource->MonsterYellToZone(textEntry, (*i).second.Language, target ? target->GetGUID() : 0);
+ source->MonsterYellToZone(textEntry, (*i).second.Language, target ? target->GetGUID() : 0);
break;
}
}
-bool CreatureEventAI::CanCast(Unit* Target, SpellInfo const *Spell, bool Triggered)
+bool CreatureEventAI::CanCast(Unit* target, SpellInfo const* spell, bool triggered)
{
//No target so we can't cast
- if (!Target || !Spell)
+ if (!target || !spell)
return false;
//Silenced so we can't cast
- if (!Triggered && me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
+ if (!triggered && me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
return false;
//Check for power
- if (!Triggered && me->GetPower((Powers)Spell->PowerType) < Spell->CalcPowerCost(me, Spell->GetSchoolMask()))
+ if (!triggered && me->GetPower((Powers)spell->PowerType) < spell->CalcPowerCost(me, spell->GetSchoolMask()))
return false;
//Unit is out of range of this spell
- if (!me->IsInRange(Target, Spell->GetMinRange(false), Spell->GetMaxRange(false)))
+ if (!me->IsInRange(target, spell->GetMinRange(false), spell->GetMaxRange(false)))
return false;
return true;
}
-void CreatureEventAI::ReceiveEmote(Player* pPlayer, uint32 text_emote)
+void CreatureEventAI::ReceiveEmote(Player* player, uint32 textEmote)
{
if (m_bEmptyList)
return;
@@ -1334,7 +1334,7 @@ void CreatureEventAI::ReceiveEmote(Player* pPlayer, uint32 text_emote)
{
if ((*itr).Event.event_type == EVENT_T_RECEIVE_EMOTE)
{
- if ((*itr).Event.receive_emote.emoteId != text_emote)
+ if ((*itr).Event.receive_emote.emoteId != textEmote)
return;
Condition cond;
@@ -1342,10 +1342,10 @@ void CreatureEventAI::ReceiveEmote(Player* pPlayer, uint32 text_emote)
cond.mConditionValue1 = (*itr).Event.receive_emote.conditionValue1;
cond.mConditionValue2 = (*itr).Event.receive_emote.conditionValue2;
- if (cond.Meets(pPlayer))
+ if (cond.Meets(player))
{
sLog->outDebug(LOG_FILTER_DATABASE_AI, "CreatureEventAI: ReceiveEmote CreatureEventAI: Condition ok, processing");
- ProcessEvent(*itr, pPlayer);
+ ProcessEvent(*itr, player);
}
}
}
diff --git a/src/server/game/AI/EventAI/CreatureEventAI.h b/src/server/game/AI/EventAI/CreatureEventAI.h
index 7df0dc2d30d..2fc26bcbd3e 100755
--- a/src/server/game/AI/EventAI/CreatureEventAI.h
+++ b/src/server/game/AI/EventAI/CreatureEventAI.h
@@ -591,7 +591,7 @@ class CreatureEventAI : public CreatureAI
{
public:
- explicit CreatureEventAI(Creature *c);
+ explicit CreatureEventAI(Creature* c);
~CreatureEventAI()
{
m_CreatureEventAIList.clear();
@@ -599,32 +599,32 @@ class CreatureEventAI : public CreatureAI
void JustRespawned();
void Reset();
void JustReachedHome();
- void EnterCombat(Unit *enemy);
+ void EnterCombat(Unit* enemy);
void EnterEvadeMode();
void JustDied(Unit* /*killer*/);
void KilledUnit(Unit* victim);
- void JustSummoned(Creature* pUnit);
- void AttackStart(Unit *who);
- void MoveInLineOfSight(Unit *who);
- void SpellHit(Unit* pUnit, const SpellInfo* pSpell);
+ void JustSummoned(Creature* unit);
+ void AttackStart(Unit* who);
+ void MoveInLineOfSight(Unit* who);
+ void SpellHit(Unit* unit, const SpellInfo* spell);
void DamageTaken(Unit* done_by, uint32& damage);
void HealReceived(Unit* /*done_by*/, uint32& /*addhealth*/) {}
void UpdateAI(const uint32 diff);
- void ReceiveEmote(Player* pPlayer, uint32 text_emote);
- static int Permissible(const Creature *);
+ void ReceiveEmote(Player* player, uint32 textEmote);
+ static int Permissible(const Creature*);
- bool ProcessEvent(CreatureEventAIHolder& pHolder, Unit* pActionInvoker = NULL);
- void ProcessAction(CreatureEventAI_Action const& action, uint32 rnd, uint32 EventId, Unit* pActionInvoker);
+ bool ProcessEvent(CreatureEventAIHolder& holder, Unit* actionInvoker = NULL);
+ void ProcessAction(CreatureEventAI_Action const& action, uint32 rnd, uint32 eventId, Unit* actionInvoker);
inline uint32 GetRandActionParam(uint32 rnd, uint32 param1, uint32 param2, uint32 param3);
inline int32 GetRandActionParam(uint32 rnd, int32 param1, int32 param2, int32 param3);
- inline Unit* GetTargetByType(uint32 Target, Unit* pActionInvoker);
+ inline Unit* GetTargetByType(uint32 target, Unit* actionInvoker);
- void DoScriptText(int32 textEntry, WorldObject* pSource, Unit* target);
- bool CanCast(Unit* Target, SpellInfo const *Spell, bool Triggered);
+ void DoScriptText(int32 textEntry, WorldObject* source, Unit* target);
+ bool CanCast(Unit* target, SpellInfo const* spell, bool triggered);
bool SpawnedEventConditionsCheck(CreatureEventAI_Event const& event);
- Unit* DoSelectLowestHpFriendly(float range, uint32 MinHPDiff);
+ Unit* DoSelectLowestHpFriendly(float range, uint32 minHPDiff);
void DoFindFriendlyMissingBuff(std::list<Creature*>& _list, float range, uint32 spellid);
void DoFindFriendlyCC(std::list<Creature*>& _list, float range);
diff --git a/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp b/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp
index 6c3765252f0..72828ad01d6 100755
--- a/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp
+++ b/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp
@@ -124,7 +124,7 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Summons()
do
{
- Field *fields = result->Fetch();
+ Field* fields = result->Fetch();
CreatureEventAI_Summon temp;
@@ -178,7 +178,7 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
do
{
- Field *fields = result->Fetch();
+ Field* fields = result->Fetch();
CreatureEventAI_Event temp;
temp.event_id = EventAI_Type(fields[0].GetUInt32());
@@ -250,14 +250,14 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
case EVENT_T_SPELLHIT:
if (temp.spell_hit.spellId)
{
- SpellInfo const* pSpell = sSpellMgr->GetSpellInfo(temp.spell_hit.spellId);
- if (!pSpell)
+ SpellInfo const* spell = sSpellMgr->GetSpellInfo(temp.spell_hit.spellId);
+ if (!spell)
{
sLog->outErrorDb("CreatureEventAI: Creature %u has non-existant SpellID(%u) defined in event %u.", temp.creature_id, temp.spell_hit.spellId, i);
continue;
}
- if ((temp.spell_hit.schoolMask & pSpell->SchoolMask) != pSpell->SchoolMask)
+ if ((temp.spell_hit.schoolMask & spell->SchoolMask) != spell->SchoolMask)
sLog->outErrorDb("CreatureEventAI: Creature %u has param1(spellId %u) but param2 is not -1 and not equal to spell's school mask. Event %u can never trigger.", temp.creature_id, temp.spell_hit.schoolMask, i);
}
@@ -304,8 +304,8 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
break;
case EVENT_T_FRIENDLY_MISSING_BUFF:
{
- SpellInfo const* pSpell = sSpellMgr->GetSpellInfo(temp.spell_hit.spellId);
- if (!pSpell)
+ SpellInfo const* spell = sSpellMgr->GetSpellInfo(temp.spell_hit.spellId);
+ if (!spell)
{
sLog->outErrorDb("CreatureEventAI: Creature %u has non-existant SpellID(%u) defined in event %u.", temp.creature_id, temp.spell_hit.spellId, i);
continue;
@@ -381,8 +381,8 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
case EVENT_T_BUFFED:
case EVENT_T_TARGET_BUFFED:
{
- SpellInfo const* pSpell = sSpellMgr->GetSpellInfo(temp.buffed.spellId);
- if (!pSpell)
+ SpellInfo const* spell = sSpellMgr->GetSpellInfo(temp.buffed.spellId);
+ if (!spell)
{
sLog->outErrorDb("CreatureEventAI: Creature %u has non-existant SpellID(%u) defined in event %u.", temp.creature_id, temp.spell_hit.spellId, i);
continue;
@@ -501,7 +501,7 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
break;
case ACTION_T_CAST:
{
- const SpellInfo *spell = sSpellMgr->GetSpellInfo(action.cast.spellId);
+ const SpellInfo* spell = sSpellMgr->GetSpellInfo(action.cast.spellId);
if (!spell)
sLog->outErrorDb("CreatureEventAI: Event %u Action %u uses non-existent SpellID %u.", i, j+1, action.cast.spellId);
/* FIXME: temp.raw.param3 not have event tipes with recovery time in it....
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
index 001296e5c45..ebca71df079 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
@@ -16,13 +16,13 @@ struct TSpellSummary
{
uint8 Targets; // set of enum SelectTarget
uint8 Effects; // set of enum SelectEffect
-} extern *SpellSummary;
+} extern* SpellSummary;
void SummonList::DoZoneInCombat(uint32 entry)
{
for (iterator i = begin(); i != end();)
{
- Creature *summon = Unit::GetCreature(*me, *i);
+ Creature* summon = Unit::GetCreature(*me, *i);
++i;
if (summon && summon->IsAIEnabled
&& (!entry || summon->GetEntry() == entry))
@@ -34,7 +34,7 @@ void SummonList::DoAction(uint32 entry, int32 info)
{
for (iterator i = begin(); i != end();)
{
- Creature *summon = Unit::GetCreature(*me, *i);
+ Creature* summon = Unit::GetCreature(*me, *i);
++i;
if (summon && summon->IsAIEnabled
&& (!entry || summon->GetEntry() == entry))
@@ -46,7 +46,7 @@ void SummonList::DespawnEntry(uint32 entry)
{
for (iterator i = begin(); i != end();)
{
- Creature *summon = Unit::GetCreature(*me, *i);
+ Creature* summon = Unit::GetCreature(*me, *i);
if (!summon)
erase(i++);
else if (summon->GetEntry() == entry)
@@ -64,7 +64,7 @@ void SummonList::DespawnAll()
{
while (!empty())
{
- Creature *summon = Unit::GetCreature(*me, *begin());
+ Creature* summon = Unit::GetCreature(*me, *begin());
if (!summon)
erase(begin());
else
@@ -108,8 +108,8 @@ bool SummonList::HasEntry(uint32 entry)
return false;
}
-ScriptedAI::ScriptedAI(Creature* pCreature) : CreatureAI(pCreature),
- me(pCreature),
+ScriptedAI::ScriptedAI(Creature* creature) : CreatureAI(creature),
+ me(creature),
IsFleeing(false),
_evadeCheckCooldown(2500),
_isCombatMovementAllowed(true)
@@ -118,13 +118,13 @@ ScriptedAI::ScriptedAI(Creature* pCreature) : CreatureAI(pCreature),
_difficulty = Difficulty(me->GetMap()->GetSpawnMode());
}
-void ScriptedAI::AttackStartNoMove(Unit* pWho)
+void ScriptedAI::AttackStartNoMove(Unit* who)
{
- if (!pWho)
+ if (!who)
return;
- if (me->Attack(pWho, false))
- DoStartNoMovement(pWho);
+ if (me->Attack(who, false))
+ DoStartNoMovement(who);
}
void ScriptedAI::UpdateAI(uint32 const /*diff*/)
@@ -144,15 +144,15 @@ void ScriptedAI::UpdateAI(uint32 const /*diff*/)
}
}
-void ScriptedAI::DoStartMovement(Unit* pVictim, float fDistance, float fAngle)
+void ScriptedAI::DoStartMovement(Unit* victim, float distance, float angle)
{
- if (pVictim)
- me->GetMotionMaster()->MoveChase(pVictim, fDistance, fAngle);
+ if (victim)
+ me->GetMotionMaster()->MoveChase(victim, distance, angle);
}
-void ScriptedAI::DoStartNoMovement(Unit* pVictim)
+void ScriptedAI::DoStartNoMovement(Unit* victim)
{
- if (!pVictim)
+ if (!victim)
return;
me->GetMotionMaster()->MoveIdle();
@@ -164,27 +164,27 @@ void ScriptedAI::DoStopAttack()
me->AttackStop();
}
-void ScriptedAI::DoCastSpell(Unit* pTarget, SpellInfo const* pSpellInfo, bool bTriggered)
+void ScriptedAI::DoCastSpell(Unit* target, SpellInfo const* spellInfo, bool triggered)
{
- if (!pTarget || me->IsNonMeleeSpellCasted(false))
+ if (!target || me->IsNonMeleeSpellCasted(false))
return;
me->StopMoving();
- me->CastSpell(pTarget, pSpellInfo, bTriggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);
+ me->CastSpell(target, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);
}
-void ScriptedAI::DoPlaySoundToSet(WorldObject* pSource, uint32 uiSoundId)
+void ScriptedAI::DoPlaySoundToSet(WorldObject* source, uint32 soundId)
{
- if (!pSource)
+ if (!source)
return;
- if (!GetSoundEntriesStore()->LookupEntry(uiSoundId))
+ if (!GetSoundEntriesStore()->LookupEntry(soundId))
{
- sLog->outError("TSCR: Invalid soundId %u used in DoPlaySoundToSet (Source: TypeId %u, GUID %u)", uiSoundId, pSource->GetTypeId(), pSource->GetGUIDLow());
+ sLog->outError("TSCR: Invalid soundId %u used in DoPlaySoundToSet (Source: TypeId %u, GUID %u)", soundId, source->GetTypeId(), source->GetGUIDLow());
return;
}
- pSource->PlayDirectSound(uiSoundId);
+ source->PlayDirectSound(soundId);
}
Creature* ScriptedAI::DoSpawnCreature(uint32 entry, float offsetX, float offsetY, float offsetZ, float angle, uint32 type, uint32 despawntime)
@@ -302,105 +302,107 @@ void ScriptedAI::DoResetThreat()
for (std::list<HostileReference*>::iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
{
- Unit* pUnit = Unit::GetUnit((*me), (*itr)->getUnitGuid());
+ Unit* unit = Unit::GetUnit((*me), (*itr)->getUnitGuid());
- if (pUnit && DoGetThreat(pUnit))
- DoModifyThreatPercent(pUnit, -100);
+ if (unit && DoGetThreat(unit))
+ DoModifyThreatPercent(unit, -100);
}
}
-float ScriptedAI::DoGetThreat(Unit* pUnit)
+float ScriptedAI::DoGetThreat(Unit* unit)
{
- if (!pUnit) return 0.0f;
- return me->getThreatManager().getThreat(pUnit);
+ if (!unit)
+ return 0.0f;
+ return me->getThreatManager().getThreat(unit);
}
-void ScriptedAI::DoModifyThreatPercent(Unit* pUnit, int32 pct)
+void ScriptedAI::DoModifyThreatPercent(Unit* unit, int32 pct)
{
- if (!pUnit) return;
- me->getThreatManager().modifyThreatPercent(pUnit, pct);
+ if (!unit)
+ return;
+ me->getThreatManager().modifyThreatPercent(unit, pct);
}
-void ScriptedAI::DoTeleportTo(float fX, float fY, float fZ, uint32 uiTime)
+void ScriptedAI::DoTeleportTo(float x, float y, float z, uint32 time)
{
- me->Relocate(fX, fY, fZ);
- me->SendMonsterMove(fX, fY, fZ, uiTime);
+ me->Relocate(x, y, z);
+ me->SendMonsterMove(x, y, z, time);
}
-void ScriptedAI::DoTeleportTo(const float fPos[4])
+void ScriptedAI::DoTeleportTo(const float position[4])
{
- me->NearTeleportTo(fPos[0], fPos[1], fPos[2], fPos[3]);
+ me->NearTeleportTo(position[0], position[1], position[2], position[3]);
}
-void ScriptedAI::DoTeleportPlayer(Unit* pUnit, float fX, float fY, float fZ, float fO)
+void ScriptedAI::DoTeleportPlayer(Unit* unit, float x, float y, float z, float o)
{
- if (!pUnit || pUnit->GetTypeId() != TYPEID_PLAYER)
+ if (!unit || unit->GetTypeId() != TYPEID_PLAYER)
{
- if (pUnit)
- sLog->outError("TSCR: Creature " UI64FMTD " (Entry: %u) Tried to teleport non-player unit (Type: %u GUID: " UI64FMTD ") to x: %f y:%f z: %f o: %f. Aborted.", me->GetGUID(), me->GetEntry(), pUnit->GetTypeId(), pUnit->GetGUID(), fX, fY, fZ, fO);
+ if (unit)
+ sLog->outError("TSCR: Creature " UI64FMTD " (Entry: %u) Tried to teleport non-player unit (Type: %u GUID: " UI64FMTD ") to x: %f y:%f z: %f o: %f. Aborted.", me->GetGUID(), me->GetEntry(), unit->GetTypeId(), unit->GetGUID(), x, y, z, o);
return;
}
- CAST_PLR(pUnit)->TeleportTo(pUnit->GetMapId(), fX, fY, fZ, fO, TELE_TO_NOT_LEAVE_COMBAT);
+ CAST_PLR(unit)->TeleportTo(unit->GetMapId(), x, y, z, o, TELE_TO_NOT_LEAVE_COMBAT);
}
-void ScriptedAI::DoTeleportAll(float fX, float fY, float fZ, float fO)
+void ScriptedAI::DoTeleportAll(float x, float y, float z, float o)
{
- Map *map = me->GetMap();
+ Map* map = me->GetMap();
if (!map->IsDungeon())
return;
- Map::PlayerList const &PlayerList = map->GetPlayers();
- for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
- if (Player* i_pl = i->getSource())
- if (i_pl->isAlive())
- i_pl->TeleportTo(me->GetMapId(), fX, fY, fZ, fO, TELE_TO_NOT_LEAVE_COMBAT);
+ Map::PlayerList const& PlayerList = map->GetPlayers();
+ for (Map::PlayerList::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr)
+ if (Player* player = itr->getSource())
+ if (player->isAlive())
+ player->TeleportTo(me->GetMapId(), x, y, z, o, TELE_TO_NOT_LEAVE_COMBAT);
}
-Unit* ScriptedAI::DoSelectLowestHpFriendly(float fRange, uint32 uiMinHPDiff)
+Unit* ScriptedAI::DoSelectLowestHpFriendly(float range, uint32 minHPDiff)
{
- Unit* pUnit = NULL;
- Trinity::MostHPMissingInRange u_check(me, fRange, uiMinHPDiff);
- Trinity::UnitLastSearcher<Trinity::MostHPMissingInRange> searcher(me, pUnit, u_check);
- me->VisitNearbyObject(fRange, searcher);
+ Unit* unit = NULL;
+ Trinity::MostHPMissingInRange u_check(me, range, minHPDiff);
+ Trinity::UnitLastSearcher<Trinity::MostHPMissingInRange> searcher(me, unit, u_check);
+ me->VisitNearbyObject(range, searcher);
- return pUnit;
+ return unit;
}
-std::list<Creature*> ScriptedAI::DoFindFriendlyCC(float fRange)
+std::list<Creature*> ScriptedAI::DoFindFriendlyCC(float range)
{
- std::list<Creature*> pList;
- Trinity::FriendlyCCedInRange u_check(me, fRange);
- Trinity::CreatureListSearcher<Trinity::FriendlyCCedInRange> searcher(me, pList, u_check);
- me->VisitNearbyObject(fRange, searcher);
- return pList;
+ std::list<Creature*> list;
+ Trinity::FriendlyCCedInRange u_check(me, range);
+ Trinity::CreatureListSearcher<Trinity::FriendlyCCedInRange> searcher(me, list, u_check);
+ me->VisitNearbyObject(range, searcher);
+ return list;
}
-std::list<Creature*> ScriptedAI::DoFindFriendlyMissingBuff(float fRange, uint32 uiSpellid)
+std::list<Creature*> ScriptedAI::DoFindFriendlyMissingBuff(float range, uint32 uiSpellid)
{
- std::list<Creature*> pList;
- Trinity::FriendlyMissingBuffInRange u_check(me, fRange, uiSpellid);
- Trinity::CreatureListSearcher<Trinity::FriendlyMissingBuffInRange> searcher(me, pList, u_check);
- me->VisitNearbyObject(fRange, searcher);
- return pList;
+ std::list<Creature*> list;
+ Trinity::FriendlyMissingBuffInRange u_check(me, range, uiSpellid);
+ Trinity::CreatureListSearcher<Trinity::FriendlyMissingBuffInRange> searcher(me, list, u_check);
+ me->VisitNearbyObject(range, searcher);
+ return list;
}
-Player* ScriptedAI::GetPlayerAtMinimumRange(float fMinimumRange)
+Player* ScriptedAI::GetPlayerAtMinimumRange(float minimumRange)
{
- Player* pPlayer = NULL;
+ Player* player = NULL;
CellPair pair(Trinity::ComputeCellPair(me->GetPositionX(), me->GetPositionY()));
Cell cell(pair);
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
- Trinity::PlayerAtMinimumRangeAway check(me, fMinimumRange);
- Trinity::PlayerSearcher<Trinity::PlayerAtMinimumRangeAway> searcher(me, pPlayer, check);
+ Trinity::PlayerAtMinimumRangeAway check(me, minimumRange);
+ Trinity::PlayerSearcher<Trinity::PlayerAtMinimumRangeAway> searcher(me, player, check);
TypeContainerVisitor<Trinity::PlayerSearcher<Trinity::PlayerAtMinimumRangeAway>, GridTypeMapContainer> visitor(searcher);
cell.Visit(pair, visitor, *(me->GetMap()));
- return pPlayer;
+ return player;
}
void ScriptedAI::SetEquipmentSlots(bool loadDefault, int32 mainHand /*= EQUIP_NO_CHANGE*/, int32 offHand /*= EQUIP_NO_CHANGE*/, int32 ranged /*= EQUIP_NO_CHANGE*/)
@@ -451,14 +453,14 @@ bool ScriptedAI::EnterEvadeIfOutOfCombatArea(uint32 const diff)
if (me->IsInEvadeMode() || !me->getVictim())
return false;
- float fX = me->GetPositionX();
- float fY = me->GetPositionY();
- float fZ = me->GetPositionZ();
+ float x = me->GetPositionX();
+ float y = me->GetPositionY();
+ float z = me->GetPositionZ();
switch(me->GetEntry())
{
case NPC_BROODLORD: // broodlord (not move down stairs)
- if (fZ > 448.60f)
+ if (z > 448.60f)
return false;
break;
case NPC_VOID_REAVER: // void reaver (calculate from center of room)
@@ -466,11 +468,11 @@ bool ScriptedAI::EnterEvadeIfOutOfCombatArea(uint32 const diff)
return false;
break;
case NPC_JAN_ALAI: // jan'alai (calculate by Z)
- if (fZ > 12.0f)
+ if (z > 12.0f)
return false;
break;
case NPC_SARTHARION: // sartharion (calculate box)
- if (fX > 3218.86f && fX < 3275.69f && fY < 572.40f && fY > 484.68f)
+ if (x > 3218.86f && x < 3275.69f && y < 572.40f && y > 484.68f)
return false;
break;
default:
diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
index 653c37b1003..02cbacb8db0 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
@@ -20,29 +20,29 @@ enum ePoints
POINT_COMBAT_START = 0xFFFFFF
};
-FollowerAI::FollowerAI(Creature* pCreature) : ScriptedAI(pCreature),
+FollowerAI::FollowerAI(Creature* creature) : ScriptedAI(creature),
m_uiLeaderGUID(0),
m_uiUpdateFollowTimer(2500),
m_uiFollowState(STATE_FOLLOW_NONE),
m_pQuestForFollow(NULL)
{}
-void FollowerAI::AttackStart(Unit* pWho)
+void FollowerAI::AttackStart(Unit* who)
{
- if (!pWho)
+ if (!who)
return;
- if (me->Attack(pWho, true))
+ if (me->Attack(who, true))
{
- me->AddThreat(pWho, 0.0f);
- me->SetInCombatWith(pWho);
- pWho->SetInCombatWith(me);
+ me->AddThreat(who, 0.0f);
+ me->SetInCombatWith(who);
+ who->SetInCombatWith(me);
if (me->HasUnitState(UNIT_STAT_FOLLOW))
me->ClearUnitState(UNIT_STAT_FOLLOW);
if (IsCombatMovementAllowed())
- me->GetMotionMaster()->MoveChase(pWho);
+ me->GetMotionMaster()->MoveChase(who);
}
}
@@ -86,30 +86,30 @@ bool FollowerAI::AssistPlayerInCombat(Unit* who)
return false;
}
-void FollowerAI::MoveInLineOfSight(Unit* pWho)
+void FollowerAI::MoveInLineOfSight(Unit* who)
{
- if (!me->HasUnitState(UNIT_STAT_STUNNED) && pWho->isTargetableForAttack() && pWho->isInAccessiblePlaceFor(me))
+ if (!me->HasUnitState(UNIT_STAT_STUNNED) && who->isTargetableForAttack() && who->isInAccessiblePlaceFor(me))
{
- if (HasFollowState(STATE_FOLLOW_INPROGRESS) && AssistPlayerInCombat(pWho))
+ if (HasFollowState(STATE_FOLLOW_INPROGRESS) && AssistPlayerInCombat(who))
return;
- if (!me->canFly() && me->GetDistanceZ(pWho) > CREATURE_Z_ATTACK_RANGE)
+ if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
return;
- if (me->IsHostileTo(pWho))
+ if (me->IsHostileTo(who))
{
- float fAttackRadius = me->GetAttackDistance(pWho);
- if (me->IsWithinDistInMap(pWho, fAttackRadius) && me->IsWithinLOSInMap(pWho))
+ float fAttackRadius = me->GetAttackDistance(who);
+ if (me->IsWithinDistInMap(who, fAttackRadius) && me->IsWithinLOSInMap(who))
{
if (!me->getVictim())
{
- pWho->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);
- AttackStart(pWho);
+ who->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);
+ AttackStart(who);
}
else if (me->GetMap()->IsDungeon())
{
- pWho->SetInCombatWith(me);
- me->AddThreat(pWho, 0.0f);
+ who->SetInCombatWith(me);
+ me->AddThreat(who, 0.0f);
}
}
}
@@ -122,23 +122,23 @@ void FollowerAI::JustDied(Unit* /*pKiller*/)
return;
//TODO: need a better check for quests with time limit.
- if (Player* pPlayer = GetLeaderForFollower())
+ if (Player* player = GetLeaderForFollower())
{
- if (Group* pGroup = pPlayer->GetGroup())
+ if (Group* group = player->GetGroup())
{
- for (GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next())
+ for (GroupReference* groupRef = group->GetFirstMember(); groupRef != NULL; groupRef = groupRef->next())
{
- if (Player* pMember = pRef->getSource())
+ if (Player* member = groupRef->getSource())
{
- if (pMember->GetQuestStatus(m_pQuestForFollow->GetQuestId()) == QUEST_STATUS_INCOMPLETE)
- pMember->FailQuest(m_pQuestForFollow->GetQuestId());
+ if (member->GetQuestStatus(m_pQuestForFollow->GetQuestId()) == QUEST_STATUS_INCOMPLETE)
+ member->FailQuest(m_pQuestForFollow->GetQuestId());
}
}
}
else
{
- if (pPlayer->GetQuestStatus(m_pQuestForFollow->GetQuestId()) == QUEST_STATUS_INCOMPLETE)
- pPlayer->FailQuest(m_pQuestForFollow->GetQuestId());
+ if (player->GetQuestStatus(m_pQuestForFollow->GetQuestId()) == QUEST_STATUS_INCOMPLETE)
+ player->FailQuest(m_pQuestForFollow->GetQuestId());
}
}
}
@@ -198,24 +198,24 @@ void FollowerAI::UpdateAI(const uint32 uiDiff)
bool bIsMaxRangeExceeded = true;
- if (Player* pPlayer = GetLeaderForFollower())
+ if (Player* player = GetLeaderForFollower())
{
if (HasFollowState(STATE_FOLLOW_RETURNING))
{
sLog->outDebug(LOG_FILTER_TSCR, "TSCR: FollowerAI is returning to leader.");
RemoveFollowState(STATE_FOLLOW_RETURNING);
- me->GetMotionMaster()->MoveFollow(pPlayer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
+ me->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
return;
}
- if (Group* pGroup = pPlayer->GetGroup())
+ if (Group* group = player->GetGroup())
{
- for (GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next())
+ for (GroupReference* groupRef = group->GetFirstMember(); groupRef != NULL; groupRef = groupRef->next())
{
- Player* pMember = pRef->getSource();
+ Player* member = groupRef->getSource();
- if (pMember && me->IsWithinDistInMap(pMember, MAX_PLAYER_DISTANCE))
+ if (member && me->IsWithinDistInMap(member, MAX_PLAYER_DISTANCE))
{
bIsMaxRangeExceeded = false;
break;
@@ -224,7 +224,7 @@ void FollowerAI::UpdateAI(const uint32 uiDiff)
}
else
{
- if (me->IsWithinDistInMap(pPlayer, MAX_PLAYER_DISTANCE))
+ if (me->IsWithinDistInMap(player, MAX_PLAYER_DISTANCE))
bIsMaxRangeExceeded = false;
}
}
@@ -253,12 +253,12 @@ void FollowerAI::UpdateFollowerAI(const uint32 /*uiDiff*/)
DoMeleeAttackIfReady();
}
-void FollowerAI::MovementInform(uint32 uiMotionType, uint32 uiPointId)
+void FollowerAI::MovementInform(uint32 motionType, uint32 pointId)
{
- if (uiMotionType != POINT_MOTION_TYPE || !HasFollowState(STATE_FOLLOW_INPROGRESS))
+ if (motionType != POINT_MOTION_TYPE || !HasFollowState(STATE_FOLLOW_INPROGRESS))
return;
- if (uiPointId == POINT_COMBAT_START)
+ if (pointId == POINT_COMBAT_START)
{
if (GetLeaderForFollower())
{
@@ -270,7 +270,7 @@ void FollowerAI::MovementInform(uint32 uiMotionType, uint32 uiPointId)
}
}
-void FollowerAI::StartFollow(Player* pLeader, uint32 uiFactionForFollower, const Quest* pQuest)
+void FollowerAI::StartFollow(Player* player, uint32 factionForFollower, const Quest* quest)
{
if (me->getVictim())
{
@@ -285,12 +285,12 @@ void FollowerAI::StartFollow(Player* pLeader, uint32 uiFactionForFollower, const
}
//set variables
- m_uiLeaderGUID = pLeader->GetGUID();
+ m_uiLeaderGUID = player->GetGUID();
- if (uiFactionForFollower)
- me->setFaction(uiFactionForFollower);
+ if (factionForFollower)
+ me->setFaction(factionForFollower);
- m_pQuestForFollow = pQuest;
+ m_pQuestForFollow = quest;
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE)
{
@@ -303,30 +303,30 @@ void FollowerAI::StartFollow(Player* pLeader, uint32 uiFactionForFollower, const
AddFollowState(STATE_FOLLOW_INPROGRESS);
- me->GetMotionMaster()->MoveFollow(pLeader, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
+ me->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
- sLog->outDebug(LOG_FILTER_TSCR, "TSCR: FollowerAI start follow %s (GUID " UI64FMTD ")", pLeader->GetName(), m_uiLeaderGUID);
+ sLog->outDebug(LOG_FILTER_TSCR, "TSCR: FollowerAI start follow %s (GUID " UI64FMTD ")", player->GetName(), m_uiLeaderGUID);
}
Player* FollowerAI::GetLeaderForFollower()
{
- if (Player* pLeader = Unit::GetPlayer(*me, m_uiLeaderGUID))
+ if (Player* player = Unit::GetPlayer(*me, m_uiLeaderGUID))
{
- if (pLeader->isAlive())
- return pLeader;
+ if (player->isAlive())
+ return player;
else
{
- if (Group* pGroup = pLeader->GetGroup())
+ if (Group* group = player->GetGroup())
{
- for (GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next())
+ for (GroupReference* groupRef = group->GetFirstMember(); groupRef != NULL; groupRef = groupRef->next())
{
- Player* pMember = pRef->getSource();
+ Player* member = groupRef->getSource();
- if (pMember && pMember->isAlive() && me->IsWithinDistInMap(pMember, MAX_PLAYER_DISTANCE))
+ if (member && member->isAlive() && me->IsWithinDistInMap(member, MAX_PLAYER_DISTANCE))
{
sLog->outDebug(LOG_FILTER_TSCR, "TSCR: FollowerAI GetLeader changed and returned new leader.");
- m_uiLeaderGUID = pMember->GetGUID();
- return pMember;
+ m_uiLeaderGUID = member->GetGUID();
+ return member;
break;
}
}
@@ -360,12 +360,12 @@ void FollowerAI::SetFollowComplete(bool bWithEndEvent)
AddFollowState(STATE_FOLLOW_COMPLETE);
}
-void FollowerAI::SetFollowPaused(bool bPaused)
+void FollowerAI::SetFollowPaused(bool paused)
{
if (!HasFollowState(STATE_FOLLOW_INPROGRESS) || HasFollowState(STATE_FOLLOW_COMPLETE))
return;
- if (bPaused)
+ if (paused)
{
AddFollowState(STATE_FOLLOW_PAUSED);
@@ -382,7 +382,7 @@ void FollowerAI::SetFollowPaused(bool bPaused)
{
RemoveFollowState(STATE_FOLLOW_PAUSED);
- if (Player* pLeader = GetLeaderForFollower())
- me->GetMotionMaster()->MoveFollow(pLeader, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
+ if (Player* leader = GetLeaderForFollower())
+ me->GetMotionMaster()->MoveFollow(leader, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
}
}
diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h
index d352141e3e9..1c81b5f73fc 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h
@@ -21,12 +21,12 @@ enum eFollowState
class FollowerAI : public ScriptedAI
{
public:
- explicit FollowerAI(Creature* pCreature);
+ explicit FollowerAI(Creature* creature);
~FollowerAI() {}
//virtual void WaypointReached(uint32 uiPointId) = 0;
- void MovementInform(uint32 uiMotionType, uint32 uiPointId);
+ void MovementInform(uint32 motionType, uint32 pointId);
void AttackStart(Unit*);
@@ -41,7 +41,7 @@ class FollowerAI : public ScriptedAI
void UpdateAI(const uint32); //the "internal" update, calls UpdateFollowerAI()
virtual void UpdateFollowerAI(const uint32); //used when it's needed to add code in update (abilities, scripted events, etc)
- void StartFollow(Player* pPlayer, uint32 uiFactionForFollower = 0, const Quest* pQuest = NULL);
+ void StartFollow(Player* player, uint32 factionForFollower = 0, const Quest* quest = NULL);
void SetFollowPaused(bool bPaused); //if special event require follow mode to hold/resume during the follow
void SetFollowComplete(bool bWithEndEvent = false);
@@ -55,7 +55,7 @@ class FollowerAI : public ScriptedAI
void AddFollowState(uint32 uiFollowState) { m_uiFollowState |= uiFollowState; }
void RemoveFollowState(uint32 uiFollowState) { m_uiFollowState &= ~uiFollowState; }
- bool AssistPlayerInCombat(Unit* pWho);
+ bool AssistPlayerInCombat(Unit* who);
uint64 m_uiLeaderGUID;
uint32 m_uiUpdateFollowTimer;
diff --git a/src/server/game/AI/ScriptedAI/ScriptedSimpleAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedSimpleAI.cpp
index a3bbd65aff0..c4142ba2b1b 100755
--- a/src/server/game/AI/ScriptedAI/ScriptedSimpleAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedSimpleAI.cpp
@@ -26,7 +26,7 @@ EndScriptData */
#include "ScriptPCH.h"
#include "ScriptedSimpleAI.h"
-SimpleAI::SimpleAI(Creature *c) : ScriptedAI(c)
+SimpleAI::SimpleAI(Creature* c) : ScriptedAI(c)
{
//Clear all data
Aggro_TextId[0] = 0;
@@ -63,7 +63,7 @@ void SimpleAI::Reset()
{
}
-void SimpleAI::EnterCombat(Unit *who)
+void SimpleAI::EnterCombat(Unit* who)
{
//Reset cast timers
if (Spell[0].First_Cast >= 0)
@@ -123,36 +123,36 @@ void SimpleAI::KilledUnit(Unit* victim)
if (!Kill_Spell)
return;
- Unit *pTarget = NULL;
+ Unit* target = NULL;
switch (Kill_Target_Type)
{
case CAST_SELF:
- pTarget = me;
+ target = me;
break;
case CAST_HOSTILE_TARGET:
- pTarget = me->getVictim();
+ target = me->getVictim();
break;
case CAST_HOSTILE_SECOND_AGGRO:
- pTarget = SelectTarget(SELECT_TARGET_TOPAGGRO, 1);
+ target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1);
break;
case CAST_HOSTILE_LAST_AGGRO:
- pTarget = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0);
+ target = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0);
break;
case CAST_HOSTILE_RANDOM:
- pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0);
break;
case CAST_KILLEDUNIT_VICTIM:
- pTarget = victim;
+ target = victim;
break;
}
//Target is ok, cast a spell on it
- if (pTarget)
- DoCast(pTarget, Kill_Spell);
+ if (target)
+ DoCast(target, Kill_Spell);
}
-void SimpleAI::DamageTaken(Unit* killer, uint32 &damage)
+void SimpleAI::DamageTaken(Unit* killer, uint32& damage)
{
//Return if damage taken won't kill us
if (me->GetHealth() > damage)
@@ -171,33 +171,33 @@ void SimpleAI::DamageTaken(Unit* killer, uint32 &damage)
if (!Death_Spell)
return;
- Unit *pTarget = NULL;
+ Unit* target = NULL;
switch (Death_Target_Type)
{
case CAST_SELF:
- pTarget = me;
+ target = me;
break;
case CAST_HOSTILE_TARGET:
- pTarget = me->getVictim();
+ target = me->getVictim();
break;
case CAST_HOSTILE_SECOND_AGGRO:
- pTarget = SelectTarget(SELECT_TARGET_TOPAGGRO, 1);
+ target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1);
break;
case CAST_HOSTILE_LAST_AGGRO:
- pTarget = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0);
+ target = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0);
break;
case CAST_HOSTILE_RANDOM:
- pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0);
break;
case CAST_JUSTDIED_KILLER:
- pTarget = killer;
+ target = killer;
break;
}
//Target is ok, cast a spell on it
- if (pTarget)
- DoCast(pTarget, Death_Spell);
+ if (target)
+ DoCast(target, Death_Spell);
}
void SimpleAI::UpdateAI(const uint32 diff)
@@ -222,34 +222,34 @@ void SimpleAI::UpdateAI(const uint32 diff)
//Check Current spell
if (!(Spell[i].InterruptPreviousCast && me->IsNonMeleeSpellCasted(false)))
{
- Unit *pTarget = NULL;
+ Unit* target = NULL;
switch (Spell[i].Cast_Target_Type)
{
case CAST_SELF:
- pTarget = me;
+ target = me;
break;
case CAST_HOSTILE_TARGET:
- pTarget = me->getVictim();
+ target = me->getVictim();
break;
case CAST_HOSTILE_SECOND_AGGRO:
- pTarget = SelectTarget(SELECT_TARGET_TOPAGGRO, 1);
+ target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1);
break;
case CAST_HOSTILE_LAST_AGGRO:
- pTarget = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0);
+ target = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0);
break;
case CAST_HOSTILE_RANDOM:
- pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0);
break;
}
//Target is ok, cast a spell on it and then do our random yell
- if (pTarget)
+ if (target)
{
if (me->IsNonMeleeSpellCasted(false))
me->InterruptNonMeleeSpells(false);
- DoCast(pTarget, Spell[i].Spell_Id);
+ DoCast(target, Spell[i].Spell_Id);
//Yell and sound use the same number so that you can make
//the Creature yell with the correct sound effect attached
@@ -257,7 +257,7 @@ void SimpleAI::UpdateAI(const uint32 diff)
//Random yell
if (Spell[i].TextId[random_text])
- DoScriptText(Spell[i].TextId[random_text], me, pTarget);
+ DoScriptText(Spell[i].TextId[random_text], me, target);
//Random sound
if (Spell[i].Text_Sound[random_text])
diff --git a/src/server/game/AI/ScriptedAI/ScriptedSimpleAI.h b/src/server/game/AI/ScriptedAI/ScriptedSimpleAI.h
index 246f1b9df3e..a38bdf85e14 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedSimpleAI.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedSimpleAI.h
@@ -23,7 +23,7 @@ enum CastTarget
struct SimpleAI : public ScriptedAI
{
- SimpleAI(Creature *c);// : ScriptedAI(c);
+ SimpleAI(Creature* c);// : ScriptedAI(c);
void Reset();
@@ -31,7 +31,7 @@ struct SimpleAI : public ScriptedAI
void KilledUnit(Unit* /*victim*/);
- void DamageTaken(Unit* killer, uint32 &damage);
+ void DamageTaken(Unit* killer, uint32& damage);
void UpdateAI(const uint32 diff);
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index db8d2ffc2cb..97bfbd6fb10 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -214,36 +214,36 @@ void SmartAI::EndPath(bool fail)
{
if (targets->size() == 1 && GetScript()->IsPlayer((*targets->begin())))
{
- Player* plr = (*targets->begin())->ToPlayer();
- if (!fail && plr->IsAtGroupRewardDistance(me) && !plr->GetCorpse())
- plr->GroupEventHappens(mEscortQuestID, me);
+ Player* player = (*targets->begin())->ToPlayer();
+ if (!fail && player->IsAtGroupRewardDistance(me) && !player->GetCorpse())
+ player->GroupEventHappens(mEscortQuestID, me);
- if (fail && plr->GetQuestStatus(mEscortQuestID) == QUEST_STATUS_INCOMPLETE)
- plr->FailQuest(mEscortQuestID);
+ if (fail && player->GetQuestStatus(mEscortQuestID) == QUEST_STATUS_INCOMPLETE)
+ player->FailQuest(mEscortQuestID);
- if (Group* pGroup = plr->GetGroup())
+ if (Group* group = player->GetGroup())
{
- for (GroupReference* gr = pGroup->GetFirstMember(); gr != NULL; gr = gr->next())
+ for (GroupReference* groupRef = group->GetFirstMember(); groupRef != NULL; groupRef = groupRef->next())
{
- Player* pGroupGuy = gr->getSource();
+ Player* groupGuy = groupRef->getSource();
- if (!fail && pGroupGuy->IsAtGroupRewardDistance(me) && !pGroupGuy->GetCorpse())
- pGroupGuy->AreaExploredOrEventHappens(mEscortQuestID);
- if (fail && pGroupGuy->GetQuestStatus(mEscortQuestID) == QUEST_STATUS_INCOMPLETE)
- pGroupGuy->FailQuest(mEscortQuestID);
+ if (!fail && groupGuy->IsAtGroupRewardDistance(me) && !groupGuy->GetCorpse())
+ groupGuy->AreaExploredOrEventHappens(mEscortQuestID);
+ if (fail && groupGuy->GetQuestStatus(mEscortQuestID) == QUEST_STATUS_INCOMPLETE)
+ groupGuy->FailQuest(mEscortQuestID);
}
}
}else
{
- for (ObjectList::iterator iter = targets->begin(); iter != targets->end(); iter++)
+ for (ObjectList::iterator iter = targets->begin(); iter != targets->end(); ++iter)
{
if (GetScript()->IsPlayer((*iter)))
{
- Player* plr = (*iter)->ToPlayer();
- if (!fail && plr->IsAtGroupRewardDistance(me) && !plr->GetCorpse())
- plr->AreaExploredOrEventHappens(mEscortQuestID);
- if (fail && plr->GetQuestStatus(mEscortQuestID) == QUEST_STATUS_INCOMPLETE)
- plr->FailQuest(mEscortQuestID);
+ Player* player = (*iter)->ToPlayer();
+ if (!fail && player->IsAtGroupRewardDistance(me) && !player->GetCorpse())
+ player->AreaExploredOrEventHappens(mEscortQuestID);
+ if (fail && player->GetQuestStatus(mEscortQuestID) == QUEST_STATUS_INCOMPLETE)
+ player->FailQuest(mEscortQuestID);
}
}
}
@@ -346,12 +346,12 @@ void SmartAI::UpdateAI(const uint32 diff)
{
if (me->FindNearestCreature(mFollowArrivedEntry, INTERACTION_DISTANCE, true))
{
- if (Player* plr = me->GetPlayer(*me, mFollowGuid))
+ if (Player* player = me->GetPlayer(*me, mFollowGuid))
{
if (!mFollowCreditType)
- plr->RewardPlayerAndGroupAtEvent(mFollowCredit, me);
+ player->RewardPlayerAndGroupAtEvent(mFollowCredit, me);
else
- plr->GroupEventHappens(mFollowCredit, me);
+ player->GroupEventHappens(mFollowCredit, me);
}
mFollowGuid = 0;
mFollowDist = 0;
@@ -385,23 +385,23 @@ bool SmartAI::IsEscortInvokerInRange()
{
if (targets->size() == 1 && GetScript()->IsPlayer((*targets->begin())))
{
- Player* plr = (*targets->begin())->ToPlayer();
- if (me->GetDistance(plr) <= SMART_ESCORT_MAX_PLAYER_DIST)
+ Player* player = (*targets->begin())->ToPlayer();
+ if (me->GetDistance(player) <= SMART_ESCORT_MAX_PLAYER_DIST)
return true;
- if (Group* pGroup = plr->GetGroup())
+ if (Group* group = player->GetGroup())
{
- for (GroupReference* gr = pGroup->GetFirstMember(); gr != NULL; gr = gr->next())
+ for (GroupReference* groupRef = group->GetFirstMember(); groupRef != NULL; groupRef = groupRef->next())
{
- Player* pGroupGuy = gr->getSource();
+ Player* groupGuy = groupRef->getSource();
- if (me->GetDistance(pGroupGuy) <= SMART_ESCORT_MAX_PLAYER_DIST)
+ if (me->GetDistance(groupGuy) <= SMART_ESCORT_MAX_PLAYER_DIST)
return true;
}
}
}else
{
- for (ObjectList::iterator iter = targets->begin(); iter != targets->end(); iter++)
+ for (ObjectList::iterator iter = targets->begin(); iter != targets->end(); ++iter)
{
if (GetScript()->IsPlayer((*iter)))
{
@@ -499,9 +499,9 @@ bool SmartAI::CanAIAttack(const Unit* /*who*/) const
return true;
}
-bool SmartAI::AssistPlayerInCombat(Unit* pWho)
+bool SmartAI::AssistPlayerInCombat(Unit* who)
{
- if (!pWho || !pWho->getVictim())
+ if (!who || !who->getVictim())
return false;
//experimental (unknown) flag not present
@@ -509,26 +509,26 @@ bool SmartAI::AssistPlayerInCombat(Unit* pWho)
return false;
//not a player
- if (!pWho->getVictim()->GetCharmerOrOwnerPlayerOrPlayerItself())
+ if (!who->getVictim()->GetCharmerOrOwnerPlayerOrPlayerItself())
return false;
//never attack friendly
- if (me->IsFriendlyTo(pWho))
+ if (me->IsFriendlyTo(who))
return false;
//too far away and no free sight?
- if (me->IsWithinDistInMap(pWho, SMART_MAX_AID_DIST) && me->IsWithinLOSInMap(pWho))
+ if (me->IsWithinDistInMap(who, SMART_MAX_AID_DIST) && me->IsWithinLOSInMap(who))
{
//already fighting someone?
if (!me->getVictim())
{
- AttackStart(pWho);
+ AttackStart(who);
return true;
}
else
{
- pWho->SetInCombatWith(me);
- me->AddThreat(pWho, 0.0f);
+ who->SetInCombatWith(me);
+ me->AddThreat(who, 0.0f);
return true;
}
}
@@ -606,29 +606,29 @@ void SmartAI::AttackStart(Unit* who)
}
}
-void SmartAI::SpellHit(Unit* pUnit, const SpellInfo* pSpell)
+void SmartAI::SpellHit(Unit* unit, const SpellInfo* spellInfo)
{
- GetScript()->ProcessEventsFor(SMART_EVENT_SPELLHIT, pUnit, 0, 0, false, pSpell);
+ GetScript()->ProcessEventsFor(SMART_EVENT_SPELLHIT, unit, 0, 0, false, spellInfo);
}
-void SmartAI::SpellHitTarget(Unit* target, const SpellInfo* pSpell)
+void SmartAI::SpellHitTarget(Unit* target, const SpellInfo* spellInfo)
{
- GetScript()->ProcessEventsFor(SMART_EVENT_SPELLHIT_TARGET, target, 0, 0, false, pSpell);
+ GetScript()->ProcessEventsFor(SMART_EVENT_SPELLHIT_TARGET, target, 0, 0, false, spellInfo);
}
-void SmartAI::DamageTaken(Unit* done_by, uint32& damage)
+void SmartAI::DamageTaken(Unit* doneBy, uint32& damage)
{
- GetScript()->ProcessEventsFor(SMART_EVENT_DAMAGED, done_by, damage);
+ GetScript()->ProcessEventsFor(SMART_EVENT_DAMAGED, doneBy, damage);
}
-void SmartAI::HealReceived(Unit* done_by, uint32& addhealth)
+void SmartAI::HealReceived(Unit* doneBy, uint32& addhealth)
{
- GetScript()->ProcessEventsFor(SMART_EVENT_RECEIVE_HEAL, done_by, addhealth);
+ GetScript()->ProcessEventsFor(SMART_EVENT_RECEIVE_HEAL, doneBy, addhealth);
}
-void SmartAI::ReceiveEmote(Player* pPlayer, uint32 text_emote)
+void SmartAI::ReceiveEmote(Player* player, uint32 textEmote)
{
- GetScript()->ProcessEventsFor(SMART_EVENT_RECEIVE_EMOTE, pPlayer, text_emote);
+ GetScript()->ProcessEventsFor(SMART_EVENT_RECEIVE_EMOTE, player, textEmote);
}
void SmartAI::IsSummonedBy(Unit* summoner)
@@ -636,9 +636,9 @@ void SmartAI::IsSummonedBy(Unit* summoner)
GetScript()->ProcessEventsFor(SMART_EVENT_JUST_SUMMONED, summoner);
}
-void SmartAI::DamageDealt(Unit* done_to, uint32& damage, DamageEffectType /*damagetype*/)
+void SmartAI::DamageDealt(Unit* doneTo, uint32& damage, DamageEffectType /*damagetype*/)
{
- GetScript()->ProcessEventsFor(SMART_EVENT_DAMAGED_TARGET, done_to, damage);
+ GetScript()->ProcessEventsFor(SMART_EVENT_DAMAGED_TARGET, doneTo, damage);
}
void SmartAI::SummonedCreatureDespawn(Creature* unit)
@@ -705,14 +705,14 @@ void SmartAI::SetRun(bool run)
mRun = run;
}
-void SmartAI::SetFly(bool bFly)
+void SmartAI::SetFly(bool fly)
{
- me->SetFlying(bFly);
+ me->SetFlying(fly);
}
-void SmartAI::SetSwimm(bool bSwimm)
+void SmartAI::SetSwim(bool swim)
{
- if (bSwimm)
+ if (swim)
me->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING);
else
me->RemoveUnitMovementFlag(MOVEMENTFLAG_SWIMMING);
@@ -787,7 +787,7 @@ void SmartAI::SetFollow(Unit* target, float dist, float angle, uint32 credit, ui
mFollowCreditType = creditType;
}
-void SmartAI::SetScript9(SmartScriptHolder &e, uint32 entry, Unit* invoker)
+void SmartAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker)
{
if (invoker)
GetScript()->mLastInvoker = invoker->GetGUID();
@@ -888,7 +888,7 @@ void SmartGameObjectAI::SetData(uint32 id, uint32 value)
GetScript()->ProcessEventsFor(SMART_EVENT_DATA_SET, NULL, id, value);
}
-void SmartGameObjectAI::SetScript9(SmartScriptHolder &e, uint32 entry, Unit* invoker)
+void SmartGameObjectAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker)
{
if (invoker)
GetScript()->mLastInvoker = invoker->GetGUID();
diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h
index e26d125b442..a4926226a91 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.h
+++ b/src/server/game/AI/SmartScripts/SmartAI.h
@@ -48,7 +48,7 @@ class SmartAI : public CreatureAI
{
public:
~SmartAI(){};
- explicit SmartAI(Creature *c);
+ explicit SmartAI(Creature* c);
// Start moving to the desired MovePoint
void StartPath(bool run = false, uint32 path = 0, bool repeat = false, Unit* invoker = NULL);
@@ -65,7 +65,7 @@ class SmartAI : public CreatureAI
void SetCombatMove(bool on);
void SetFollow(Unit* target, float dist = 0.0f, float angle = 0.0f, uint32 credit = 0, uint32 end = 0, uint32 creditType = 0);
- void SetScript9(SmartScriptHolder &e, uint32 entry, Unit* invoker);
+ void SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker);
SmartScript* GetScript() { return &mScript; }
bool IsEscortInvokerInRange();
@@ -79,7 +79,7 @@ class SmartAI : public CreatureAI
void JustReachedHome();
// Called for reaction at enter to combat if not in combat yet (enemy can be NULL)
- void EnterCombat(Unit *enemy);
+ void EnterCombat(Unit* enemy);
// Called for reaction at stopping attack at no attackers or targets
void EnterEvadeMode();
@@ -97,25 +97,25 @@ class SmartAI : public CreatureAI
void AttackStart(Unit* who);
// Called if IsVisible(Unit *who) is true at each *who move, reaction at visibility zone enter
- void MoveInLineOfSight(Unit *who);
+ void MoveInLineOfSight(Unit* who);
// Called when hit by a spell
- void SpellHit(Unit* pUnit, const SpellInfo* pSpell);
+ void SpellHit(Unit* unit, const SpellInfo* spellInfo);
// Called when spell hits a target
- void SpellHitTarget(Unit* target, const SpellInfo* pSpell);
+ void SpellHitTarget(Unit* target, const SpellInfo* spellInfo);
// Called at any Damage from any attacker (before damage apply)
- void DamageTaken(Unit* done_by, uint32& damage);
+ void DamageTaken(Unit* doneBy, uint32& damage);
// Called when the creature receives heal
- void HealReceived(Unit* done_by, uint32& addhealth);
+ void HealReceived(Unit* doneBy, uint32& addhealth);
// Called at World update tick
void UpdateAI(const uint32 diff);
// Called at text emote receive from player
- void ReceiveEmote(Player* pPlayer, uint32 text_emote);
+ void ReceiveEmote(Player* player, uint32 textEmote);
// Called at waypoint reached or point movement finished
void MovementInform(uint32 MovementType, uint32 Data);
@@ -124,13 +124,13 @@ class SmartAI : public CreatureAI
void IsSummonedBy(Unit* summoner);
// Called at any Damage to any victim (before damage apply)
- void DamageDealt(Unit* done_to, uint32 & damage, DamageEffectType /*damagetype*/);
+ void DamageDealt(Unit* doneTo, uint32& damage, DamageEffectType /*damagetype*/);
// Called when a summoned creature dissapears (UnSommoned)
void SummonedCreatureDespawn(Creature* unit);
// called when the corpse of this creature gets removed
- void CorpseRemoved(uint32 & respawnDelay);
+ void CorpseRemoved(uint32& respawnDelay);
// Called at World update tick if creature is charmed
void UpdateAIWhileCharmed(const uint32 diff);
@@ -163,17 +163,17 @@ class SmartAI : public CreatureAI
uint64 GetGUID(int32 id = 0);
//core related
- static int Permissible(const Creature *);
+ static int Permissible(const Creature*);
// Called at movepoint reached
void MovepointReached(uint32 id);
// Makes the creature run/walk
- void SetRun(bool bRun = true);
+ void SetRun(bool run = true);
- void SetFly(bool bFly = true);
+ void SetFly(bool fly = true);
- void SetSwimm(bool bSwimm = true);
+ void SetSwim(bool swim = true);
void sGossipHello(Player* player);
void sGossipSelect(Player* player, uint32 sender, uint32 action);
@@ -220,7 +220,7 @@ class SmartAI : public CreatureAI
bool mCanCombatMove;
bool mForcedPaused;
- bool AssistPlayerInCombat(Unit* pWho);
+ bool AssistPlayerInCombat(Unit* who);
uint32 mDespawnTime;
uint32 mDespawnState;
@@ -231,7 +231,7 @@ class SmartAI : public CreatureAI
class SmartGameObjectAI : public GameObjectAI
{
public:
- SmartGameObjectAI(GameObject *g) : GameObjectAI(g), go(g) {}
+ SmartGameObjectAI(GameObject* g) : GameObjectAI(g), go(g) {}
~SmartGameObjectAI() {}
void UpdateAI(const uint32 diff);
@@ -248,7 +248,7 @@ public:
uint32 GetDialogStatus(Player* /*player*/);
void Destroyed(Player* player, uint32 eventId);
void SetData(uint32 id, uint32 value);
- void SetScript9(SmartScriptHolder &e, uint32 entry, Unit* invoker);
+ void SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker);
protected:
GameObject* const go;
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index d2cd386828b..cbcbc1e2290 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -1212,12 +1212,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
CAST_AI(SmartAI, me->AI())->SetRun(e.action.setRun.run ? true : false);
break;
}
- case SMART_ACTION_SET_SWIMM:
+ case SMART_ACTION_SET_SWIM:
{
if (!IsSmart())
return;
- CAST_AI(SmartAI, me->AI())->SetSwimm(e.action.setSwimm.swimm ? true : false);
+ CAST_AI(SmartAI, me->AI())->SetSwim(e.action.setSwim.swim ? true : false);
break;
}
case SMART_ACTION_WP_START:
@@ -1946,9 +1946,9 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder const& e, Unit* invoker /*
if (trigger)
{
l->push_back(trigger);
- if (Player* plr = trigger->ToPlayer())
- if (Group* pGroup = plr->GetGroup())
- for (GroupReference* groupRef = pGroup->GetFirstMember(); groupRef != NULL; groupRef = groupRef->next())
+ if (Player* player = trigger->ToPlayer())
+ if (Group* group = player->GetGroup())
+ for (GroupReference* groupRef = group->GetFirstMember(); groupRef != NULL; groupRef = groupRef->next())
if (Player* member = groupRef->getSource())
l->push_back(member);
}
@@ -2263,10 +2263,10 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
if (!me || !me->isInCombat())
return;
- Unit* pUnit = DoSelectLowestHpFriendly((float)e.event.friendlyHealt.radius, e.event.friendlyHealt.hpDeficit);
- if (!pUnit)
+ Unit* unit = DoSelectLowestHpFriendly((float)e.event.friendlyHealt.radius, e.event.friendlyHealt.hpDeficit);
+ if (!unit)
return;
- ProcessAction(e, pUnit);
+ ProcessAction(e, unit);
RecalcTimer(e, e.event.friendlyHealt.repeatMin, e.event.friendlyHealt.repeatMax);
break;
}
@@ -2881,15 +2881,15 @@ Unit* SmartScript::DoSelectLowestHpFriendly(float range, uint32 MinHPDiff)
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
- Unit* pUnit = NULL;
+ Unit* unit = NULL;
Trinity::MostHPMissingInRange u_check(me, range, MinHPDiff);
- Trinity::UnitLastSearcher<Trinity::MostHPMissingInRange> searcher(me, pUnit, u_check);
+ Trinity::UnitLastSearcher<Trinity::MostHPMissingInRange> searcher(me, unit, u_check);
TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::MostHPMissingInRange>, GridTypeMapContainer > grid_unit_searcher(searcher);
cell.Visit(p, grid_unit_searcher, *me->GetMap(), *me, range);
- return pUnit;
+ return unit;
}
void SmartScript::DoFindFriendlyCC(std::list<Creature*>& _list, float range)
diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h
index 0ff6f9efefc..62855154c8a 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.h
+++ b/src/server/game/AI/SmartScripts/SmartScript.h
@@ -151,35 +151,35 @@ class SmartScript
return NULL;
}
- GameObject* FindGameObjectNear(WorldObject* pSearchObject, uint32 guid) const
+ GameObject* FindGameObjectNear(WorldObject* searchObject, uint32 guid) const
{
- GameObject* pGameObject = NULL;
+ GameObject* gameObject = NULL;
- CellPair p(Trinity::ComputeCellPair(pSearchObject->GetPositionX(), pSearchObject->GetPositionY()));
+ CellPair p(Trinity::ComputeCellPair(searchObject->GetPositionX(), searchObject->GetPositionY()));
Cell cell(p);
cell.data.Part.reserved = ALL_DISTRICT;
- Trinity::GameObjectWithDbGUIDCheck goCheck(*pSearchObject, guid);
- Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck> checker(pSearchObject, pGameObject, goCheck);
+ Trinity::GameObjectWithDbGUIDCheck goCheck(*searchObject, guid);
+ Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck> checker(searchObject, gameObject, goCheck);
TypeContainerVisitor<Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck>, GridTypeMapContainer > objectChecker(checker);
- cell.Visit(p, objectChecker, *pSearchObject->GetMap());
+ cell.Visit(p, objectChecker, *searchObject->GetMap());
- return pGameObject;
+ return gameObject;
}
- Creature* FindCreatureNear(WorldObject* pSearchObject, uint32 guid) const
+ Creature* FindCreatureNear(WorldObject* searchObject, uint32 guid) const
{
Creature* crea = NULL;
- CellPair p(Trinity::ComputeCellPair(pSearchObject->GetPositionX(), pSearchObject->GetPositionY()));
+ CellPair p(Trinity::ComputeCellPair(searchObject->GetPositionX(), searchObject->GetPositionY()));
Cell cell(p);
cell.data.Part.reserved = ALL_DISTRICT;
- Trinity::CreatureWithDbGUIDCheck target_check(pSearchObject, guid);
- Trinity::CreatureSearcher<Trinity::CreatureWithDbGUIDCheck> checker(pSearchObject, crea, target_check);
+ Trinity::CreatureWithDbGUIDCheck target_check(searchObject, guid);
+ Trinity::CreatureSearcher<Trinity::CreatureWithDbGUIDCheck> checker(searchObject, crea, target_check);
TypeContainerVisitor<Trinity::CreatureSearcher <Trinity::CreatureWithDbGUIDCheck>, GridTypeMapContainer > unit_checker(checker);
- cell.Visit(p, unit_checker, *pSearchObject->GetMap());
+ cell.Visit(p, unit_checker, *searchObject->GetMap());
return crea;
}
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index 99c804d3d2c..ce40d42a74e 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -282,7 +282,7 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e)
return true;
}
-bool SmartAIMgr::IsEventValid(SmartScriptHolder &e)
+bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
{
if (e.event.type >= SMART_EVENT_END)
{
@@ -334,13 +334,13 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder &e)
case SMART_EVENT_SPELLHIT_TARGET:
if (e.event.spellHit.spell)
{
- SpellInfo const* pSpell = sSpellMgr->GetSpellInfo(e.event.spellHit.spell);
- if (!pSpell)
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(e.event.spellHit.spell);
+ if (!spellInfo)
{
sLog->outErrorDb("SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses non-existent Spell entry %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.event.spellHit.spell);
return false;
}
- if (e.event.spellHit.school && (e.event.spellHit.school & pSpell->SchoolMask) != pSpell->SchoolMask)
+ if (e.event.spellHit.school && (e.event.spellHit.school & spellInfo->SchoolMask) != spellInfo->SchoolMask)
{
sLog->outErrorDb("SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses Spell entry %u with invalid school mask, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.event.spellHit.spell);
return false;
@@ -739,7 +739,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder &e)
case SMART_ACTION_WP_PAUSE:
case SMART_ACTION_SET_FLY:
case SMART_ACTION_SET_RUN:
- case SMART_ACTION_SET_SWIMM:
+ case SMART_ACTION_SET_SWIM:
case SMART_ACTION_FORCE_DESPAWN:
case SMART_ACTION_SET_INGAME_PHASE_MASK:
case SMART_ACTION_SET_UNIT_FLAG:
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index 4ab9a738707..d6235b05667 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -420,7 +420,7 @@ enum SMART_ACTION
SMART_ACTION_INSTALL_AI_TEMPLATE = 58, // AITemplateID
SMART_ACTION_SET_RUN = 59, // 0/1
SMART_ACTION_SET_FLY = 60, // 0/1
- SMART_ACTION_SET_SWIMM = 61, // 0/1
+ SMART_ACTION_SET_SWIM = 61, // 0/1
SMART_ACTION_TELEPORT = 62, // mapID,
SMART_ACTION_STORE_VARIABLE_DECIMAL = 63, // varID, number
SMART_ACTION_STORE_TARGET_LIST = 64, // varID,
@@ -754,8 +754,8 @@ struct SmartAction
struct
{
- uint32 swimm;
- } setSwimm;
+ uint32 swim;
+ } setSwim;
struct
{
@@ -1153,7 +1153,6 @@ struct SmartScriptHolder
runOnce = false;
link = 0;
entryOrGuid = 0;
- link = 0;
event_id = 0;
enableTimed = false;
}
@@ -1236,7 +1235,7 @@ class SmartAIMgr
//event stores
SmartAIEventMap mEventMap[SMART_SCRIPT_TYPE_MAX];
- bool IsEventValid(SmartScriptHolder &e);
+ bool IsEventValid(SmartScriptHolder& e);
bool IsTargetValid(SmartScriptHolder const& e);
/*inline bool IsTargetValid(SmartScriptHolder e, int32 target)
diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp
index 47320b1b542..69c413108ff 100755
--- a/src/server/game/Accounts/AccountMgr.cpp
+++ b/src/server/game/Accounts/AccountMgr.cpp
@@ -35,9 +35,7 @@ AccountOpResult AccountMgr::CreateAccount(std::string username, std::string pass
normalizeString(password);
if (GetId(username))
- {
return AOR_NAME_ALREDY_EXIST; // username does already exist
- }
LoginDatabase.PExecute("INSERT INTO account(username, sha_pass_hash, joindate) VALUES('%s', '%s', NOW())", username.c_str(), CalculateShaPassHash(username, password).c_str());
LoginDatabase.Execute("INSERT INTO realmcharacters (realmid, acctid, numchars) SELECT realmlist.id, account.id, 0 FROM realmlist, account LEFT JOIN realmcharacters ON acctid=account.id WHERE acctid IS NULL");
@@ -45,23 +43,22 @@ AccountOpResult AccountMgr::CreateAccount(std::string username, std::string pass
return AOR_OK; // everything's fine
}
-AccountOpResult AccountMgr::DeleteAccount(uint32 accid)
+AccountOpResult AccountMgr::DeleteAccount(uint32 accountId)
{
- QueryResult result = LoginDatabase.PQuery("SELECT 1 FROM account WHERE id='%d'", accid);
+ QueryResult result = LoginDatabase.PQuery("SELECT 1 FROM account WHERE id='%d'", accountId);
if (!result)
return AOR_NAME_NOT_EXIST; // account doesn't exist
// existed characters list
- result = CharacterDatabase.PQuery("SELECT guid FROM characters WHERE account='%d'", accid);
+ result = CharacterDatabase.PQuery("SELECT guid FROM characters WHERE account='%d'", accountId);
if (result)
{
do
{
- Field *fields = result->Fetch();
- uint32 guidlo = fields[0].GetUInt32();
- uint64 guid = MAKE_NEW_GUID(guidlo, 0, HIGHGUID_PLAYER);
+ uint32 guidLow = (*result)[0].GetUInt32();
+ uint64 guid = MAKE_NEW_GUID(guidLow, 0, HIGHGUID_PLAYER);
- // kick if player currently
+ // kick if player is online
if (Player* p = ObjectAccessor::FindPlayer(guid))
{
WorldSession* s = p->GetSession();
@@ -69,69 +66,69 @@ AccountOpResult AccountMgr::DeleteAccount(uint32 accid)
s->LogoutPlayer(false); // logout player without waiting next session list update
}
- Player::DeleteFromDB(guid, accid, false); // no need to update realm characters
+ Player::DeleteFromDB(guid, accountId, false); // no need to update realm characters
} while (result->NextRow());
}
// table realm specific but common for all characters of account for realm
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_TUTORIALS);
- stmt->setUInt32(0, accid);
+ stmt->setUInt32(0, accountId);
CharacterDatabase.Execute(stmt);
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ACCOUNT_DATA);
- stmt->setUInt32(0, accid);
+ stmt->setUInt32(0, accountId);
CharacterDatabase.Execute(stmt);
SQLTransaction trans = LoginDatabase.BeginTransaction();
- trans->PAppend("DELETE FROM account WHERE id='%d'", accid);
- trans->PAppend("DELETE FROM account_access WHERE id ='%d'", accid);
- trans->PAppend("DELETE FROM realmcharacters WHERE acctid='%d'", accid);
+ trans->PAppend("DELETE FROM account WHERE id='%d'", accountId);
+ trans->PAppend("DELETE FROM account_access WHERE id ='%d'", accountId);
+ trans->PAppend("DELETE FROM realmcharacters WHERE acctid='%d'", accountId);
LoginDatabase.CommitTransaction(trans);
return AOR_OK;
}
-AccountOpResult AccountMgr::ChangeUsername(uint32 accid, std::string new_uname, std::string new_passwd)
+AccountOpResult AccountMgr::ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword)
{
- QueryResult result = LoginDatabase.PQuery("SELECT 1 FROM account WHERE id='%d'", accid);
+ QueryResult result = LoginDatabase.PQuery("SELECT 1 FROM account WHERE id='%d'", accountId);
if (!result)
return AOR_NAME_NOT_EXIST; // account doesn't exist
- if (utf8length(new_uname) > MAX_ACCOUNT_STR)
+ if (utf8length(newUsername) > MAX_ACCOUNT_STR)
return AOR_NAME_TOO_LONG;
- if (utf8length(new_passwd) > MAX_ACCOUNT_STR)
+ if (utf8length(newPassword) > MAX_ACCOUNT_STR)
return AOR_PASS_TOO_LONG;
- normalizeString(new_uname);
- normalizeString(new_passwd);
+ normalizeString(newUsername);
+ normalizeString(newPassword);
- std::string safe_new_uname = new_uname;
- LoginDatabase.EscapeString(safe_new_uname);
+ std::string safeNewUsername = newUsername;
+ LoginDatabase.EscapeString(safeNewUsername);
- LoginDatabase.PExecute("UPDATE account SET v='0', s='0', username='%s', sha_pass_hash='%s' WHERE id='%d'", safe_new_uname.c_str(),
- CalculateShaPassHash(new_uname, new_passwd).c_str(), accid);
+ LoginDatabase.PExecute("UPDATE account SET v='0', s='0', username='%s', sha_pass_hash='%s' WHERE id='%d'", safeNewUsername.c_str(),
+ CalculateShaPassHash(newUsername, newPassword).c_str(), accountId);
return AOR_OK;
}
-AccountOpResult AccountMgr::ChangePassword(uint32 accid, std::string new_passwd)
+AccountOpResult AccountMgr::ChangePassword(uint32 accountId, std::string newPassword)
{
std::string username;
- if (!GetName(accid, username))
+ if (!GetName(accountId, username))
return AOR_NAME_NOT_EXIST; // account doesn't exist
- if (utf8length(new_passwd) > MAX_ACCOUNT_STR)
+ if (utf8length(newPassword) > MAX_ACCOUNT_STR)
return AOR_PASS_TOO_LONG;
normalizeString(username);
- normalizeString(new_passwd);
+ normalizeString(newPassword);
// also reset s and v to force update at next realmd login
LoginDatabase.PExecute("UPDATE account SET v='0', s='0', sha_pass_hash='%s' WHERE id='%d'",
- CalculateShaPassHash(username, new_passwd).c_str(), accid);
+ CalculateShaPassHash(username, newPassword).c_str(), accountId);
return AOR_OK;
}
@@ -140,44 +137,26 @@ uint32 AccountMgr::GetId(std::string username)
{
LoginDatabase.EscapeString(username);
QueryResult result = LoginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'", username.c_str());
- if (!result)
- return 0;
- else
- {
- uint32 id = (*result)[0].GetUInt32();
- return id;
- }
+ return (result) ? (*result)[0].GetUInt32() : 0;
}
-uint32 AccountMgr::GetSecurity(uint32 acc_id)
+uint32 AccountMgr::GetSecurity(uint32 accountId)
{
- QueryResult result = LoginDatabase.PQuery("SELECT gmlevel FROM account_access WHERE id = '%u'", acc_id);
- if (result)
- {
- uint32 sec = (*result)[0].GetUInt32();
- return sec;
- }
-
- return 0;
+ QueryResult result = LoginDatabase.PQuery("SELECT gmlevel FROM account_access WHERE id = '%u'", accountId);
+ return (result) ? (*result)[0].GetUInt32() : 0;
}
-uint32 AccountMgr::GetSecurity(uint64 acc_id, int32 realm_id)
+uint32 AccountMgr::GetSecurity(uint64 accountId, int32 realmId)
{
- QueryResult result = (realm_id == -1)
- ? LoginDatabase.PQuery("SELECT gmlevel FROM account_access WHERE id = '%u' AND RealmID = '%d'", acc_id, realm_id)
- : LoginDatabase.PQuery("SELECT gmlevel FROM account_access WHERE id = '%u' AND (RealmID = '%d' OR RealmID = '-1')", acc_id, realm_id);
- if (result)
- {
- uint32 sec = (*result)[0].GetUInt32();
- return sec;
- }
-
- return 0;
+ QueryResult result = (realmId == -1)
+ ? LoginDatabase.PQuery("SELECT gmlevel FROM account_access WHERE id = '%u' AND RealmID = '%d'", accountId, realmId)
+ : LoginDatabase.PQuery("SELECT gmlevel FROM account_access WHERE id = '%u' AND (RealmID = '%d' OR RealmID = '-1')", accountId, realmId);
+ return (result) ? (*result)[0].GetUInt32() : 0;
}
-bool AccountMgr::GetName(uint32 acc_id, std::string &name)
+bool AccountMgr::GetName(uint32 accountId, std::string& name)
{
- QueryResult result = LoginDatabase.PQuery("SELECT username FROM account WHERE id = '%u'", acc_id);
+ QueryResult result = LoginDatabase.PQuery("SELECT username FROM account WHERE id = '%u'", accountId);
if (result)
{
name = (*result)[0].GetString();
@@ -187,51 +166,43 @@ bool AccountMgr::GetName(uint32 acc_id, std::string &name)
return false;
}
-bool AccountMgr::CheckPassword(uint32 accid, std::string passwd)
+bool AccountMgr::CheckPassword(uint32 accountId, std::string password)
{
std::string username;
- if (!GetName(accid, username))
+
+ if (!GetName(accountId, username))
return false;
normalizeString(username);
- normalizeString(passwd);
-
- QueryResult result = LoginDatabase.PQuery("SELECT 1 FROM account WHERE id='%d' AND sha_pass_hash='%s'", accid, CalculateShaPassHash(username, passwd).c_str());
- if (result)
- return true;
+ normalizeString(password);
- return false;
+ QueryResult result = LoginDatabase.PQuery("SELECT 1 FROM account WHERE id='%d' AND sha_pass_hash='%s'", accountId, CalculateShaPassHash(username, password).c_str());
+ return (result) ? true : false;
}
-uint32 AccountMgr::GetCharactersCount(uint32 acc_id)
+uint32 AccountMgr::GetCharactersCount(uint32 accountId)
{
- uint32 charcount = 0;
// check character count
- QueryResult result = CharacterDatabase.PQuery("SELECT COUNT(guid) FROM characters WHERE account = '%d'", acc_id);
- if (result)
- {
- Field *fields=result->Fetch();
- charcount = fields[0].GetUInt32();
- }
- return charcount;
+ QueryResult result = CharacterDatabase.PQuery("SELECT COUNT(guid) FROM characters WHERE account = '%d'", accountId);
+ return (result) ? (*result)[0].GetUInt32() : 0;
}
-bool AccountMgr::normalizeString(std::string& utf8str)
+bool AccountMgr::normalizeString(std::string& utf8String)
{
- wchar_t wstr_buf[MAX_ACCOUNT_STR+1];
+ wchar_t buffer[MAX_ACCOUNT_STR+1];
- size_t wstr_len = MAX_ACCOUNT_STR;
- if (!Utf8toWStr(utf8str, wstr_buf, wstr_len))
+ size_t maxLength = MAX_ACCOUNT_STR;
+ if (!Utf8toWStr(utf8String, buffer, maxLength))
return false;
#ifdef _MSC_VER
#pragma warning(disable: 4996)
#endif
- std::transform(&wstr_buf[0], wstr_buf+wstr_len, &wstr_buf[0], wcharToUpperOnlyLatin);
+ std::transform(&buffer[0], buffer+maxLength, &buffer[0], wcharToUpperOnlyLatin);
#ifdef _MSC_VER
#pragma warning(default: 4996)
#endif
- return WStrToUtf8(wstr_buf, wstr_len, utf8str);
+ return WStrToUtf8(buffer, maxLength, utf8String);
}
std::string AccountMgr::CalculateShaPassHash(std::string& name, std::string& password)
diff --git a/src/server/game/Accounts/AccountMgr.h b/src/server/game/Accounts/AccountMgr.h
index 7d31c550bdf..3eaa0df93b3 100755
--- a/src/server/game/Accounts/AccountMgr.h
+++ b/src/server/game/Accounts/AccountMgr.h
@@ -42,19 +42,19 @@ class AccountMgr
~AccountMgr();
AccountOpResult CreateAccount(std::string username, std::string password);
- AccountOpResult DeleteAccount(uint32 accid);
- AccountOpResult ChangeUsername(uint32 accid, std::string new_uname, std::string new_passwd);
- AccountOpResult ChangePassword(uint32 accid, std::string new_passwd);
- bool CheckPassword(uint32 accid, std::string passwd);
+ AccountOpResult DeleteAccount(uint32 accountId);
+ AccountOpResult ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword);
+ AccountOpResult ChangePassword(uint32 accountId, std::string newPassword);
+ bool CheckPassword(uint32 accountId, std::string password);
uint32 GetId(std::string username);
- uint32 GetSecurity(uint32 acc_id);
- uint32 GetSecurity(uint64 acc_id, int32 realm_id);
- bool GetName(uint32 acc_id, std::string &name);
- uint32 GetCharactersCount(uint32 acc_id);
+ uint32 GetSecurity(uint32 accountId);
+ uint32 GetSecurity(uint64 accountId, int32 realmId);
+ bool GetName(uint32 accountId, std::string& name);
+ uint32 GetCharactersCount(uint32 accountId);
std::string CalculateShaPassHash(std::string& name, std::string& password);
- static bool normalizeString(std::string& utf8str);
+ static bool normalizeString(std::string& utf8String);
};
#define sAccountMgr ACE_Singleton<AccountMgr, ACE_Null_Mutex>::instance()
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 853215c7026..0090e910e8a 100755
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -1664,7 +1664,7 @@ void Battleground::SendWarningToAll(int32 entry, ...)
data << (uint32)1;
data << (uint8)0;
data << (uint64)0;
- data << (uint32)(strlen(msg.c_str())+1);
+ data << (uint32)(msg.length() + 1);
data << msg.c_str();
data << (uint8)0;
for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
index ce62a20d035..7ce7498358b 100755
--- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
@@ -60,11 +60,9 @@ bool BattlegroundSA::SetupBattleground()
bool BattlegroundSA::ResetObjs()
{
-
- for (int i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; i++)
- for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
- if (Player *plr = ObjectAccessor::FindPlayer(itr->first))
- SendTransportsRemove(plr);
+ for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
+ if (Player *plr = ObjectAccessor::FindPlayer(itr->first))
+ SendTransportsRemove(plr);
uint32 atF = BG_SA_Factions[Attackers];
uint32 defF = BG_SA_Factions[Attackers ? TEAM_ALLIANCE : TEAM_HORDE];
@@ -263,7 +261,7 @@ void BattlegroundSA::StartShips()
for (int i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; i++)
{
- for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end();itr++)
+ for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
{
if (Player* p = ObjectAccessor::FindPlayer(itr->first))
{
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index 9509302f87b..cecbd223ed9 100755
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -653,7 +653,7 @@ bool ChatHandler::ExecuteCommandInTable(ChatCommand *table, const char* text, co
continue;
bool match = false;
- if (strlen(table[i].Name) > strlen(cmd.c_str()))
+ if (strlen(table[i].Name) > cmd.length())
{
for (uint32 j = 0; table[j].Name != NULL; ++j)
{
@@ -694,7 +694,7 @@ bool ChatHandler::ExecuteCommandInTable(ChatCommand *table, const char* text, co
SetSentErrorMessage(false);
// table[i].Name == "" is special case: send original command to handler
- if ((table[i].Handler)(this, strlen(table[i].Name) != 0 ? text : oldtext))
+ if ((table[i].Handler)(this, table[i].Name[0] != '\0' ? text : oldtext))
{
if (table[i].SecurityLevel > SEC_PLAYER)
{
diff --git a/src/server/game/Chat/Commands/Level3.cpp b/src/server/game/Chat/Commands/Level3.cpp
index 901d41e5c54..c7dec515d3c 100755
--- a/src/server/game/Chat/Commands/Level3.cpp
+++ b/src/server/game/Chat/Commands/Level3.cpp
@@ -3105,7 +3105,10 @@ bool ChatHandler::HandleBanInfoCharacterCommand(const char *args)
stmt->setUInt32(0, target_guid);
PreparedQueryResult result = CharacterDatabase.Query(stmt);
if (!result)
+ {
+ PSendSysMessage(LANG_CHAR_NOT_BANNED, name.c_str());
return true;
+ }
PSendSysMessage(LANG_BANINFO_BANHISTORY, name.c_str());
do
diff --git a/src/server/game/Combat/HostileRefManager.h b/src/server/game/Combat/HostileRefManager.h
index f84a7a69fca..36fe6f7a6b7 100755
--- a/src/server/game/Combat/HostileRefManager.h
+++ b/src/server/game/Combat/HostileRefManager.h
@@ -32,9 +32,9 @@ class SpellInfo;
class HostileRefManager : public RefManager<Unit, ThreatManager>
{
private:
- Unit *iOwner;
+ Unit* iOwner;
public:
- explicit HostileRefManager(Unit *owner) { iOwner = owner; }
+ explicit HostileRefManager(Unit* owner) { iOwner = owner; }
~HostileRefManager();
Unit* getOwner() { return iOwner; }
@@ -62,10 +62,10 @@ class HostileRefManager : public RefManager<Unit, ThreatManager>
void setOnlineOfflineState(bool isOnline);
// set state for one reference, defined by Unit
- void setOnlineOfflineState(Unit *creature, bool isOnline);
+ void setOnlineOfflineState(Unit* creature, bool isOnline);
// delete one reference, defined by Unit
- void deleteReference(Unit *creature);
+ void deleteReference(Unit* creature);
void UpdateVisibility();
};
diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp
index 242110f4a22..bf3650f611e 100755
--- a/src/server/game/Combat/ThreatManager.cpp
+++ b/src/server/game/Combat/ThreatManager.cpp
@@ -301,7 +301,7 @@ HostileReference* ThreatContainer::selectNextVictim(Creature* attacker, HostileR
bool noPriorityTargetFound = false;
std::list<HostileReference*>::const_iterator lastRef = iThreatList.end();
- lastRef--;
+ --lastRef;
for (std::list<HostileReference*>::const_iterator iter = iThreatList.begin(); iter != iThreatList.end() && !found;)
{
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index b45a870ee83..e72a8cba67b 100755
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -864,20 +864,20 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
bool targetfound = false;
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
- if (spellProto->Effects[i].TargetA.GetTarget() == TARGET_UNIT_AREA_ENTRY_SRC ||
- spellProto->Effects[i].TargetB.GetTarget() == TARGET_UNIT_AREA_ENTRY_SRC ||
- spellProto->Effects[i].TargetA.GetTarget() == TARGET_UNIT_AREA_ENTRY_DST ||
- spellProto->Effects[i].TargetB.GetTarget() == TARGET_UNIT_AREA_ENTRY_DST ||
+ if (spellProto->Effects[i].TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENTRY ||
+ spellProto->Effects[i].TargetB.GetTarget() == TARGET_UNIT_SRC_AREA_ENTRY ||
+ spellProto->Effects[i].TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENTRY ||
+ spellProto->Effects[i].TargetB.GetTarget() == TARGET_UNIT_DEST_AREA_ENTRY ||
spellProto->Effects[i].TargetA.GetTarget() == TARGET_UNIT_NEARBY_ENTRY ||
spellProto->Effects[i].TargetB.GetTarget() == TARGET_UNIT_NEARBY_ENTRY ||
spellProto->Effects[i].TargetA.GetTarget() == TARGET_GAMEOBJECT_NEARBY_ENTRY ||
spellProto->Effects[i].TargetB.GetTarget() == TARGET_GAMEOBJECT_NEARBY_ENTRY ||
- spellProto->Effects[i].TargetA.GetTarget() == TARGET_GAMEOBJECT_AREA_SRC ||
- spellProto->Effects[i].TargetB.GetTarget() == TARGET_GAMEOBJECT_AREA_SRC ||
- spellProto->Effects[i].TargetA.GetTarget() == TARGET_GAMEOBJECT_AREA_DST ||
- spellProto->Effects[i].TargetB.GetTarget() == TARGET_GAMEOBJECT_AREA_DST ||
- spellProto->Effects[i].TargetA.GetTarget() == TARGET_DST_NEARBY_ENTRY ||
- spellProto->Effects[i].TargetB.GetTarget() == TARGET_DST_NEARBY_ENTRY ||
+ spellProto->Effects[i].TargetA.GetTarget() == TARGET_GAMEOBJECT_SRC_AREA ||
+ spellProto->Effects[i].TargetB.GetTarget() == TARGET_GAMEOBJECT_SRC_AREA ||
+ spellProto->Effects[i].TargetA.GetTarget() == TARGET_GAMEOBJECT_DEST_AREA ||
+ spellProto->Effects[i].TargetB.GetTarget() == TARGET_GAMEOBJECT_DEST_AREA ||
+ spellProto->Effects[i].TargetA.GetTarget() == TARGET_DEST_NEARBY_ENTRY ||
+ spellProto->Effects[i].TargetB.GetTarget() == TARGET_DEST_NEARBY_ENTRY ||
spellProto->Effects[i].TargetA.GetTarget() == TARGET_UNIT_CONE_ENTRY ||
spellProto->Effects[i].TargetB.GetTarget() == TARGET_UNIT_CONE_ENTRY)
{
@@ -887,21 +887,21 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
else if (cond->mConditionValue3 & (1 << i))
{
cond->mConditionValue3 &= ~(1 << i);
- sLog->outErrorDb("SourceEntry %u in `condition` table does not have any implicit target TARGET_UNIT_NEARBY_ENTRY(38) or TARGET_DST_NEARBY_ENTRY (46)"
- ", TARGET_UNIT_AREA_ENTRY_SRC(7), TARGET_UNIT_AREA_ENTRY_DST(8), TARGET_UNIT_CONE_ENTRY(60), TARGET_GAMEOBJECT_NEARBY_ENTRY(40)"
- "TARGET_GAMEOBJECT_AREA_SRC(51), TARGET_GAMEOBJECT_AREA_DST(52) in effect %u", cond->mSourceEntry, uint32(i));
+ sLog->outErrorDb("SourceEntry %u in `condition` table does not have any implicit target TARGET_UNIT_NEARBY_ENTRY(38) or TARGET_DEST_NEARBY_ENTRY (46)"
+ ", TARGET_UNIT_SRC_AREA_ENTRY(7), TARGET_UNIT_DEST_AREA_ENTRY(8), TARGET_UNIT_CONE_ENTRY(60), TARGET_GAMEOBJECT_NEARBY_ENTRY(40)"
+ "TARGET_GAMEOBJECT_SRC_AREA(51), TARGET_GAMEOBJECT_DEST_AREA(52) in effect %u", cond->mSourceEntry, uint32(i));
}
}
if (!targetfound && !cond->mConditionValue3) // cond->mConditionValue3 already errored up there
{
- sLog->outErrorDb("SourceEntry %u in `condition` table does not have any implicit target TARGET_UNIT_NEARBY_ENTRY(38) or TARGET_DST_NEARBY_ENTRY (46)"
- ", TARGET_UNIT_AREA_ENTRY_SRC(7), TARGET_UNIT_AREA_ENTRY_DST(8), TARGET_UNIT_CONE_ENTRY(60), TARGET_GAMEOBJECT_NEARBY_ENTRY(40)"
- "TARGET_GAMEOBJECT_AREA_SRC(51), TARGET_GAMEOBJECT_AREA_DST(52)", cond->mSourceEntry);
+ sLog->outErrorDb("SourceEntry %u in `condition` table does not have any implicit target TARGET_UNIT_NEARBY_ENTRY(38) or TARGET_DEST_NEARBY_ENTRY (46)"
+ ", TARGET_UNIT_SRC_AREA_ENTRY(7), TARGET_UNIT_DEST_AREA_ENTRY(8), TARGET_UNIT_CONE_ENTRY(60), TARGET_GAMEOBJECT_NEARBY_ENTRY(40)"
+ "TARGET_GAMEOBJECT_SRC_AREA(51), TARGET_GAMEOBJECT_DEST_AREA(52)", cond->mSourceEntry);
return false;
}
if ((cond->mConditionValue1 == SPELL_TARGET_TYPE_DEAD) && !spellProto->IsAllowingDeadTarget())
{
- sLog->outErrorDb("SourceEntry %u in `condition` table does have SPELL_TARGET_TYPE_DEAD specified but spell does not have SPELL_ATTR2_ALLOW_DEAD_TARGET", cond->mSourceEntry);
+ sLog->outErrorDb("SourceEntry %u in `condition` table does have SPELL_TARGET_TYPE_DEAD specified but spell does not have SPELL_ATTR2_CAN_TARGET_DEAD", cond->mSourceEntry);
return false;
}
break;
diff --git a/src/server/game/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp
index f8c6f6e8c1f..e9e7a9f4d2b 100755
--- a/src/server/game/Conditions/DisableMgr.cpp
+++ b/src/server/game/Conditions/DisableMgr.cpp
@@ -16,11 +16,11 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "DisableMgr.h"
#include "ObjectMgr.h"
#include "OutdoorPvP.h"
#include "SpellMgr.h"
#include "VMapManager2.h"
+#include "DisableMgr.h"
DisableMgr::DisableMgr()
{
diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp
index b34ac0bc681..88477be6115 100755
--- a/src/server/game/DataStores/DBCStores.cpp
+++ b/src/server/game/DataStores/DBCStores.cpp
@@ -239,7 +239,7 @@ inline void LoadDBC(uint32& availableDbcLocales, StoreProblemList& errors, DBCSt
if (FILE* f = fopen(dbcFilename.c_str(), "rb"))
{
char buf[100];
- snprintf(buf, 100, " (exists, but has %d fields instead of " SIZEFMTD ") Possible wrong client version.", storage.GetFieldCount(), strlen(storage.GetFormat()));
+ snprintf(buf, 100, " (exists, but has %u fields instead of " SIZEFMTD ") Possible wrong client version.", storage.GetFieldCount(), strlen(storage.GetFormat()));
errors.push_back(dbcFilename + buf);
fclose(f);
}
@@ -363,7 +363,7 @@ void LoadDBCStores(const std::string& dataPath)
// fill data
for (uint32 i = 1; i < sMapDifficultyStore.GetNumRows(); ++i)
if (MapDifficultyEntry const* entry = sMapDifficultyStore.LookupEntry(i))
- sMapDifficultyMap[MAKE_PAIR32(entry->MapId, entry->Difficulty)] = MapDifficulty(entry->resetTime, entry->maxPlayers, strlen(entry->areaTriggerText)>0);
+ sMapDifficultyMap[MAKE_PAIR32(entry->MapId, entry->Difficulty)] = MapDifficulty(entry->resetTime, entry->maxPlayers, entry->areaTriggerText[0] != '\0');
sMapDifficultyStore.Clear();
LoadDBC(availableDbcLocales, bad_dbc_files, sMovieStore, dbcPath, "Movie.dbc");
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 0896a6d603a..b099fb5faa7 100755
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -996,12 +996,12 @@ void Creature::SetLootRecipient(Unit *unit)
}
// return true if this creature is tapped by the player or by a member of his group.
-bool Creature::isTappedBy(Player* player) const
+bool Creature::isTappedBy(Player const* player) const
{
if (player->GetGUID() == m_lootRecipient)
return true;
- Group* playerGroup = player->GetGroup();
+ Group const* playerGroup = player->GetGroup();
if (!playerGroup || playerGroup != GetLootRecipientGroup()) // if we dont have a group we arent the recipient
return false; // if creature doesnt have group bound it means it was solo killed by someone else
@@ -1947,7 +1947,7 @@ bool Creature::_IsTargetAcceptable(const Unit* target) const
// if the target cannot be attacked, the target is not acceptable
if (IsFriendlyTo(target)
- || !target->isAttackableByAOE()
+ || !target->isTargetableForAttack(false)
|| (m_vehicle && (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))))
return false;
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index b1d805a3a6e..bf61e98bb41 100755
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -555,10 +555,10 @@ class Creature : public Unit, public GridObject<Creature>
Loot loot;
bool lootForPickPocketed;
bool lootForBody;
- Player *GetLootRecipient() const;
- Group *GetLootRecipientGroup() const;
+ Player* GetLootRecipient() const;
+ Group* GetLootRecipientGroup() const;
bool hasLootRecipient() const { return m_lootRecipient || m_lootRecipientGroup; }
- bool isTappedBy(Player* player) const; // return true if the creature is tapped by the player or a member of his party.
+ bool isTappedBy(Player const* player) const; // return true if the creature is tapped by the player or a member of his party.
void SetLootRecipient (Unit* unit);
void AllLootRemovedFromCorpse();
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 5d4eeb48111..5308c30a196 100755
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -147,7 +147,7 @@ void GameObject::RemoveFromWorld()
if (Unit* owner = GetOwner())
owner->RemoveGameObject(this, false);
else
- sLog->outError("Delete GameObject (GUID: %u Entry: %u) that have references in not found creature %u GO list. Crash possible later.", GetGUIDLow(), GetGOInfo()->entry, GUID_LOPART(owner_guid));
+ sLog->outError("Delete GameObject (GUID: %u Entry: %u, Name: %s) that have references in not found creature %u GO list. Crash possible later.", GetGUIDLow(), GetGOInfo()->entry, GetGOInfo()->name.c_str(), GUID_LOPART(owner_guid));
}
WorldObject::RemoveFromWorld();
sObjectAccessor->RemoveObject(this);
@@ -1575,8 +1575,9 @@ void GameObject::Use(Unit* user)
return;
}
default:
- sLog->outError("GameObject::Use(): unit (type: %u, guid: %u, name: %s) tries to use object (guid: %u, entry: %u, name: %s) of unknown type (%u)",
- user->GetTypeId(), user->GetGUIDLow(), user->GetName(), GetGUIDLow(), GetEntry(), GetGOInfo()->name.c_str(), GetGoType());
+ if (GetGoType() >= MAX_GAMEOBJECT_TYPE)
+ sLog->outError("GameObject::Use(): unit (type: %u, guid: %u, name: %s) tries to use object (guid: %u, entry: %u, name: %s) of unknown type (%u)",
+ user->GetTypeId(), user->GetGUIDLow(), user->GetName(), GetGUIDLow(), GetEntry(), GetGOInfo()->name.c_str(), GetGoType());
break;
}
diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h
index 504fc37135f..a0e6fff173f 100755
--- a/src/server/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
@@ -816,6 +816,13 @@ class GameObject : public WorldObject, public GridObject<GameObject>
uint16 m_LootMode; // bitmask, default LOOT_MODE_DEFAULT, determines what loot will be lootable
private:
void SwitchDoorOrButton(bool activate, bool alternative = false);
+
+ //! Object distance/size - overridden from Object::_IsWithinDist. Needs to take in account proper GO size.
+ bool _IsWithinDist(WorldObject const* obj, float dist2compare, bool /*is3D*/) const
+ {
+ //! Following check does check 3d distance
+ return IsInRange(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), dist2compare);
+ }
GameObjectAI* m_AI;
};
#endif
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 0ec3312834d..a0433f8f475 100755
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -699,7 +699,7 @@ class WorldObject : public Object, public WorldLocation
{ return IsInDist2d(x, y, dist + GetObjectSize()); }
bool IsWithinDist2d(const Position *pos, float dist) const
{ return IsInDist2d(pos, dist + GetObjectSize()); }
- bool _IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D) const;
+ virtual bool _IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D) const;
// use only if you will sure about placing both object at same map
bool IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D = true) const
{
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index cff76936aa8..9ac1c5aca0f 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -831,7 +831,7 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputa
m_lastFallTime = 0;
m_lastFallZ = 0;
-
+
m_grantableLevels = 0;
m_ControlledByPlayer = true;
@@ -918,7 +918,7 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo)
PlayerInfo const* info = sObjectMgr->GetPlayerInfo(createInfo->Race, createInfo->Class);
if (!info)
{
- sLog->outError("Player have incorrect race/class pair. Can't be loaded.");
+ sLog->outError("Player (Name %s) have incorrect race/class pair (Race %u, Class %u). Can't be loaded.", m_name.c_str(), createInfo->Race, createInfo->Class);
return false;
}
@@ -1751,7 +1751,7 @@ void Player::Update(uint32 p_time)
}
// not auto-free ghost from body in instances
- if (m_deathTimer > 0 && !GetBaseMap()->Instanceable())
+ if (m_deathTimer > 0 && !GetBaseMap()->Instanceable() && !HasAuraType(SPELL_AURA_PREVENT_RESSURECTION))
{
if (p_time >= m_deathTimer)
{
@@ -5165,7 +5165,8 @@ bool Player::FallGround(uint8 FallMode)
void Player::KillPlayer()
{
- if (IsFlying() && !GetTransport()) FallGround();
+ if (IsFlying() && !GetTransport())
+ FallGround();
SetMovement(MOVE_ROOT);
@@ -5175,10 +5176,10 @@ void Player::KillPlayer()
//SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_IN_PVP);
SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_NONE);
- ApplyModFlag(PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTE_RELEASE_TIMER, !sMapStore.LookupEntry(GetMapId())->Instanceable());
+ ApplyModFlag(PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTE_RELEASE_TIMER, !sMapStore.LookupEntry(GetMapId())->Instanceable() && !HasAuraType(SPELL_AURA_PREVENT_RESSURECTION));
// 6 minutes until repop at graveyard
- m_deathTimer = 6*MINUTE*IN_MILLISECONDS;
+ m_deathTimer = 6 * MINUTE * IN_MILLISECONDS;
UpdateCorpseReclaimDelay(); // dependent at use SetDeathPvP() call before kill
SendCorpseReclaimDelay();
@@ -5677,8 +5678,6 @@ void Player::HandleBaseModValue(BaseModGroup modGroup, BaseModType modType, floa
m_auraBaseMod[modGroup][modType] += apply ? amount : -amount;
break;
case PCT_MOD:
- if (amount <= -100.0f)
- amount = -200.0f;
ApplyPercentModFloatVar(m_auraBaseMod[modGroup][modType], amount, apply);
break;
}
@@ -8033,13 +8032,9 @@ void Player::_ApplyWeaponDependentAuraMods(Item *item, WeaponAttackType attackTy
for (AuraEffectList::const_iterator itr = auraDamageFlatList.begin(); itr != auraDamageFlatList.end(); ++itr)
_ApplyWeaponDependentAuraDamageMod(item, attackType, *itr, apply);
- float mod = 100.0f;
AuraEffectList const& auraDamagePctList = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
for (AuraEffectList::const_iterator itr = auraDamagePctList.begin(); itr != auraDamagePctList.end(); ++itr)
- if ((apply && item->IsFitToSpellRequirements((*itr)->GetSpellInfo())) || HasItemFitToSpellRequirements((*itr)->GetSpellInfo(), item))
- mod += (*itr)->GetAmount();
-
- SetFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, mod/100.0f);
+ _ApplyWeaponDependentAuraDamageMod(item, attackType, *itr, apply);
}
void Player::_ApplyWeaponDependentAuraCritMod(Item *item, WeaponAttackType attackType, AuraEffect const* aura, bool apply)
@@ -8088,13 +8083,17 @@ void Player::_ApplyWeaponDependentAuraDamageMod(Item *item, WeaponAttackType att
switch (aura->GetAuraType())
{
case SPELL_AURA_MOD_DAMAGE_DONE: unitModType = TOTAL_VALUE; break;
+ case SPELL_AURA_MOD_DAMAGE_PERCENT_DONE: unitModType = TOTAL_PCT; break;
default: return;
}
if (item->IsFitToSpellRequirements(aura->GetSpellInfo()))
{
HandleStatModifier(unitMod, unitModType, float(aura->GetAmount()), apply);
- ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS, aura->GetAmount(), apply);
+ if (unitModType == TOTAL_VALUE)
+ ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS, aura->GetAmount(), apply);
+ else
+ ApplyPercentModFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, float (aura->GetAmount()), apply);
}
}
@@ -11793,34 +11792,42 @@ InventoryResult Player::CanUseItem(Item *pItem, bool not_loading) const
return EQUIP_ERR_ITEM_NOT_FOUND;
}
-InventoryResult Player::CanUseItem(ItemTemplate const *pProto) const
+InventoryResult Player::CanUseItem(ItemTemplate const* proto) const
{
// Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player
- if (pProto)
+ if (proto)
{
- if ((pProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && GetTeam() != HORDE)
+ if ((proto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && GetTeam() != HORDE)
return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM;
- if ((pProto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && GetTeam() != ALLIANCE)
+ if ((proto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && GetTeam() != ALLIANCE)
return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM;
- if ((pProto->AllowableClass & getClassMask()) == 0 || (pProto->AllowableRace & getRaceMask()) == 0)
+ if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0)
return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM;
- if (pProto->RequiredSkill != 0)
+ if (proto->RequiredSkill != 0)
{
- if (GetSkillValue(pProto->RequiredSkill) == 0)
+ if (GetSkillValue(proto->RequiredSkill) == 0)
return EQUIP_ERR_NO_REQUIRED_PROFICIENCY;
- else if (GetSkillValue(pProto->RequiredSkill) < pProto->RequiredSkillRank)
+ else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank)
return EQUIP_ERR_CANT_EQUIP_SKILL;
}
- if (pProto->RequiredSpell != 0 && !HasSpell(pProto->RequiredSpell))
+
+ if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell))
return EQUIP_ERR_NO_REQUIRED_PROFICIENCY;
- if (getLevel() < pProto->RequiredLevel)
+
+ if (getLevel() < proto->RequiredLevel)
return EQUIP_ERR_CANT_EQUIP_LEVEL_I;
+
+ // If World Event is not active, prevent using event dependant items
+ if (proto->HolidayId && !IsHolidayActive((HolidayIds)proto->HolidayId))
+ return EQUIP_ERR_CANT_DO_RIGHT_NOW;
+
return EQUIP_ERR_OK;
}
+
return EQUIP_ERR_ITEM_NOT_FOUND;
}
@@ -14205,7 +14212,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men
break;
case GOSSIP_OPTION_SPIRITHEALER:
if (isDead())
- source->ToCreature()->CastSpell((source->ToCreature()), 17251, true, NULL, NULL, GetGUID());
+ source->ToCreature()->CastSpell(source->ToCreature(), 17251, true, NULL, NULL, GetGUID());
break;
case GOSSIP_OPTION_QUESTGIVER:
PrepareQuestMenu(guid);
@@ -14242,7 +14249,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men
ResetPetTalents();
break;
case GOSSIP_OPTION_TAXIVENDOR:
- GetSession()->SendTaxiMenu((source->ToCreature()));
+ GetSession()->SendTaxiMenu(source->ToCreature());
break;
case GOSSIP_OPTION_INNKEEPER:
PlayerTalkClass->SendCloseGossip();
@@ -14260,7 +14267,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men
GetSession()->SendTabardVendorActivate(guid);
break;
case GOSSIP_OPTION_AUCTIONEER:
- GetSession()->SendAuctionHello(guid, (source->ToCreature()));
+ GetSession()->SendAuctionHello(guid, source->ToCreature());
break;
case GOSSIP_OPTION_SPIRITGUIDE:
PrepareGossipMenu(source);
@@ -17408,6 +17415,20 @@ Item* Player::_LoadItem(SQLTransaction& trans, uint32 zoneId, uint32 timeDiff, F
item->RemoveFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_BOP_TRADEABLE);
}
}
+ else if (proto->HolidayId)
+ {
+ remove = true;
+ GameEventMgr::GameEventDataMap const& events = sGameEventMgr->GetEventMap();
+ GameEventMgr::ActiveEvents const& activeEventsList = sGameEventMgr->GetActiveEventList();
+ for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr)
+ {
+ if (events[*itr].holiday_id == proto->HolidayId)
+ {
+ remove = false;
+ break;
+ }
+ }
+ }
}
else
{
@@ -18120,7 +18141,7 @@ bool Player::_LoadHomeBind(PreparedQueryResult result)
PlayerInfo const *info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
if (!info)
{
- sLog->outError("Player have incorrect race/class pair. Can't be loaded.");
+ sLog->outError("Player (Name %s) have incorrect race/class pair (Race: %u, Class %u). Can't be loaded.", GetName(), getRace(), getClass());
return false;
}
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 6ab9588e56f..c8b1abc1deb 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -978,7 +978,7 @@ void Unit::CastCustomSpell(uint32 spellId, CustomSpellValues const& value, Unit*
}
// used for scripting
-void Unit::CastSpell(float x, float y, float z, uint32 spellId, bool triggered, Item* castItem, AuraEffect const* triggeredByAura, uint64 originalCaster, Unit* OriginalVictim)
+void Unit::CastSpell(float x, float y, float z, uint32 spellId, bool triggered, Item* castItem, AuraEffect const* triggeredByAura, uint64 originalCaster)
{
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
@@ -998,8 +998,6 @@ void Unit::CastSpell(float x, float y, float z, uint32 spellId, bool triggered,
SpellCastTargets targets;
targets.SetDst(x, y, z, GetOrientation());
- if (OriginalVictim)
- targets.SetUnitTarget(OriginalVictim);
spell->m_CastItem = castItem;
spell->prepare(&targets, triggeredByAura);
}
@@ -7209,6 +7207,8 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
if (!triggeredSpell)
return false;
basepoints0 = CalculatePctN(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / triggeredSpell->Effects[0].Amplitude);
+ // Add remaining ticks to healing done
+ basepoints0 += GetRemainingPeriodicAmount(GetGUID(), triggered_spell_id, SPELL_AURA_PERIODIC_HEAL);
}
break;
}
@@ -10395,17 +10395,12 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellInfo const* spellProto, uint32
AuraEffectList const& mModDamagePercentDone = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
- if ((*i)->GetMiscValue() & spellProto->GetSchoolMask())
+ if ((*i)->GetMiscValue() & spellProto->GetSchoolMask() && !(spellProto->GetSchoolMask() & SPELL_SCHOOL_MASK_NORMAL))
{
if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
AddPctN(DoneTotalMod, (*i)->GetAmount());
- else if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK))
- {
- if ((*i)->GetSpellInfo()->EquippedItemClass & spellProto->EquippedItemClass)
- if (((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0) ||
- ((*i)->GetSpellInfo()->EquippedItemSubClassMask & spellProto->EquippedItemSubClassMask))
- AddPctN(DoneTotalMod, (*i)->GetAmount());
- }
+ else if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
+ AddPctN(DoneTotalMod, (*i)->GetAmount());
else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
AddPctN(DoneTotalMod, (*i)->GetAmount());
}
@@ -10860,16 +10855,16 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellInfo const* spellProto, uint32
coeff = DotFactor;
}
- float coeff2 = CalculateLevelPenalty(spellProto) * stack;
- if (spellProto->SpellFamilyName) // TODO: fix this
- TakenTotal+= int32(TakenAdvertisedBenefit * coeff * coeff2);
+ float factorMod = CalculateLevelPenalty(spellProto) * stack;
+ // level penalty still applied on Taken bonus - is it blizzlike?
+ TakenTotal+= int32(TakenAdvertisedBenefit * factorMod);
if (Player* modOwner = GetSpellModOwner())
{
coeff *= 100.0f;
modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
coeff /= 100.0f;
}
- DoneTotal += int32(DoneAdvertisedBenefit * coeff * coeff2);
+ DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
}
// Some spells don't benefit from done mods
@@ -11419,7 +11414,8 @@ uint32 Unit::SpellHealingBonus(Unit* victim, SpellInfo const* spellProto, uint32
}
factorMod *= CalculateLevelPenalty(spellProto) * stack;
- TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod);
+ // level penalty still applied on Taken bonus - is it blizzlike?
+ TakenTotal += int32(TakenAdvertisedBenefit * factorMod);
if (Player* modOwner = GetSpellModOwner())
{
coeff *= 100.0f;
@@ -11761,45 +11757,20 @@ void Unit::MeleeDamageBonus(Unit* victim, uint32 *pdamage, WeaponAttackType attT
// ..done
AuraEffectList const& mModDamagePercentDone = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
+ {
if (spellProto)
{
- if ((*i)->GetMiscValue() & spellProto->GetSchoolMask())
+ if ((*i)->GetMiscValue() & spellProto->GetSchoolMask() && !(spellProto->GetSchoolMask() & SPELL_SCHOOL_MASK_NORMAL))
{
if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
AddPctN(DoneTotalMod, (*i)->GetAmount());
- else if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK))
- {
- if ((*i)->GetSpellInfo()->EquippedItemClass & spellProto->EquippedItemClass)
- if (((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0) ||
- ((*i)->GetSpellInfo()->EquippedItemSubClassMask & spellProto->EquippedItemSubClassMask))
- AddPctN(DoneTotalMod, (*i)->GetAmount());
- }
- else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
+ else if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
AddPctN(DoneTotalMod, (*i)->GetAmount());
- }
- }
- else if (player)
- {
- if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK))
- {
- EquipmentSlots slot;
-
- switch (attType)
- {
- case BASE_ATTACK: slot = EQUIPMENT_SLOT_MAINHAND; break;
- case OFF_ATTACK: slot = EQUIPMENT_SLOT_OFFHAND; break;
- case RANGED_ATTACK: slot = EQUIPMENT_SLOT_RANGED; break;
- default: return;
- }
-
- Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
-
- if (item && !item->IsBroken() && item->IsFitToSpellRequirements((*i)->GetSpellInfo()))
+ else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
AddPctN(DoneTotalMod, (*i)->GetAmount());
}
- else if (player->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
- AddPctN(DoneTotalMod, (*i)->GetAmount());
}
+ }
AuraEffectList const& mDamageDoneVersus = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_DONE_VERSUS);
for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
@@ -12285,10 +12256,19 @@ void Unit::ClearInCombat()
RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PET_IN_COMBAT);
}
-// TODO: remove this function
-bool Unit::isTargetableForAttack() const
+bool Unit::isTargetableForAttack(bool checkFakeDeath) const
{
- return isAttackableByAOE() && !HasUnitState(UNIT_STAT_DIED);
+ if (!isAlive())
+ return false;
+
+ if (HasFlag(UNIT_FIELD_FLAGS,
+ UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE))
+ return false;
+
+ if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->isGameMaster())
+ return false;
+
+ return !HasUnitState(UNIT_STAT_UNATTACKABLE) && (!checkFakeDeath || !HasUnitState(UNIT_STAT_DIED));
}
bool Unit::canAttack(Unit const* target, bool force) const
@@ -12315,7 +12295,7 @@ bool Unit::canAttack(Unit const* target, bool force) const
else if (!IsHostileTo(target))
return false;
- if (!target->isAttackableByAOE())
+ if (!target->isTargetableForAttack(false))
return false;
if (target->HasUnitState(UNIT_STAT_DIED))
@@ -12338,27 +12318,6 @@ bool Unit::canAttack(Unit const* target, bool force) const
return true;
}
-bool Unit::isAttackableByAOE(SpellInfo const* spellProto) const
-{
- bool targetMustBeDead = spellProto ? bool(spellProto->AttributesEx3 & SPELL_ATTR3_REQUIRE_DEAD_TARGET) : false;
- bool targetCanBeDead = spellProto ? bool(spellProto->AttributesEx2 & SPELL_ATTR2_ALLOW_DEAD_TARGET) : false;
-
- if (targetMustBeDead && isAlive())
- return false;
-
- if (!targetMustBeDead && !targetCanBeDead && !isAlive())
- return false;
-
- if (HasFlag(UNIT_FIELD_FLAGS,
- UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE))
- return false;
-
- if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->isGameMaster())
- return false;
-
- return !HasUnitState(UNIT_STAT_UNATTACKABLE);
-}
-
int32 Unit::ModifyHealth(int32 dVal)
{
int32 gain = 0;
@@ -13392,7 +13351,7 @@ bool Unit::HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, f
break;
case BASE_PCT:
case TOTAL_PCT:
- m_auraModifiersGroup[unitMod][modifierType] += (apply ? amount : -amount) / 100.0f;
+ ApplyPercentModFloatVar(m_auraModifiersGroup[unitMod][modifierType], amount, apply);
break;
default:
break;
@@ -16224,6 +16183,26 @@ bool Unit::IsInRaidWith(Unit const* unit) const
return false;
}
+bool Unit::IsTargetMatchingCheck(Unit const* target, SpellTargetSelectionCheckTypes check) const
+{
+ switch (check)
+ {
+ case TARGET_SELECT_CHECK_ENEMY:
+ if (IsControlledByPlayer())
+ return !IsFriendlyTo(target);
+ else
+ return IsHostileTo(target);
+ case TARGET_SELECT_CHECK_ALLY:
+ return IsFriendlyTo(target);
+ case TARGET_SELECT_CHECK_PARTY:
+ return IsInPartyWith(target);
+ case TARGET_SELECT_CHECK_RAID:
+ return IsInRaidWith(target);
+ default:
+ return true;
+ }
+}
+
void Unit::GetRaidMember(std::list<Unit*> &nearMembers, float radius)
{
Player* owner = GetCharmerOrOwnerPlayerOrPlayerItself();
@@ -16341,7 +16320,7 @@ Aura* Unit::AddAura(uint32 spellId, Unit* target)
if (!spellInfo)
return NULL;
- if (!target->isAlive() && !(spellInfo->Attributes & SPELL_ATTR0_PASSIVE) && !(spellInfo->AttributesEx2 & SPELL_ATTR2_ALLOW_DEAD_TARGET))
+ if (!target->isAlive() && !(spellInfo->Attributes & SPELL_ATTR0_PASSIVE) && !(spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_DEAD))
return NULL;
return AddAura(spellInfo, MAX_EFFECT_MASK, target);
@@ -17409,7 +17388,7 @@ uint32 Unit::GetRemainingPeriodicAmount(uint64 caster, uint32 spellId, AuraType
AuraEffectList const& periodicAuras = GetAuraEffectsByType(auraType);
for (AuraEffectList::const_iterator i = periodicAuras.begin(); i != periodicAuras.end(); ++i)
{
- if ((*i)->GetCasterGUID() != caster || (*i)->GetId() != spellId || (*i)->GetEffIndex() != effectIndex)
+ if ((*i)->GetCasterGUID() != caster || (*i)->GetId() != spellId || (*i)->GetEffIndex() != effectIndex || (*i)->GetTotalTicks() == 0)
continue;
amount += uint32(((*i)->GetAmount() * std::max<int32>((*i)->GetTotalTicks() - int32((*i)->GetTickNumber()), 0)) / (*i)->GetTotalTicks());
break;
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 6371124aad9..caf1f4e46ad 100755
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -32,6 +32,7 @@
#include "EventProcessor.h"
#include "MotionMaster.h"
#include "DBCStructure.h"
+#include "SpellInfo.h"
#include "Path.h"
#include "WorldPacket.h"
#include "Timer.h"
@@ -395,10 +396,7 @@ enum TriggerCastFlags
TRIGGERED_IGNORE_SET_FACING = 0x00000200, //! Will not adjust facing to target (if any)
TRIGGERED_IGNORE_SHAPESHIFT = 0x00000400, //! Will ignore shapeshift checks
TRIGGERED_IGNORE_CASTER_AURASTATE = 0x00000800, //! Will ignore caster aura states including combat requirements and death state
- TRIGGERED_IGNORE_TARGET_AURASTATE = 0x00001000, //! Will ignore target aura states
TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE = 0x00002000, //! Will ignore mounted/on vehicle restrictions
- TRIGGERED_IGNORE_TARGET_DETECTABILITY = 0x00004000, //! Will ignore canSeeOrDetect
- TRIGGERED_IGNORE_LOS = 0x00008000, //! Will ignore LOS to target
TRIGGERED_IGNORE_CASTER_AURAS = 0x00010000, //! Will ignore caster aura restrictions or requirements
TRIGGERED_DISALLOW_PROC_EVENTS = 0x00020000, //! Disallows proc events from triggered spell (default)
TRIGGERED_DONT_REPORT_CAST_ERROR = 0x00040000, //! Will return SPELL_FAILED_DONT_REPORT in CheckCast functions
@@ -471,7 +469,7 @@ enum DeathState
enum UnitState
{
- UNIT_STAT_DIED = 0x00000001,
+ UNIT_STAT_DIED = 0x00000001, // player has fake death aura
UNIT_STAT_MELEE_ATTACKING = 0x00000002, // player is melee attacking someone
//UNIT_STAT_MELEE_ATTACK_BY = 0x00000004, // player is melee attack by someone
UNIT_STAT_STUNNED = 0x00000008,
@@ -1394,6 +1392,7 @@ class Unit : public WorldObject
bool IsNeutralToAll() const;
bool IsInPartyWith(Unit const* unit) const;
bool IsInRaidWith(Unit const* unit) const;
+ bool IsTargetMatchingCheck(Unit const* target, SpellTargetSelectionCheckTypes check) const;
void GetPartyMemberInDist(std::list<Unit*> &units, float dist);
void GetPartyMembers(std::list<Unit*> &units);
void GetRaidMember(std::list<Unit*> &units, float dist);
@@ -1547,8 +1546,7 @@ class Unit : public WorldObject
bool isFrozen() const;
- bool isTargetableForAttack() const;
- bool isAttackableByAOE(SpellInfo const* spellProto = NULL) const;
+ bool isTargetableForAttack(bool checkFakeDeath = true) const;
bool canAttack(Unit const* target, bool force = true) const;
virtual bool IsInWater() const;
virtual bool IsUnderWater() const;
@@ -1563,7 +1561,7 @@ class Unit : public WorldObject
void CastSpell(Unit* victim, uint32 spellId, TriggerCastFlags triggerFlags = TRIGGERED_NONE, Item* castItem = NULL, AuraEffect const* triggeredByAura = NULL, uint64 originalCaster = 0);
void CastSpell(Unit* victim, SpellInfo const *spellInfo, bool triggered, Item *castItem= NULL, AuraEffect const* triggeredByAura = NULL, uint64 originalCaster = 0);
void CastSpell(Unit* victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags, Item *castItem= NULL, AuraEffect const* triggeredByAura = NULL, uint64 originalCaster = 0);
- void CastSpell(float x, float y, float z, uint32 spellId, bool triggered, Item *castItem = NULL, AuraEffect const* triggeredByAura = NULL, uint64 originalCaster = 0, Unit* originalVictim = 0);
+ void CastSpell(float x, float y, float z, uint32 spellId, bool triggered, Item *castItem = NULL, AuraEffect const* triggeredByAura = NULL, uint64 originalCaster = 0);
void CastCustomSpell(Unit* Victim, uint32 spellId, int32 const* bp0, int32 const* bp1, int32 const* bp2, bool triggered, Item *castItem= NULL, AuraEffect const* triggeredByAura = NULL, uint64 originalCaster = 0);
void CastCustomSpell(uint32 spellId, SpellValueMod mod, int32 value, Unit* Victim = NULL, bool triggered = true, Item *castItem = NULL, AuraEffect const* triggeredByAura = NULL, uint64 originalCaster = 0);
void CastCustomSpell(uint32 spellId, CustomSpellValues const &value, Unit* Victim = NULL, bool triggered = true, Item *castItem = NULL, AuraEffect const* triggeredByAura = NULL, uint64 originalCaster = 0);
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 196bce7e9d8..3190bc7af2c 100755
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -653,17 +653,21 @@ class ObjectMgr
PlayerClassInfo const* GetPlayerClassInfo(uint32 class_) const
{
- if (class_ >= MAX_CLASSES) return NULL;
+ if (class_ >= MAX_CLASSES)
+ return NULL;
return &playerClassInfo[class_];
}
void GetPlayerClassLevelInfo(uint32 class_, uint8 level, PlayerClassLevelInfo* info) const;
PlayerInfo const* GetPlayerInfo(uint32 race, uint32 class_) const
{
- if (race >= MAX_RACES) return NULL;
- if (class_ >= MAX_CLASSES) return NULL;
+ if (race >= MAX_RACES)
+ return NULL;
+ if (class_ >= MAX_CLASSES)
+ return NULL;
PlayerInfo const* info = &playerInfo[race][class_];
- if (info->displayId_m == 0 || info->displayId_f == 0) return NULL;
+ if (info->displayId_m == 0 || info->displayId_f == 0)
+ return NULL;
return info;
}
void GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, PlayerLevelInfo* info) const;
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.cpp b/src/server/game/Grids/Notifiers/GridNotifiers.cpp
index 13a88a26b89..9914426215c 100755
--- a/src/server/game/Grids/Notifiers/GridNotifiers.cpp
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.cpp
@@ -26,6 +26,7 @@
#include "Transport.h"
#include "ObjectAccessor.h"
#include "CellImpl.h"
+#include "SpellInfo.h"
using namespace Trinity;
@@ -330,38 +331,41 @@ ObjectUpdater::Visit(GridRefManager<T> &m)
}
}
-bool CannibalizeObjectCheck::operator()(Corpse* u)
+bool AnyDeadUnitObjectInRangeCheck::operator()(Player* u)
{
- // ignore bones
- if (u->GetType() == CORPSE_BONES)
- return false;
-
- Player* owner = ObjectAccessor::FindPlayer(u->GetOwnerGUID());
-
- if (!owner || i_funit->IsFriendlyTo(owner))
- return false;
+ return !u->isAlive() && !u->HasAuraType(SPELL_AURA_GHOST) && i_searchObj->IsWithinDistInMap(u, i_range);
+}
- if (i_funit->IsWithinDistInMap(u, i_range))
- return true;
+bool AnyDeadUnitObjectInRangeCheck::operator()(Corpse* u)
+{
+ return u->GetType() != CORPSE_BONES && i_searchObj->IsWithinDistInMap(u, i_range);
+}
- return false;
+bool AnyDeadUnitObjectInRangeCheck::operator()(Creature* u)
+{
+ return !u->isAlive() && i_searchObj->IsWithinDistInMap(u, i_range);
}
-bool CarrionFeederObjectCheck::operator()(Corpse* u)
+bool AnyDeadUnitSpellTargetInRangeCheck::operator()(Player* u)
{
- // ignore bones
- if (u->GetType() == CORPSE_BONES)
- return false;
+ return AnyDeadUnitObjectInRangeCheck::operator()(u)
+ && i_spellInfo->CheckTarget(i_searchObj, u, true)
+ && i_searchObj->IsTargetMatchingCheck(u, i_check);
+}
+bool AnyDeadUnitSpellTargetInRangeCheck::operator()(Corpse* u)
+{
Player* owner = ObjectAccessor::FindPlayer(u->GetOwnerGUID());
+ return owner && AnyDeadUnitObjectInRangeCheck::operator()(u)
+ && i_spellInfo->CheckTarget(i_searchObj, owner, true)
+ && i_searchObj->IsTargetMatchingCheck(owner, i_check);
+}
- if (!owner || i_funit->IsFriendlyTo(owner))
- return false;
-
- if (i_funit->IsWithinDistInMap(u, i_range))
- return true;
-
- return false;
+bool AnyDeadUnitSpellTargetInRangeCheck::operator()(Creature* u)
+{
+ return AnyDeadUnitObjectInRangeCheck::operator()(u)
+ && i_spellInfo->CheckTarget(i_searchObj, u, true)
+ && i_searchObj->IsTargetMatchingCheck(u, i_check);
}
template void ObjectUpdater::Visit<GameObject>(GameObjectMapType &);
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h
index b4d20f25740..4d4f0bfe05e 100755
--- a/src/server/game/Grids/Notifiers/GridNotifiers.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h
@@ -554,56 +554,31 @@ namespace Trinity
float i_range;
};
- class CannibalizeObjectCheck
+ class AnyDeadUnitObjectInRangeCheck
{
public:
- CannibalizeObjectCheck(Unit* funit, float range) : i_funit(funit), i_range(range) {}
- bool operator()(Player* u)
- {
- if (i_funit->IsFriendlyTo(u) || u->isAlive() || u->isInFlight())
- return false;
-
- return i_funit->IsWithinDistInMap(u, i_range);
- }
+ AnyDeadUnitObjectInRangeCheck(Unit const* searchObj, float range) : i_searchObj(searchObj), i_range(range) {}
+ bool operator()(Player* u);
bool operator()(Corpse* u);
- bool operator()(Creature* u)
- {
- if (i_funit->IsFriendlyTo(u) || u->isAlive() || u->isInFlight() ||
- (u->GetCreatureTypeMask() & CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD) == 0)
- return false;
-
- return i_funit->IsWithinDistInMap(u, i_range);
- }
+ bool operator()(Creature* u);
template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
- private:
- Unit* const i_funit;
+ protected:
+ Unit const* const i_searchObj;
float i_range;
};
- class CarrionFeederObjectCheck
+ class AnyDeadUnitSpellTargetInRangeCheck : public AnyDeadUnitObjectInRangeCheck
{
public:
- CarrionFeederObjectCheck(Unit* funit, float range) : i_funit(funit), i_range(range) {}
- bool operator()(Player* u)
- {
- if (i_funit->IsFriendlyTo(u) || u->isAlive() || u->isInFlight())
- return false;
-
- return i_funit->IsWithinDistInMap(u, i_range);
- }
+ AnyDeadUnitSpellTargetInRangeCheck(Unit const* searchObj, float range, SpellInfo const* spellInfo, SpellTargetSelectionCheckTypes check)
+ : AnyDeadUnitObjectInRangeCheck(searchObj, range), i_spellInfo(spellInfo), i_check(check) {}
+ bool operator()(Player* u);
bool operator()(Corpse* u);
- bool operator()(Creature* u)
- {
- if (i_funit->IsFriendlyTo(u) || u->isAlive() || u->isInFlight() ||
- (u->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL) != 0)
- return false;
-
- return i_funit->IsWithinDistInMap(u, i_range);
- }
+ bool operator()(Creature* u);
template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
- private:
- Unit* const i_funit;
- float i_range;
+ protected:
+ SpellInfo const* i_spellInfo;
+ SpellTargetSelectionCheckTypes i_check;
};
// WorldObject do classes
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index c26ffdd3190..52f94f10b40 100755
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -1003,7 +1003,7 @@ void Group::EndRoll(Loot *pLoot)
itr = RollId.begin();
}
else
- itr++;
+ ++itr;
}
}
diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp
index 2fe38b0a953..101f0e4ce4d 100755
--- a/src/server/game/Instances/InstanceScript.cpp
+++ b/src/server/game/Instances/InstanceScript.cpp
@@ -355,12 +355,19 @@ void InstanceScript::DoStopTimedAchievement(AchievementCriteriaTimedTypes type,
// Remove Auras due to Spell on all players in instance
void InstanceScript::DoRemoveAurasDueToSpellOnPlayers(uint32 spell)
{
- Map::PlayerList const &PlayerList = instance->GetPlayers();
-
+ Map::PlayerList const& PlayerList = instance->GetPlayers();
if (!PlayerList.isEmpty())
- for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
- if (Player* pPlayer = i->getSource())
- pPlayer->RemoveAurasDueToSpell(spell);
+ {
+ for (Map::PlayerList::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr)
+ {
+ if (Player* player = itr->getSource())
+ {
+ player->RemoveAurasDueToSpell(spell);
+ if (Pet* pet = player->GetPet())
+ pet->RemoveAurasDueToSpell(spell);
+ }
+ }
+ }
}
// Cast spell on all players in instance
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 0cb9b318b54..001f22815b5 100755
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -2489,7 +2489,7 @@ void InstanceMap::PermBindAllPlayers(Player* player)
InstanceSave *save = sInstanceSaveMgr->GetInstanceSave(GetInstanceId());
if (!save)
{
- sLog->outError("Cannot bind players, no instance save available for map!");
+ sLog->outError("Cannot bind player (GUID: %u, Name: %s), because no instance save is available for instance map (Name: %s, Entry: %u, InstanceId: %u)!", player->GetGUIDLow(), player->GetName(), player->GetMap()->GetMapName(), player->GetMapId(), GetInstanceId());
return;
}
@@ -2541,8 +2541,8 @@ void InstanceMap::SetResetSchedule(bool on)
if (InstanceSave *save = sInstanceSaveMgr->GetInstanceSave(GetInstanceId()))
sInstanceSaveMgr->ScheduleReset(on, save->GetResetTime(), InstanceSaveManager::InstResetEvent(0, GetId(), Difficulty(GetSpawnMode()), GetInstanceId()));
else
- sLog->outError("InstanceMap::SetResetSchedule: cannot turn schedule %s, there is no save information for instance (map [id: %u, name: %s], instance id: %u)",
- on ? "on" : "off", GetId(), GetMapName(), GetInstanceId());
+ sLog->outError("InstanceMap::SetResetSchedule: cannot turn schedule %s, there is no save information for instance (map [id: %u, name: %s], instance id: %u, difficulty: %u)",
+ on ? "on" : "off", GetId(), GetMapName(), GetInstanceId(), Difficulty(GetSpawnMode()));
}
}
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index 6ff4bf05d42..f430002fca6 100755
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -416,6 +416,7 @@ class Map : public GridRefManager<NGridType>
template<class T> void SwitchGridContainers(T* obj, bool active);
template<class NOTIFIER> void VisitAll(const float &x, const float &y, float radius, NOTIFIER &notifier);
+ template<class NOTIFIER> void VisitFirstFound(const float &x, const float &y, float radius, NOTIFIER &notifier);
template<class NOTIFIER> void VisitWorld(const float &x, const float &y, float radius, NOTIFIER &notifier);
template<class NOTIFIER> void VisitGrid(const float &x, const float &y, float radius, NOTIFIER &notifier);
CreatureGroupHolderType CreatureGroupHolder;
@@ -650,6 +651,25 @@ Map::VisitAll(const float &x, const float &y, float radius, NOTIFIER &notifier)
cell.Visit(p, grid_object_notifier, *this, radius, x, y);
}
+// should be used with Searcher notifiers, tries to search world if nothing found in grid
+template<class NOTIFIER>
+inline void
+Map::VisitFirstFound(const float &x, const float &y, float radius, NOTIFIER &notifier)
+{
+ CellPair p(Trinity::ComputeCellPair(x, y));
+ Cell cell(p);
+ cell.data.Part.reserved = ALL_DISTRICT;
+ cell.SetNoCreate();
+
+ TypeContainerVisitor<NOTIFIER, WorldTypeMapContainer> world_object_notifier(notifier);
+ cell.Visit(p, world_object_notifier, *this, radius, x, y);
+ if (!notifier.i_object)
+ {
+ TypeContainerVisitor<NOTIFIER, GridTypeMapContainer > grid_object_notifier(notifier);
+ cell.Visit(p, grid_object_notifier, *this, radius, x, y);
+ }
+}
+
template<class NOTIFIER>
inline void
Map::VisitWorld(const float &x, const float &y, float radius, NOTIFIER &notifier)
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index 2846efe9189..e824a3cf5da 100755
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -804,7 +804,8 @@ enum TrinityStrings
LANG_BANLIST_CHARACTERS_HEADER = 1133,
LANG_ALLOW_TICKETS = 1134,
LANG_DISALLOW_TICKETS = 1135,
- // Room for more level 3 1136-1199 not used
+ LANG_CHAR_NOT_BANNED = 1136,
+ // Room for more level 3 1137-1199 not used
// Debug commands
LANG_CINEMATIC_NOT_EXIST = 1200,
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 7f77535b8c2..5e10a2c0fe4 100755
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -307,7 +307,7 @@ enum SpellAttr1
SPELL_ATTR1_NOT_BREAK_STEALTH = 0x00000020, // 5 Not break stealth
SPELL_ATTR1_CHANNELED_2 = 0x00000040, // 6
SPELL_ATTR1_CANT_BE_REFLECTED = 0x00000080, // 7
- SPELL_ATTR1_NOT_IN_COMBAT_TARGET = 0x00000100, // 8 Spell req target not to be in combat state
+ SPELL_ATTR1_CANT_TARGET_IN_COMBAT = 0x00000100, // 8 can target only out of combat units
SPELL_ATTR1_MELEE_COMBAT_START = 0x00000200, // 9 player starts melee combat after this spell is cast
SPELL_ATTR1_NO_THREAT = 0x00000400, // 10 no generates threat on cast 100% (old NO_INITIAL_AGGRO)
SPELL_ATTR1_UNK11 = 0x00000800, // 11 aura
@@ -318,7 +318,7 @@ enum SpellAttr1
SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE = 0x00010000, // 16 on immuniy
SPELL_ATTR1_UNAUTOCASTABLE_BY_PET = 0x00020000, // 17
SPELL_ATTR1_UNK18 = 0x00040000, // 18
- SPELL_ATTR1_CANT_TARGET_SELF = 0x00080000, // 19 Applies only to unit target - for example Divine Intervention (19752)
+ SPELL_ATTR1_CANT_TARGET_SELF = 0x00080000, // 19
SPELL_ATTR1_REQ_COMBO_POINTS1 = 0x00100000, // 20 Req combo points on target
SPELL_ATTR1_UNK21 = 0x00200000, // 21
SPELL_ATTR1_REQ_COMBO_POINTS2 = 0x00400000, // 22 Req combo points on target
@@ -335,9 +335,9 @@ enum SpellAttr1
enum SpellAttr2
{
- SPELL_ATTR2_ALLOW_DEAD_TARGET = 0x00000001, // 0
+ SPELL_ATTR2_CAN_TARGET_DEAD = 0x00000001, // 0 can target dead unit or corpse
SPELL_ATTR2_UNK1 = 0x00000002, // 1 ? many triggered spells have this flag
- SPELL_ATTR2_UNK2 = 0x00000004, // 2
+ SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS = 0x00000004, // 2 26368 4.0.1 dbc change
SPELL_ATTR2_UNK3 = 0x00000008, // 3
SPELL_ATTR2_DISPLAY_IN_STANCE_BAR = 0x00000010, // 4 client displays icon in stance bar when learned, even if not shapeshift
SPELL_ATTR2_AUTOREPEAT_FLAG = 0x00000020, // 5
@@ -379,11 +379,11 @@ enum SpellAttr3
SPELL_ATTR3_UNK5 = 0x00000020, // 5
SPELL_ATTR3_UNK6 = 0x00000040, // 6
SPELL_ATTR3_STACK_FOR_DIFF_CASTERS = 0x00000080, // 7 separate stack for every caster
- SPELL_ATTR3_PLAYERS_ONLY = 0x00000100, // 8 Player only?
+ SPELL_ATTR3_ONLY_TARGET_PLAYERS = 0x00000100, // 8 can only target players
SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2 = 0x00000200, // 9 triggered from effect?
SPELL_ATTR3_MAIN_HAND = 0x00000400, // 10 Main hand weapon required
SPELL_ATTR3_BATTLEGROUND = 0x00000800, // 11 Can casted only on battleground
- SPELL_ATTR3_REQUIRE_DEAD_TARGET = 0x00001000, // 12
+ SPELL_ATTR3_ONLY_TARGET_GHOSTS = 0x00001000, // 12
SPELL_ATTR3_UNK13 = 0x00002000, // 13
SPELL_ATTR3_UNK14 = 0x00004000, // 14 "Honorless Target" only this spells have this flag
SPELL_ATTR3_UNK15 = 0x00008000, // 15 Auto Shoot, Shoot, Throw, - this is autoshot flag
@@ -400,7 +400,7 @@ enum SpellAttr3
SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED = 0x04000000, // 26 auras with this attribute can proc from triggered spell casts with SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2 (67736 + 52999)
SPELL_ATTR3_DRAIN_SOUL = 0x08000000, // 27 only drain soul has this flag
SPELL_ATTR3_UNK28 = 0x10000000, // 28
- SPELL_ATTR3_NO_DONE_BONUS = 0x20000000, // 29 Ignore caster spellpower and done damage mods?
+ SPELL_ATTR3_NO_DONE_BONUS = 0x20000000, // 29 Ignore caster spellpower and done damage mods? client doesn't apply spellmods for those spells
SPELL_ATTR3_DONT_DISPLAY_RANGE = 0x40000000, // 30 client doesn't display range in tooltip for those spells
SPELL_ATTR3_UNK31 = 0x80000000 // 31
};
@@ -487,30 +487,30 @@ enum SpellAttr6
SPELL_ATTR6_UNK5 = 0x00000020, // 5
SPELL_ATTR6_UNK6 = 0x00000040, // 6
SPELL_ATTR6_UNK7 = 0x00000080, // 7
- SPELL_ATTR6_IGNORE_CROWD_CONTROL_TARGETS = 0x00000100, // 8
+ SPELL_ATTR6_CANT_TARGET_CROWD_CONTROLLED = 0x00000100, // 8
SPELL_ATTR6_UNK9 = 0x00000200, // 9
SPELL_ATTR6_CAN_TARGET_POSSESSED_FRIENDS = 0x00000400, // 10 NYI!
SPELL_ATTR6_NOT_IN_RAID_INSTANCE = 0x00000800, // 11 not usable in raid instance
SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE = 0x00001000, // 12 castable while caster is on vehicle
- SPELL_ATTR6_UNK13 = 0x00002000, // 13
+ SPELL_ATTR6_CAN_TARGET_INVISIBLE = 0x00002000, // 13 ignore visibility requirement for spell target (phases, invisibility, etc.)
SPELL_ATTR6_UNK14 = 0x00004000, // 14
SPELL_ATTR6_UNK15 = 0x00008000, // 15 not set in 3.0.3
SPELL_ATTR6_UNK16 = 0x00010000, // 16
SPELL_ATTR6_UNK17 = 0x00020000, // 17
- SPELL_ATTR6_ONLY_CAST_WHILE_POSSESSED = 0x00040000, // 18 (NYI) client won't allow to cast these spells when unit does not have possessor
+ SPELL_ATTR6_CAST_BY_CHARMER = 0x00040000, // 18 client won't allow to cast these spells when unit is not possessed && charmer of caster will be original caster
SPELL_ATTR6_UNK19 = 0x00080000, // 19
SPELL_ATTR6_UNK20 = 0x00100000, // 20
SPELL_ATTR6_CLIENT_UI_TARGET_EFFECTS = 0x00200000, // 21 it's only client-side attribute
SPELL_ATTR6_UNK22 = 0x00400000, // 22
SPELL_ATTR6_UNK23 = 0x00800000, // 23
- SPELL_ATTR6_CAN_TARGET_UNTARGETABLE = 0x01000000, // 24 NYI!
+ SPELL_ATTR6_CAN_TARGET_UNTARGETABLE = 0x01000000, // 24
SPELL_ATTR6_UNK25 = 0x02000000, // 25
SPELL_ATTR6_UNK26 = 0x04000000, // 26
SPELL_ATTR6_UNK27 = 0x08000000, // 27
SPELL_ATTR6_UNK28 = 0x10000000, // 28
SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS = 0x20000000, // 29 ignores done percent damage mods?
SPELL_ATTR6_UNK30 = 0x40000000, // 30
- SPELL_ATTR6_UNK31 = 0x80000000 // 31
+ SPELL_ATTR6_UNK31 = 0x80000000 // 31 some special cooldown calc?
};
enum SpellAttr7
@@ -1014,7 +1014,7 @@ enum SpellCastResult
SPELL_FAILED_TARGET_CANNOT_BE_RESURRECTED = 186,
SPELL_FAILED_UNKNOWN = 187, // actually doesn't exist in client
- SPELL_CAST_OK = 255 // custom value, don't must be send to client
+ SPELL_CAST_OK = 255 // custom value, must not be sent to client
};
enum SpellCustomErrors
@@ -1277,6 +1277,8 @@ enum SpellImmunity
#define MAX_SPELL_IMMUNITY 7
+// target enum name consist of:
+// TARGET_[OBJECT_TYPE]_[REFERENCE_TYPE(skipped for caster)]_[SELECTION_TYPE(skipped for default)]_[additional specifiers(friendly, BACK_LEFT, etc.]
enum Targets
{
TARGET_UNIT_CASTER = 1,
@@ -1285,67 +1287,66 @@ enum Targets
TARGET_UNIT_NEARBY_ALLY = 4,
TARGET_UNIT_PET = 5,
TARGET_UNIT_TARGET_ENEMY = 6,
- TARGET_UNIT_AREA_ENTRY_SRC = 7,
- TARGET_UNIT_AREA_ENTRY_DST = 8,
- TARGET_DST_HOME = 9,
- TARGET_UNIT_TARGET_DEST_CASTER = 11, // teleport target to caster
- TARGET_UNIT_AREA_ENEMY_SRC = 15,
- TARGET_UNIT_AREA_ENEMY_DST = 16,
- TARGET_DST_DB = 17,
- TARGET_DST_CASTER = 18,
- TARGET_UNIT_PARTY_CASTER = 20,
+ TARGET_UNIT_SRC_AREA_ENTRY = 7,
+ TARGET_UNIT_DEST_AREA_ENTRY = 8,
+ TARGET_DEST_HOME = 9,
+ TARGET_UNIT_SRC_AREA_UNK_11 = 11,
+ TARGET_UNIT_SRC_AREA_ENEMY = 15,
+ TARGET_UNIT_DEST_AREA_ENEMY = 16,
+ TARGET_DEST_DB = 17,
+ TARGET_DEST_CASTER = 18,
+ TARGET_UNIT_CASTER_AREA_PARTY = 20,
TARGET_UNIT_TARGET_ALLY = 21,
TARGET_SRC_CASTER = 22,
- TARGET_GAMEOBJECT = 23,
- TARGET_UNIT_CONE_ENEMY = 24,
+ TARGET_GAMEOBJECT_TARGET = 23,
+ TARGET_UNIT_CONE_ENEMY_24 = 24,
TARGET_UNIT_TARGET_ANY = 25,
- TARGET_GAMEOBJECT_ITEM = 26,
+ TARGET_GAMEOBJECT_ITEM_TARGET = 26,
TARGET_UNIT_MASTER = 27,
TARGET_DEST_DYNOBJ_ENEMY = 28,
TARGET_DEST_DYNOBJ_ALLY = 29,
- TARGET_UNIT_AREA_ALLY_SRC = 30,
- TARGET_UNIT_AREA_ALLY_DST = 31,
- TARGET_MINION = 32,
- //TARGET_DEST_SUMMON
- TARGET_UNIT_AREA_PARTY_SRC = 33,
- TARGET_UNIT_AREA_PARTY_DST = 34,
+ TARGET_UNIT_SRC_AREA_ALLY = 30,
+ TARGET_UNIT_DEST_AREA_ALLY = 31,
+ TARGET_DEST_CASTER_SUMMON = 32, // front left, doesn't use radius
+ TARGET_UNIT_SRC_AREA_PARTY = 33,
+ TARGET_UNIT_DEST_AREA_PARTY = 34,
TARGET_UNIT_TARGET_PARTY = 35,
- TARGET_DEST_CASTER_RANDOM_UNKNOWN = 36, //unknown
- TARGET_UNIT_TARGET_ALLY_PARTY = 37,
+ TARGET_DEST_CASTER_UNK_36 = 36,
+ TARGET_UNIT_LASTTARGET_AREA_PARTY = 37,
TARGET_UNIT_NEARBY_ENTRY = 38,
- TARGET_UNIT_CASTER_FISHING = 39,
+ TARGET_DEST_CASTER_FISHING = 39,
TARGET_GAMEOBJECT_NEARBY_ENTRY = 40,
- TARGET_DEST_CASTER_FRONT_LEFT = 41,
- TARGET_DEST_CASTER_BACK_LEFT = 42,
- TARGET_DEST_CASTER_BACK_RIGHT = 43,
- TARGET_DEST_CASTER_FRONT_RIGHT = 44,
- TARGET_UNIT_CHAINHEAL = 45,
- TARGET_DST_NEARBY_ENTRY = 46,
+ TARGET_DEST_CASTER_FRONT_RIGHT = 41,
+ TARGET_DEST_CASTER_BACK_RIGHT = 42,
+ TARGET_DEST_CASTER_BACK_LEFT = 43,
+ TARGET_DEST_CASTER_FRONT_LEFT = 44,
+ TARGET_UNIT_TARGET_CHAINHEAL_ALLY = 45,
+ TARGET_DEST_NEARBY_ENTRY = 46,
TARGET_DEST_CASTER_FRONT = 47,
TARGET_DEST_CASTER_BACK = 48,
TARGET_DEST_CASTER_RIGHT = 49,
TARGET_DEST_CASTER_LEFT = 50,
- TARGET_GAMEOBJECT_AREA_SRC = 51,
- TARGET_GAMEOBJECT_AREA_DST = 52,
- TARGET_DST_TARGET_ENEMY = 53, // set unit coordinates as dest, only 16 target B imlemented
- TARGET_UNIT_CONE_ENEMY_UNKNOWN = 54, // 180 degree, or different angle
+ TARGET_GAMEOBJECT_SRC_AREA = 51,
+ TARGET_GAMEOBJECT_DEST_AREA = 52,
+ TARGET_DEST_TARGET_ENEMY = 53,
+ TARGET_UNIT_CONE_ENEMY_54 = 54,
TARGET_DEST_CASTER_FRONT_LEAP = 55, // for a leap spell
- TARGET_UNIT_RAID_CASTER = 56,
+ TARGET_UNIT_CASTER_AREA_RAID = 56,
TARGET_UNIT_TARGET_RAID = 57,
TARGET_UNIT_NEARBY_RAID = 58,
TARGET_UNIT_CONE_ALLY = 59,
TARGET_UNIT_CONE_ENTRY = 60,
- TARGET_UNIT_TARGET_CLASS_RAID = 61,
- TARGET_TEST = 62, // for a test spell
+ TARGET_UNIT_TARGET_AREA_RAID_CLASS = 61,
+ TARGET_UNK_62 = 62,
TARGET_DEST_TARGET_ANY = 63,
TARGET_DEST_TARGET_FRONT = 64,
TARGET_DEST_TARGET_BACK = 65,
TARGET_DEST_TARGET_RIGHT = 66,
TARGET_DEST_TARGET_LEFT = 67,
- TARGET_DEST_TARGET_FRONT_LEFT = 68,
- TARGET_DEST_TARGET_BACK_LEFT = 69,
- TARGET_DEST_TARGET_BACK_RIGHT = 70,
- TARGET_DEST_TARGET_FRONT_RIGHT = 71,
+ TARGET_DEST_TARGET_FRONT_RIGHT = 68,
+ TARGET_DEST_TARGET_BACK_RIGHT = 69,
+ TARGET_DEST_TARGET_BACK_LEFT = 70,
+ TARGET_DEST_TARGET_FRONT_LEFT = 71,
TARGET_DEST_CASTER_RANDOM = 72,
TARGET_DEST_CASTER_RADIUS = 73,
TARGET_DEST_TARGET_RANDOM = 74,
@@ -1356,18 +1357,18 @@ enum Targets
TARGET_DEST_DEST_BACK = 79,
TARGET_DEST_DEST_RIGHT = 80,
TARGET_DEST_DEST_LEFT = 81,
- TARGET_DEST_DEST_FRONT_LEFT = 82,
- TARGET_DEST_DEST_BACK_LEFT = 83,
- TARGET_DEST_DEST_BACK_RIGHT = 84,
- TARGET_DEST_DEST_FRONT_RIGHT = 85,
+ TARGET_DEST_DEST_FRONT_RIGHT = 82,
+ TARGET_DEST_DEST_BACK_RIGHT = 83,
+ TARGET_DEST_DEST_BACK_LEFT = 84,
+ TARGET_DEST_DEST_FRONT_LEFT = 85,
TARGET_DEST_DEST_RANDOM = 86,
TARGET_DEST_DEST = 87,
TARGET_DEST_DYNOBJ_NONE = 88,
TARGET_DEST_TRAJ = 89,
TARGET_UNIT_TARGET_MINIPET = 90,
- TARGET_DEST_DEST_RANDOM_DIR_DIST = 91,
+ TARGET_DEST_DEST_RADIUS = 91,
TARGET_UNIT_SUMMONER = 92,
- TARGET_CORPSE_AREA_ENEMY_PLAYER_SRC= 93, // TODO
+ TARGET_CORPSE_SRC_AREA_ENEMY = 93, // NYI
TARGET_UNIT_VEHICLE = 94,
TARGET_UNIT_TARGET_PASSENGER = 95,
TARGET_UNIT_PASSENGER_0 = 96,
@@ -1378,12 +1379,12 @@ enum Targets
TARGET_UNIT_PASSENGER_5 = 101,
TARGET_UNIT_PASSENGER_6 = 102,
TARGET_UNIT_PASSENGER_7 = 103,
- TARGET_UNIT_AREA_PATH = 104,
+ TARGET_UNIT_CONE_ENEMY_104 = 104,
TARGET_UNIT_UNK_105 = 105, // 1 spell
TARGET_DEST_CHANNEL_CASTER = 106,
- TARGET_UNK_AREA_UNK_DST_107 = 107, // not enough info - only generic spells avalible
- TARGET_GAMEOBJECT_AREA_PATH = 108,
- TARGET_DEST_UNK_110 = 110, // some kind of traj?
+ TARGET_UNK_DEST_AREA_UNK_107 = 107, // not enough info - only generic spells avalible
+ TARGET_GAMEOBJECT_CONE = 108,
+ TARGET_DEST_UNK_110 = 110, // 1 spell
TOTAL_SPELL_TARGETS
};
@@ -1473,13 +1474,13 @@ enum GameobjectTypes
enum GameObjectFlags
{
- GO_FLAG_IN_USE = 0x00000001, //disables interaction while animated
- GO_FLAG_LOCKED = 0x00000002, //require key, spell, event, etc to be opened. Makes "Locked" appear in tooltip
- GO_FLAG_INTERACT_COND = 0x00000004, //cannot interact (condition to interact)
- GO_FLAG_TRANSPORT = 0x00000008, //any kind of transport? Object can transport (elevator, boat, car)
- GO_FLAG_UNK1 = 0x00000010, //
- GO_FLAG_NODESPAWN = 0x00000020, //never despawn, typically for doors, they just change state
- GO_FLAG_TRIGGERED = 0x00000040, //typically, summoned objects. Triggered by spell or other events
+ GO_FLAG_IN_USE = 0x00000001, // disables interaction while animated
+ GO_FLAG_LOCKED = 0x00000002, // require key, spell, event, etc to be opened. Makes "Locked" appear in tooltip
+ GO_FLAG_INTERACT_COND = 0x00000004, // cannot interact (condition to interact)
+ GO_FLAG_TRANSPORT = 0x00000008, // any kind of transport? Object can transport (elevator, boat, car)
+ GO_FLAG_NOT_SELECTABLE = 0x00000010, // not selectable even in GM mode
+ GO_FLAG_NODESPAWN = 0x00000020, // never despawn, typically for doors, they just change state
+ GO_FLAG_TRIGGERED = 0x00000040, // typically, summoned objects. Triggered by spell or other events
GO_FLAG_DAMAGED = 0x00000200,
GO_FLAG_DESTROYED = 0x00000400,
};
@@ -2762,7 +2763,7 @@ enum PetDiet
#define MAX_PET_DIET 9
-#define CHAIN_SPELL_JUMP_RADIUS 10
+#define CHAIN_SPELL_JUMP_RADIUS 8
#define GUILD_BANKLOG_MAX_RECORDS 25
#define GUILD_EVENTLOG_MAX_RECORDS 100
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index d0b56ee1ddf..e5168fbec9c 100755
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -331,21 +331,21 @@ void ScriptMgr::FillSpellSummary()
// Spell targets a single enemy.
if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ENEMY ||
- pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DST_TARGET_ENEMY)
+ pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_TARGET_ENEMY)
SpellSummary[i].Targets |= 1 << (SELECT_TARGET_SINGLE_ENEMY-1);
// Spell targets AoE at enemy.
- if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_AREA_ENEMY_SRC ||
- pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_AREA_ENEMY_DST ||
+ if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY ||
+ pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY ||
pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER ||
pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY)
SpellSummary[i].Targets |= 1 << (SELECT_TARGET_AOE_ENEMY-1);
// Spell targets an enemy.
if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ENEMY ||
- pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DST_TARGET_ENEMY ||
- pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_AREA_ENEMY_SRC ||
- pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_AREA_ENEMY_DST ||
+ pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_TARGET_ENEMY ||
+ pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY ||
+ pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY ||
pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER ||
pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY)
SpellSummary[i].Targets |= 1 << (SELECT_TARGET_ANY_ENEMY-1);
@@ -357,8 +357,8 @@ void ScriptMgr::FillSpellSummary()
SpellSummary[i].Targets |= 1 << (SELECT_TARGET_SINGLE_FRIEND-1);
// Spell targets AoE friends.
- if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_PARTY_CASTER ||
- pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ALLY_PARTY ||
+ if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER_AREA_PARTY ||
+ pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_LASTTARGET_AREA_PARTY ||
pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER)
SpellSummary[i].Targets |= 1 << (SELECT_TARGET_AOE_FRIEND-1);
@@ -366,8 +366,8 @@ void ScriptMgr::FillSpellSummary()
if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER ||
pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ALLY ||
pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_PARTY ||
- pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_PARTY_CASTER ||
- pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ALLY_PARTY ||
+ pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER_AREA_PARTY ||
+ pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_LASTTARGET_AREA_PARTY ||
pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER)
SpellSummary[i].Targets |= 1 << (SELECT_TARGET_ANY_FRIEND-1);
diff --git a/src/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp b/src/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp
index 63012a11707..5bccf511da3 100755
--- a/src/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp
@@ -370,7 +370,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recv_data)
if (!sBattlemasterListStore.LookupEntry(bgTypeId_))
{
- sLog->outError("BattlegroundHandler: invalid bgtype (%u) received.", bgTypeId_);
+ sLog->outError("BattlegroundHandler: invalid bgtype (%u) with player (Name: %s, GUID: %u) received.", bgTypeId_, _player->GetName(), _player->GetGUIDLow());
return;
}
if (!_player->InBattlegroundQueue())
diff --git a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp
index 09897dcde19..a5f84c411da 100755
--- a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp
@@ -57,9 +57,12 @@ void WorldSession::HandleRepopRequestOpcode(WorldPacket & recv_data)
recv_data.read_skip<uint8>();
- if (GetPlayer()->isAlive()||GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))
+ if (GetPlayer()->isAlive() || GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))
return;
+ if (GetPlayer()->HasAuraType(SPELL_AURA_PREVENT_RESSURECTION))
+ return; // silently return, client should display the error by itself
+
// the world update order is sessions, players, creatures
// the netcode runs in parallel with all of these
// creatures can kill players
@@ -1502,7 +1505,7 @@ void WorldSession::HandleSetDungeonDifficultyOpcode(WorldPacket & recv_data)
Map *map = _player->GetMap();
if (map && map->IsDungeon())
{
- sLog->outError("WorldSession::HandleSetDungeonDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
+ sLog->outError("WorldSession::HandleSetDungeonDifficultyOpcode: player (Name: %s, GUID: %u) tried to reset the instance while player is inside!", _player->GetName(), _player->GetGUIDLow());
return;
}
@@ -1523,7 +1526,7 @@ void WorldSession::HandleSetDungeonDifficultyOpcode(WorldPacket & recv_data)
map = pGroupGuy->GetMap();
if (map && map->IsNonRaidDungeon())
{
- sLog->outError("WorldSession::HandleSetDungeonDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
+ sLog->outError("WorldSession::HandleSetDungeonDifficultyOpcode: player %d tried to reset the instance while group member (Name: %s, GUID: %u) is inside!", _player->GetGUIDLow(), pGroupGuy->GetName(), pGroupGuy->GetGUIDLow());
return;
}
}
diff --git a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp
index 6446710ed38..2c22b4fe9d7 100755
--- a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp
@@ -67,7 +67,7 @@ void WorldSession::HandleMoveWorldportAckOpcode()
ASSERT(oldMap);
if (GetPlayer()->IsInWorld())
{
- sLog->outCrash("Player is still in world when teleported from map %u! to new map %u", oldMap->GetId(), loc.GetMapId());
+ sLog->outCrash("Player (Name %s) is still in world when teleported from map %u to new map %u", GetPlayer()->GetName(), oldMap->GetId(), loc.GetMapId());
oldMap->Remove(GetPlayer(), false);
}
diff --git a/src/server/game/Server/Protocol/Handlers/PetHandler.cpp b/src/server/game/Server/Protocol/Handlers/PetHandler.cpp
index 2f28f83de8f..67272f4d5ec 100755
--- a/src/server/game/Server/Protocol/Handlers/PetHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/PetHandler.cpp
@@ -302,7 +302,7 @@ void WorldSession::HandlePetActionHelper(Unit *pet, uint64 guid1, uint16 spellid
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
- if (spellInfo->Effects[i].TargetA.GetTarget() == TARGET_UNIT_AREA_ENEMY_SRC || spellInfo->Effects[i].TargetA.GetTarget() == TARGET_UNIT_AREA_ENEMY_DST || spellInfo->Effects[i].TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY)
+ if (spellInfo->Effects[i].TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY || spellInfo->Effects[i].TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY || spellInfo->Effects[i].TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY)
return;
}
@@ -678,7 +678,7 @@ void WorldSession::HandlePetAbandon(WorldPacket & recv_data)
if (pet->GetGUID() == _player->GetPetGUID())
{
uint32 feelty = pet->GetPower(POWER_HAPPINESS);
- pet->SetPower(POWER_HAPPINESS , (feelty-50000) > 0 ?(feelty-50000) : 0);
+ pet->SetPower(POWER_HAPPINESS , feelty > 50000 ? (feelty-50000) : 0);
}
_player->RemovePet((Pet*)pet, PET_SAVE_AS_DELETED);
diff --git a/src/server/game/Server/Protocol/Handlers/SpellHandler.cpp b/src/server/game/Server/Protocol/Handlers/SpellHandler.cpp
index 2043d88adfc..716aaa9e74f 100755
--- a/src/server/game/Server/Protocol/Handlers/SpellHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/SpellHandler.cpp
@@ -540,6 +540,9 @@ void WorldSession::HandleSelfResOpcode(WorldPacket & /*recv_data*/)
{
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_SELF_RES"); // empty opcode
+ if (_player->HasAuraType(SPELL_AURA_PREVENT_RESSURECTION))
+ return; // silent return, client should display error by itself and not send this opcode
+
if (_player->GetUInt32Value(PLAYER_SELF_RES_SPELL))
{
SpellInfo const *spellInfo = sSpellMgr->GetSpellInfo(_player->GetUInt32Value(PLAYER_SELF_RES_SPELL));
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index b3e955de11f..adfb0d67bfa 100755
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -367,7 +367,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]=
&AuraEffect::HandleNULL, //311 0 spells in 3.3.5
&AuraEffect::HandleNULL, //312 0 spells in 3.3.5
&AuraEffect::HandleNULL, //313 0 spells in 3.3.5
- &AuraEffect::HandleNoImmediateEffect, //314 SPELL_AURA_PREVENT_RESSURECTION todo
+ &AuraEffect::HandlePreventResurrection, //314 SPELL_AURA_PREVENT_RESSURECTION todo
&AuraEffect::HandleNoImmediateEffect, //315 SPELL_AURA_UNDERWATER_WALKING todo
&AuraEffect::HandleNoImmediateEffect, //316 SPELL_AURA_PERIODIC_HASTE implemented in AuraEffect::CalculatePeriodic
};
@@ -1516,7 +1516,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const
// Heart of the Wild
if ((*i)->GetSpellInfo()->SpellIconID == 240 && (*i)->GetMiscValue() == 3)
{
- int32 HotWMod = (*i)->GetAmount();
+ int32 HotWMod = (*i)->GetAmount() / 2; // For each 2% Intelligence, you get 1% stamina and 1% attack power.
target->CastCustomSpell(target, HotWSpellId, &HotWMod, NULL, NULL, true, NULL, this);
break;
@@ -1562,7 +1562,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const
// Survival of the Fittest
if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DRUID, 961, 0))
{
- int32 bp = 100 + aurEff->GetSpellInfo()->Effects[EFFECT_2].CalcValue();
+ int32 bp = aurEff->GetSpellInfo()->Effects[EFFECT_2].CalcValue();
target->CastCustomSpell(target, 62069, &bp, NULL, NULL, true, 0, this);
}
break;
@@ -2553,12 +2553,10 @@ void AuraEffect::HandleAuraModDisarm(AuraApplication const* aurApp, uint8 mode,
return;
}
+ // if disarm aura is to be removed, remove the flag first to reapply damage/aura mods
if (!apply)
target->RemoveFlag(field, flag);
- if (apply)
- target->SetFlag(field, flag);
-
// Handle damage modification, shapeshifted druids are not affected
if (target->GetTypeId() == TYPEID_PLAYER && !target->IsInFeralForm())
{
@@ -2567,10 +2565,17 @@ void AuraEffect::HandleAuraModDisarm(AuraApplication const* aurApp, uint8 mode,
uint8 attacktype = Player::GetAttackBySlot(slot);
if (attacktype < MAX_ATTACK)
+ {
target->ToPlayer()->_ApplyWeaponDamage(slot, pItem->GetTemplate(), NULL, !apply);
+ target->ToPlayer()->_ApplyWeaponDependentAuraMods(pItem, WeaponAttackType(attacktype), !apply);
+ }
}
}
+ // if disarm effects should be applied, wait to set flag until damage mods are unapplied
+ if (apply)
+ target->SetFlag(field, flag);
+
if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->GetCurrentEquipmentId())
target->UpdateDamagePhysical(attType);
}
@@ -4495,12 +4500,30 @@ void AuraEffect::HandleModDamagePercentDone(AuraApplication const* aurApp, uint8
if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT)))
return;
- Player* target = aurApp->GetTarget()->ToPlayer();
+ Unit* target = aurApp->GetTarget();
if (!target)
return;
- if (target->HasItemFitToSpellRequirements(GetSpellInfo()))
- target->ApplyModSignedFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, GetAmount() / 100.0f, apply);
+ if (target->GetTypeId() == TYPEID_PLAYER)
+ {
+ for(int i = 0; i < MAX_ATTACK; ++i)
+ if(Item* item = target->ToPlayer()->GetWeaponForAttack(WeaponAttackType(i),false))
+ target->ToPlayer()->_ApplyWeaponDependentAuraDamageMod(item, WeaponAttackType(i), this, apply);
+ }
+
+ if ((GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) && (GetSpellInfo()->EquippedItemClass == -1 || target->GetTypeId() != TYPEID_PLAYER))
+ {
+ target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, float (GetAmount()), apply);
+ target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_PCT, float (GetAmount()), apply);
+ target->HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_PCT, float (GetAmount()), apply);
+
+ if (target->GetTypeId() == TYPEID_PLAYER)
+ target->ToPlayer()->ApplyPercentModFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, float (GetAmount()), apply);
+ }
+ else
+ {
+ // done in Player::_ApplyWeaponDependentAuraMods for !SPELL_SCHOOL_MASK_NORMAL and also for wand case
+ }
}
void AuraEffect::HandleModOffhandDamagePercent(AuraApplication const* aurApp, uint8 mode, bool apply) const
@@ -4901,6 +4924,18 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool
caster->CastSpell(target, GetAmount(), true);
}
break;
+ case SPELLFAMILY_PRIEST:
+ // Vampiric Touch
+ if (m_spellInfo->SpellFamilyFlags[1] & 0x0400 && aurApp->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL && GetEffIndex() == 0)
+ {
+ if (AuraEffect const* aurEff = GetBase()->GetEffect(1))
+ {
+ int32 damage = aurEff->GetAmount() * 8;
+ // backfire damage
+ target->CastCustomSpell(target, 64085, &damage, NULL, NULL, true, NULL, NULL, GetCasterGUID());
+ }
+ }
+ break;
case SPELLFAMILY_WARLOCK:
// Haunt
if (m_spellInfo->SpellFamilyFlags[1] & 0x40000)
@@ -4929,18 +4964,6 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool
}
}
break;
- case SPELLFAMILY_PRIEST:
- // Vampiric Touch
- if (m_spellInfo->SpellFamilyFlags[1] & 0x0400 && aurApp->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL && GetEffIndex() == 0)
- {
- if (AuraEffect const* aurEff = GetBase()->GetEffect(1))
- {
- int32 damage = aurEff->GetAmount() * 8;
- // backfire damage
- target->CastCustomSpell(target, 64085, &damage, NULL, NULL, true, NULL, NULL, GetCasterGUID());
- }
- }
- break;
case SPELLFAMILY_HUNTER:
// Misdirection
if (GetId() == 34477)
@@ -5577,6 +5600,20 @@ void AuraEffect::HandleAuraSetVehicle(AuraApplication const* aurApp, uint8 mode,
}
}
+void AuraEffect::HandlePreventResurrection(AuraApplication const* aurApp, uint8 mode, bool apply) const
+{
+ if (!(mode & AURA_EFFECT_HANDLE_REAL))
+ return;
+
+ if (aurApp->GetTarget()->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ if (apply)
+ aurApp->GetTarget()->RemoveByteFlag(PLAYER_FIELD_BYTES, 0, PLAYER_FIELD_BYTE_RELEASE_TIMER);
+ else if (!aurApp->GetTarget()->GetBaseMap()->Instanceable())
+ aurApp->GetTarget()->SetByteFlag(PLAYER_FIELD_BYTES, 0, PLAYER_FIELD_BYTE_RELEASE_TIMER);
+}
+
void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const
{
switch (GetSpellInfo()->SpellFamilyName)
@@ -5586,20 +5623,17 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const
{
case 54798: // FLAMING Arrow Triggered Effect
{
- if (!caster || !target || !target->ToCreature() || !caster->IsVehicle() || target->HasAura(54683))
+ if (!caster || !target || !target->ToCreature() || !caster->GetVehicle() || target->HasAura(54683))
break;
- if (Unit* rider = caster->GetVehicleKit()->GetPassenger(0))
- {
- target->CastSpell(target, 54683, true);
-
- // Credit Frostworgs
- if (target->GetEntry() == 29358)
- rider->CastSpell(rider, 54896, true);
- // Credit Frost Giants
- else if (target->GetEntry() == 29351)
- rider->CastSpell(rider, 54893, true);
- }
+ target->CastSpell(target, 54683, true);
+
+ // Credit Frostworgs
+ if (target->GetEntry() == 29358)
+ caster->CastSpell(caster, 54896, true);
+ // Credit Frost Giants
+ else if (target->GetEntry() == 29351)
+ caster->CastSpell(caster, 54893, true);
break;
}
case 62292: // Blaze (Pool of Tar)
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h
index 0c5e500d887..86bb325aa3c 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.h
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.h
@@ -277,6 +277,7 @@ class AuraEffect
void HandleAuraModFakeInebriation(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleAuraOverrideSpells(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleAuraSetVehicle(AuraApplication const* aurApp, uint8 mode, bool apply) const;
+ void HandlePreventResurrection(AuraApplication const* aurApp, uint8 mode, bool apply) const;
// aura effect periodic tick handlers
void HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const;
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 3fcf4867c8f..bff4f222895 100755
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -2397,7 +2397,7 @@ void DynObjAura::FillTargetMap(std::map<Unit *, uint8> & targets, Unit* /*caster
continue;
UnitList targetList;
if (GetSpellInfo()->Effects[effIndex].TargetB.GetTarget() == TARGET_DEST_DYNOBJ_ALLY
- || GetSpellInfo()->Effects[effIndex].TargetB.GetTarget() == TARGET_UNIT_AREA_ALLY_DST)
+ || GetSpellInfo()->Effects[effIndex].TargetB.GetTarget() == TARGET_UNIT_DEST_AREA_ALLY)
{
Trinity::AnyFriendlyUnitInObjectRangeCheck u_check(GetDynobjOwner(), dynObjOwnerCaster, radius);
Trinity::UnitListSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(GetDynobjOwner(), targetList, u_check);
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index b287734b9a5..84d31449c41 100755
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -82,42 +82,11 @@ SpellCastTargets::~SpellCastTargets()
{
}
-SpellCastTargets& SpellCastTargets::operator=(const SpellCastTargets &target)
-{
- m_unitTarget = target.m_unitTarget;
- m_itemTarget = target.m_itemTarget;
- m_GOTarget = target.m_GOTarget;
-
- m_unitTargetGUID = target.m_unitTargetGUID;
- m_GOTargetGUID = target.m_GOTargetGUID;
- m_CorpseTargetGUID = target.m_CorpseTargetGUID;
- m_itemTargetGUID = target.m_itemTargetGUID;
-
- m_itemTargetEntry = target.m_itemTargetEntry;
-
- m_srcTransGUID = target.m_srcTransGUID;
- m_srcTransOffset = target.m_srcTransOffset;
- m_srcPos = target.m_srcPos;
-
- m_dstTransGUID = target.m_dstTransGUID;
- m_dstTransOffset = target.m_dstTransOffset;
- m_dstPos = target.m_dstPos;
-
- m_elevation = target.m_elevation;
- m_speed = target.m_speed;
-
- m_strTarget = target.m_strTarget;
-
- m_targetMask = target.m_targetMask;
-
- return *this;
-}
-
void SpellCastTargets::Read(ByteBuffer& data, Unit* caster)
{
data >> m_targetMask;
- if (m_targetMask == TARGET_FLAG_SELF)
+ if (m_targetMask == TARGET_FLAG_NONE)
return;
if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_UNIT_MINIPET))
@@ -238,6 +207,65 @@ void SpellCastTargets::SetUnitTarget(Unit* target)
m_targetMask |= TARGET_FLAG_UNIT;
}
+void SpellCastTargets::RemoveUnitTarget()
+{
+ m_unitTarget = NULL;
+ m_unitTargetGUID = 0LL;
+ m_targetMask &= ~(TARGET_FLAG_UNIT | TARGET_FLAG_UNIT_MINIPET);
+}
+
+void SpellCastTargets::SetGOTarget(GameObject* target)
+{
+ if (!target)
+ return;
+
+ m_GOTarget = target;
+ m_GOTargetGUID = target->GetGUID();
+ m_targetMask |= TARGET_FLAG_GAMEOBJECT;
+}
+
+void SpellCastTargets::RemoveGOTarget()
+{
+ m_GOTarget = NULL;
+ m_GOTargetGUID = 0LL;
+ m_targetMask &= ~(TARGET_FLAG_GAMEOBJECT);
+}
+
+void SpellCastTargets::RemoveCorpseTarget()
+{
+ m_CorpseTargetGUID = 0;
+ m_targetMask &= ~(TARGET_FLAG_CORPSE_ENEMY | TARGET_FLAG_CORPSE_ALLY);
+}
+
+void SpellCastTargets::SetItemTarget(Item* item)
+{
+ if (!item)
+ return;
+
+ m_itemTarget = item;
+ m_itemTargetGUID = item->GetGUID();
+ m_itemTargetEntry = item->GetEntry();
+ m_targetMask |= TARGET_FLAG_ITEM;
+}
+
+void SpellCastTargets::SetTradeItemTarget(Player* caster)
+{
+ m_itemTargetGUID = uint64(TRADE_SLOT_NONTRADED);
+ m_itemTargetEntry = 0;
+ m_targetMask |= TARGET_FLAG_TRADE_ITEM;
+
+ Update(caster);
+}
+
+void SpellCastTargets::UpdateTradeSlotItem()
+{
+ if (m_itemTarget && (m_targetMask & TARGET_FLAG_TRADE_ITEM))
+ {
+ m_itemTargetGUID = m_itemTarget->GetGUID();
+ m_itemTargetEntry = m_itemTarget->GetEntry();
+ }
+}
+
Position const* SpellCastTargets::GetSrc() const
{
return &m_srcPos;
@@ -279,6 +307,11 @@ void SpellCastTargets::ModSrc(Position const& pos)
m_srcPos.Relocate(pos);
}
+void SpellCastTargets::RemoveSrc()
+{
+ m_targetMask &= ~(TARGET_FLAG_SOURCE_LOCATION);
+}
+
WorldLocation const* SpellCastTargets::GetDst() const
{
return &m_dstPos;
@@ -311,10 +344,10 @@ void SpellCastTargets::SetDst(WorldObject const& wObj)
void SpellCastTargets::SetDst(SpellCastTargets const& spellTargets)
{
- m_dstTransGUID = spellTargets.m_dstTransGUID;
- m_dstTransOffset.Relocate(spellTargets.m_dstTransOffset);
- m_dstPos.Relocate(spellTargets.m_dstPos);
- m_targetMask |= TARGET_FLAG_DEST_LOCATION;
+ m_dstTransGUID = spellTargets.m_dstTransGUID;
+ m_dstTransOffset.Relocate(spellTargets.m_dstTransOffset);
+ m_dstPos.Relocate(spellTargets.m_dstPos);
+ m_targetMask |= TARGET_FLAG_DEST_LOCATION;
}
void SpellCastTargets::ModDst(Position const& pos)
@@ -330,45 +363,9 @@ void SpellCastTargets::ModDst(Position const& pos)
m_dstPos.Relocate(pos);
}
-void SpellCastTargets::SetGOTarget(GameObject* target)
-{
- m_GOTarget = target;
- m_GOTargetGUID = target->GetGUID();
- m_targetMask |= TARGET_FLAG_GAMEOBJECT;
-}
-
-void SpellCastTargets::SetItemTarget(Item* item)
+void SpellCastTargets::RemoveDst()
{
- if (!item)
- return;
-
- m_itemTarget = item;
- m_itemTargetGUID = item->GetGUID();
- m_itemTargetEntry = item->GetEntry();
- m_targetMask |= TARGET_FLAG_ITEM;
-}
-
-void SpellCastTargets::SetTradeItemTarget(Player* caster)
-{
- m_itemTargetGUID = uint64(TRADE_SLOT_NONTRADED);
- m_itemTargetEntry = 0;
- m_targetMask |= TARGET_FLAG_TRADE_ITEM;
-
- Update(caster);
-}
-
-void SpellCastTargets::UpdateTradeSlotItem()
-{
- if (m_itemTarget && (m_targetMask & TARGET_FLAG_TRADE_ITEM))
- {
- m_itemTargetGUID = m_itemTarget->GetGUID();
- m_itemTargetEntry = m_itemTarget->GetEntry();
- }
-}
-
-void SpellCastTargets::SetCorpseTarget(Corpse* corpse)
-{
- m_CorpseTargetGUID = corpse->GetGUID();
+ m_targetMask &= ~(TARGET_FLAG_DEST_LOCATION);
}
void SpellCastTargets::Update(Unit* caster)
@@ -414,7 +411,7 @@ void SpellCastTargets::Update(Unit* caster)
void SpellCastTargets::OutDebug() const
{
if (!m_targetMask)
- sLog->outString("TARGET_FLAG_SELF");
+ sLog->outString("TARGET_FLAG_NONE");
if (m_targetMask & TARGET_FLAG_UNIT)
sLog->outString("TARGET_FLAG_UNIT: " UI64FMTD, m_unitTargetGUID);
@@ -451,7 +448,8 @@ SpellValue::SpellValue(SpellInfo const* proto)
Spell::Spell(Unit* caster, SpellInfo const *info, TriggerCastFlags triggerFlags, uint64 originalCasterGUID, bool skipCheck) :
m_spellInfo(sSpellMgr->GetSpellForDifficultyFromSpell(info, caster)),
-m_caster(caster), m_spellValue(new SpellValue(m_spellInfo))
+m_caster((info->AttributesEx6 & SPELL_ATTR6_CAST_BY_CHARMER && caster->GetCharmerOrOwner()) ? caster->GetCharmerOrOwner() : caster)
+, m_spellValue(new SpellValue(m_spellInfo))
{
m_customError = SPELL_CUSTOM_ERROR_NONE;
m_skipCheck = skipCheck;
@@ -506,7 +504,8 @@ m_caster(caster), m_spellValue(new SpellValue(m_spellInfo))
else
{
m_originalCaster = ObjectAccessor::GetUnit(*m_caster, m_originalCasterGUID);
- if (m_originalCaster && !m_originalCaster->IsInWorld()) m_originalCaster = NULL;
+ if (m_originalCaster && !m_originalCaster->IsInWorld())
+ m_originalCaster = NULL;
}
m_spellState = SPELL_STATE_NULL;
@@ -601,6 +600,73 @@ WorldObject* Spell::FindCorpseUsing()
return result;
}
+void Spell::InitExplicitTargets(SpellCastTargets const& targets)
+{
+ m_targets = targets;
+ // this function tries to correct spell explicit targets for spell
+ // client doesn't send explicit targets correctly sometimes - we need to fix such spells serverside
+ // this also makes sure that we correctly send explicit targets to client (removes redundant data)
+ uint32 neededTargets = m_spellInfo->GetExplicitTargetMask();
+
+ // check if spell needs unit target
+ if (neededTargets & TARGET_FLAG_UNIT_MASK)
+ {
+ Unit* target = targets.GetUnitTarget();
+
+ if (!target)
+ {
+ // try to use player selection as a target
+ if (Player* playerCaster = m_caster->ToPlayer())
+ {
+ // selection has to be found and to be valid target for the spell
+ if (Unit* selectedUnit = ObjectAccessor::GetUnit(*m_caster, playerCaster->GetSelection()))
+ if (IsValidSingleTargetSpell(selectedUnit))
+ target = selectedUnit;
+ }
+ // try to use attacked unit as a target
+ else if ((m_caster->GetTypeId() == TYPEID_UNIT) && neededTargets & (TARGET_FLAG_UNIT_ENEMY | TARGET_FLAG_UNIT))
+ target = m_caster->getVictim();
+ // didn't find anything - let's use self as target
+ if (!target && neededTargets & (TARGET_FLAG_UNIT_RAID | TARGET_FLAG_UNIT_PARTY | TARGET_FLAG_UNIT_ALLY | TARGET_FLAG_UNIT))
+ target = m_caster;
+ }
+ m_targets.SetUnitTarget(target);
+ }
+ else
+ m_targets.RemoveUnitTarget();
+
+ if (!(neededTargets & TARGET_FLAG_GAMEOBJECT_MASK))
+ m_targets.RemoveGOTarget();
+
+ if (!(neededTargets & TARGET_FLAG_CORPSE_MASK))
+ m_targets.RemoveCorpseTarget();
+
+ // check if spell needs dst target
+ if (neededTargets & TARGET_FLAG_DEST_LOCATION)
+ {
+ // and target isn't set
+ if (!targets.GetDst())
+ {
+ // try to use unit target if provided
+ if (Unit* target = targets.GetUnitTarget())
+ m_targets.SetDst(*target);
+ // or use self if not available
+ else
+ m_targets.SetDst(*m_caster);
+ }
+ }
+ else
+ m_targets.RemoveDst();
+
+ if (neededTargets & TARGET_FLAG_SOURCE_LOCATION)
+ {
+ if (!targets.GetSrc())
+ m_targets.SetSrc(*m_caster);
+ }
+ else
+ m_targets.RemoveSrc();
+}
+
void Spell::SelectSpellTargets()
{
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
@@ -627,7 +693,7 @@ void Spell::SelectSpellTargets()
if (effectTargetType != SPELL_REQUIRE_UNIT)
{
if (effectTargetType == SPELL_REQUIRE_CASTER)
- AddUnitTarget(m_caster, i);
+ AddUnitTarget(m_caster, i, false);
else if (effectTargetType == SPELL_REQUIRE_ITEM)
if (m_targets.GetItemTarget())
AddItemTarget(m_targets.GetItemTarget(), i);
@@ -638,7 +704,7 @@ void Spell::SelectSpellTargets()
{
if (!m_spellInfo->GetMaxRange(true))
{
- AddUnitTarget(m_caster, i);
+ AddUnitTarget(m_caster, i, false);
continue;
}
@@ -648,51 +714,10 @@ void Spell::SelectSpellTargets()
{
case SPELL_EFFECT_DUMMY:
{
- switch(m_spellInfo->Id)
- {
- case 20577: // Cannibalize
- case 54044: // Carrion Feeder
- {
- WorldObject* result = NULL;
- if (m_spellInfo->Id == 20577)
- result = FindCorpseUsing<Trinity::CannibalizeObjectCheck>();
- else
- result = FindCorpseUsing<Trinity::CarrionFeederObjectCheck>();
-
- if (result)
- {
- switch(result->GetTypeId())
- {
- case TYPEID_UNIT:
- case TYPEID_PLAYER:
- AddUnitTarget((Unit*)result, i);
- break;
- case TYPEID_CORPSE:
- m_targets.SetCorpseTarget((Corpse*)result);
- if (Player* owner = ObjectAccessor::FindPlayer(((Corpse*)result)->GetOwnerGUID()))
- AddUnitTarget(owner, i);
- break;
- default:
- break;
- }
- }
- else
- {
- // clear cooldown at fail
- if (m_caster->GetTypeId() == TYPEID_PLAYER)
- m_caster->ToPlayer()->RemoveSpellCooldown(m_spellInfo->Id, true);
- SendCastResult(SPELL_FAILED_NO_EDIBLE_CORPSES);
- finish(false);
- }
- break;
- }
- default:
- if (m_targets.GetUnitTarget())
- AddUnitTarget(m_targets.GetUnitTarget(), i);
- else
- AddUnitTarget(m_caster, i);
- break;
- }
+ if (m_targets.GetUnitTarget())
+ AddUnitTarget(m_targets.GetUnitTarget(), i, false);
+ else
+ AddUnitTarget(m_caster, i, false);
break;
}
case SPELL_EFFECT_BIND:
@@ -707,10 +732,10 @@ void Spell::SelectSpellTargets()
case SPELL_EFFECT_LEARN_SPELL:
case SPELL_EFFECT_SEND_TAXI:
if (m_targets.GetUnitTarget())
- AddUnitTarget(m_targets.GetUnitTarget(), i);
+ AddUnitTarget(m_targets.GetUnitTarget(), i, false);
// Triggered spells have additional spell targets - cast them even if no explicit unit target is given (required for spell 50516 for example)
else if (m_spellInfo->Effects[i].Effect == SPELL_EFFECT_TRIGGER_SPELL)
- AddUnitTarget(m_caster, i);
+ AddUnitTarget(m_caster, i, false);
break;
case SPELL_EFFECT_SUMMON_RAF_FRIEND:
case SPELL_EFFECT_SUMMON_PLAYER:
@@ -718,12 +743,12 @@ void Spell::SelectSpellTargets()
{
Player* target = ObjectAccessor::FindPlayer(m_caster->ToPlayer()->GetSelection());
if (target)
- AddUnitTarget(target, i);
+ AddUnitTarget(target, i, false);
}
break;
case SPELL_EFFECT_RESURRECT_NEW:
if (m_targets.GetUnitTarget())
- AddUnitTarget(m_targets.GetUnitTarget(), i);
+ AddUnitTarget(m_targets.GetUnitTarget(), i, false);
if (m_targets.GetCorpseTargetGUID())
{
Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.GetCorpseTargetGUID());
@@ -731,7 +756,7 @@ void Spell::SelectSpellTargets()
{
Player* owner = ObjectAccessor::FindPlayer(corpse->GetOwnerGUID());
if (owner)
- AddUnitTarget(owner, i);
+ AddUnitTarget(owner, i, false);
}
}
break;
@@ -742,7 +767,7 @@ void Spell::SelectSpellTargets()
case SPELL_EFFECT_FEED_PET:
case SPELL_EFFECT_DESTROY_ALL_TOTEMS:
case SPELL_EFFECT_KILL_CREDIT2: // only one spell: 42793
- AddUnitTarget(m_caster, i);
+ AddUnitTarget(m_caster, i, false);
break;
case SPELL_EFFECT_LEARN_PET_SPELL:
if (Guardian* pet = m_caster->GetGuardianPet())
@@ -753,17 +778,17 @@ void Spell::SelectSpellTargets()
{
case SPELL_AURA_ADD_FLAT_MODIFIER: // some spell mods auras have 0 target modes instead expected TARGET_UNIT_CASTER(1) (and present for other ranks for same spell for example)
case SPELL_AURA_ADD_PCT_MODIFIER:
- AddUnitTarget(m_caster, i);
+ AddUnitTarget(m_caster, i, false);
break;
default: // apply to target in other case
if (m_targets.GetUnitTarget())
- AddUnitTarget(m_targets.GetUnitTarget(), i);
+ AddUnitTarget(m_targets.GetUnitTarget(), i, false);
break;
}
break;
case SPELL_EFFECT_SKIN_PLAYER_CORPSE:
if (m_targets.GetUnitTarget())
- AddUnitTarget(m_targets.GetUnitTarget(), i);
+ AddUnitTarget(m_targets.GetUnitTarget(), i, false);
else if (m_targets.GetCorpseTargetGUID())
{
Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.GetCorpseTargetGUID());
@@ -771,12 +796,12 @@ void Spell::SelectSpellTargets()
{
Player* owner = ObjectAccessor::FindPlayer(corpse->GetOwnerGUID());
if (owner)
- AddUnitTarget(owner, i);
+ AddUnitTarget(owner, i, false);
}
}
break;
default:
- AddUnitTarget(m_caster, i);
+ AddUnitTarget(m_caster, i, false);
break;
}
}
@@ -922,12 +947,15 @@ void Spell::CleanupTargetList()
m_delayMoment = 0;
}
-void Spell::AddUnitTarget(Unit* pVictim, uint32 effIndex)
+void Spell::AddUnitTarget(Unit* pVictim, uint32 effIndex, bool checkIfValid /*=true*/)
{
if (!m_spellInfo->Effects[effIndex].IsEffect())
return;
- if (!CheckTarget(pVictim, effIndex))
+ if (checkIfValid)
+ if (m_spellInfo->CheckTarget(m_caster, pVictim, true) != SPELL_CAST_OK)
+ return;
+ if (!CheckEffectTarget(pVictim, effIndex))
return;
// Check for effect immune skip if immuned
@@ -1018,12 +1046,6 @@ void Spell::AddUnitTarget(Unit* pVictim, uint32 effIndex)
m_UniqueTargetInfo.push_back(target);
}
-void Spell::AddUnitTarget(uint64 unitGUID, uint32 effIndex)
-{
- if (Unit* unit = m_caster->GetGUID() == unitGUID ? m_caster : ObjectAccessor::GetUnit(*m_caster, unitGUID))
- AddUnitTarget(unit, effIndex);
-}
-
void Spell::AddGOTarget(GameObject* go, uint32 effIndex)
{
if (!m_spellInfo->Effects[effIndex].IsEffect())
@@ -1229,7 +1251,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
break;
}
}
- switch(m_spellInfo->DmgClass)
+ switch (m_spellInfo->DmgClass)
{
case SPELL_DAMAGE_CLASS_MAGIC:
if (positive)
@@ -1279,6 +1301,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
int32 gain = caster->HealBySpell(unitTarget, m_spellInfo, addhealth, crit);
unitTarget->getHostileRefManager().threatAssist(caster, float(gain) * 0.5f, m_spellInfo);
+ m_healing = gain;
}
// Do damage and triggers
else if (m_damage > 0)
@@ -1310,9 +1333,10 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
// Haunt
if (m_spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK && m_spellInfo->SpellFamilyFlags[1] & 0x40000 && m_spellAura && m_spellAura->GetEffect(1))
{
- AuraEffect * aurEff = m_spellAura->GetEffect(1);
+ AuraEffect* aurEff = m_spellAura->GetEffect(1);
aurEff->SetAmount(CalculatePctU(aurEff->GetAmount(), damageInfo.damage));
}
+ m_damage = damageInfo.damage;
}
// Passive spell hits/misses or active spells only misses (only triggers)
else
@@ -1357,18 +1381,15 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
p->CastedCreatureOrGO(spellHitTarget->GetEntry(), spellHitTarget->GetGUID(), m_spellInfo->Id);
}
- if (m_caster && m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->IsAIEnabled)
+ if (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->IsAIEnabled)
m_caster->ToCreature()->AI()->SpellHitTarget(spellHitTarget, m_spellInfo);
// Needs to be called after dealing damage/healing to not remove breaking on damage auras
DoTriggersOnSpellHit(spellHitTarget, mask);
// if target is fallged for pvp also flag caster if a player
- if (unit->IsPvP())
- {
- if (m_caster->GetTypeId() == TYPEID_PLAYER)
+ if (unit->IsPvP() && m_caster->GetTypeId() == TYPEID_PLAYER)
m_caster->ToPlayer()->UpdatePvP(true);
- }
CallScriptAfterHitHandlers();
}
@@ -1449,7 +1470,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask, bool
uint8 aura_effmask = 0;
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
- if (effectMask & (1 <<i ) && m_spellInfo->Effects[i].IsUnitOwnedAuraEffect())
+ if (effectMask & (1 << i) && m_spellInfo->Effects[i].IsUnitOwnedAuraEffect())
aura_effmask |= 1 << i;
if (aura_effmask)
@@ -1498,34 +1519,41 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask, bool
if (diminishMod == 0.0f)
{
m_spellAura->Remove();
- return SPELL_MISS_IMMUNE;
+ bool found = false;
+ for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ if (effectMask & (1 << i) && m_spellInfo->Effects[i].Effect != SPELL_EFFECT_APPLY_AURA)
+ found = true;
+ if (!found)
+ return SPELL_MISS_IMMUNE;
}
+ else
+ {
+ ((UnitAura*)m_spellAura)->SetDiminishGroup(m_diminishGroup);
- ((UnitAura*)m_spellAura)->SetDiminishGroup(m_diminishGroup);
-
- bool positive = m_spellAura->GetSpellInfo()->IsPositive();
- AuraApplication * aurApp = m_spellAura->GetApplicationOfTarget(m_originalCaster->GetGUID());
- if (aurApp)
- positive = aurApp->IsPositive();
+ bool positive = m_spellAura->GetSpellInfo()->IsPositive();
+ AuraApplication* aurApp = m_spellAura->GetApplicationOfTarget(m_originalCaster->GetGUID());
+ if (aurApp)
+ positive = aurApp->IsPositive();
- duration = m_originalCaster->ModSpellDuration(aurSpellInfo, unit, duration, positive);
+ duration = m_originalCaster->ModSpellDuration(aurSpellInfo, unit, duration, positive);
- // Haste modifies duration of channeled spells
- if (m_spellInfo->IsChanneled())
- {
- if (m_spellInfo->AttributesEx5 & SPELL_ATTR5_HASTE_AFFECT_DURATION)
- m_originalCaster->ModSpellCastTime(aurSpellInfo, duration, this);
- }
- // and duration of auras affected by SPELL_AURA_PERIODIC_HASTE
- else if (m_originalCaster->HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, aurSpellInfo) || m_spellInfo->AttributesEx5 & SPELL_ATTR5_HASTE_AFFECT_DURATION)
- duration = int32(duration * m_originalCaster->GetFloatValue(UNIT_MOD_CAST_SPEED));
+ // Haste modifies duration of channeled spells
+ if (m_spellInfo->IsChanneled())
+ {
+ if (m_spellInfo->AttributesEx5 & SPELL_ATTR5_HASTE_AFFECT_DURATION)
+ m_originalCaster->ModSpellCastTime(aurSpellInfo, duration, this);
+ }
+ // and duration of auras affected by SPELL_AURA_PERIODIC_HASTE
+ else if (m_originalCaster->HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, aurSpellInfo) || m_spellInfo->AttributesEx5 & SPELL_ATTR5_HASTE_AFFECT_DURATION)
+ duration = int32(duration * m_originalCaster->GetFloatValue(UNIT_MOD_CAST_SPEED));
- if (duration != m_spellAura->GetMaxDuration())
- {
- m_spellAura->SetMaxDuration(duration);
- m_spellAura->SetDuration(duration);
+ if (duration != m_spellAura->GetMaxDuration())
+ {
+ m_spellAura->SetMaxDuration(duration);
+ m_spellAura->SetDuration(duration);
+ }
+ m_spellAura->_RegisterForTargets();
}
- m_spellAura->_RegisterForTargets();
}
}
}
@@ -1793,7 +1821,7 @@ void Spell::SearchChainTarget(std::list<Unit*> &TagUnitMap, float max_range, uin
&& !m_caster->isInFrontInMap(*next, max_range))
|| !m_caster->canSeeOrDetect(*next)
|| !cur->IsWithinLOSInMap(*next)
- || ((GetSpellInfo()->AttributesEx6 & SPELL_ATTR6_IGNORE_CROWD_CONTROL_TARGETS) && !(*next)->CanFreeMove()))
+ || ((GetSpellInfo()->AttributesEx6 & SPELL_ATTR6_CANT_TARGET_CROWD_CONTROLLED) && !(*next)->CanFreeMove()))
{
++next;
if (next == tempUnitMap.end() || cur->GetDistance(*next) > CHAIN_SPELL_JUMP_RADIUS) // Don't search beyond the max jump radius
@@ -1839,16 +1867,10 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, SpellNo
}
Trinity::SpellNotifierCreatureAndPlayer notifier(m_caster, TagUnitMap, radius, type, TargetType, pos, entry, m_spellInfo);
- if ((m_spellInfo->AttributesEx3 & SPELL_ATTR3_PLAYERS_ONLY) || (TargetType == SPELL_TARGETS_ENTRY && !entry))
- {
+ if ((m_spellInfo->AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_PLAYERS) || (TargetType == SPELL_TARGETS_ENTRY && !entry))
m_caster->GetMap()->VisitWorld(pos->m_positionX, pos->m_positionY, radius, notifier);
- TagUnitMap.remove_if(Trinity::ObjectTypeIdCheck(TYPEID_PLAYER, false)); // above line will select also pets and totems, remove them
- }
else
m_caster->GetMap()->VisitAll(pos->m_positionX, pos->m_positionY, radius, notifier);
-
- if (m_spellInfo->AttributesCu & SPELL_ATTR0_CU_EXCLUDE_SELF)
- TagUnitMap.remove(m_caster);
}
void Spell::SearchGOAreaTarget(std::list<GameObject*> &TagGOMap, float radius, SpellNotifyPushType type, SpellTargets TargetType, uint32 entry)
@@ -1989,9 +2011,9 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
switch(cur.GetTarget())
{
case TARGET_UNIT_CASTER:
- AddUnitTarget(m_caster, i);
+ AddUnitTarget(m_caster, i, false);
break;
- case TARGET_UNIT_CASTER_FISHING:
+ case TARGET_DEST_CASTER_FISHING:
{
float min_dis = m_spellInfo->GetMinRange(true);
float max_dis = m_spellInfo->GetMaxRange(true);
@@ -2014,8 +2036,8 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
if (Unit* unit = m_caster->ToTempSummon()->GetSummoner())
AddUnitTarget(unit, i);
break;
- case TARGET_UNIT_PARTY_CASTER:
- case TARGET_UNIT_RAID_CASTER:
+ case TARGET_UNIT_CASTER_AREA_PARTY:
+ case TARGET_UNIT_CASTER_AREA_RAID:
pushType = PUSH_CASTER_CENTER;
break;
case TARGET_UNIT_VEHICLE:
@@ -2064,24 +2086,24 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
m_targets.SetUnitTarget(magnet);
pushType = PUSH_CHAIN;
break;
- case TARGET_UNIT_CHAINHEAL:
+ case TARGET_UNIT_TARGET_CHAINHEAL_ALLY:
pushType = PUSH_CHAIN;
break;
case TARGET_UNIT_TARGET_ALLY:
- AddUnitTarget(target, i);
+ AddUnitTarget(target, i, false);
break;
case TARGET_UNIT_TARGET_RAID:
case TARGET_UNIT_TARGET_PARTY:
case TARGET_UNIT_TARGET_MINIPET:
if (IsValidSingleTargetSpell(target))
- AddUnitTarget(target, i);
+ AddUnitTarget(target, i, false);
break;
case TARGET_UNIT_TARGET_PASSENGER:
if (target->IsOnVehicle(m_caster))
- AddUnitTarget(target, i);
+ AddUnitTarget(target, i, false);
break;
- case TARGET_UNIT_TARGET_ALLY_PARTY:
- case TARGET_UNIT_TARGET_CLASS_RAID:
+ case TARGET_UNIT_LASTTARGET_AREA_PARTY:
+ case TARGET_UNIT_TARGET_AREA_RAID_CLASS:
pushType = PUSH_CASTER_CENTER; // not real
break;
default:
@@ -2158,7 +2180,7 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
m_targets.SetSrc(*m_caster);
break;
}
- else if (cur.GetTarget() == TARGET_DST_CASTER)
+ else if (cur.GetTarget() == TARGET_DEST_CASTER)
{
m_targets.SetDst(*m_caster);
break;
@@ -2167,7 +2189,7 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
float angle, dist;
float objSize = m_caster->GetObjectSize();
- if (cur.GetTarget() == TARGET_MINION)
+ if (cur.GetTarget() == TARGET_DEST_CASTER_SUMMON)
dist = 0.0f;
else
dist = m_spellInfo->Effects[i].CalcRadius(m_caster);
@@ -2183,7 +2205,7 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
case TARGET_DEST_CASTER_BACK_LEFT: angle = static_cast<float>(-3*M_PI/4); break;
case TARGET_DEST_CASTER_BACK_RIGHT: angle = static_cast<float>(3*M_PI/4); break;
case TARGET_DEST_CASTER_FRONT_RIGHT:angle = static_cast<float>(M_PI/4); break;
- case TARGET_MINION:
+ case TARGET_DEST_CASTER_SUMMON:
case TARGET_DEST_CASTER_FRONT_LEAP:
case TARGET_DEST_CASTER_FRONT: angle = 0.0f; break;
case TARGET_DEST_CASTER_BACK: angle = static_cast<float>(M_PI); break;
@@ -2211,7 +2233,7 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
break;
}
- if (cur.GetTarget() == TARGET_DST_TARGET_ENEMY || cur.GetTarget() == TARGET_DEST_TARGET_ANY)
+ if (cur.GetTarget() == TARGET_DEST_TARGET_ENEMY || cur.GetTarget() == TARGET_DEST_TARGET_ANY)
{
m_targets.SetDst(*target);
break;
@@ -2277,7 +2299,7 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
}
float dist = m_spellInfo->Effects[i].CalcRadius(m_caster);
- if (cur.GetTarget() == TARGET_DEST_DEST_RANDOM || cur.GetTarget() == TARGET_DEST_DEST_RANDOM_DIR_DIST)
+ if (cur.GetTarget() == TARGET_DEST_DEST_RANDOM || cur.GetTarget() == TARGET_DEST_DEST_RADIUS)
dist *= (float)rand_norm();
// must has dst, no need to set flag
@@ -2291,7 +2313,7 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
{
switch(cur.GetTarget())
{
- case TARGET_DST_DB:
+ case TARGET_DEST_DB:
if (SpellTargetPosition const* st = sSpellMgr->GetSpellTargetPosition(m_spellInfo->Id))
{
//TODO: fix this check
@@ -2309,11 +2331,11 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
m_targets.SetDst(target ? *target : *m_caster);
}
break;
- case TARGET_DST_HOME:
+ case TARGET_DEST_HOME:
if (m_caster->GetTypeId() == TYPEID_PLAYER)
m_targets.SetDst(m_caster->ToPlayer()->m_homebindX, m_caster->ToPlayer()->m_homebindY, m_caster->ToPlayer()->m_homebindZ, m_caster->ToPlayer()->GetOrientation(), m_caster->ToPlayer()->m_homebindMapId);
break;
- case TARGET_DST_NEARBY_ENTRY:
+ case TARGET_DEST_NEARBY_ENTRY:
{
float range = m_spellInfo->GetMaxRange(m_spellInfo->IsPositive());
if (modOwner) modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RANGE, range, this);
@@ -2366,11 +2388,11 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
{
switch (cur.GetTarget())
{
- case TARGET_GAMEOBJECT:
+ case TARGET_GAMEOBJECT_TARGET:
if (m_targets.GetGOTarget())
AddGOTarget(m_targets.GetGOTarget(), i);
break;
- case TARGET_GAMEOBJECT_ITEM:
+ case TARGET_GAMEOBJECT_ITEM_TARGET:
if (m_targets.GetGOTargetGUID())
AddGOTarget(m_targets.GetGOTarget(), i);
else if (m_targets.GetItemTarget())
@@ -2417,7 +2439,7 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
if (modOwner) modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RANGE, range, this);
SearchChainTarget(unitList, range, maxTargets, SPELL_TARGETS_ENEMY);
break;
- case TARGET_UNIT_CHAINHEAL:
+ case TARGET_UNIT_TARGET_CHAINHEAL_ALLY:
case TARGET_UNIT_NEARBY_ALLY: // fix me
case TARGET_UNIT_NEARBY_PARTY:
case TARGET_UNIT_NEARBY_RAID:
@@ -2432,10 +2454,10 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
CallScriptAfterUnitTargetSelectHandlers(unitList, SpellEffIndex(i));
for (std::list<Unit*>::iterator itr = unitList.begin(); itr != unitList.end(); ++itr)
- AddUnitTarget(*itr, i);
+ AddUnitTarget(*itr, i, false);
}
else
- AddUnitTarget(target, i);
+ AddUnitTarget(target, i, false);
}
else if (pushType)
{
@@ -2447,29 +2469,29 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
SpellTargets targetType;
switch(cur.GetTarget())
{
- case TARGET_UNIT_AREA_ENEMY_SRC:
- case TARGET_UNIT_AREA_ENEMY_DST:
- case TARGET_UNIT_CONE_ENEMY:
- case TARGET_UNIT_CONE_ENEMY_UNKNOWN:
- case TARGET_UNIT_AREA_PATH:
+ case TARGET_UNIT_SRC_AREA_ENEMY:
+ case TARGET_UNIT_DEST_AREA_ENEMY:
+ case TARGET_UNIT_CONE_ENEMY_24:
+ case TARGET_UNIT_CONE_ENEMY_54:
+ case TARGET_UNIT_CONE_ENEMY_104:
radius = m_spellInfo->Effects[i].CalcRadius();
targetType = SPELL_TARGETS_ENEMY;
break;
- case TARGET_UNIT_AREA_ALLY_SRC:
- case TARGET_UNIT_AREA_ALLY_DST:
+ case TARGET_UNIT_SRC_AREA_ALLY:
+ case TARGET_UNIT_DEST_AREA_ALLY:
case TARGET_UNIT_CONE_ALLY:
radius = m_spellInfo->Effects[i].CalcRadius();
targetType = SPELL_TARGETS_ALLY;
break;
- case TARGET_UNIT_AREA_ENTRY_DST:
- case TARGET_UNIT_AREA_ENTRY_SRC:
+ case TARGET_UNIT_DEST_AREA_ENTRY:
+ case TARGET_UNIT_SRC_AREA_ENTRY:
case TARGET_UNIT_CONE_ENTRY: // fix me
radius = m_spellInfo->Effects[i].CalcRadius();
targetType = SPELL_TARGETS_ENTRY;
break;
- case TARGET_GAMEOBJECT_AREA_SRC:
- case TARGET_GAMEOBJECT_AREA_DST:
- case TARGET_GAMEOBJECT_AREA_PATH:
+ case TARGET_GAMEOBJECT_SRC_AREA:
+ case TARGET_GAMEOBJECT_DEST_AREA:
+ case TARGET_GAMEOBJECT_CONE:
radius = m_spellInfo->Effects[i].CalcRadius();
targetType = SPELL_TARGETS_GO;
break;
@@ -2539,7 +2561,6 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
// Search for ghoul if our ghoul or dead body not valid unit target
if (!(m_targets.GetUnitTarget() && ((m_targets.GetUnitTarget()->GetEntry() == 26125 && m_targets.GetUnitTarget()->GetOwnerGUID() == m_caster->GetGUID())
|| (m_targets.GetUnitTarget()->getDeathState() == CORPSE
- && m_targets.GetUnitTarget()->GetDisplayId() == m_targets.GetUnitTarget()->GetNativeDisplayId()
&& m_targets.GetUnitTarget()->GetTypeId() == TYPEID_UNIT
&& !(m_targets.GetUnitTarget()->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL)
&& m_targets.GetUnitTarget()->GetDisplayId() == m_targets.GetUnitTarget()->GetNativeDisplayId()))))
@@ -2615,20 +2636,20 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
default:
switch (cur.GetTarget())
{
- case TARGET_UNIT_AREA_PARTY_SRC:
- case TARGET_UNIT_AREA_PARTY_DST:
+ case TARGET_UNIT_SRC_AREA_PARTY:
+ case TARGET_UNIT_DEST_AREA_PARTY:
m_caster->GetPartyMemberInDist(unitList, radius); //fix me
break;
- case TARGET_UNIT_TARGET_ALLY_PARTY:
+ case TARGET_UNIT_LASTTARGET_AREA_PARTY:
m_targets.GetUnitTarget()->GetPartyMemberInDist(unitList, radius);
break;
- case TARGET_UNIT_PARTY_CASTER:
+ case TARGET_UNIT_CASTER_AREA_PARTY:
m_caster->GetPartyMemberInDist(unitList, radius);
break;
- case TARGET_UNIT_RAID_CASTER:
+ case TARGET_UNIT_CASTER_AREA_RAID:
m_caster->GetRaidMember(unitList, radius);
break;
- case TARGET_UNIT_TARGET_CLASS_RAID:
+ case TARGET_UNIT_TARGET_AREA_RAID_CLASS:
{
Player* targetPlayer = m_targets.GetUnitTarget() && m_targets.GetUnitTarget()->GetTypeId() == TYPEID_PLAYER
? (Player*)m_targets.GetUnitTarget() : NULL;
@@ -2792,7 +2813,7 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur)
CallScriptAfterUnitTargetSelectHandlers(unitList, SpellEffIndex(i));
for (std::list<Unit*>::iterator itr = unitList.begin(); itr != unitList.end(); ++itr)
- AddUnitTarget(*itr, i);
+ AddUnitTarget(*itr, i, false);
}
if (!gobjectList.empty())
@@ -2819,25 +2840,8 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered
else
m_castItemGUID = 0;
- m_targets = *targets;
-
- if (!m_targets.GetUnitTargetGUID() && m_spellInfo->Targets & TARGET_FLAG_UNIT)
- {
- Unit* target = NULL;
- if (m_caster->GetTypeId() == TYPEID_UNIT)
- target = m_caster->getVictim();
- else
- target = ObjectAccessor::GetUnit(*m_caster, m_caster->ToPlayer()->GetSelection());
+ InitExplicitTargets(*targets);
- if (target && IsValidSingleTargetSpell(target))
- m_targets.SetUnitTarget(target);
- else
- {
- SendCastResult(SPELL_FAILED_BAD_TARGETS);
- finish(false);
- return;
- }
- }
if (Player* plrCaster = m_caster->GetCharmerOrOwnerPlayerOrPlayerItself())
{
//check for special spell conditions
@@ -2851,29 +2855,6 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered
return;
}
}
- if (!m_targets.HasSrc() && m_spellInfo->Targets & TARGET_FLAG_SOURCE_LOCATION)
- m_targets.SetSrc(*m_caster);
-
- if (!m_targets.HasDst() && m_spellInfo->Targets & TARGET_FLAG_DEST_LOCATION)
- {
- Unit* target = m_targets.GetUnitTarget();
- if (!target)
- {
- if (m_caster->GetTypeId() == TYPEID_UNIT)
- target = m_caster->getVictim();
- else
- target = ObjectAccessor::GetUnit(*m_caster, m_caster->ToPlayer()->GetSelection());
- }
-
- if (target)
- m_targets.SetDst(*target);
- else
- {
- SendCastResult(SPELL_FAILED_BAD_TARGETS);
- finish(false);
- return;
- }
- }
// Fill aura scaling information
if (m_caster->IsControlledByPlayer() && !m_spellInfo->IsPassive() && m_spellInfo->SpellLevel && !m_spellInfo->IsChanneled() && !(_triggeredCastFlags & TRIGGERED_IGNORE_AURA_SCALING))
@@ -3877,15 +3858,6 @@ void Spell::SendSpellGo()
data << uint32(castFlags); // cast flags
data << uint32(getMSTime()); // timestamp
- /*
- // statement below seems to be wrong - i've seen spells with both unit and dest target
- // Can't have TARGET_FLAG_UNIT when *_LOCATION is present - it breaks missile visuals
- if (m_targets.GetTargetMask() & (TARGET_FLAG_SOURCE_LOCATION | TARGET_FLAG_DEST_LOCATION))
- m_targets.setTargetMask(m_targets.GetTargetMask() & ~TARGET_FLAG_UNIT);
- else if (m_targets.getIntTargetFlags() & FLAG_INT_UNIT)
- m_targets.setTargetMask(m_targets.GetTargetMask() | TARGET_FLAG_UNIT);
- */
-
WriteSpellGoTargets(&data);
m_targets.Write(data);
@@ -4594,7 +4566,7 @@ void Spell::HandleEffects(Unit *pUnitTarget, Item *pItemTarget, GameObject *pGOT
SpellCastResult Spell::CheckCast(bool strict)
{
// check death state
- if (!(_triggeredCastFlags & TRIGGERED_IGNORE_CASTER_AURASTATE) && !m_caster->isAlive() && !(m_spellInfo->Attributes & SPELL_ATTR0_PASSIVE) && !(m_spellInfo->Attributes & SPELL_ATTR0_CASTABLE_WHILE_DEAD))
+ if (!m_caster->isAlive() && !(m_spellInfo->Attributes & SPELL_ATTR0_PASSIVE) && !(m_spellInfo->Attributes & SPELL_ATTR0_CASTABLE_WHILE_DEAD))
return SPELL_FAILED_CASTER_DEAD;
// check cooldowns to prevent cheating
@@ -4736,91 +4708,29 @@ SpellCastResult Spell::CheckCast(bool strict)
return SPELL_FAILED_DONT_REPORT;
}
- Unit* target = m_targets.GetUnitTarget();
- // In pure self-cast spells, the client won't send any unit target
- if (!target && (m_targets.GetTargetMask() == TARGET_FLAG_SELF || m_targets.GetTargetMask() & TARGET_FLAG_UNIT_ALLY)) // TARGET_FLAG_SELF == 0, remember!
- target = m_caster;
-
- if (target)
+ if (Unit* target = m_targets.GetUnitTarget())
{
- // target state requirements (not allowed state), apply to self also
- if (!(_triggeredCastFlags & TRIGGERED_IGNORE_TARGET_AURASTATE) && m_spellInfo->TargetAuraStateNot && target->HasAuraState(AuraStateType(m_spellInfo->TargetAuraStateNot), m_spellInfo, m_caster))
- return SPELL_FAILED_TARGET_AURASTATE;
-
- if (m_spellInfo->TargetAuraSpell && !target->HasAura(sSpellMgr->GetSpellIdForDifficulty(m_spellInfo->TargetAuraSpell, m_caster)))
- return SPELL_FAILED_TARGET_AURASTATE;
-
- if (m_spellInfo->ExcludeTargetAuraSpell && target->HasAura(sSpellMgr->GetSpellIdForDifficulty(m_spellInfo->ExcludeTargetAuraSpell, m_caster)))
- return SPELL_FAILED_TARGET_AURASTATE;
-
- if (!IsTriggered() && target == m_caster && m_spellInfo->AttributesEx & SPELL_ATTR1_CANT_TARGET_SELF)
- return SPELL_FAILED_BAD_TARGETS;
-
- bool non_caster_target = target != m_caster && m_spellInfo->IsRequiringSelectedTarget();
+ SpellCastResult castResult = m_spellInfo->CheckTarget(m_caster, target, false);
+ if (castResult != SPELL_CAST_OK)
+ return castResult;
- if (non_caster_target)
+ if (target != m_caster)
{
- // target state requirements (apply to non-self only), to allow cast affects to self like Dirty Deeds
- if (!(_triggeredCastFlags & TRIGGERED_IGNORE_TARGET_AURASTATE) && m_spellInfo->TargetAuraState && !target->HasAuraState(AuraStateType(m_spellInfo->TargetAuraState), m_spellInfo, m_caster))
- return SPELL_FAILED_TARGET_AURASTATE;
-
- // Not allow casting on flying player or on vehicle player (if caster isnt vehicle)
- if (target->HasUnitState(UNIT_STAT_IN_FLIGHT) /*|| (target->HasUnitState(UNIT_STAT_ONVEHICLE) && target->GetVehicleBase() != m_caster)*/)
- return SPELL_FAILED_BAD_TARGETS;
-
- if (!(_triggeredCastFlags & TRIGGERED_IGNORE_TARGET_DETECTABILITY) && !m_caster->canSeeOrDetect(target))
- return SPELL_FAILED_BAD_TARGETS;
-
- if (m_caster->GetTypeId() == TYPEID_PLAYER)
- {
- // Do not allow these spells to target creatures not tapped by us (Banish, Polymorph, many quest spells)
- if (m_spellInfo->AttributesEx2 & SPELL_ATTR2_CANT_TARGET_TAPPED)
- if (Creature *targetCreature = target->ToCreature())
- if (targetCreature->hasLootRecipient() && !targetCreature->isTappedBy(m_caster->ToPlayer()))
- return SPELL_FAILED_CANT_CAST_ON_TAPPED;
-
- if (m_spellInfo->AttributesCu & SPELL_ATTR0_CU_PICKPOCKET)
- {
- if (target->GetTypeId() == TYPEID_PLAYER)
- return SPELL_FAILED_BAD_TARGETS;
- else if ((target->GetCreatureTypeMask() & CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD) == 0)
- return SPELL_FAILED_TARGET_NO_POCKETS;
- }
+ // Must be behind the target
+ if ((m_spellInfo->AttributesCu & SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET) && target->HasInArc(static_cast<float>(M_PI), m_caster))
+ return SPELL_FAILED_NOT_BEHIND;
- // Not allow disarm unarmed player
- if (m_spellInfo->Mechanic == MECHANIC_DISARM)
- {
- if (target->GetTypeId() == TYPEID_PLAYER)
- {
- Player* player = target->ToPlayer();
- if (!player->GetWeaponForAttack(BASE_ATTACK) || !player->IsUseEquipedWeapon(true))
- return SPELL_FAILED_TARGET_NO_WEAPONS;
- }
- else if (!target->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID))
- return SPELL_FAILED_TARGET_NO_WEAPONS;
- }
- }
+ // Target must be facing you
+ if ((m_spellInfo->AttributesCu & SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER) && !target->HasInArc(static_cast<float>(M_PI), m_caster))
+ return SPELL_FAILED_NOT_INFRONT;
- if (!(_triggeredCastFlags & TRIGGERED_IGNORE_LOS) && VMAP::VMapFactory::checkSpellForLoS(m_spellInfo->Id) && !m_caster->IsWithinLOSInMap(target))
+ if (!(m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) && VMAP::VMapFactory::checkSpellForLoS(m_spellInfo->Id) && !m_caster->IsWithinLOSInMap(target))
return SPELL_FAILED_LINE_OF_SIGHT;
-
}
- else if (m_caster == target)
+ else
{
if (m_caster->GetTypeId() == TYPEID_PLAYER) // Target - is player caster
{
- // Additional check for some spells
- // If 0 spell effect empty - client not send target data (need use selection)
- // TODO: check it on next client version
- if (m_targets.GetTargetMask() == TARGET_FLAG_SELF &&
- m_spellInfo->Effects[1].TargetA.GetTarget() == TARGET_UNIT_TARGET_ENEMY)
- {
- target = m_caster->GetUnit(*m_caster, m_caster->ToPlayer()->GetSelection());
- if (target)
- m_targets.SetUnitTarget(target);
- else
- return SPELL_FAILED_BAD_TARGETS;
- }
// Lay on Hands - cannot be self-cast on paladin with Forbearance or after using Avenging Wrath
if (m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && m_spellInfo->SpellFamilyFlags[0] & 0x0008000)
if (target->HasAura(61988)) // Immunity shield marker
@@ -4828,7 +4738,7 @@ SpellCastResult Spell::CheckCast(bool strict)
}
}
- // check pet presents
+ // check pet presence
for (int j = 0; j < MAX_SPELL_EFFECTS; ++j)
{
if (m_spellInfo->Effects[j].TargetA.GetTarget() == TARGET_UNIT_PET)
@@ -4844,36 +4754,6 @@ SpellCastResult Spell::CheckCast(bool strict)
break;
}
}
-
- // check creature type
- // ignore self casts (including area casts when caster selected as target)
- if (non_caster_target)
- {
- if (!CheckTargetCreatureType(target))
- {
- if (target->GetTypeId() == TYPEID_PLAYER)
- return SPELL_FAILED_TARGET_IS_PLAYER;
- else
- return SPELL_FAILED_BAD_TARGETS;
- }
-
- // Must be behind the target
- if ((m_spellInfo->AttributesCu & SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET) && target->HasInArc(static_cast<float>(M_PI), m_caster))
- return SPELL_FAILED_NOT_BEHIND;
-
- // Target must be facing you
- if ((m_spellInfo->AttributesCu & SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER) && !target->HasInArc(static_cast<float>(M_PI), m_caster))
- return SPELL_FAILED_NOT_INFRONT;
-
- // Target must not be in combat
- if (m_spellInfo->AttributesEx & SPELL_ATTR1_NOT_IN_COMBAT_TARGET && target->isInCombat())
- return SPELL_FAILED_TARGET_AFFECTING_COMBAT;
- }
-
- if (target)
- if (m_spellInfo->IsPositive())
- if (target->IsImmunedToSpell(m_spellInfo))
- return SPELL_FAILED_TARGET_AURASTATE;
}
// Spell casted only on battleground
@@ -5127,13 +5007,13 @@ SpellCastResult Spell::CheckCast(bool strict)
}
case SPELL_EFFECT_OPEN_LOCK:
{
- if (m_spellInfo->Effects[i].TargetA.GetTarget() != TARGET_GAMEOBJECT &&
- m_spellInfo->Effects[i].TargetA.GetTarget() != TARGET_GAMEOBJECT_ITEM)
+ if (m_spellInfo->Effects[i].TargetA.GetTarget() != TARGET_GAMEOBJECT_TARGET &&
+ m_spellInfo->Effects[i].TargetA.GetTarget() != TARGET_GAMEOBJECT_ITEM_TARGET)
break;
if (m_caster->GetTypeId() != TYPEID_PLAYER // only players can open locks, gather etc.
- // we need a go target in case of TARGET_GAMEOBJECT
- || (m_spellInfo->Effects[i].TargetA.GetTarget() == TARGET_GAMEOBJECT && !m_targets.GetGOTarget()))
+ // we need a go target in case of TARGET_GAMEOBJECT_TARGET
+ || (m_spellInfo->Effects[i].TargetA.GetTarget() == TARGET_GAMEOBJECT_TARGET && !m_targets.GetGOTarget()))
return SPELL_FAILED_BAD_TARGETS;
Item *pTempItem = NULL;
@@ -5145,8 +5025,8 @@ SpellCastResult Spell::CheckCast(bool strict)
else if (m_targets.GetTargetMask() & TARGET_FLAG_ITEM)
pTempItem = m_caster->ToPlayer()->GetItemByGuid(m_targets.GetItemTargetGUID());
- // we need a go target, or an openable item target in case of TARGET_GAMEOBJECT_ITEM
- if (m_spellInfo->Effects[i].TargetA.GetTarget() == TARGET_GAMEOBJECT_ITEM &&
+ // we need a go target, or an openable item target in case of TARGET_GAMEOBJECT_ITEM_TARGET
+ if (m_spellInfo->Effects[i].TargetA.GetTarget() == TARGET_GAMEOBJECT_ITEM_TARGET &&
!m_targets.GetGOTarget() &&
(!pTempItem || !pTempItem->GetTemplate()->LockID || !pTempItem->IsLocked()))
return SPELL_FAILED_BAD_TARGETS;
@@ -5544,46 +5424,41 @@ SpellCastResult Spell::CheckCast(bool strict)
SpellCastResult Spell::CheckPetCast(Unit* target)
{
- if (!m_caster->isAlive() && !(m_spellInfo->Attributes & SPELL_ATTR0_CASTABLE_WHILE_DEAD))
- return SPELL_FAILED_CASTER_DEAD;
-
if (m_caster->HasUnitState(UNIT_STAT_CASTING) && !(_triggeredCastFlags & TRIGGERED_IGNORE_CAST_IN_PROGRESS)) //prevent spellcast interruption by another spellcast
return SPELL_FAILED_SPELL_IN_PROGRESS;
- if (m_caster->isInCombat() && !m_spellInfo->CanBeUsedInCombat())
- return SPELL_FAILED_AFFECTING_COMBAT;
- //dead owner (pets still alive when owners ressed?)
- if (Unit *owner = m_caster->GetCharmerOrOwner())
- if (!owner->isAlive())
- return SPELL_FAILED_CASTER_DEAD;
+ // dead owner (pets still alive when owners ressed?)
+ if (Unit *owner = m_caster->GetCharmerOrOwner())
+ if (!owner->isAlive())
+ return SPELL_FAILED_CASTER_DEAD;
- if (!target && m_targets.GetUnitTarget())
- target = m_targets.GetUnitTarget();
+ if (!target && m_targets.GetUnitTarget())
+ target = m_targets.GetUnitTarget();
- for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ {
+ if (m_spellInfo->Effects[i].TargetA.GetType() == TARGET_TYPE_UNIT_TARGET
+ || m_spellInfo->Effects[i].TargetA.GetType() == TARGET_TYPE_DEST_TARGET)
{
- if (m_spellInfo->Effects[i].TargetA.GetType() == TARGET_TYPE_UNIT_TARGET
- || m_spellInfo->Effects[i].TargetA.GetType() == TARGET_TYPE_DEST_TARGET)
- {
- if (!target)
- return SPELL_FAILED_BAD_IMPLICIT_TARGETS;
- m_targets.SetUnitTarget(target);
- break;
- }
+ if (!target)
+ return SPELL_FAILED_BAD_IMPLICIT_TARGETS;
+ m_targets.SetUnitTarget(target);
+ break;
}
+ }
- Unit* _target = m_targets.GetUnitTarget();
+ Unit* _target = m_targets.GetUnitTarget();
- if (_target) //for target dead/target not valid
- {
- if (!_target->isAlive())
- return SPELL_FAILED_BAD_TARGETS;
+ // for target dead/target not valid
+ if (_target)
+ {
+ if (!IsValidSingleTargetSpell(_target))
+ return SPELL_FAILED_BAD_TARGETS;
+ }
- if (!IsValidSingleTargetSpell(_target))
- return SPELL_FAILED_BAD_TARGETS;
- }
- //cooldown
- if (m_caster->ToCreature()->HasSpellCooldown(m_spellInfo->Id))
+ // cooldown
+ if (Creature const* creatureCaster = m_caster->ToCreature())
+ if (creatureCaster->HasSpellCooldown(m_spellInfo->Id))
return SPELL_FAILED_NOT_READY;
return CheckCast(true);
@@ -6459,38 +6334,7 @@ void Spell::UpdatePointers()
m_targets.Update(m_caster);
}
-bool Spell::CheckTargetCreatureType(Unit* target) const
-{
- uint32 spellCreatureTargetMask = m_spellInfo->TargetCreatureType;
-
- // Curse of Doom & Exorcism: not find another way to fix spell target check :/
- if (m_spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK && m_spellInfo->Category == 1179)
- {
- // not allow cast at player
- if (target->GetTypeId() == TYPEID_PLAYER)
- return false;
-
- spellCreatureTargetMask = 0x7FF;
- }
-
- // Dismiss Pet and Taming Lesson skipped
- if (m_spellInfo->Id == 2641 || m_spellInfo->Id == 23356)
- spellCreatureTargetMask = 0;
-
- // Polymorph and Grounding Totem
- if (target->GetEntry() == 5925 && m_spellInfo->SpellFamilyName == SPELLFAMILY_MAGE && (m_spellInfo->SpellFamilyFlags[0] & 0x1000000) && m_spellInfo->Effects[0].ApplyAuraName == SPELL_AURA_MOD_CONFUSE)
- return true;
-
- if (spellCreatureTargetMask)
- {
- uint32 TargetCreatureType = target->GetCreatureTypeMask();
-
- return !TargetCreatureType || (spellCreatureTargetMask & TargetCreatureType);
- }
- return true;
-}
-
-CurrentSpellTypes Spell::GetCurrentContainer()
+CurrentSpellTypes Spell::GetCurrentContainer() const
{
if (IsNextMeleeSwingSpell())
return(CURRENT_MELEE_SPELL);
@@ -6502,52 +6346,10 @@ CurrentSpellTypes Spell::GetCurrentContainer()
return(CURRENT_GENERIC_SPELL);
}
-bool Spell::CheckTarget(Unit* target, uint32 eff)
+bool Spell::CheckEffectTarget(Unit const* target, uint32 eff) const
{
- // Check targets for creature type mask and remove not appropriate (skip explicit self target case, maybe need other explicit targets)
- if (m_spellInfo->Effects[eff].TargetA.GetTarget() != TARGET_UNIT_CASTER)
- {
- if (!CheckTargetCreatureType(target))
- return false;
- }
-
- // Check Aura spell req (need for AoE spells)
- if (m_spellInfo->TargetAuraSpell && !target->HasAura(sSpellMgr->GetSpellIdForDifficulty(m_spellInfo->TargetAuraSpell, m_caster)))
- return false;
- if (m_spellInfo->ExcludeTargetAuraSpell && target->HasAura(sSpellMgr->GetSpellIdForDifficulty(m_spellInfo->ExcludeTargetAuraSpell, m_caster)))
- return false;
-
- // Check targets for not_selectable unit flag and remove
- // A player can cast spells on his pet (or other controlled unit) though in any state
- if (target != m_caster && target->GetCharmerOrOwnerGUID() != m_caster->GetGUID())
- {
- // any unattackable target skipped
- if (target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
- return false;
-
- // unselectable targets skipped in all cases except TARGET_UNIT_NEARBY_ENTRY targeting
- // in case TARGET_UNIT_NEARBY_ENTRY target selected by server always and can't be cheated
- /*if (target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE) &&
- m_spellInfo->EffectImplicitTargetA[eff] != TARGET_UNIT_NEARBY_ENTRY &&
- m_spellInfo->EffectImplicitTargetB[eff] != TARGET_UNIT_NEARBY_ENTRY)
- return false;*/
- }
-
- //Check player targets and remove if in GM mode or GM invisibility (for not self casting case)
- if (target != m_caster && target->GetTypeId() == TYPEID_PLAYER)
- {
- if (!target->ToPlayer()->IsVisible())
- return false;
-
- if (target->ToPlayer()->isGameMaster() && !m_spellInfo->IsPositive())
- return false;
- }
-
switch(m_spellInfo->Effects[eff].ApplyAuraName)
{
- case SPELL_AURA_NONE:
- default:
- break;
case SPELL_AURA_MOD_POSSESS:
case SPELL_AURA_MOD_CHARM:
case SPELL_AURA_MOD_POSSESS_PET:
@@ -6562,22 +6364,17 @@ bool Spell::CheckTarget(Unit* target, uint32 eff)
if ((int32)target->getLevel() > damage)
return false;
break;
+ default:
+ break;
}
- //Do not do further checks for triggered spells
- if (IsTriggered())
+ if (m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS)
return true;
+ // todo: shit below shouldn't be here, but it's temporary
//Check targets for LOS visibility (except spells without range limitations)
switch(m_spellInfo->Effects[eff].Effect)
{
- case SPELL_EFFECT_SUMMON_RAF_FRIEND:
- case SPELL_EFFECT_SUMMON_PLAYER: // from anywhere
- break;
- case SPELL_EFFECT_DUMMY:
- if (m_spellInfo->Id != 20577) // Cannibalize
- break;
- //fall through
case SPELL_EFFECT_RESURRECT_NEW:
// player far away, maybe his corpse near?
if (target != m_caster && !target->IsWithinLOSInMap(m_caster))
@@ -6605,8 +6402,6 @@ bool Spell::CheckTarget(Unit* target, uint32 eff)
caster = m_caster->GetMap()->GetGameObject(m_originalCasterGUID);
if (!caster)
caster = m_caster;
- if (target->GetEntry() == 5925)
- return true;
if (target != m_caster && !target->IsWithinLOSInMap(caster))
return false;
break;
@@ -6776,7 +6571,7 @@ bool Spell::IsValidSingleTargetEffect(Unit const* target, Targets type) const
case TARGET_UNIT_TARGET_ENEMY:
return !m_caster->IsFriendlyTo(target);
case TARGET_UNIT_TARGET_ALLY:
- case TARGET_UNIT_TARGET_ALLY_PARTY:
+ case TARGET_UNIT_LASTTARGET_AREA_PARTY:
return m_caster->IsFriendlyTo(target);
case TARGET_UNIT_TARGET_PARTY:
return m_caster != target && m_caster->IsInPartyWith(target);
@@ -6983,7 +6778,7 @@ SpellCastResult Spell::CanOpenLock(uint32 effIndex, uint32 lockId, SkillType& sk
// skill bonus provided by casting spell (mostly item spells)
// add the damage modifier from the spell casted (cheat lock / skeleton key etc.)
- if (m_spellInfo->Effects[effIndex].TargetA.GetTarget() == TARGET_GAMEOBJECT_ITEM || m_spellInfo->Effects[effIndex].TargetB.GetTarget() == TARGET_GAMEOBJECT_ITEM)
+ if (m_spellInfo->Effects[effIndex].TargetA.GetTarget() == TARGET_GAMEOBJECT_ITEM_TARGET || m_spellInfo->Effects[effIndex].TargetB.GetTarget() == TARGET_GAMEOBJECT_ITEM_TARGET)
skillValue += uint32(CalculateDamage(effIndex, NULL));
if (skillValue < reqSkillValue)
@@ -7393,7 +7188,7 @@ enum GCDLimits
MAX_GCD = 1500
};
-bool Spell::HasGlobalCooldown()
+bool Spell::HasGlobalCooldown() const
{
// Only player or controlled units have global cooldown
if (m_caster->GetCharmInfo())
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index e334f6d29f6..c0f3daf0664 100755
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -35,33 +35,6 @@ class ByteBuffer;
#define SPELL_CHANNEL_UPDATE_INTERVAL (1 * IN_MILLISECONDS)
-enum SpellCastTargetFlags
-{
- TARGET_FLAG_SELF = 0x00000000,
- TARGET_FLAG_UNUSED_1 = 0x00000001, // not used
- TARGET_FLAG_UNIT = 0x00000002, // pguid
- TARGET_FLAG_UNIT_RAID = 0x00000004, // not sent, used to validate target (if raid member)
- TARGET_FLAG_UNIT_PARTY = 0x00000008, // not sent, used to validate target (if party member)
- TARGET_FLAG_ITEM = 0x00000010, // pguid
- TARGET_FLAG_SOURCE_LOCATION = 0x00000020, // pguid, 3 float
- TARGET_FLAG_DEST_LOCATION = 0x00000040, // pguid, 3 float
- TARGET_FLAG_UNIT_ENEMY = 0x00000080, // not sent, used to validate target (if enemy)
- TARGET_FLAG_UNIT_ALLY = 0x00000100, // not sent, used to validate target (if ally)
- TARGET_FLAG_CORPSE_ENEMY = 0x00000200, // pguid
- TARGET_FLAG_UNIT_DEAD = 0x00000400, // not sent, used to validate target (if dead creature)
- TARGET_FLAG_GAMEOBJECT = 0x00000800, // pguid, used with TARGET_GAMEOBJECT
- TARGET_FLAG_TRADE_ITEM = 0x00001000, // pguid
- TARGET_FLAG_STRING = 0x00002000, // string
- TARGET_FLAG_GAMEOBJECT_ITEM = 0x00004000, // not sent, used with TARGET_GAMEOBJECT_ITEM
- TARGET_FLAG_CORPSE_ALLY = 0x00008000, // pguid
- TARGET_FLAG_UNIT_MINIPET = 0x00010000, // pguid, used to validate target (if non combat pet)
- TARGET_FLAG_GLYPH_SLOT = 0x00020000, // used in glyph spells
- TARGET_FLAG_UNK19 = 0x00040000, // sometimes appears with DEST_TARGET spells (may appear or not for a given spell)
- TARGET_FLAG_UNUSED20 = 0x00080000, // uint32 counter, loop { vec3 - screen position (?), guid }, not used so far
- TARGET_FLAG_UNIT_PASSENGER = 0x00100000, // guessed, used to validate target (if vehicle passenger)
-};
-#define MAX_TARGET_FLAGS 21
-
enum SpellCastFlags
{
CAST_FLAG_NONE = 0x00000000,
@@ -125,8 +98,6 @@ class SpellCastTargets
SpellCastTargets();
~SpellCastTargets();
- SpellCastTargets& operator=(const SpellCastTargets &target);
-
void Read(ByteBuffer& data, Unit* caster);
void Write(ByteBuffer& data);
@@ -136,26 +107,15 @@ class SpellCastTargets
uint64 GetUnitTargetGUID() const { return m_unitTargetGUID; }
Unit* GetUnitTarget() const { return m_unitTarget; }
void SetUnitTarget(Unit* target);
-
- Position const* GetSrc() const;
- void SetSrc(float x, float y, float z);
- void SetSrc(Position const& pos);
- void SetSrc(WorldObject const& wObj);
- void ModSrc(Position const& pos);
-
- WorldLocation const* GetDst() const;
- void SetDst(float x, float y, float z, float orientation, uint32 mapId = MAPID_INVALID);
- void SetDst(Position const& pos);
- void SetDst(WorldObject const& wObj);
- void SetDst(SpellCastTargets const& spellTargets);
- void ModDst(Position const& pos);
+ void RemoveUnitTarget();
uint64 GetGOTargetGUID() const { return m_GOTargetGUID; }
GameObject* GetGOTarget() const { return m_GOTarget; }
void SetGOTarget(GameObject* target);
+ void RemoveGOTarget();
uint64 GetCorpseTargetGUID() const { return m_CorpseTargetGUID; }
- void SetCorpseTarget(Corpse* corpse);
+ void RemoveCorpseTarget();
uint64 GetItemTargetGUID() const { return m_itemTargetGUID; }
Item* GetItemTarget() const { return m_itemTarget; }
@@ -164,6 +124,21 @@ class SpellCastTargets
void SetTradeItemTarget(Player* caster);
void UpdateTradeSlotItem();
+ Position const* GetSrc() const;
+ void SetSrc(float x, float y, float z);
+ void SetSrc(Position const& pos);
+ void SetSrc(WorldObject const& wObj);
+ void ModSrc(Position const& pos);
+ void RemoveSrc();
+
+ WorldLocation const* GetDst() const;
+ void SetDst(float x, float y, float z, float orientation, uint32 mapId = MAPID_INVALID);
+ void SetDst(Position const& pos);
+ void SetDst(WorldObject const& wObj);
+ void SetDst(SpellCastTargets const& spellTargets);
+ void ModDst(Position const& pos);
+ void RemoveDst();
+
bool IsEmpty() const { return m_GOTargetGUID == 0 && m_unitTargetGUID == 0 && m_itemTarget == 0 && m_CorpseTargetGUID == 0; }
bool HasSrc() const { return GetTargetMask() & TARGET_FLAG_SOURCE_LOCATION; }
bool HasDst() const { return GetTargetMask() & TARGET_FLAG_DEST_LOCATION; }
@@ -411,7 +386,7 @@ class Spell
SpellCastResult CheckRuneCost(uint32 runeCostID);
SpellCastResult CheckCasterAuras() const;
- int32 CalculateDamage(uint8 i, Unit* target) { return m_caster->CalculateSpellDamage(target, m_spellInfo, i, &m_spellValue->EffectBasePoints[i]); }
+ int32 CalculateDamage(uint8 i, Unit const* target) const { return m_caster->CalculateSpellDamage(target, m_spellInfo, i, &m_spellValue->EffectBasePoints[i]); }
bool HaveTargetsForEffect(uint8 effect) const;
void Delayed();
@@ -423,13 +398,14 @@ class Spell
void WriteSpellGoTargets(WorldPacket * data);
void WriteAmmoToPacket(WorldPacket * data);
+ void InitExplicitTargets(SpellCastTargets const& targets);
void SelectSpellTargets();
void SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur);
void SelectTrajTargets();
template<typename T> WorldObject* FindCorpseUsing();
- bool CheckTarget(Unit* target, uint32 eff);
+ bool CheckEffectTarget(Unit const* target, uint32 eff) const;
bool CanAutoCast(Unit* target);
void CheckSrc() { if (!m_targets.HasSrc()) m_targets.SetSrc(*m_caster); }
void CheckDst() { if (!m_targets.HasDst()) m_targets.SetDst(*m_caster); }
@@ -489,7 +465,7 @@ class Spell
bool IsNeedSendToClient() const;
- CurrentSpellTypes GetCurrentContainer();
+ CurrentSpellTypes GetCurrentContainer() const;
Unit* GetCaster() const { return m_caster; }
Unit* GetOriginalCaster() const { return m_originalCaster; }
@@ -498,13 +474,11 @@ class Spell
void UpdatePointers(); // must be used at call Spell code after time delay (non triggered spell cast/update spell call/etc)
- bool CheckTargetCreatureType(Unit* target) const;
-
void CleanupTargetList();
void SetSpellValue(SpellValueMod mod, int32 value);
protected:
- bool HasGlobalCooldown();
+ bool HasGlobalCooldown() const;
void TriggerGlobalCooldown();
void CancelGlobalCooldown();
@@ -614,8 +588,7 @@ class Spell
};
std::list<ItemTargetInfo> m_UniqueItemInfo;
- void AddUnitTarget(Unit* target, uint32 effIndex);
- void AddUnitTarget(uint64 unitGUID, uint32 effIndex);
+ void AddUnitTarget(Unit* target, uint32 effIndex, bool checkIfValid = true);
void AddGOTarget(GameObject* target, uint32 effIndex);
void AddGOTarget(uint64 goGUID, uint32 effIndex);
void AddItemTarget(Item* target, uint32 effIndex);
@@ -706,7 +679,6 @@ namespace Trinity
const Unit* const i_source;
uint32 i_entry;
const Position * const i_pos;
- bool i_requireDeadTarget;
SpellInfo const* i_spellProto;
SpellNotifierCreatureAndPlayer(Unit *source, std::list<Unit*> &data, float radius, SpellNotifyPushType type,
@@ -719,13 +691,11 @@ namespace Trinity
template<class T> inline void Visit(GridRefManager<T>& m)
{
- i_requireDeadTarget = i_spellProto ? bool(i_spellProto->AttributesEx3 & SPELL_ATTR3_REQUIRE_DEAD_TARGET) : false;
-
for (typename GridRefManager<T>::iterator itr = m.begin(); itr != m.end(); ++itr)
{
Unit* target = (Unit*)itr->getSource();
- if (!i_source->canSeeOrDetect(target, true))
+ if (i_spellProto->CheckTarget(i_source, target, true) != SPELL_CAST_OK)
continue;
switch (i_TargetType)
@@ -733,7 +703,10 @@ namespace Trinity
case SPELL_TARGETS_ENEMY:
if (target->isTotem())
continue;
- if (!target->isAttackableByAOE(i_spellProto))
+ // can't be checked in SpellInfo::CheckTarget - needs more research
+ if (target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE))
+ continue;
+ if (target->HasUnitState(UNIT_STAT_UNATTACKABLE))
continue;
if (i_source->IsControlledByPlayer())
{
@@ -751,12 +724,6 @@ namespace Trinity
continue;
if (!i_source->IsFriendlyTo(target))
continue;
- if (target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
- continue;
- if (target->GetTypeId() == TYPEID_PLAYER && target->ToPlayer()->isGameMaster())
- continue;
- if (target->isAlive() == i_requireDeadTarget)
- continue;
break;
case SPELL_TARGETS_ENTRY:
if (target->GetEntry()!= i_entry)
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 528bf8beebb..2d53cdd40c3 100755
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -816,10 +816,6 @@ void Spell::EffectDummy(SpellEffIndex effIndex)
}
return;
}
- case 20577: // Cannibalize
- if (unitTarget)
- m_caster->CastSpell(m_caster, 20578, false, NULL);
- return;
case 23019: // Crystal Prison Dummy DND
{
if (!unitTarget || !unitTarget->isAlive() || unitTarget->GetTypeId() != TYPEID_UNIT || unitTarget->ToCreature()->isPet())
@@ -1003,7 +999,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex)
}
case 47170: // Impale Leviroth
{
- if (!unitTarget && unitTarget->GetEntry() != 26452 && unitTarget->HealthAbovePct(95))
+ if (!unitTarget || (unitTarget->GetEntry() != 26452 && unitTarget->HealthAbovePct(95)))
return;
m_caster->DealDamage(unitTarget, unitTarget->CountPctFromMaxHealth(93));
@@ -1604,14 +1600,6 @@ void Spell::EffectForceCast(SpellEffIndex effIndex)
break;
}
}
-
- // temphack
- if (m_spellInfo->Id == 51888)
- {
- unitTarget->CastSpell(unitTarget, spellInfo->Id, true, NULL, NULL, m_originalCasterGUID);
- return;
- }
-
unitTarget->CastSpell(m_caster, spellInfo, true);
}
@@ -1949,7 +1937,7 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/)
else if (unitTarget->GetTypeId() == TYPEID_PLAYER)
unitTarget->ToPlayer()->TeleportTo(mapid, x, y, z, orientation, unitTarget == m_caster ? TELE_TO_SPELL : 0);
- // post effects for TARGET_DST_DB
+ // post effects for TARGET_DEST_DB
switch (m_spellInfo->Id)
{
// Dimensional Ripper - Everlook
@@ -3139,7 +3127,7 @@ void Spell::EffectDispel(SpellEffIndex effIndex)
if (aura->IsPassive())
continue;
- if ((aura->GetSpellInfo()->GetDispelMask()) & dispelMask)
+ if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)
{
if (aura->GetSpellInfo()->Dispel == DISPEL_MAGIC)
{
@@ -5062,27 +5050,18 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)
m_caster->ToPlayer()->learnSpell(discoveredSpell, false);
return;
}
- case 62428: // Load into Catapult
- {
- if (Vehicle* seat = m_caster->GetVehicleKit())
- if (Unit* passenger = seat->GetPassenger(0))
- if (Unit* demolisher = m_caster->GetVehicleBase())
- passenger->CastSpell(demolisher, damage, true);
- return;
- }
case 62482: // Grab Crate
{
if (unitTarget)
{
- if (Vehicle* seat = m_caster->GetVehicleKit())
+ if (Unit* seat = m_caster->GetVehicleBase())
{
- if (Unit* passenger = seat->GetPassenger(1))
- if (Creature* oldContainer = passenger->ToCreature())
- oldContainer->DisappearAndDie();
-
- // TODO: a hack, range = 11, should after some time cast, otherwise too far
- m_caster->CastSpell(seat->GetBase(), 62496, true);
- unitTarget->EnterVehicle(m_caster, 1);
+ if (Unit* parent = seat->GetVehicleBase())
+ {
+ // TODO: a hack, range = 11, should after some time cast, otherwise too far
+ m_caster->CastSpell(parent, 62496, true);
+ unitTarget->CastSpell(parent, m_spellInfo->Effects[EFFECT_0].CalcValue());
+ }
}
}
return;
@@ -6857,7 +6836,7 @@ void Spell::GetSummonPosition(uint32 i, Position &pos, float radius, uint32 coun
//This is a workaround. Do not have time to write much about it
switch (m_spellInfo->Effects[i].TargetA.GetTarget())
{
- case TARGET_MINION:
+ case TARGET_DEST_CASTER_SUMMON:
case TARGET_DEST_CASTER_RANDOM:
m_caster->GetNearPosition(pos, radius * (float)rand_norm(), (float)rand_norm()*static_cast<float>(2*M_PI));
break;
@@ -7033,7 +7012,7 @@ void Spell::EffectBind(SpellEffIndex effIndex)
uint32 area_id;
WorldLocation loc;
- if (m_spellInfo->Effects[effIndex].TargetA.GetTarget() == TARGET_DST_DB || m_spellInfo->Effects[effIndex].TargetB.GetTarget() == TARGET_DST_DB)
+ if (m_spellInfo->Effects[effIndex].TargetA.GetTarget() == TARGET_DEST_DB || m_spellInfo->Effects[effIndex].TargetB.GetTarget() == TARGET_DEST_DB)
{
SpellTargetPosition const* st = sSpellMgr->GetSpellTargetPosition(m_spellInfo->Id);
if (!st)
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index a4cddd607b6..9d36ca493a2 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -15,10 +15,36 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "SpellAuraDefines.h"
#include "SpellInfo.h"
#include "SpellMgr.h"
+#include "Spell.h"
#include "DBCStores.h"
+uint32 GetTargetFlagMask(SpellTargetObjectTypes objType)
+{
+ switch (objType)
+ {
+ case TARGET_OBJECT_TYPE_DEST:
+ return TARGET_FLAG_DEST_LOCATION;
+ case TARGET_OBJECT_TYPE_UNIT_AND_DEST:
+ return TARGET_FLAG_DEST_LOCATION | TARGET_FLAG_UNIT;
+ case TARGET_OBJECT_TYPE_CORPSE:
+ case TARGET_OBJECT_TYPE_UNIT:
+ return TARGET_FLAG_UNIT;
+ case TARGET_OBJECT_TYPE_GOBJ:
+ return TARGET_FLAG_GAMEOBJECT;
+ case TARGET_OBJECT_TYPE_GOBJ_ITEM:
+ return TARGET_FLAG_GAMEOBJECT_ITEM;
+ case TARGET_OBJECT_TYPE_ITEM:
+ return TARGET_FLAG_ITEM;
+ case TARGET_OBJECT_TYPE_SRC:
+ return TARGET_FLAG_SOURCE_LOCATION;
+ default:
+ return TARGET_FLAG_NONE;
+ }
+}
+
SpellImplicitTargetInfo::SpellImplicitTargetInfo(uint32 target)
{
_target = Targets(target);
@@ -26,7 +52,7 @@ SpellImplicitTargetInfo::SpellImplicitTargetInfo(uint32 target)
bool SpellImplicitTargetInfo::IsArea() const
{
- return Area[_target];
+ return GetSelectionCategory() == TARGET_SELECT_CATEGORY_AREA || GetSelectionCategory() == TARGET_SELECT_CATEGORY_CONE;
}
SpellSelectTargetTypes SpellImplicitTargetInfo::GetType() const
@@ -34,12 +60,145 @@ SpellSelectTargetTypes SpellImplicitTargetInfo::GetType() const
return Type[_target];
}
+SpellTargetSelectionCategories SpellImplicitTargetInfo::GetSelectionCategory() const
+{
+ return _data[_target].SelectionCategory;
+}
+
+SpellTargetReferenceTypes SpellImplicitTargetInfo::GetReferenceType() const
+{
+ return _data[_target].ReferenceType;
+}
+
+SpellTargetObjectTypes SpellImplicitTargetInfo::GetObjectType() const
+{
+ return _data[_target].ObjectType;
+}
+
+SpellTargetSelectionCheckTypes SpellImplicitTargetInfo::GetSelectionCheckType() const
+{
+ return _data[_target].SelectionCheckType;
+}
+
+SpellTargetDirectionTypes SpellImplicitTargetInfo::GetDirectionType() const
+{
+ return _data[_target].DirectionType;
+}
+
+float SpellImplicitTargetInfo::CalcDirectionAngle() const
+{
+ switch (GetDirectionType())
+ {
+ case TARGET_DIR_FRONT:
+ return 0.0f;
+ case TARGET_DIR_BACK:
+ return static_cast<float>(M_PI);
+ case TARGET_DIR_RIGHT:
+ return static_cast<float>(-M_PI/2);
+ case TARGET_DIR_LEFT:
+ return static_cast<float>(M_PI/2);
+ case TARGET_DIR_FRONT_RIGHT:
+ return static_cast<float>(M_PI/4);
+ case TARGET_DIR_BACK_RIGHT:
+ return static_cast<float>(-3*M_PI/4);
+ case TARGET_DIR_BACK_LEFT:
+ return static_cast<float>(3*M_PI/4);
+ case TARGET_DIR_FRONT_LEFT:
+ return static_cast<float>(M_PI/4);
+ case TARGET_DIR_RANDOM:
+ return float(rand_norm())*static_cast<float>(2*M_PI);
+ default:
+ return 0.0f;
+ }
+}
Targets SpellImplicitTargetInfo::GetTarget() const
{
return _target;
}
+uint32 SpellImplicitTargetInfo::GetExplicitTargetMask(bool& srcSet, bool& dstSet) const
+{
+ uint32 targetMask = 0;
+ if (GetTarget() == TARGET_DEST_TRAJ)
+ {
+ if (!srcSet)
+ targetMask = TARGET_FLAG_SOURCE_LOCATION;
+ if (!dstSet)
+ targetMask |= TARGET_FLAG_DEST_LOCATION;
+ }
+ else
+ {
+ switch (GetReferenceType())
+ {
+ case TARGET_REFERENCE_TYPE_SRC:
+ if (srcSet)
+ break;
+ targetMask = TARGET_FLAG_SOURCE_LOCATION;
+ break;
+ case TARGET_REFERENCE_TYPE_DEST:
+ if (dstSet)
+ break;
+ targetMask = TARGET_FLAG_DEST_LOCATION;
+ break;
+ case TARGET_REFERENCE_TYPE_TARGET:
+ switch (GetObjectType())
+ {
+ case TARGET_OBJECT_TYPE_GOBJ:
+ targetMask = TARGET_FLAG_GAMEOBJECT;
+ break;
+ case TARGET_OBJECT_TYPE_GOBJ_ITEM:
+ targetMask = TARGET_FLAG_GAMEOBJECT_ITEM;
+ break;
+ case TARGET_OBJECT_TYPE_UNIT_AND_DEST:
+ case TARGET_OBJECT_TYPE_UNIT:
+ case TARGET_OBJECT_TYPE_DEST:
+ switch (GetSelectionCheckType())
+ {
+ case TARGET_SELECT_CHECK_ENEMY:
+ targetMask = TARGET_FLAG_UNIT_ENEMY;
+ break;
+ case TARGET_SELECT_CHECK_ALLY:
+ targetMask = TARGET_FLAG_UNIT_ALLY;
+ break;
+ case TARGET_SELECT_CHECK_PARTY:
+ targetMask = TARGET_FLAG_UNIT_PARTY;
+ break;
+ case TARGET_SELECT_CHECK_RAID:
+ targetMask = TARGET_FLAG_UNIT_RAID;
+ break;
+ case TARGET_SELECT_CHECK_PASSENGER:
+ targetMask = TARGET_FLAG_UNIT_PASSENGER;
+ break;
+ default:
+ targetMask = TARGET_FLAG_UNIT;
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ switch (GetObjectType())
+ {
+ case TARGET_OBJECT_TYPE_SRC:
+ srcSet = true;
+ break;
+ case TARGET_OBJECT_TYPE_DEST:
+ case TARGET_OBJECT_TYPE_UNIT_AND_DEST:
+ dstSet = true;
+ break;
+ default:
+ break;
+ }
+ return targetMask;
+}
+
bool SpellImplicitTargetInfo::IsPosition(uint32 targetType)
{
switch (SpellImplicitTargetInfo::Type[targetType])
@@ -56,42 +215,10 @@ bool SpellImplicitTargetInfo::IsPosition(uint32 targetType)
bool SpellImplicitTargetInfo::InitStaticData()
{
- InitAreaData();
InitTypeData();
return true;
}
-void SpellImplicitTargetInfo::InitAreaData()
-{
- for (int32 i = 0; i < TOTAL_SPELL_TARGETS; ++i)
- {
- switch (i)
- {
- case TARGET_UNIT_AREA_ENEMY_DST:
- case TARGET_UNIT_AREA_ENEMY_SRC:
- case TARGET_UNIT_AREA_ALLY_DST:
- case TARGET_UNIT_AREA_ALLY_SRC:
- case TARGET_UNIT_AREA_ENTRY_DST:
- case TARGET_UNIT_AREA_ENTRY_SRC:
- case TARGET_UNIT_AREA_PARTY_DST:
- case TARGET_UNIT_AREA_PARTY_SRC:
- case TARGET_UNIT_TARGET_ALLY_PARTY:
- case TARGET_UNIT_PARTY_CASTER:
- case TARGET_UNIT_CONE_ENEMY:
- case TARGET_UNIT_CONE_ALLY:
- case TARGET_UNIT_CONE_ENEMY_UNKNOWN:
- case TARGET_UNIT_AREA_PATH:
- case TARGET_GAMEOBJECT_AREA_PATH:
- case TARGET_UNIT_RAID_CASTER:
- Area[i] = true;
- break;
- default:
- Area[i] = false;
- break;
- }
- }
-}
-
void SpellImplicitTargetInfo::InitTypeData()
{
for (uint8 i = 0; i < TOTAL_SPELL_TARGETS; ++i)
@@ -99,11 +226,11 @@ void SpellImplicitTargetInfo::InitTypeData()
switch (i)
{
case TARGET_UNIT_CASTER:
- case TARGET_UNIT_CASTER_FISHING:
+ case TARGET_DEST_CASTER_FISHING:
case TARGET_UNIT_MASTER:
case TARGET_UNIT_PET:
- case TARGET_UNIT_PARTY_CASTER:
- case TARGET_UNIT_RAID_CASTER:
+ case TARGET_UNIT_CASTER_AREA_PARTY:
+ case TARGET_UNIT_CASTER_AREA_RAID:
case TARGET_UNIT_VEHICLE:
case TARGET_UNIT_PASSENGER_0:
case TARGET_UNIT_PASSENGER_1:
@@ -123,9 +250,9 @@ void SpellImplicitTargetInfo::InitTypeData()
case TARGET_UNIT_TARGET_ENEMY:
case TARGET_UNIT_TARGET_PARTY:
case TARGET_UNIT_TARGET_PASSENGER:
- case TARGET_UNIT_TARGET_ALLY_PARTY:
- case TARGET_UNIT_TARGET_CLASS_RAID:
- case TARGET_UNIT_CHAINHEAL:
+ case TARGET_UNIT_LASTTARGET_AREA_PARTY:
+ case TARGET_UNIT_TARGET_AREA_RAID_CLASS:
+ case TARGET_UNIT_TARGET_CHAINHEAL_ALLY:
Type[i] = TARGET_TYPE_UNIT_TARGET;
break;
case TARGET_UNIT_NEARBY_ENEMY:
@@ -136,31 +263,31 @@ void SpellImplicitTargetInfo::InitTypeData()
case TARGET_GAMEOBJECT_NEARBY_ENTRY:
Type[i] = TARGET_TYPE_UNIT_NEARBY;
break;
- case TARGET_UNIT_AREA_ENEMY_SRC:
- case TARGET_UNIT_AREA_ALLY_SRC:
- case TARGET_UNIT_AREA_ENTRY_SRC:
- case TARGET_UNIT_AREA_PARTY_SRC:
- case TARGET_GAMEOBJECT_AREA_SRC:
+ case TARGET_UNIT_SRC_AREA_ENEMY:
+ case TARGET_UNIT_SRC_AREA_ALLY:
+ case TARGET_UNIT_SRC_AREA_ENTRY:
+ case TARGET_UNIT_SRC_AREA_PARTY:
+ case TARGET_GAMEOBJECT_SRC_AREA:
Type[i] = TARGET_TYPE_AREA_SRC;
break;
- case TARGET_UNIT_AREA_ENEMY_DST:
- case TARGET_UNIT_AREA_ALLY_DST:
- case TARGET_UNIT_AREA_ENTRY_DST:
- case TARGET_UNIT_AREA_PARTY_DST:
- case TARGET_GAMEOBJECT_AREA_DST:
+ case TARGET_UNIT_DEST_AREA_ENEMY:
+ case TARGET_UNIT_DEST_AREA_ALLY:
+ case TARGET_UNIT_DEST_AREA_ENTRY:
+ case TARGET_UNIT_DEST_AREA_PARTY:
+ case TARGET_GAMEOBJECT_DEST_AREA:
Type[i] = TARGET_TYPE_AREA_DST;
break;
- case TARGET_UNIT_CONE_ENEMY:
+ case TARGET_UNIT_CONE_ENEMY_24:
case TARGET_UNIT_CONE_ALLY:
case TARGET_UNIT_CONE_ENTRY:
- case TARGET_UNIT_CONE_ENEMY_UNKNOWN:
- case TARGET_UNIT_AREA_PATH:
- case TARGET_GAMEOBJECT_AREA_PATH:
+ case TARGET_UNIT_CONE_ENEMY_54:
+ case TARGET_UNIT_CONE_ENEMY_104:
+ case TARGET_GAMEOBJECT_CONE:
Type[i] = TARGET_TYPE_AREA_CONE;
break;
- case TARGET_DST_CASTER:
+ case TARGET_DEST_CASTER:
case TARGET_SRC_CASTER:
- case TARGET_MINION:
+ case TARGET_DEST_CASTER_SUMMON:
case TARGET_DEST_CASTER_FRONT_LEAP:
case TARGET_DEST_CASTER_FRONT:
case TARGET_DEST_CASTER_BACK:
@@ -174,7 +301,7 @@ void SpellImplicitTargetInfo::InitTypeData()
case TARGET_DEST_CASTER_RADIUS:
Type[i] = TARGET_TYPE_DEST_CASTER;
break;
- case TARGET_DST_TARGET_ENEMY:
+ case TARGET_DEST_TARGET_ENEMY:
case TARGET_DEST_TARGET_ANY:
case TARGET_DEST_TARGET_FRONT:
case TARGET_DEST_TARGET_BACK:
@@ -202,12 +329,12 @@ void SpellImplicitTargetInfo::InitTypeData()
case TARGET_DEST_DEST_RIGHT:
case TARGET_DEST_DEST_LEFT:
case TARGET_DEST_DEST_RANDOM:
- case TARGET_DEST_DEST_RANDOM_DIR_DIST:
+ case TARGET_DEST_DEST_RADIUS:
Type[i] = TARGET_TYPE_DEST_DEST;
break;
- case TARGET_DST_DB:
- case TARGET_DST_HOME:
- case TARGET_DST_NEARBY_ENTRY:
+ case TARGET_DEST_DB:
+ case TARGET_DEST_HOME:
+ case TARGET_DEST_NEARBY_ENTRY:
Type[i] = TARGET_TYPE_DEST_SPECIAL;
break;
case TARGET_UNIT_CHANNEL_TARGET:
@@ -222,9 +349,123 @@ void SpellImplicitTargetInfo::InitTypeData()
}
bool SpellImplicitTargetInfo::Init = SpellImplicitTargetInfo::InitStaticData();
-bool SpellImplicitTargetInfo::Area[TOTAL_SPELL_TARGETS];
SpellSelectTargetTypes SpellImplicitTargetInfo::Type[TOTAL_SPELL_TARGETS];
+SpellImplicitTargetInfo::StaticData SpellImplicitTargetInfo::_data[TOTAL_SPELL_TARGETS] =
+{
+ {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, //
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 1 TARGET_UNIT_CASTER
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_NEARBY, TARGET_SELECT_CHECK_ENEMY, TARGET_DIR_NONE}, // 2 TARGET_UNIT_NEARBY_ENEMY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_NEARBY, TARGET_SELECT_CHECK_PARTY, TARGET_DIR_NONE}, // 3 TARGET_UNIT_NEARBY_PARTY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_NEARBY, TARGET_SELECT_CHECK_ALLY, TARGET_DIR_NONE}, // 4 TARGET_UNIT_NEARBY_ALLY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 5 TARGET_UNIT_PET
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_ENEMY, TARGET_DIR_NONE}, // 6 TARGET_UNIT_TARGET_ENEMY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_SRC, TARGET_SELECT_CATEGORY_AREA, TARGET_SELECT_CHECK_ENTRY, TARGET_DIR_NONE}, // 7 TARGET_UNIT_SRC_AREA_ENTRY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_AREA, TARGET_SELECT_CHECK_ENTRY, TARGET_DIR_NONE}, // 8 TARGET_UNIT_DEST_AREA_ENTRY
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 9 TARGET_DEST_HOME
+ {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 10
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_SRC, TARGET_SELECT_CATEGORY_NYI, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 11 TARGET_UNIT_SRC_AREA_UNK_11
+ {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 12
+ {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 13
+ {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 14
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_SRC, TARGET_SELECT_CATEGORY_AREA, TARGET_SELECT_CHECK_ENEMY, TARGET_DIR_NONE}, // 15 TARGET_UNIT_SRC_AREA_ENEMY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_AREA, TARGET_SELECT_CHECK_ENEMY, TARGET_DIR_NONE}, // 16 TARGET_UNIT_DEST_AREA_ENEMY
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 17 TARGET_DEST_DB
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 18 TARGET_DEST_CASTER
+ {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 19
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_AREA, TARGET_SELECT_CHECK_PARTY, TARGET_DIR_NONE}, // 20 TARGET_UNIT_CASTER_AREA_PARTY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_ALLY, TARGET_DIR_NONE}, // 21 TARGET_UNIT_TARGET_ALLY
+ {TARGET_OBJECT_TYPE_SRC, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 22 TARGET_SRC_CASTER
+ {TARGET_OBJECT_TYPE_GOBJ, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 23 TARGET_GAMEOBJECT_TARGET
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_CONE, TARGET_SELECT_CHECK_ENEMY, TARGET_DIR_FRONT}, // 24 TARGET_UNIT_CONE_ENEMY_24
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 25 TARGET_UNIT_TARGET_ANY
+ {TARGET_OBJECT_TYPE_GOBJ_ITEM,TARGET_REFERENCE_TYPE_TARGET,TARGET_SELECT_CATEGORY_DEFAULT,TARGET_SELECT_CHECK_DEFAULT,TARGET_DIR_NONE}, // 26 TARGET_GAMEOBJECT_ITEM_TARGET
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 27 TARGET_UNIT_MASTER
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_ENEMY, TARGET_DIR_NONE}, // 28 TARGET_DEST_DYNOBJ_ENEMY
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_ALLY, TARGET_DIR_NONE}, // 29 TARGET_DEST_DYNOBJ_ALLY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_SRC, TARGET_SELECT_CATEGORY_AREA, TARGET_SELECT_CHECK_ALLY, TARGET_DIR_NONE}, // 30 TARGET_UNIT_SRC_AREA_ALLY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_AREA, TARGET_SELECT_CHECK_ALLY, TARGET_DIR_NONE}, // 31 TARGET_UNIT_DEST_AREA_ALLY
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_FRONT_LEFT}, // 32 TARGET_DEST_CASTER_SUMMON
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_SRC, TARGET_SELECT_CATEGORY_AREA, TARGET_SELECT_CHECK_PARTY, TARGET_DIR_NONE}, // 33 TARGET_UNIT_SRC_AREA_PARTY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_AREA, TARGET_SELECT_CHECK_PARTY, TARGET_DIR_NONE}, // 34 TARGET_UNIT_DEST_AREA_PARTY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_PARTY, TARGET_DIR_NONE}, // 35 TARGET_UNIT_TARGET_PARTY
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_NYI, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 36 TARGET_DEST_CASTER_UNK_36
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_LAST, TARGET_SELECT_CATEGORY_AREA, TARGET_SELECT_CHECK_PARTY, TARGET_DIR_NONE}, // 37 TARGET_UNIT_LASTTARGET_AREA_PARTY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_NEARBY, TARGET_SELECT_CHECK_ENTRY, TARGET_DIR_NONE}, // 38 TARGET_UNIT_NEARBY_ENTRY
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 39 TARGET_DEST_CASTER_FISHING
+ {TARGET_OBJECT_TYPE_GOBJ, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_NEARBY, TARGET_SELECT_CHECK_ENTRY, TARGET_DIR_NONE}, // 40 TARGET_GAMEOBJECT_NEARBY_ENTRY
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_FRONT_RIGHT}, // 41 TARGET_DEST_CASTER_FRONT_RIGHT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_BACK_RIGHT}, // 42 TARGET_DEST_CASTER_BACK_RIGHT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_BACK_LEFT}, // 43 TARGET_DEST_CASTER_BACK_LEFT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_FRONT_LEFT}, // 44 TARGET_DEST_CASTER_FRONT_LEFT
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_ALLY, TARGET_DIR_NONE}, // 45 TARGET_UNIT_TARGET_CHAINHEAL_ALLY
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_NEARBY, TARGET_SELECT_CHECK_ENTRY, TARGET_DIR_NONE}, // 46 TARGET_DEST_NEARBY_ENTRY
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_FRONT}, // 47 TARGET_DEST_CASTER_FRONT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_BACK}, // 48 TARGET_DEST_CASTER_BACK
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_RIGHT}, // 49 TARGET_DEST_CASTER_RIGHT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_LEFT}, // 50 TARGET_DEST_CASTER_LEFT
+ {TARGET_OBJECT_TYPE_GOBJ, TARGET_REFERENCE_TYPE_SRC, TARGET_SELECT_CATEGORY_AREA, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 51 TARGET_GAMEOBJECT_SRC_AREA
+ {TARGET_OBJECT_TYPE_GOBJ, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_AREA, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 52 TARGET_GAMEOBJECT_DEST_AREA
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_ENEMY, TARGET_DIR_NONE}, // 53 TARGET_DEST_TARGET_ENEMY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_CONE, TARGET_SELECT_CHECK_ENEMY, TARGET_DIR_FRONT}, // 54 TARGET_UNIT_CONE_ENEMY_54
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 55 TARGET_DEST_CASTER_FRONT_LEAP
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_AREA, TARGET_SELECT_CHECK_RAID, TARGET_DIR_NONE}, // 56 TARGET_UNIT_CASTER_AREA_RAID
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_RAID, TARGET_DIR_NONE}, // 57 TARGET_UNIT_TARGET_RAID
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_NEARBY, TARGET_SELECT_CHECK_RAID, TARGET_DIR_NONE}, // 58 TARGET_UNIT_NEARBY_RAID
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_CONE, TARGET_SELECT_CHECK_ALLY, TARGET_DIR_FRONT}, // 59 TARGET_UNIT_CONE_ALLY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_CONE, TARGET_SELECT_CHECK_ENTRY, TARGET_DIR_FRONT}, // 60 TARGET_UNIT_CONE_ENTRY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_AREA, TARGET_SELECT_CHECK_RAID, TARGET_DIR_NONE}, // 61 TARGET_UNIT_TARGET_AREA_RAID_CLASS
+ {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 62 TARGET_UNK_62
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 63 TARGET_DEST_TARGET_ANY
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_FRONT}, // 64 TARGET_DEST_TARGET_FRONT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_BACK}, // 65 TARGET_DEST_TARGET_BACK
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_RIGHT}, // 66 TARGET_DEST_TARGET_RIGHT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_LEFT}, // 67 TARGET_DEST_TARGET_LEFT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_FRONT_RIGHT}, // 68 TARGET_DEST_TARGET_FRONT_RIGHT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_BACK_RIGHT}, // 69 TARGET_DEST_TARGET_BACK_RIGHT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_BACK_LEFT}, // 70 TARGET_DEST_TARGET_BACK_LEFT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_FRONT_LEFT}, // 71 TARGET_DEST_TARGET_FRONT_LEFT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_RANDOM}, // 72 TARGET_DEST_CASTER_RANDOM
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_RANDOM}, // 73 TARGET_DEST_CASTER_RADIUS
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_RANDOM}, // 74 TARGET_DEST_TARGET_RANDOM
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_RANDOM}, // 75 TARGET_DEST_TARGET_RADIUS
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_CHANNEL, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 76 TARGET_DEST_CHANNEL_TARGET
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_CHANNEL, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 77 TARGET_UNIT_CHANNEL_TARGET
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_FRONT}, // 78 TARGET_DEST_DEST_FRONT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_BACK}, // 79 TARGET_DEST_DEST_BACK
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_RIGHT}, // 80 TARGET_DEST_DEST_RIGHT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_LEFT}, // 81 TARGET_DEST_DEST_LEFT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_FRONT_RIGHT}, // 82 TARGET_DEST_DEST_FRONT_RIGHT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_BACK_RIGHT}, // 83 TARGET_DEST_DEST_BACK_RIGHT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_BACK_LEFT}, // 84 TARGET_DEST_DEST_BACK_LEFT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_FRONT_LEFT}, // 85 TARGET_DEST_DEST_FRONT_LEFT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_RANDOM}, // 86 TARGET_DEST_DEST_RANDOM
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 87 TARGET_DEST_DEST
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 88 TARGET_DEST_DYNOBJ_NONE
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 89 TARGET_DEST_TRAJ
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 90 TARGET_UNIT_TARGET_MINIPET
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_RANDOM}, // 91 TARGET_DEST_DEST_RADIUS
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 92 TARGET_UNIT_SUMMONER
+ {TARGET_OBJECT_TYPE_CORPSE,TARGET_REFERENCE_TYPE_SRC, TARGET_SELECT_CATEGORY_NYI, TARGET_SELECT_CHECK_ENEMY, TARGET_DIR_NONE}, // 93 TARGET_CORPSE_SRC_AREA_ENEMY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 94 TARGET_UNIT_VEHICLE
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_PASSENGER,TARGET_DIR_NONE}, // 95 TARGET_UNIT_TARGET_PASSENGER
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 96 TARGET_UNIT_PASSENGER_0
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 97 TARGET_UNIT_PASSENGER_1
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 98 TARGET_UNIT_PASSENGER_2
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 99 TARGET_UNIT_PASSENGER_3
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 100 TARGET_UNIT_PASSENGER_4
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 101 TARGET_UNIT_PASSENGER_5
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 102 TARGET_UNIT_PASSENGER_6
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 103 TARGET_UNIT_PASSENGER_7
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_CONE, TARGET_SELECT_CHECK_ENEMY, TARGET_DIR_FRONT}, // 104 TARGET_UNIT_CONE_ENEMY_104
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 105 TARGET_UNIT_UNK_105
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_CHANNEL, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 106 TARGET_DEST_CHANNEL_CASTER
+ {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_NYI, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 107 TARGET_UNK_DEST_AREA_UNK_107
+ {TARGET_OBJECT_TYPE_GOBJ, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_CONE, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_FRONT}, // 108 TARGET_GAMEOBJECT_CONE
+ {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 109
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_SELECT_CHECK_DEFAULT, TARGET_DIR_NONE}, // 110 TARGET_DEST_UNK_110
+};
+
SpellEffectInfo::SpellEffectInfo(SpellEntry const* spellEntry, SpellInfo const* spellInfo, uint8 effIndex)
{
_spellInfo = spellInfo;
@@ -290,17 +531,17 @@ bool SpellEffectInfo::IsAreaAuraEffect() const
bool SpellEffectInfo::IsFarUnitTargetEffect() const
{
- return (Effect == SPELL_EFFECT_SUMMON_PLAYER);
+ return Effect == SPELL_EFFECT_SUMMON_PLAYER;
}
bool SpellEffectInfo::IsFarDestTargetEffect() const
{
- return (Effect == SPELL_EFFECT_TELEPORT_UNITS);
+ return Effect == SPELL_EFFECT_TELEPORT_UNITS;
}
bool SpellEffectInfo::IsUnitOwnedAuraEffect() const
{
- return (IsAreaAuraEffect() || Effect == SPELL_EFFECT_APPLY_AURA);
+ return IsAreaAuraEffect() || Effect == SPELL_EFFECT_APPLY_AURA;
}
int32 SpellEffectInfo::CalcValue(Unit const* caster, int32 const* bp, Unit const* /*target*/) const
@@ -411,6 +652,16 @@ SpellEffectTargetTypes SpellEffectInfo::GetRequiredTargetType() const
return RequiredTargetType[Effect];
}
+SpellTargetObjectTypes SpellEffectInfo::GetImplicitTargetObjectType() const
+{
+ return _data[Effect].ImplicitObjectType;
+}
+
+SpellTargetObjectTypes SpellEffectInfo::GetRequiredTargetObjectType() const
+{
+ return _data[Effect].RequiredObjectType;
+}
+
bool SpellEffectInfo::InitStaticData()
{
InitRequiredTargetTypeData();
@@ -487,6 +738,176 @@ void SpellEffectInfo::InitRequiredTargetTypeData()
bool SpellEffectInfo::Init = SpellEffectInfo::InitStaticData();
SpellEffectTargetTypes SpellEffectInfo::RequiredTargetType[TOTAL_SPELL_EFFECTS];
+SpellEffectInfo::StaticData SpellEffectInfo::_data[TOTAL_SPELL_EFFECTS] =
+{
+ // implicit target required target
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 0
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 1 SPELL_EFFECT_INSTAKILL
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 2 SPELL_EFFECT_SCHOOL_DAMAGE
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 3 SPELL_EFFECT_DUMMY
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 4 SPELL_EFFECT_PORTAL_TELEPORT
+ {TARGET_OBJECT_TYPE_UNIT_AND_DEST,TARGET_OBJECT_TYPE_UNIT_AND_DEST},// 5 SPELL_EFFECT_TELEPORT_UNITS
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 6 SPELL_EFFECT_APPLY_AURA
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 7 SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 8 SPELL_EFFECT_POWER_DRAIN
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 9 SPELL_EFFECT_HEALTH_LEECH
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 10 SPELL_EFFECT_HEAL
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 11 SPELL_EFFECT_BIND
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 12 SPELL_EFFECT_PORTAL
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 13 SPELL_EFFECT_RITUAL_BASE
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 14 SPELL_EFFECT_RITUAL_SPECIALIZE
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 15 SPELL_EFFECT_RITUAL_ACTIVATE_PORTAL
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 16 SPELL_EFFECT_QUEST_COMPLETE
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 17 SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL
+ {TARGET_OBJECT_TYPE_CORPSE, TARGET_OBJECT_TYPE_CORPSE}, // 18 SPELL_EFFECT_RESURRECT
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 19 SPELL_EFFECT_ADD_EXTRA_ATTACKS
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 20 SPELL_EFFECT_DODGE
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 21 SPELL_EFFECT_EVADE
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 22 SPELL_EFFECT_PARRY
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 23 SPELL_EFFECT_BLOCK
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 24 SPELL_EFFECT_CREATE_ITEM
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 25 SPELL_EFFECT_WEAPON
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 26 SPELL_EFFECT_DEFENSE
+ {TARGET_OBJECT_TYPE_DEST, TARGET_OBJECT_TYPE_DEST}, // 27 SPELL_EFFECT_PERSISTENT_AREA_AURA
+ {TARGET_OBJECT_TYPE_DEST, TARGET_OBJECT_TYPE_DEST}, // 28 SPELL_EFFECT_SUMMON
+ {TARGET_OBJECT_TYPE_UNIT_AND_DEST, TARGET_OBJECT_TYPE_UNIT_AND_DEST},// 29 SPELL_EFFECT_LEAP
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 30 SPELL_EFFECT_ENERGIZE
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 31 SPELL_EFFECT_WEAPON_PERCENT_DAMAGE
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 32 SPELL_EFFECT_TRIGGER_MISSILE
+ {TARGET_OBJECT_TYPE_GOBJ_ITEM, TARGET_OBJECT_TYPE_GOBJ_ITEM}, // 33 SPELL_EFFECT_OPEN_LOCK
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 34 SPELL_EFFECT_SUMMON_CHANGE_ITEM
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 35 SPELL_EFFECT_APPLY_AREA_AURA_PARTY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 36 SPELL_EFFECT_LEARN_SPELL
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 37 SPELL_EFFECT_SPELL_DEFENSE
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 38 SPELL_EFFECT_DISPEL
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 39 SPELL_EFFECT_LANGUAGE
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 40 SPELL_EFFECT_DUAL_WIELD
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 41 SPELL_EFFECT_JUMP
+ {TARGET_OBJECT_TYPE_UNIT_AND_DEST,TARGET_OBJECT_TYPE_UNIT_AND_DEST},// 42 SPELL_EFFECT_JUMP_DEST
+ {TARGET_OBJECT_TYPE_UNIT_AND_DEST,TARGET_OBJECT_TYPE_UNIT_AND_DEST},// 43 SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 44 SPELL_EFFECT_SKILL_STEP
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 45 SPELL_EFFECT_ADD_HONOR
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 46 SPELL_EFFECT_SPAWN
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 47 SPELL_EFFECT_TRADE_SKILL
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 48 SPELL_EFFECT_STEALTH
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 49 SPELL_EFFECT_DETECT
+ {TARGET_OBJECT_TYPE_DEST, TARGET_OBJECT_TYPE_DEST}, // 50 SPELL_EFFECT_TRANS_DOOR
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 51 SPELL_EFFECT_FORCE_CRITICAL_HIT
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 52 SPELL_EFFECT_GUARANTEE_HIT
+ {TARGET_OBJECT_TYPE_ITEM, TARGET_OBJECT_TYPE_ITEM}, // 53 SPELL_EFFECT_ENCHANT_ITEM
+ {TARGET_OBJECT_TYPE_ITEM, TARGET_OBJECT_TYPE_ITEM}, // 54 SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 55 SPELL_EFFECT_TAMECREATURE
+ {TARGET_OBJECT_TYPE_DEST, TARGET_OBJECT_TYPE_DEST}, // 56 SPELL_EFFECT_SUMMON_PET
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 57 SPELL_EFFECT_LEARN_PET_SPELL
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 58 SPELL_EFFECT_WEAPON_DAMAGE
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 59 SPELL_EFFECT_CREATE_RANDOM_ITEM
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 60 SPELL_EFFECT_PROFICIENCY
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 61 SPELL_EFFECT_SEND_EVENT
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 62 SPELL_EFFECT_POWER_BURN
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 63 SPELL_EFFECT_THREAT
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 64 SPELL_EFFECT_TRIGGER_SPELL
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 65 SPELL_EFFECT_APPLY_AREA_AURA_RAID
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 66 SPELL_EFFECT_CREATE_MANA_GEM
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 67 SPELL_EFFECT_HEAL_MAX_HEALTH
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 68 SPELL_EFFECT_INTERRUPT_CAST
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 69 SPELL_EFFECT_DISTRACT
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 70 SPELL_EFFECT_PULL
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 71 SPELL_EFFECT_PICKPOCKET
+ {TARGET_OBJECT_TYPE_DEST, TARGET_OBJECT_TYPE_DEST}, // 72 SPELL_EFFECT_ADD_FARSIGHT
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 73 SPELL_EFFECT_UNTRAIN_TALENTS
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 74 SPELL_EFFECT_APPLY_GLYPH
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 75 SPELL_EFFECT_HEAL_MECHANICAL
+ {TARGET_OBJECT_TYPE_DEST, TARGET_OBJECT_TYPE_DEST}, // 76 SPELL_EFFECT_SUMMON_OBJECT_WILD
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 77 SPELL_EFFECT_SCRIPT_EFFECT
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 78 SPELL_EFFECT_ATTACK
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 79 SPELL_EFFECT_SANCTUARY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 80 SPELL_EFFECT_ADD_COMBO_POINTS
+ {TARGET_OBJECT_TYPE_DEST, TARGET_OBJECT_TYPE_DEST}, // 81 SPELL_EFFECT_CREATE_HOUSE
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 82 SPELL_EFFECT_BIND_SIGHT
+ {TARGET_OBJECT_TYPE_UNIT_AND_DEST,TARGET_OBJECT_TYPE_UNIT_AND_DEST},// 83 SPELL_EFFECT_DUEL
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 84 SPELL_EFFECT_STUCK
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 85 SPELL_EFFECT_SUMMON_PLAYER
+ {TARGET_OBJECT_TYPE_GOBJ, TARGET_OBJECT_TYPE_GOBJ}, // 86 SPELL_EFFECT_ACTIVATE_OBJECT
+ {TARGET_OBJECT_TYPE_GOBJ, TARGET_OBJECT_TYPE_GOBJ}, // 87 SPELL_EFFECT_GAMEOBJECT_DAMAGE
+ {TARGET_OBJECT_TYPE_GOBJ, TARGET_OBJECT_TYPE_GOBJ}, // 88 SPELL_EFFECT_GAMEOBJECT_REPAIR
+ {TARGET_OBJECT_TYPE_GOBJ, TARGET_OBJECT_TYPE_GOBJ}, // 89 SPELL_EFFECT_GAMEOBJECT_SET_DESTRUCTION_STATE
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 90 SPELL_EFFECT_KILL_CREDIT
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 91 SPELL_EFFECT_THREAT_ALL
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 92 SPELL_EFFECT_ENCHANT_HELD_ITEM
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 93 SPELL_EFFECT_FORCE_DESELECT
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 94 SPELL_EFFECT_SELF_RESURRECT
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 95 SPELL_EFFECT_SKINNING
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 96 SPELL_EFFECT_CHARGE
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 97 SPELL_EFFECT_CAST_BUTTON
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 98 SPELL_EFFECT_KNOCK_BACK
+ {TARGET_OBJECT_TYPE_ITEM, TARGET_OBJECT_TYPE_ITEM}, // 99 SPELL_EFFECT_DISENCHANT
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 100 SPELL_EFFECT_INEBRIATE
+ {TARGET_OBJECT_TYPE_ITEM, TARGET_OBJECT_TYPE_ITEM}, // 101 SPELL_EFFECT_FEED_PET
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 102 SPELL_EFFECT_DISMISS_PET
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 103 SPELL_EFFECT_REPUTATION
+ {TARGET_OBJECT_TYPE_DEST, TARGET_OBJECT_TYPE_DEST}, // 104 SPELL_EFFECT_SUMMON_OBJECT_SLOT1
+ {TARGET_OBJECT_TYPE_DEST, TARGET_OBJECT_TYPE_DEST}, // 105 SPELL_EFFECT_SUMMON_OBJECT_SLOT2
+ {TARGET_OBJECT_TYPE_DEST, TARGET_OBJECT_TYPE_DEST}, // 106 SPELL_EFFECT_SUMMON_OBJECT_SLOT3
+ {TARGET_OBJECT_TYPE_DEST, TARGET_OBJECT_TYPE_DEST}, // 107 SPELL_EFFECT_SUMMON_OBJECT_SLOT4
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 108 SPELL_EFFECT_DISPEL_MECHANIC
+ {TARGET_OBJECT_TYPE_DEST, TARGET_OBJECT_TYPE_DEST}, // 109 SPELL_EFFECT_SUMMON_DEAD_PET
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 110 SPELL_EFFECT_DESTROY_ALL_TOTEMS
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 111 SPELL_EFFECT_DURABILITY_DAMAGE
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 112 SPELL_EFFECT_112
+ {TARGET_OBJECT_TYPE_CORPSE, TARGET_OBJECT_TYPE_CORPSE}, // 113 SPELL_EFFECT_RESURRECT_NEW
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 114 SPELL_EFFECT_ATTACK_ME
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 115 SPELL_EFFECT_DURABILITY_DAMAGE_PCT
+ {TARGET_OBJECT_TYPE_CORPSE, TARGET_OBJECT_TYPE_CORPSE}, // 116 SPELL_EFFECT_SKIN_PLAYER_CORPSE
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 117 SPELL_EFFECT_SPIRIT_HEAL
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 118 SPELL_EFFECT_SKILL
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 119 SPELL_EFFECT_APPLY_AREA_AURA_PET
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 120 SPELL_EFFECT_TELEPORT_GRAVEYARD
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 121 SPELL_EFFECT_NORMALIZED_WEAPON_DMG
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 122 SPELL_EFFECT_122
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 123 SPELL_EFFECT_SEND_TAXI
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 124 SPELL_EFFECT_PULL_TOWARDS
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 125 SPELL_EFFECT_MODIFY_THREAT_PERCENT
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 126 SPELL_EFFECT_STEAL_BENEFICIAL_BUFF
+ {TARGET_OBJECT_TYPE_ITEM, TARGET_OBJECT_TYPE_ITEM}, // 127 SPELL_EFFECT_PROSPECTING
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 128 SPELL_EFFECT_APPLY_AREA_AURA_FRIEND
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 129 SPELL_EFFECT_APPLY_AREA_AURA_ENEMY
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 130 SPELL_EFFECT_REDIRECT_THREAT
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 131 SPELL_EFFECT_131
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 132 SPELL_EFFECT_PLAY_MUSIC
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 133 SPELL_EFFECT_UNLEARN_SPECIALIZATION
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 134 SPELL_EFFECT_KILL_CREDIT2
+ {TARGET_OBJECT_TYPE_DEST, TARGET_OBJECT_TYPE_DEST}, // 135 SPELL_EFFECT_CALL_PET
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 136 SPELL_EFFECT_HEAL_PCT
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 137 SPELL_EFFECT_ENERGIZE_PCT
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 138 SPELL_EFFECT_LEAP_BACK
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 139 SPELL_EFFECT_CLEAR_QUEST
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 140 SPELL_EFFECT_FORCE_CAST
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 141 SPELL_EFFECT_FORCE_CAST_WITH_VALUE
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 142 SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 143 SPELL_EFFECT_APPLY_AREA_AURA_OWNER
+ {TARGET_OBJECT_TYPE_UNIT_AND_DEST,TARGET_OBJECT_TYPE_UNIT_AND_DEST},// 144 SPELL_EFFECT_KNOCK_BACK_DEST
+ {TARGET_OBJECT_TYPE_UNIT_AND_DEST,TARGET_OBJECT_TYPE_UNIT_AND_DEST},// 145 SPELL_EFFECT_PULL_TOWARDS_DEST
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 146 SPELL_EFFECT_ACTIVATE_RUNE
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 147 SPELL_EFFECT_QUEST_FAIL
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 148 SPELL_EFFECT_148
+ {TARGET_OBJECT_TYPE_DEST, TARGET_OBJECT_TYPE_DEST}, // 149 SPELL_EFFECT_CHARGE_DEST
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 150 SPELL_EFFECT_QUEST_START
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 151 SPELL_EFFECT_TRIGGER_SPELL_2
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_NONE}, // 152 SPELL_EFFECT_SUMMON_RAF_FRIEND
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 153 SPELL_EFFECT_CREATE_TAMED_PET
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 154 SPELL_EFFECT_DISCOVER_TAXI
+ {TARGET_OBJECT_TYPE_NONE, TARGET_OBJECT_TYPE_UNIT}, // 155 SPELL_EFFECT_TITAN_GRIP
+ {TARGET_OBJECT_TYPE_ITEM, TARGET_OBJECT_TYPE_ITEM}, // 156 SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 157 SPELL_EFFECT_CREATE_ITEM_2
+ {TARGET_OBJECT_TYPE_ITEM, TARGET_OBJECT_TYPE_ITEM}, // 158 SPELL_EFFECT_MILLING
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 159 SPELL_EFFECT_ALLOW_RENAME_PET
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 160 SPELL_EFFECT_160
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 161 SPELL_EFFECT_TALENT_SPEC_COUNT
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 162 SPELL_EFFECT_TALENT_SPEC_SELECT
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 163 SPELL_EFFECT_163
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_OBJECT_TYPE_UNIT}, // 164 SPELL_EFFECT_REMOVE_AURA
+};
+
SpellInfo::SpellInfo(SpellEntry const* spellEntry)
{
Id = spellEntry->Id;
@@ -570,6 +991,7 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry)
SchoolMask = spellEntry->SchoolMask;
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
Effects[i] = SpellEffectInfo(spellEntry, this, i);
+ ExplicitTargetMask = _GetExplicitTargetMask();
ChainEntry = NULL;
}
@@ -706,17 +1128,7 @@ bool SpellInfo::IsAOE() const
bool SpellInfo::IsRequiringSelectedTarget() const
{
- for (uint8 i = 0 ; i < MAX_SPELL_EFFECTS; ++i)
- {
- if (Effects[i].TargetA.GetType() == TARGET_TYPE_UNIT_TARGET
- || Effects[i].TargetB.GetType() == TARGET_TYPE_UNIT_TARGET
- || Effects[i].TargetA.GetType() == TARGET_TYPE_CHANNEL
- || Effects[i].TargetB.GetType() == TARGET_TYPE_CHANNEL
- || Effects[i].TargetA.GetType() == TARGET_TYPE_DEST_TARGET
- || Effects[i].TargetB.GetType() == TARGET_TYPE_DEST_TARGET)
- return true;
- }
- return false;
+ return (GetExplicitTargetMask() & TARGET_FLAG_UNIT_MASK) != 0;
}
bool SpellInfo::IsPassive() const
@@ -783,12 +1195,12 @@ bool SpellInfo::IsDeathPersistent() const
bool SpellInfo::IsRequiringDeadTarget() const
{
- return AttributesEx3 & SPELL_ATTR3_REQUIRE_DEAD_TARGET;
+ return AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_GHOSTS;
}
bool SpellInfo::IsAllowingDeadTarget() const
{
- return AttributesEx2 & SPELL_ATTR2_ALLOW_DEAD_TARGET;
+ return AttributesEx2 & SPELL_ATTR2_CAN_TARGET_DEAD || Targets & (TARGET_FLAG_CORPSE_ALLY | TARGET_FLAG_CORPSE_ENEMY | TARGET_FLAG_UNIT_DEAD);
}
bool SpellInfo::CanBeUsedInCombat() const
@@ -841,15 +1253,23 @@ bool SpellInfo::IsAutoRepeatRangedSpell() const
return AttributesEx2 & SPELL_ATTR2_AUTOREPEAT_FLAG;
}
+bool SpellInfo::IsAffectedBySpellMods() const
+{
+ return !(AttributesEx3 & SPELL_ATTR3_NO_DONE_BONUS);
+}
+
bool SpellInfo::IsAffectedBySpellMod(SpellModifier* mod) const
{
+ if (!IsAffectedBySpellMods())
+ return false;
+
SpellInfo const* affectSpell = sSpellMgr->GetSpellInfo(mod->spellId);
// False if affect_spell == NULL or spellFamily not equal
if (!affectSpell || affectSpell->SpellFamilyName != SpellFamilyName)
return false;
// true
- if (mod->mask & SpellFamilyFlags)
+ if (mod->mask & SpellFamilyFlags)
return true;
return false;
@@ -1173,6 +1593,133 @@ SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 a
return SPELL_CAST_OK;
}
+SpellCastResult SpellInfo::CheckTarget(Unit const* caster, Unit const* target, bool implicit) const
+{
+ if (AttributesEx & SPELL_ATTR1_CANT_TARGET_SELF && caster == target)
+ return SPELL_FAILED_BAD_TARGETS;
+
+ if (AttributesEx & SPELL_ATTR1_CANT_TARGET_IN_COMBAT && target->isInCombat())
+ return SPELL_FAILED_TARGET_AFFECTING_COMBAT;
+
+ if (AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_PLAYERS && !target->ToPlayer())
+ return SPELL_FAILED_TARGET_NOT_PLAYER;
+
+ if (!IsAllowingDeadTarget() && !target->isAlive())
+ return SPELL_FAILED_TARGETS_DEAD;
+
+ if (AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_GHOSTS && !(!target->isAlive() && target->HasAuraType(SPELL_AURA_GHOST)))
+ return SPELL_FAILED_TARGET_NOT_GHOST;
+
+ // check this flag only for implicit targets (chain and area), allow to explicitly target units for spells like Shield of Righteousness
+ if (implicit && AttributesEx6 & SPELL_ATTR6_CANT_TARGET_CROWD_CONTROLLED && !target->CanFreeMove())
+ return SPELL_FAILED_BAD_TARGETS;
+
+ // check visibility - ignore stealth for implicit (area) targets
+ if (!(AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE) && !caster->canSeeOrDetect(target, implicit))
+ return SPELL_FAILED_BAD_TARGETS;
+
+ if (!(AttributesEx6 & SPELL_ATTR6_CAN_TARGET_UNTARGETABLE) && target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
+ return SPELL_FAILED_BAD_TARGETS;
+
+ //if (!(AttributesEx6 & SPELL_ATTR6_CAN_TARGET_POSSESSED_FRIENDS)
+
+ if (!CheckTargetCreatureType(target))
+ {
+ if (target->GetTypeId() == TYPEID_PLAYER)
+ return SPELL_FAILED_TARGET_IS_PLAYER;
+ else
+ return SPELL_FAILED_BAD_TARGETS;
+ }
+
+ // check UNIT_FLAG_NON_ATTACKABLE flag - a player can cast spells on his pet (or other controlled unit) though in any state
+ if (target != caster && target->GetCharmerOrOwnerGUID() != caster->GetGUID())
+ {
+ // any unattackable target skipped
+ if (target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
+ return SPELL_FAILED_BAD_TARGETS;
+ }
+
+ // check GM mode and GM invisibility - only for player casts (npc casts are controlled by AI) and negative spells
+ if (target != caster && (caster->IsControlledByPlayer() || !IsPositive()) && target->GetTypeId() == TYPEID_PLAYER)
+ {
+ if (!target->ToPlayer()->IsVisible())
+ return SPELL_FAILED_BAD_TARGETS;
+
+ if (target->ToPlayer()->isGameMaster())
+ return SPELL_FAILED_BAD_TARGETS;
+ }
+
+ // not allow casting on flying player
+ if (target->HasUnitState(UNIT_STAT_IN_FLIGHT))
+ return SPELL_FAILED_BAD_TARGETS;
+
+ if (TargetAuraState && !target->HasAuraState(AuraStateType(TargetAuraState), this, caster))
+ return SPELL_FAILED_TARGET_AURASTATE;
+
+ if (TargetAuraStateNot && target->HasAuraState(AuraStateType(TargetAuraStateNot), this, caster))
+ return SPELL_FAILED_TARGET_AURASTATE;
+
+ if (TargetAuraSpell && !target->HasAura(sSpellMgr->GetSpellIdForDifficulty(TargetAuraSpell, caster)))
+ return SPELL_FAILED_TARGET_AURASTATE;
+
+ if (ExcludeTargetAuraSpell && target->HasAura(sSpellMgr->GetSpellIdForDifficulty(ExcludeTargetAuraSpell, caster)))
+ return SPELL_FAILED_TARGET_AURASTATE;
+
+ if (caster != target)
+ {
+ if (caster->GetTypeId() == TYPEID_PLAYER)
+ {
+ // Do not allow these spells to target creatures not tapped by us (Banish, Polymorph, many quest spells)
+ if (AttributesEx2 & SPELL_ATTR2_CANT_TARGET_TAPPED)
+ if (Creature const* targetCreature = target->ToCreature())
+ if (targetCreature->hasLootRecipient() && !targetCreature->isTappedBy(caster->ToPlayer()))
+ return SPELL_FAILED_CANT_CAST_ON_TAPPED;
+
+ if (AttributesCu & SPELL_ATTR0_CU_PICKPOCKET)
+ {
+ if (target->GetTypeId() == TYPEID_PLAYER)
+ return SPELL_FAILED_BAD_TARGETS;
+ else if ((target->GetCreatureTypeMask() & CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD) == 0)
+ return SPELL_FAILED_TARGET_NO_POCKETS;
+ }
+
+ // Not allow disarm unarmed player
+ if (Mechanic == MECHANIC_DISARM)
+ {
+ if (target->GetTypeId() == TYPEID_PLAYER)
+ {
+ Player const* player = target->ToPlayer();
+ if (!player->GetWeaponForAttack(BASE_ATTACK) || !player->IsUseEquipedWeapon(true))
+ return SPELL_FAILED_TARGET_NO_WEAPONS;
+ }
+ else if (!target->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID))
+ return SPELL_FAILED_TARGET_NO_WEAPONS;
+ }
+ }
+ }
+
+ if (target->HasAuraType(SPELL_AURA_PREVENT_RESSURECTION))
+ if (HasEffect(SPELL_EFFECT_SELF_RESURRECT) || HasEffect(SPELL_EFFECT_RESURRECT) || HasEffect(SPELL_EFFECT_RESURRECT_NEW))
+ return SPELL_FAILED_TARGET_CANNOT_BE_RESURRECTED;
+
+ return SPELL_CAST_OK;
+}
+
+bool SpellInfo::CheckTargetCreatureType(Unit const* target) const
+{
+ // Curse of Doom & Exorcism: not find another way to fix spell target check :/
+ if (SpellFamilyName == SPELLFAMILY_WARLOCK && Category == 1179)
+ {
+ // not allow cast at player
+ if (target->GetTypeId() == TYPEID_PLAYER)
+ return false;
+ else
+ return true;
+ }
+ uint32 creatureType = target->GetCreatureTypeMask();
+ return !TargetCreatureType || !creatureType || (creatureType & TargetCreatureType);
+}
+
SpellSchoolMask SpellInfo::GetSchoolMask() const
{
return SpellSchoolMask(SchoolMask);
@@ -1182,10 +1729,10 @@ uint32 SpellInfo::GetAllEffectsMechanicMask() const
{
uint32 mask = 0;
if (Mechanic)
- mask |= 1<< Mechanic;
+ mask |= 1 << Mechanic;
for (int i = 0; i < MAX_SPELL_EFFECTS; ++i)
if (Effects[i].Mechanic)
- mask |= 1<< Effects[i].Mechanic;
+ mask |= 1 << Effects[i].Mechanic;
return mask;
}
@@ -1210,7 +1757,7 @@ Mechanics SpellInfo::GetEffectMechanic(uint8 effIndex) const
uint32 SpellInfo::GetDispelMask() const
{
- return SpellInfo::GetDispelMask(DispelType(Dispel));
+ return GetDispelMask(DispelType(Dispel));
}
uint32 SpellInfo::GetDispelMask(DispelType type)
@@ -1222,6 +1769,11 @@ uint32 SpellInfo::GetDispelMask(DispelType type)
return uint32(1 << type);
}
+uint32 SpellInfo::GetExplicitTargetMask() const
+{
+ return ExplicitTargetMask;
+}
+
AuraStateType SpellInfo::GetAuraState() const
{
// Seals
@@ -1669,6 +2221,81 @@ bool SpellInfo::IsHighRankOf(SpellInfo const* spellInfo) const
return false;
}
+uint32 SpellInfo::_GetExplicitTargetMask() const
+{
+ bool srcSet = false;
+ bool dstSet = false;
+ uint32 targetMask = Targets;
+ // prepare target mask using effect target entries
+ for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ {
+ if (!Effects[i].IsEffect())
+ continue;
+ targetMask |= Effects[i].TargetA.GetExplicitTargetMask(srcSet, dstSet);
+ targetMask |= Effects[i].TargetB.GetExplicitTargetMask(srcSet, dstSet);
+ }
+ // spells with range may need explicit targets, even if target entries not set
+ // for example many SPELL_EFFECT_LEARN_SPELL spells need to have unit target
+ if (GetMaxRange(true) > 0.0f || GetMaxRange(false) > 0.0f)
+ {
+ for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ {
+ if (!Effects[i].IsEffect())
+ continue;
+
+ uint32 effImplicitTargetMask = GetTargetFlagMask(Effects[i].GetImplicitTargetObjectType());
+ uint32 providedTargetMask = GetTargetFlagMask(Effects[i].TargetA.GetObjectType()) | GetTargetFlagMask(Effects[i].TargetB.GetObjectType()) | targetMask;
+
+ // check if valid targets already present, prevent adding redundant flags
+ switch (Effects[i].GetImplicitTargetObjectType())
+ {
+ case TARGET_OBJECT_TYPE_UNIT_AND_DEST:
+ if (providedTargetMask & TARGET_FLAG_UNIT_MASK)
+ effImplicitTargetMask &= ~(TARGET_FLAG_UNIT_MASK);
+ if (dstSet || providedTargetMask & TARGET_FLAG_DEST_LOCATION)
+ effImplicitTargetMask &= ~(TARGET_FLAG_DEST_LOCATION);
+ if (!effImplicitTargetMask)
+ continue;
+ break;
+ case TARGET_OBJECT_TYPE_SRC:
+ if (srcSet || providedTargetMask & TARGET_FLAG_SOURCE_LOCATION)
+ continue;
+ break;
+ case TARGET_OBJECT_TYPE_DEST:
+ if (dstSet || providedTargetMask & TARGET_FLAG_DEST_LOCATION)
+ continue;
+ break;
+ case TARGET_OBJECT_TYPE_UNIT:
+ if (providedTargetMask & TARGET_FLAG_UNIT_MASK)
+ continue;
+ break;
+ case TARGET_OBJECT_TYPE_CORPSE:
+ if (providedTargetMask & (TARGET_FLAG_CORPSE_MASK | TARGET_FLAG_UNIT_MASK))
+ continue;
+ break;
+ case TARGET_OBJECT_TYPE_ITEM:
+ if (providedTargetMask & (TARGET_FLAG_GAMEOBJECT_ITEM | TARGET_FLAG_ITEM))
+ continue;
+ break;
+ case TARGET_OBJECT_TYPE_GOBJ:
+ if (providedTargetMask & TARGET_FLAG_GAMEOBJECT_MASK)
+ continue;
+ break;
+ case TARGET_OBJECT_TYPE_GOBJ_ITEM:
+ if (providedTargetMask & (TARGET_FLAG_GAMEOBJECT_ITEM | TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_ITEM))
+ continue;
+ break;
+ default:
+ continue;
+ }
+
+ // extend explicit target mask only if valid targets for effect could not be provided by target types
+ targetMask |= effImplicitTargetMask &~(providedTargetMask);
+ }
+ }
+ return targetMask;
+}
+
bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const
{
// not found a single positive spell with this attribute
@@ -1926,12 +2553,12 @@ bool SpellInfo::_IsPositiveTarget(uint32 targetA, uint32 targetB)
{
case TARGET_UNIT_NEARBY_ENEMY:
case TARGET_UNIT_TARGET_ENEMY:
- case TARGET_UNIT_AREA_ENEMY_SRC:
- case TARGET_UNIT_AREA_ENEMY_DST:
- case TARGET_UNIT_CONE_ENEMY:
- case TARGET_UNIT_AREA_PATH:
+ case TARGET_UNIT_SRC_AREA_ENEMY:
+ case TARGET_UNIT_DEST_AREA_ENEMY:
+ case TARGET_UNIT_CONE_ENEMY_24:
+ case TARGET_UNIT_CONE_ENEMY_104:
case TARGET_DEST_DYNOBJ_ENEMY:
- case TARGET_DST_TARGET_ENEMY:
+ case TARGET_DEST_TARGET_ENEMY:
return false;
default:
break;
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index 9cf75b06d3b..3d94a376822 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -19,18 +19,53 @@
#define _SPELLINFO_H
#include "SharedDefines.h"
+#include "Util.h"
+#include "DBCStructure.h"
class Unit;
+class Player;
class Spell;
class SpellInfo;
struct SpellChainNode;
struct SpellTargetPosition;
struct SpellDurationEntry;
+struct SpellModifier;
struct SpellRangeEntry;
struct SpellRadiusEntry;
struct SpellEntry;
struct SpellCastTimesEntry;
+enum SpellCastTargetFlags
+{
+ TARGET_FLAG_NONE = 0x00000000,
+ TARGET_FLAG_UNUSED_1 = 0x00000001, // not used
+ TARGET_FLAG_UNIT = 0x00000002, // pguid
+ TARGET_FLAG_UNIT_RAID = 0x00000004, // not sent, used to validate target (if raid member)
+ TARGET_FLAG_UNIT_PARTY = 0x00000008, // not sent, used to validate target (if party member)
+ TARGET_FLAG_ITEM = 0x00000010, // pguid
+ TARGET_FLAG_SOURCE_LOCATION = 0x00000020, // pguid, 3 float
+ TARGET_FLAG_DEST_LOCATION = 0x00000040, // pguid, 3 float
+ TARGET_FLAG_UNIT_ENEMY = 0x00000080, // not sent, used to validate target (if enemy)
+ TARGET_FLAG_UNIT_ALLY = 0x00000100, // not sent, used to validate target (if ally)
+ TARGET_FLAG_CORPSE_ENEMY = 0x00000200, // pguid
+ TARGET_FLAG_UNIT_DEAD = 0x00000400, // not sent, used to validate target (if dead creature)
+ TARGET_FLAG_GAMEOBJECT = 0x00000800, // pguid, used with TARGET_GAMEOBJECT_TARGET
+ TARGET_FLAG_TRADE_ITEM = 0x00001000, // pguid
+ TARGET_FLAG_STRING = 0x00002000, // string
+ TARGET_FLAG_GAMEOBJECT_ITEM = 0x00004000, // not sent, used with TARGET_GAMEOBJECT_ITEM_TARGET
+ TARGET_FLAG_CORPSE_ALLY = 0x00008000, // pguid
+ TARGET_FLAG_UNIT_MINIPET = 0x00010000, // pguid, used to validate target (if non combat pet)
+ TARGET_FLAG_GLYPH_SLOT = 0x00020000, // used in glyph spells
+ TARGET_FLAG_DEST_TARGET = 0x00040000, // sometimes appears with DEST_TARGET spells (may appear or not for a given spell)
+ TARGET_FLAG_UNUSED20 = 0x00080000, // uint32 counter, loop { vec3 - screen position (?), guid }, not used so far
+ TARGET_FLAG_UNIT_PASSENGER = 0x00100000, // guessed, used to validate target (if vehicle passenger)
+
+ TARGET_FLAG_UNIT_MASK = TARGET_FLAG_UNIT | TARGET_FLAG_UNIT_RAID | TARGET_FLAG_UNIT_PARTY
+ | TARGET_FLAG_UNIT_ENEMY | TARGET_FLAG_UNIT_ALLY | TARGET_FLAG_UNIT_DEAD | TARGET_FLAG_UNIT_MINIPET | TARGET_FLAG_UNIT_PASSENGER,
+ TARGET_FLAG_GAMEOBJECT_MASK = TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_GAMEOBJECT_ITEM,
+ TARGET_FLAG_CORPSE_MASK = TARGET_FLAG_CORPSE_ALLY | TARGET_FLAG_CORPSE_ENEMY,
+};
+
enum SpellEffectTargetTypes
{
SPELL_REQUIRE_NONE,
@@ -41,6 +76,65 @@ enum SpellEffectTargetTypes
SPELL_REQUIRE_GOBJECT,
};
+enum SpellTargetSelectionCategories
+{
+ TARGET_SELECT_CATEGORY_NYI,
+ TARGET_SELECT_CATEGORY_DEFAULT,
+ TARGET_SELECT_CATEGORY_CHANNEL,
+ TARGET_SELECT_CATEGORY_NEARBY,
+ TARGET_SELECT_CATEGORY_CONE,
+ TARGET_SELECT_CATEGORY_AREA,
+};
+
+enum SpellTargetReferenceTypes
+{
+ TARGET_REFERENCE_TYPE_NONE,
+ TARGET_REFERENCE_TYPE_CASTER,
+ TARGET_REFERENCE_TYPE_TARGET,
+ TARGET_REFERENCE_TYPE_LAST,
+ TARGET_REFERENCE_TYPE_SRC,
+ TARGET_REFERENCE_TYPE_DEST,
+};
+
+enum SpellTargetObjectTypes
+{
+ TARGET_OBJECT_TYPE_NONE,
+ TARGET_OBJECT_TYPE_SRC,
+ TARGET_OBJECT_TYPE_DEST,
+ TARGET_OBJECT_TYPE_UNIT,
+ TARGET_OBJECT_TYPE_UNIT_AND_DEST,
+ TARGET_OBJECT_TYPE_GOBJ,
+ TARGET_OBJECT_TYPE_GOBJ_ITEM,
+ TARGET_OBJECT_TYPE_ITEM,
+ TARGET_OBJECT_TYPE_CORPSE,
+};
+
+enum SpellTargetSelectionCheckTypes
+{
+ TARGET_SELECT_CHECK_DEFAULT,
+ TARGET_SELECT_CHECK_ENTRY,
+ TARGET_SELECT_CHECK_ENEMY,
+ TARGET_SELECT_CHECK_ALLY,
+ TARGET_SELECT_CHECK_PARTY,
+ TARGET_SELECT_CHECK_RAID,
+ TARGET_SELECT_CHECK_PASSENGER,
+};
+
+enum SpellTargetDirectionTypes
+{
+ TARGET_DIR_NONE,
+ TARGET_DIR_FRONT,
+ TARGET_DIR_BACK,
+ TARGET_DIR_RIGHT,
+ TARGET_DIR_LEFT,
+ TARGET_DIR_FRONT_RIGHT,
+ TARGET_DIR_BACK_RIGHT,
+ TARGET_DIR_BACK_LEFT,
+ TARGET_DIR_FRONT_LEFT,
+ TARGET_DIR_RANDOM,
+ TARGET_DIR_ENTRY,
+};
+
enum SpellSelectTargetTypes
{
TARGET_TYPE_DEFAULT,
@@ -60,55 +154,56 @@ enum SpellSelectTargetTypes
// Spell clasification
enum SpellSpecificType
{
- SPELL_SPECIFIC_NORMAL = 0,
- SPELL_SPECIFIC_SEAL = 1,
- SPELL_SPECIFIC_AURA = 3,
- SPELL_SPECIFIC_STING = 4,
- SPELL_SPECIFIC_CURSE = 5,
- SPELL_SPECIFIC_ASPECT = 6,
- SPELL_SPECIFIC_TRACKER = 7,
- SPELL_SPECIFIC_WARLOCK_ARMOR = 8,
- SPELL_SPECIFIC_MAGE_ARMOR = 9,
- SPELL_SPECIFIC_ELEMENTAL_SHIELD = 10,
- SPELL_SPECIFIC_MAGE_POLYMORPH = 11,
- SPELL_SPECIFIC_JUDGEMENT = 13,
- SPELL_SPECIFIC_WARLOCK_CORRUPTION= 17,
- SPELL_SPECIFIC_FOOD = 19,
- SPELL_SPECIFIC_DRINK = 20,
- SPELL_SPECIFIC_FOOD_AND_DRINK = 21,
- SPELL_SPECIFIC_PRESENCE = 22,
- SPELL_SPECIFIC_CHARM = 23,
- SPELL_SPECIFIC_SCROLL = 24,
- SPELL_SPECIFIC_MAGE_ARCANE_BRILLANCE = 25,
- SPELL_SPECIFIC_WARRIOR_ENRAGE = 26,
- SPELL_SPECIFIC_PRIEST_DIVINE_SPIRIT = 27,
- SPELL_SPECIFIC_HAND = 28,
- SPELL_SPECIFIC_PHASE = 29,
+ SPELL_SPECIFIC_NORMAL = 0,
+ SPELL_SPECIFIC_SEAL = 1,
+ SPELL_SPECIFIC_AURA = 3,
+ SPELL_SPECIFIC_STING = 4,
+ SPELL_SPECIFIC_CURSE = 5,
+ SPELL_SPECIFIC_ASPECT = 6,
+ SPELL_SPECIFIC_TRACKER = 7,
+ SPELL_SPECIFIC_WARLOCK_ARMOR = 8,
+ SPELL_SPECIFIC_MAGE_ARMOR = 9,
+ SPELL_SPECIFIC_ELEMENTAL_SHIELD = 10,
+ SPELL_SPECIFIC_MAGE_POLYMORPH = 11,
+ SPELL_SPECIFIC_JUDGEMENT = 13,
+ SPELL_SPECIFIC_WARLOCK_CORRUPTION = 17,
+ SPELL_SPECIFIC_FOOD = 19,
+ SPELL_SPECIFIC_DRINK = 20,
+ SPELL_SPECIFIC_FOOD_AND_DRINK = 21,
+ SPELL_SPECIFIC_PRESENCE = 22,
+ SPELL_SPECIFIC_CHARM = 23,
+ SPELL_SPECIFIC_SCROLL = 24,
+ SPELL_SPECIFIC_MAGE_ARCANE_BRILLANCE = 25,
+ SPELL_SPECIFIC_WARRIOR_ENRAGE = 26,
+ SPELL_SPECIFIC_PRIEST_DIVINE_SPIRIT = 27,
+ SPELL_SPECIFIC_HAND = 28,
+ SPELL_SPECIFIC_PHASE = 29,
};
enum SpellCustomAttributes
{
- SPELL_ATTR0_CU_ENCHANT_PROC = 0x00000001,
- SPELL_ATTR0_CU_CONE_BACK = 0x00000002,
- SPELL_ATTR0_CU_CONE_LINE = 0x00000004,
- SPELL_ATTR0_CU_SHARE_DAMAGE = 0x00000008,
- SPELL_ATTR0_CU_NONE1 = 0x00000010, // UNUSED
- SPELL_ATTR0_CU_NONE2 = 0x00000020, // UNUSED
- SPELL_ATTR0_CU_AURA_CC = 0x00000040,
- SPELL_ATTR0_CU_DIRECT_DAMAGE = 0x00000100,
- SPELL_ATTR0_CU_CHARGE = 0x00000200,
- SPELL_ATTR0_CU_PICKPOCKET = 0x00000400,
- SPELL_ATTR0_CU_EXCLUDE_SELF = 0x00000800,
- SPELL_ATTR0_CU_NEGATIVE_EFF0 = 0x00001000,
- SPELL_ATTR0_CU_NEGATIVE_EFF1 = 0x00002000,
- SPELL_ATTR0_CU_NEGATIVE_EFF2 = 0x00004000,
- SPELL_ATTR0_CU_IGNORE_ARMOR = 0x00008000,
- SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER = 0x00010000,
- SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET = 0x00020000,
-
- SPELL_ATTR0_CU_NEGATIVE = SPELL_ATTR0_CU_NEGATIVE_EFF0 | SPELL_ATTR0_CU_NEGATIVE_EFF1 | SPELL_ATTR0_CU_NEGATIVE_EFF2,
+ SPELL_ATTR0_CU_ENCHANT_PROC = 0x00000001,
+ SPELL_ATTR0_CU_CONE_BACK = 0x00000002,
+ SPELL_ATTR0_CU_CONE_LINE = 0x00000004,
+ SPELL_ATTR0_CU_SHARE_DAMAGE = 0x00000008,
+ SPELL_ATTR0_CU_NONE1 = 0x00000010, // UNUSED
+ SPELL_ATTR0_CU_NONE2 = 0x00000020, // UNUSED
+ SPELL_ATTR0_CU_AURA_CC = 0x00000040,
+ SPELL_ATTR0_CU_DIRECT_DAMAGE = 0x00000100,
+ SPELL_ATTR0_CU_CHARGE = 0x00000200,
+ SPELL_ATTR0_CU_PICKPOCKET = 0x00000400,
+ SPELL_ATTR0_CU_NEGATIVE_EFF0 = 0x00001000,
+ SPELL_ATTR0_CU_NEGATIVE_EFF1 = 0x00002000,
+ SPELL_ATTR0_CU_NEGATIVE_EFF2 = 0x00004000,
+ SPELL_ATTR0_CU_IGNORE_ARMOR = 0x00008000,
+ SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER = 0x00010000,
+ SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET = 0x00020000,
+
+ SPELL_ATTR0_CU_NEGATIVE = SPELL_ATTR0_CU_NEGATIVE_EFF0 | SPELL_ATTR0_CU_NEGATIVE_EFF1 | SPELL_ATTR0_CU_NEGATIVE_EFF2,
};
+uint32 GetTargetFlagMask(SpellTargetObjectTypes objType);
+
class SpellImplicitTargetInfo
{
private:
@@ -119,8 +214,15 @@ public:
bool IsArea() const;
SpellSelectTargetTypes GetType() const;
+ SpellTargetSelectionCategories GetSelectionCategory() const;
+ SpellTargetReferenceTypes GetReferenceType() const;
+ SpellTargetObjectTypes GetObjectType() const;
+ SpellTargetSelectionCheckTypes GetSelectionCheckType() const;
+ SpellTargetDirectionTypes GetDirectionType() const;
+ float CalcDirectionAngle() const;
Targets GetTarget() const;
+ uint32 GetExplicitTargetMask(bool& srcSet, bool& dstSet) const;
// temporarily avalible to public
static bool IsPosition(uint32 targetType);
@@ -128,11 +230,19 @@ public:
private:
static bool InitStaticData();
- static void InitAreaData();
static void InitTypeData();
static bool Init;
- static bool Area[TOTAL_SPELL_TARGETS];
+
+ struct StaticData
+ {
+ SpellTargetObjectTypes ObjectType; // type of object returned by target type
+ SpellTargetReferenceTypes ReferenceType; // defines which object is used as a reference when selecting target
+ SpellTargetSelectionCategories SelectionCategory;
+ SpellTargetSelectionCheckTypes SelectionCheckType; // defines selection criteria
+ SpellTargetDirectionTypes DirectionType; // direction for cone and dest targets
+ };
+ static StaticData _data[TOTAL_SPELL_TARGETS];
};
class SpellEffectInfo
@@ -184,12 +294,22 @@ public:
SpellEffectTargetTypes GetRequiredTargetType() const;
+ SpellTargetObjectTypes GetImplicitTargetObjectType() const;
+ SpellTargetObjectTypes GetRequiredTargetObjectType() const;
+
private:
static bool InitStaticData();
static void InitRequiredTargetTypeData();
static bool Init;
static SpellEffectTargetTypes RequiredTargetType[TOTAL_SPELL_EFFECTS];
+
+ struct StaticData
+ {
+ SpellTargetObjectTypes ImplicitObjectType; // defines if explicit target can be added to effect target list if there's no valid target type provided for effect
+ SpellTargetObjectTypes RequiredObjectType; // defines valid target object type for spell effect
+ };
+ static StaticData _data[TOTAL_SPELL_EFFECTS];
};
class SpellInfo
@@ -268,6 +388,7 @@ public:
int32 AreaGroupId;
uint32 SchoolMask;
SpellEffectInfo Effects[MAX_SPELL_EFFECTS];
+ uint32 ExplicitTargetMask;
SpellChainNode const* ChainEntry;
SpellInfo(SpellEntry const* spellEntry);
@@ -306,6 +427,7 @@ public:
bool IsRangedWeaponSpell() const;
bool IsAutoRepeatRangedSpell() const;
+ bool IsAffectedBySpellMods() const;
bool IsAffectedBySpellMod(SpellModifier* mod) const;
bool CanPierceImmuneAura(SpellInfo const* aura) const;
@@ -318,6 +440,8 @@ public:
SpellCastResult CheckShapeshift(uint32 form) const;
SpellCastResult CheckLocation(uint32 map_id, uint32 zone_id, uint32 area_id, Player const* player = NULL) const;
+ SpellCastResult CheckTarget(Unit const* caster, Unit const* target, bool implicit = true) const;
+ bool CheckTargetCreatureType(Unit const* target) const;
SpellSchoolMask GetSchoolMask() const;
uint32 GetAllEffectsMechanicMask() const;
@@ -325,6 +449,7 @@ public:
Mechanics GetEffectMechanic(uint8 effIndex) const;
uint32 GetDispelMask() const;
static uint32 GetDispelMask(DispelType type);
+ uint32 GetExplicitTargetMask() const;
AuraStateType GetAuraState() const;
SpellSpecificType GetSpellSpecific() const;
@@ -352,9 +477,10 @@ public:
bool IsHighRankOf(SpellInfo const* spellInfo) const;
// loading helpers
+ uint32 _GetExplicitTargetMask() const;
bool _IsPositiveEffect(uint8 effIndex, bool deep) const;
bool _IsPositiveSpell() const;
static bool _IsPositiveTarget(uint32 targetA, uint32 targetB);
};
-#endif // _SPELLINFO_H \ No newline at end of file
+#endif // _SPELLINFO_H
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 0fb144e016e..0012f950599 100755
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -101,8 +101,11 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto,
}
case SPELLFAMILY_WARRIOR:
{
+ // Hamstring - limit duration to 10s in PvP
+ if (spellproto->SpellFamilyFlags[0] & 0x2)
+ return DIMINISHING_LIMITONLY;
// Improved Hamstring
- if (spellproto->AttributesEx3 & 0x80000 && spellproto->SpellIconID == 23)
+ else if (spellproto->AttributesEx3 & 0x80000 && spellproto->SpellIconID == 23)
return DIMINISHING_ROOT;
// Charge Stun (own diminishing)
else if (spellproto->SpellFamilyFlags[0] & 0x01000000)
@@ -114,6 +117,9 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto,
// Death Coil
if (spellproto->SpellFamilyFlags[0] & 0x80000)
return DIMINISHING_HORROR;
+ // Curses/etc
+ else if ((spellproto->SpellFamilyFlags[0] & 0x80000000) || (spellproto->SpellFamilyFlags[1] & 0x200))
+ return DIMINISHING_LIMITONLY;
// Seduction
else if (spellproto->SpellFamilyFlags[1] & 0x10000000)
return DIMINISHING_FEAR;
@@ -138,6 +144,9 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto,
// Nature's Grasp
else if (spellproto->SpellFamilyFlags[0] & 0x00000200)
return DIMINISHING_CONTROLLED_ROOT;
+ // Faerie Fire
+ else if (spellproto->SpellFamilyFlags[0] & 0x400)
+ return DIMINISHING_LIMITONLY;
break;
}
case SPELLFAMILY_ROGUE:
@@ -151,12 +160,18 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto,
// Cheap Shot
else if (spellproto->SpellFamilyFlags[0] & 0x400)
return DIMINISHING_OPENING_STUN;
+ // Crippling poison - Limit to 10 seconds in PvP (No SpellFamilyFlags)
+ else if (spellproto->SpellIconID == 163)
+ return DIMINISHING_LIMITONLY;
break;
}
case SPELLFAMILY_HUNTER:
{
+ // Hunter's mark
+ if ((spellproto->SpellFamilyFlags[0] & 0x400) && spellproto->SpellIconID == 538)
+ return DIMINISHING_LIMITONLY;
// Scatter Shot (own diminishing)
- if ((spellproto->SpellFamilyFlags[0] & 0x40000) && spellproto->SpellIconID == 132)
+ else if ((spellproto->SpellFamilyFlags[0] & 0x40000) && spellproto->SpellIconID == 132)
return DIMINISHING_SCATTER_SHOT;
// Entrapment (own diminishing)
else if (spellproto->SpellVisual[0] == 7484 && spellproto->SpellIconID == 20)
@@ -171,8 +186,11 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto,
}
case SPELLFAMILY_PALADIN:
{
+ // Judgement of Justice - limit duration to 10s in PvP
+ if (spellproto->SpellFamilyFlags[0] & 0x100000)
+ return DIMINISHING_LIMITONLY;
// Turn Evil
- if ((spellproto->SpellFamilyFlags[1] & 0x804000) && spellproto->SpellIconID == 309)
+ else if ((spellproto->SpellFamilyFlags[1] & 0x804000) && spellproto->SpellIconID == 309)
return DIMINISHING_FEAR;
break;
}
@@ -181,6 +199,9 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto,
// Hungering Cold (no flags)
if (spellproto->SpellIconID == 2797)
return DIMINISHING_DISORIENT;
+ // Mark of Blood
+ else if ((spellproto->SpellFamilyFlags[0] & 0x10000000) && spellproto->SpellIconID == 2285)
+ return DIMINISHING_LIMITONLY;
break;
}
default:
@@ -225,6 +246,9 @@ DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group)
case DIMINISHING_CYCLONE:
case DIMINISHING_CHARGE:
return DRTYPE_ALL;
+ case DIMINISHING_LIMITONLY:
+ case DIMINISHING_NONE:
+ return DRTYPE_NONE;
default:
return DRTYPE_PLAYER;
}
@@ -430,7 +454,7 @@ void SpellMgr::SetSpellDifficultyId(uint32 spellId, uint32 id)
mSpellDifficultySearcherMap[spellId] = id;
}
-uint32 SpellMgr::GetSpellIdForDifficulty(uint32 spellId, Unit* caster) const
+uint32 SpellMgr::GetSpellIdForDifficulty(uint32 spellId, Unit const* caster) const
{
if (!GetSpellInfo(spellId))
return spellId;
@@ -472,7 +496,7 @@ uint32 SpellMgr::GetSpellIdForDifficulty(uint32 spellId, Unit* caster) const
return uint32(difficultyEntry->SpellID[mode]);
}
-SpellInfo const* SpellMgr::GetSpellForDifficultyFromSpell(SpellInfo const* spell, Unit* caster) const
+SpellInfo const* SpellMgr::GetSpellForDifficultyFromSpell(SpellInfo const* spell, Unit const* caster) const
{
uint32 newSpellId = GetSpellIdForDifficulty(spell->Id, caster);
SpellInfo const* newSpell = GetSpellInfo(newSpellId);
@@ -1464,7 +1488,7 @@ void SpellMgr::LoadSpellTargetPositions()
bool found = false;
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
- if (spellInfo->Effects[i].TargetA.GetTarget() == TARGET_DST_DB || spellInfo->Effects[i].TargetB.GetTarget() == TARGET_DST_DB)
+ if (spellInfo->Effects[i].TargetA.GetTarget() == TARGET_DEST_DB || spellInfo->Effects[i].TargetB.GetTarget() == TARGET_DEST_DB)
{
// additional requirements
if (spellInfo->Effects[i].Effect == SPELL_EFFECT_BIND && spellInfo->Effects[i].MiscValue)
@@ -1483,7 +1507,7 @@ void SpellMgr::LoadSpellTargetPositions()
}
if (!found)
{
- sLog->outErrorDb("Spell (Id: %u) listed in `spell_target_position` does not have target TARGET_DST_DB (17).", Spell_ID);
+ sLog->outErrorDb("Spell (Id: %u) listed in `spell_target_position` does not have target TARGET_DEST_DB (17).", Spell_ID);
continue;
}
@@ -1505,7 +1529,7 @@ void SpellMgr::LoadSpellTargetPositions()
{
switch (spellInfo->Effects[j].TargetA)
{
- case TARGET_DST_DB:
+ case TARGET_DEST_DB:
found = true;
break;
}
@@ -1513,7 +1537,7 @@ void SpellMgr::LoadSpellTargetPositions()
break;
switch (spellInfo->Effects[j].TargetB)
{
- case TARGET_DST_DB:
+ case TARGET_DEST_DB:
found = true;
break;
}
@@ -2774,21 +2798,6 @@ void SpellMgr::LoadSpellCustomAttr()
// ONLY SPELLS WITH SPELLFAMILY_GENERIC and EFFECT_SCHOOL_DAMAGE
spellInfo->AttributesCu |= SPELL_ATTR0_CU_SHARE_DAMAGE;
break;
- case 27820: // Mana Detonation
- case 69782: // Ooze Flood
- case 69796: // Ooze Flood
- case 69798: // Ooze Flood
- case 69801: // Ooze Flood
- case 69538: // Ooze Combine
- case 69553: // Ooze Combine
- case 69610: // Ooze Combine
- case 71447: // Bloodbolt Splash
- case 71481: // Bloodbolt Splash
- case 71482: // Bloodbolt Splash
- case 71483: // Bloodbolt Splash
- case 71390: // Pact of the Darkfallen
- spellInfo->AttributesCu |= SPELL_ATTR0_CU_EXCLUDE_SELF;
- break;
case 18500: // Wing Buffet
case 33086: // Wild Bite
case 49749: // Piercing Blow
@@ -2867,16 +2876,6 @@ void SpellMgr::LoadDbcDataCorrections()
spellInfo->Effect[j] = SPELL_EFFECT_TRIGGER_MISSILE;
break;
}
-
- switch (SpellImplicitTargetInfo::Type[spellInfo->EffectImplicitTargetA[j]])
- {
- case TARGET_TYPE_UNIT_TARGET:
- case TARGET_TYPE_DEST_TARGET:
- spellInfo->Targets |= TARGET_FLAG_UNIT;
- break;
- default:
- break;
- }
}
if (spellInfo->activeIconID == 2158) // flight
@@ -2884,440 +2883,437 @@ void SpellMgr::LoadDbcDataCorrections()
switch (spellInfo->Id)
{
- case 42835: // Spout
- spellInfo->Effect[0] = 0; // remove damage effect, only anim is needed
- break;
- case 30657: // Quake
- spellInfo->EffectTriggerSpell[0] = 30571;
- break;
- case 30541: // Blaze (needs conditions entry)
- spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_TARGET_ENEMY;
- spellInfo->EffectImplicitTargetB[0] = 0;
- break;
- case 31447: // Mark of Kaz'rogal (needs target selection script)
- case 31298: // Sleep (needs target selection script)
- spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_CASTER;
- spellInfo->EffectImplicitTargetB[0] = 0;
- break;
- case 31344: // Howl of Azgalor
- spellInfo->EffectRadiusIndex[0] = 12; // 100yards instead of 50000?!
- break;
- case 42818: // Headless Horseman - Wisp Flight Port
- case 42821: // Headless Horseman - Wisp Flight Missile
- spellInfo->rangeIndex = 6; // 100 yards
- break;
- case 36350: //They Must Burn Bomb Aura (self)
- spellInfo->EffectTriggerSpell[0] = 36325; // They Must Burn Bomb Drop (DND)
- break;
- case 49838: // Stop Time
- spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_INITIAL_AGGRO;
- break;
- case 61407: // Energize Cores
- case 62136: // Energize Cores
- case 54069: // Energize Cores
- case 56251: // Energize Cores
- spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_AREA_ENTRY_SRC;
- break;
- case 50785: // Energize Cores
- case 59372: // Energize Cores
- spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_AREA_ENEMY_SRC;
- break;
- case 3286: // Bind
- spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_TARGET_ENEMY;
- spellInfo->EffectImplicitTargetA[1] = TARGET_UNIT_TARGET_ENEMY;
- break;
- case 8494: // Mana Shield (rank 2)
- // because of bug in dbc
- spellInfo->procChance = 0;
- break;
- case 32182: // Heroism
- spellInfo->excludeCasterAuraSpell = 57723; // Exhaustion
- break;
- case 2825: // Bloodlust
- spellInfo->excludeCasterAuraSpell = 57724; // Sated
- break;
- case 20335: // Heart of the Crusader
- case 20336:
- case 20337:
- case 63320: // Glyph of Life Tap
- // Entries were not updated after spell effect change, we have to do that manually :/
- spellInfo->AttributesEx3 |= SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED;
- break;
- case 16007: // Draco-Incarcinatrix 900
- // was 46, but effect is aura effect
- spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_NEARBY_ENTRY;
- spellInfo->EffectImplicitTargetB[0] = TARGET_DST_NEARBY_ENTRY;
- break;
- case 59725: // Improved Spell Reflection - aoe aura
- // Target entry seems to be wrong for this spell :/
- spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_PARTY_CASTER;
- spellInfo->EffectRadiusIndex[0] = 45;
- break;
- case 44978: case 45001: case 45002: // Wild Magic
- case 45004: case 45006: case 45010: // Wild Magic
- case 31347: // Doom
- case 41635: // Prayer of Mending
- case 44869: // Spectral Blast
- case 45027: // Revitalize
- case 45976: // Muru Portal Channel
- case 39365: // Thundering Storm
- case 41071: // Raise Dead (HACK)
- case 52124: // Sky Darkener Assault
- case 42442: // Vengeance Landing Cannonfire
- case 45863: // Cosmetic - Incinerate to Random Target
- case 25425: // Shoot
- case 45761: // Shoot
- case 42611: // Shoot
- case 62374: // Pursued
- case 61588: // Blazing Harpoon
- spellInfo->MaxAffectedTargets = 1;
- break;
- case 52479: // Gift of the Harvester
- spellInfo->MaxAffectedTargets = 1;
- // a trap always has dst = src?
- spellInfo->EffectImplicitTargetA[0] = TARGET_DST_CASTER;
- spellInfo->EffectImplicitTargetA[1] = TARGET_DST_CASTER;
- break;
- case 41376: // Spite
- case 39992: // Needle Spine
- case 29576: // Multi-Shot
- case 40816: // Saber Lash
- case 37790: // Spread Shot
- case 46771: // Flame Sear
- case 45248: // Shadow Blades
- case 41303: // Soul Drain
- case 54172: // Divine Storm (heal)
- case 29213: // Curse of the Plaguebringer - Noth
- case 28542: // Life Drain - Sapphiron
- case 66588: // Flaming Spear
- case 54171: // Divine Storm
- spellInfo->MaxAffectedTargets = 3;
- break;
- case 38310: // Multi-Shot
- case 53385: // Divine Storm (Damage)
- spellInfo->MaxAffectedTargets = 4;
- break;
- case 42005: // Bloodboil
- case 38296: // Spitfire Totem
- case 37676: // Insidious Whisper
- case 46008: // Negative Energy
- case 45641: // Fire Bloom
- case 55665: // Life Drain - Sapphiron (H)
- case 28796: // Poison Bolt Volly - Faerlina
- spellInfo->MaxAffectedTargets = 5;
- break;
- case 40827: // Sinful Beam
- case 40859: // Sinister Beam
- case 40860: // Vile Beam
- case 40861: // Wicked Beam
- case 54835: // Curse of the Plaguebringer - Noth (H)
- case 54098: // Poison Bolt Volly - Faerlina (H)
- spellInfo->MaxAffectedTargets = 10;
- break;
- case 50312: // Unholy Frenzy
- spellInfo->MaxAffectedTargets = 15;
- break;
- case 38794: case 33711: //Murmur's Touch
- spellInfo->MaxAffectedTargets = 1;
- spellInfo->EffectTriggerSpell[0] = 33760;
- break;
- case 17941: // Shadow Trance
- case 22008: // Netherwind Focus
- case 31834: // Light's Grace
- case 34754: // Clearcasting
- case 34936: // Backlash
- case 48108: // Hot Streak
- case 51124: // Killing Machine
- case 54741: // Firestarter
- case 57761: // Fireball!
- case 39805: // Lightning Overload
- case 64823: // Item - Druid T8 Balance 4P Bonus
- case 44401: // Missile Barrage
- spellInfo->procCharges = 1;
- break;
- case 44544: // Fingers of Frost
- spellInfo->EffectSpellClassMask[0] = flag96(685904631, 1151048, 0);
- break;
- case 74396: // Fingers of Frost visual buff
- spellInfo->procCharges = 2;
- spellInfo->StackAmount = 0;
- break;
- case 28200: // Ascendance (Talisman of Ascendance trinket)
- spellInfo->procCharges = 6;
- break;
- case 47201: // Everlasting Affliction
- case 47202:
- case 47203:
- case 47204:
- case 47205:
- // add corruption to affected spells
- spellInfo->EffectSpellClassMask[1][0] |= 2;
- break;
- case 49305: // Teleport to Boss 1 DND
- case 64981: // Summon Random Vanquished Tentacle
- spellInfo->EffectImplicitTargetB[0] = TARGET_UNIT_CASTER;
- break;
- case 51852: // The Eye of Acherus (no spawn in phase 2 in db)
- spellInfo->EffectMiscValue[0] |= 1;
- break;
- case 51904: // Summon Ghouls On Scarlet Crusade (core does not know the triggered spell is summon spell)
- spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_CASTER;
- break;
- case 29809: // Desecration Arm - 36 instead of 37 - typo? :/
- spellInfo->EffectRadiusIndex[0] = 37;
- break;
- // Master Shapeshifter: missing stance data for forms other than bear - bear version has correct data
- // To prevent aura staying on target after talent unlearned
- case 48420:
- spellInfo->Stances = 1 << (FORM_CAT - 1);
- break;
- case 48421:
- spellInfo->Stances = 1 << (FORM_MOONKIN - 1);
- break;
- case 48422:
- spellInfo->Stances = 1 << (FORM_TREE - 1);
- break;
- case 47569: // Improved Shadowform (Rank 1)
- // with this spell atrribute aura can be stacked several times
- spellInfo->Attributes &= ~SPELL_ATTR0_NOT_SHAPESHIFT;
- break;
- case 30421: // Nether Portal - Perseverence
- spellInfo->EffectBasePoints[2] += 30000;
- break;
- case 16834: // Natural shapeshifter
- case 16835:
- spellInfo->DurationIndex = 21;
- break;
- case 51735: // Ebon Plague
- case 51734:
- case 51726:
- spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS;
- spellInfo->SpellFamilyFlags[2] = 0x10;
- break;
- case 41013: // Parasitic Shadowfiend Passive
- spellInfo->EffectApplyAuraName[0] = 4; // proc debuff, and summon infinite fiends
- break;
- case 27892: // To Anchor 1
- case 27928: // To Anchor 1
- case 27935: // To Anchor 1
- case 27915: // Anchor to Skulls
- case 27931: // Anchor to Skulls
- case 27937: // Anchor to Skulls
- spellInfo->rangeIndex = 13;
- break;
- case 48743: // Death Pact
- spellInfo->AttributesEx &= ~SPELL_ATTR1_CANT_TARGET_SELF;
- break;
- // target allys instead of enemies, target A is src_caster, spells with effect like that have ally target
- // this is the only known exception, probably just wrong data
- case 29214: // Wrath of the Plaguebringer
- case 54836: // Wrath of the Plaguebringer
- spellInfo->EffectImplicitTargetB[0] = TARGET_UNIT_AREA_ALLY_SRC;
- spellInfo->EffectImplicitTargetB[1] = TARGET_UNIT_AREA_ALLY_SRC;
- break;
- case 31687: // Summon Water Elemental
- // 322-330 switch - effect changed to dummy, target entry not changed in client:(
- spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_CASTER;
- break;
- case 57994: // Wind Shear - improper data for EFFECT_1 in 3.3.5 DBC, but is correct in 4.x
- spellInfo->Effect[EFFECT_1] = SPELL_EFFECT_MODIFY_THREAT_PERCENT;
- spellInfo->EffectBasePoints[EFFECT_1] = -6; // -5%
- break;
- case 63675: // Improved Devouring Plague
- spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS;
- break;
- case 8145: // Tremor Totem (instant pulse)
- case 6474: // Earthbind Totem (instant pulse)
- spellInfo->AttributesEx5 |= SPELL_ATTR5_START_PERIODIC_AT_APPLY;
- break;
- case 53241: // Marked for Death (Rank 1)
- case 53243: // Marked for Death (Rank 2)
- case 53244: // Marked for Death (Rank 3)
- case 53245: // Marked for Death (Rank 4)
- case 53246: // Marked for Death (Rank 5)
- spellInfo->EffectSpellClassMask[0] = flag96(423937, 276955137, 2049);
- break;
- case 70728: // Exploit Weakness
- case 70840: // Devious Minds
- spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_CASTER;
- spellInfo->EffectImplicitTargetB[0] = TARGET_UNIT_PET;
- break;
- case 70893: // Culling The Herd
- spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_CASTER;
- spellInfo->EffectImplicitTargetB[0] = TARGET_UNIT_MASTER;
- break;
- case 54800: // Sigil of the Frozen Conscience - change class mask to custom extended flags of Icy Touch
- // this is done because another spell also uses the same SpellFamilyFlags as Icy Touch
- // SpellFamilyFlags[0] & 0x00000040 in SPELLFAMILY_DEATHKNIGHT is currently unused (3.3.5a)
- // this needs research on modifier applying rules, does not seem to be in Attributes fields
- spellInfo->EffectSpellClassMask[0] = flag96(0x00000040, 0x00000000, 0x00000000);
- break;
- case 19970: // Entangling Roots (Rank 6) -- Nature's Grasp Proc
- case 19971: // Entangling Roots (Rank 5) -- Nature's Grasp Proc
- case 19972: // Entangling Roots (Rank 4) -- Nature's Grasp Proc
- case 19973: // Entangling Roots (Rank 3) -- Nature's Grasp Proc
- case 19974: // Entangling Roots (Rank 2) -- Nature's Grasp Proc
- case 19975: // Entangling Roots (Rank 1) -- Nature's Grasp Proc
- case 27010: // Entangling Roots (Rank 7) -- Nature's Grasp Proc
- case 53313: // Entangling Roots (Rank 8) -- Nature's Grasp Proc
- spellInfo->CastingTimeIndex = 1;
- break;
- case 61719: // Easter Lay Noblegarden Egg Aura - Interrupt flags copied from aura which this aura is linked with
- spellInfo->AuraInterruptFlags = AURA_INTERRUPT_FLAG_HITBYSPELL | AURA_INTERRUPT_FLAG_TAKE_DAMAGE;
- break;
- // ULDUAR SPELLS
- //
- case 63342: // Focused Eyebeam Summon Trigger (Kologarn)
- spellInfo->MaxAffectedTargets = 1;
- break;
- case 62716: // Growth of Nature (Freya)
- case 65584: // Growth of Nature (Freya)
- case 64381: // Strength of the Pack (Auriaya)
- spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS;
- break;
- case 63018: // Searing Light (XT-002)
- case 65121: // Searing Light (25m) (XT-002)
- case 63024: // Gravity Bomb (XT-002)
- case 64234: // Gravity Bomb (25m) (XT-002)
- spellInfo->MaxAffectedTargets = 1;
- break;
- case 62834: // Boom (XT-002)
- // This hack is here because we suspect our implementation of spell effect execution on targets
- // is done in the wrong order. We suspect that EFFECT_0 needs to be applied on all targets,
- // then EFFECT_1, etc - instead of applying each effect on target1, then target2, etc.
- // The above situation causes the visual for this spell to be bugged, so we remove the instakill
- // effect and implement a script hack for that.
- spellInfo->Effect[EFFECT_1] = 0;
- break;
- case 64386: // Terrifying Screech (Auriaya)
- case 64389: // Sentinel Blast (Auriaya)
- case 64678: // Sentinel Blast (Auriaya)
- spellInfo->DurationIndex = 28; // 5 seconds, wrong DBC data?
- break;
- case 64321: // Potent Pheromones (Freya)
- // spell should dispel area aura, but doesn't have the attribute
- // may be db data bug, or blizz may keep reapplying area auras every update with checking immunity
- // that will be clear if we get more spells with problem like this
- spellInfo->AttributesEx |= SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY;
- break;
- // ENDOF ULDUAR SPELLS
- //
- // TRIAL OF THE CRUSADER SPELLS
- //
- case 66258: // Infernal Eruption (10N)
- case 67901: // Infernal Eruption (25N)
- // increase duration from 15 to 18 seconds because caster is already
- // unsummoned when spell missile hits the ground so nothing happen in result
- spellInfo->DurationIndex = 85;
- break;
- // ENDOF TRIAL OF THE CRUSADER SPELLS
- //
- // ICECROWN CITADEL SPELLS
- //
- // THESE SPELLS ARE WORKING CORRECTLY EVEN WITHOUT THIS HACK
- // THE ONLY REASON ITS HERE IS THAT CURRENT GRID SYSTEM
- // DOES NOT ALLOW FAR OBJECT SELECTION (dist > 333)
- case 70781: // Light's Hammer Teleport
- case 70856: // Oratory of the Damned Teleport
- case 70857: // Rampart of Skulls Teleport
- case 70858: // Deathbringer's Rise Teleport
- case 70859: // Upper Spire Teleport
- case 70860: // Frozen Throne Teleport
- case 70861: // Sindragosa's Lair Teleport
- spellInfo->EffectImplicitTargetA[0] = TARGET_DST_DB;
- break;
- case 69055: // Saber Lash (Lord Marrowgar)
- case 70814: // Saber Lash (Lord Marrowgar)
- spellInfo->EffectRadiusIndex[0] = 8; // 5yd
- break;
- case 69075: // Bone Storm (Lord Marrowgar)
- case 70834: // Bone Storm (Lord Marrowgar)
- case 70835: // Bone Storm (Lord Marrowgar)
- case 70836: // Bone Storm (Lord Marrowgar)
- case 72864: // Death Plague (Rotting Frost Giant)
- case 72378: // Blood Nova (Deathbringer Saurfang)
- case 73058: // Blood Nova (Deathbringer Saurfang)
- case 71160: // Plague Stench (Stinky)
- case 71161: // Plague Stench (Stinky)
- case 71123: // Decimate (Stinky & Precious)
- spellInfo->EffectRadiusIndex[0] = 12; // 100yd
- break;
- case 72723: // Resistant Skin (Deathbringer Saurfang adds)
- // this spell initially granted Shadow damage immunity, however it was removed but the data was left in client
- spellInfo->Effect[2] = 0;
- break;
- case 70460: // Coldflame Jets (Traps after Saurfang)
- spellInfo->DurationIndex = 1; // 10 seconds
- break;
- case 71413: // Green Ooze Summon (Professor Putricide)
- case 71414: // Orange Ooze Summon (Professor Putricide)
- spellInfo->EffectImplicitTargetA[0] = TARGET_DEST_DEST;
- break;
- case 71159: // Awaken Plagued Zombies
- spellInfo->DurationIndex = 21;
- break;
- // THIS IS HERE BECAUSE COOLDOWN ON CREATURE PROCS IS NOT IMPLEMENTED
- case 71604: // Mutated Strength (Professor Putricide)
- case 72673: // Mutated Strength (Professor Putricide)
- case 72674: // Mutated Strength (Professor Putricide)
- case 72675: // Mutated Strength (Professor Putricide)
- spellInfo->Effect[1] = 0;
- break;
- case 72454: // Mutated Plague (Professor Putricide)
- case 72464: // Mutated Plague (Professor Putricide)
- case 72506: // Mutated Plague (Professor Putricide)
- case 72507: // Mutated Plague (Professor Putricide)
- spellInfo->EffectRadiusIndex[0] = 28; // 50000yd
- break;
- case 70911: // Unbound Plague (Professor Putricide)
- case 72854: // Unbound Plague (Professor Putricide)
- case 72855: // Unbound Plague (Professor Putricide)
- case 72856: // Unbound Plague (Professor Putricide)
- spellInfo->EffectImplicitTargetB[0] = TARGET_UNIT_TARGET_ENEMY;
- break;
- case 71518: // Unholy Infusion Quest Credit (Professor Putricide)
- case 72934: // Blood Infusion Quest Credit (Blood-Queen Lana'thel)
- case 72289: // Frost Infusion Quest Credit (Sindragosa)
- spellInfo->EffectRadiusIndex[0] = 28; // another missing radius
- break;
- case 71708: // Empowered Flare (Blood Prince Council)
- case 72785: // Empowered Flare (Blood Prince Council)
- case 72786: // Empowered Flare (Blood Prince Council)
- case 72787: // Empowered Flare (Blood Prince Council)
- spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS;
- break;
- case 71266: // Swarming Shadows
- case 72890: // Swarming Shadows
- spellInfo->AreaGroupId = 0; // originally, these require area 4522, which is... outside of Icecrown Citadel
- break;
- case 70602: // Corruption
- spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS;
- break;
- case 70715: // Column of Frost (visual marker)
- spellInfo->DurationIndex = 32; // 6 seconds (missing)
- break;
- case 71085: // Mana Void (periodic aura)
- spellInfo->DurationIndex = 9; // 30 seconds (missing)
- break;
- case 70936: // Summon Suppressor
- spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_TARGET_ANY;
- spellInfo->EffectImplicitTargetB[0] = 0;
- break;
- case 72706: // Achievement Check (Valithria Dreamwalker)
- case 71357: // Order Whelp
- spellInfo->EffectRadiusIndex[0] = 22; // 200yd
- break;
- case 70598: // Sindragosa's Fury
- spellInfo->EffectImplicitTargetA[0] = TARGET_DST_CASTER;
- break;
- case 69846: // Frost Bomb
- spellInfo->speed = 10;
- spellInfo->EffectImplicitTargetA[0] = TARGET_DEST_TARGET_ANY;
- spellInfo->EffectImplicitTargetB[0] = TARGET_UNIT_TARGET_ANY;
- spellInfo->Effect[1] = 0;
- break;
- default:
- break;
+ case 42835: // Spout
+ spellInfo->Effect[0] = 0; // remove damage effect, only anim is needed
+ break;
+ case 30657: // Quake
+ spellInfo->EffectTriggerSpell[0] = 30571;
+ break;
+ case 30541: // Blaze (needs conditions entry)
+ spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_TARGET_ENEMY;
+ spellInfo->EffectImplicitTargetB[0] = 0;
+ break;
+ case 31447: // Mark of Kaz'rogal (needs target selection script)
+ case 31298: // Sleep (needs target selection script)
+ spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_CASTER;
+ spellInfo->EffectImplicitTargetB[0] = 0;
+ break;
+ case 31344: // Howl of Azgalor
+ spellInfo->EffectRadiusIndex[0] = 12; // 100yards instead of 50000?!
+ break;
+ case 42818: // Headless Horseman - Wisp Flight Port
+ case 42821: // Headless Horseman - Wisp Flight Missile
+ spellInfo->rangeIndex = 6; // 100 yards
+ break;
+ case 36350: //They Must Burn Bomb Aura (self)
+ spellInfo->EffectTriggerSpell[0] = 36325; // They Must Burn Bomb Drop (DND)
+ break;
+ case 49838: // Stop Time
+ spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_INITIAL_AGGRO;
+ break;
+ case 61407: // Energize Cores
+ case 62136: // Energize Cores
+ case 54069: // Energize Cores
+ case 56251: // Energize Cores
+ spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_SRC_AREA_ENTRY;
+ break;
+ case 50785: // Energize Cores
+ case 59372: // Energize Cores
+ spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_SRC_AREA_ENEMY;
+ break;
+ case 3286: // Bind
+ spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_TARGET_ENEMY;
+ spellInfo->EffectImplicitTargetA[1] = TARGET_UNIT_TARGET_ENEMY;
+ break;
+ case 8494: // Mana Shield (rank 2)
+ // because of bug in dbc
+ spellInfo->procChance = 0;
+ break;
+ case 32182: // Heroism
+ spellInfo->excludeCasterAuraSpell = 57723; // Exhaustion
+ break;
+ case 2825: // Bloodlust
+ spellInfo->excludeCasterAuraSpell = 57724; // Sated
+ break;
+ case 20335: // Heart of the Crusader
+ case 20336:
+ case 20337:
+ case 63320: // Glyph of Life Tap
+ // Entries were not updated after spell effect change, we have to do that manually :/
+ spellInfo->AttributesEx3 |= SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED;
+ break;
+ case 16007: // Draco-Incarcinatrix 900
+ // was 46, but effect is aura effect
+ spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_NEARBY_ENTRY;
+ spellInfo->EffectImplicitTargetB[0] = TARGET_DEST_NEARBY_ENTRY;
+ break;
+ case 59725: // Improved Spell Reflection - aoe aura
+ // Target entry seems to be wrong for this spell :/
+ spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_CASTER_AREA_PARTY;
+ spellInfo->EffectRadiusIndex[0] = 45;
+ break;
+ case 44978: case 45001: case 45002: // Wild Magic
+ case 45004: case 45006: case 45010: // Wild Magic
+ case 31347: // Doom
+ case 41635: // Prayer of Mending
+ case 44869: // Spectral Blast
+ case 45027: // Revitalize
+ case 45976: // Muru Portal Channel
+ case 39365: // Thundering Storm
+ case 41071: // Raise Dead (HACK)
+ case 52124: // Sky Darkener Assault
+ case 42442: // Vengeance Landing Cannonfire
+ case 45863: // Cosmetic - Incinerate to Random Target
+ case 25425: // Shoot
+ case 45761: // Shoot
+ case 42611: // Shoot
+ case 62374: // Pursued
+ case 61588: // Blazing Harpoon
+ spellInfo->MaxAffectedTargets = 1;
+ break;
+ case 52479: // Gift of the Harvester
+ spellInfo->MaxAffectedTargets = 1;
+ // a trap always has dst = src?
+ spellInfo->EffectImplicitTargetA[0] = TARGET_DEST_CASTER;
+ spellInfo->EffectImplicitTargetA[1] = TARGET_DEST_CASTER;
+ break;
+ case 41376: // Spite
+ case 39992: // Needle Spine
+ case 29576: // Multi-Shot
+ case 40816: // Saber Lash
+ case 37790: // Spread Shot
+ case 46771: // Flame Sear
+ case 45248: // Shadow Blades
+ case 41303: // Soul Drain
+ case 54172: // Divine Storm (heal)
+ case 29213: // Curse of the Plaguebringer - Noth
+ case 28542: // Life Drain - Sapphiron
+ case 66588: // Flaming Spear
+ case 54171: // Divine Storm
+ spellInfo->MaxAffectedTargets = 3;
+ break;
+ case 38310: // Multi-Shot
+ case 53385: // Divine Storm (Damage)
+ spellInfo->MaxAffectedTargets = 4;
+ break;
+ case 42005: // Bloodboil
+ case 38296: // Spitfire Totem
+ case 37676: // Insidious Whisper
+ case 46008: // Negative Energy
+ case 45641: // Fire Bloom
+ case 55665: // Life Drain - Sapphiron (H)
+ case 28796: // Poison Bolt Volly - Faerlina
+ spellInfo->MaxAffectedTargets = 5;
+ break;
+ case 40827: // Sinful Beam
+ case 40859: // Sinister Beam
+ case 40860: // Vile Beam
+ case 40861: // Wicked Beam
+ case 54835: // Curse of the Plaguebringer - Noth (H)
+ case 54098: // Poison Bolt Volly - Faerlina (H)
+ spellInfo->MaxAffectedTargets = 10;
+ break;
+ case 50312: // Unholy Frenzy
+ spellInfo->MaxAffectedTargets = 15;
+ break;
+ case 38794: case 33711: //Murmur's Touch
+ spellInfo->MaxAffectedTargets = 1;
+ spellInfo->EffectTriggerSpell[0] = 33760;
+ break;
+ case 17941: // Shadow Trance
+ case 22008: // Netherwind Focus
+ case 31834: // Light's Grace
+ case 34754: // Clearcasting
+ case 34936: // Backlash
+ case 48108: // Hot Streak
+ case 51124: // Killing Machine
+ case 54741: // Firestarter
+ case 57761: // Fireball!
+ case 39805: // Lightning Overload
+ case 64823: // Item - Druid T8 Balance 4P Bonus
+ case 44401: // Missile Barrage
+ spellInfo->procCharges = 1;
+ break;
+ case 44544: // Fingers of Frost
+ spellInfo->EffectSpellClassMask[0] = flag96(685904631, 1151048, 0);
+ break;
+ case 74396: // Fingers of Frost visual buff
+ spellInfo->procCharges = 2;
+ spellInfo->StackAmount = 0;
+ break;
+ case 28200: // Ascendance (Talisman of Ascendance trinket)
+ spellInfo->procCharges = 6;
+ break;
+ case 47201: // Everlasting Affliction
+ case 47202:
+ case 47203:
+ case 47204:
+ case 47205:
+ // add corruption to affected spells
+ spellInfo->EffectSpellClassMask[1][0] |= 2;
+ break;
+ case 49305: // Teleport to Boss 1 DND
+ case 64981: // Summon Random Vanquished Tentacle
+ spellInfo->EffectImplicitTargetB[0] = TARGET_UNIT_CASTER;
+ break;
+ case 51852: // The Eye of Acherus (no spawn in phase 2 in db)
+ spellInfo->EffectMiscValue[0] |= 1;
+ break;
+ case 51904: // Summon Ghouls On Scarlet Crusade (core does not know the triggered spell is summon spell)
+ spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_CASTER;
+ break;
+ case 29809: // Desecration Arm - 36 instead of 37 - typo? :/
+ spellInfo->EffectRadiusIndex[0] = 37;
+ break;
+ // Master Shapeshifter: missing stance data for forms other than bear - bear version has correct data
+ // To prevent aura staying on target after talent unlearned
+ case 48420:
+ spellInfo->Stances = 1 << (FORM_CAT - 1);
+ break;
+ case 48421:
+ spellInfo->Stances = 1 << (FORM_MOONKIN - 1);
+ break;
+ case 48422:
+ spellInfo->Stances = 1 << (FORM_TREE - 1);
+ break;
+ case 47569: // Improved Shadowform (Rank 1)
+ // with this spell atrribute aura can be stacked several times
+ spellInfo->Attributes &= ~SPELL_ATTR0_NOT_SHAPESHIFT;
+ break;
+ case 30421: // Nether Portal - Perseverence
+ spellInfo->EffectBasePoints[2] += 30000;
+ break;
+ case 16834: // Natural shapeshifter
+ case 16835:
+ spellInfo->DurationIndex = 21;
+ break;
+ case 51735: // Ebon Plague
+ case 51734:
+ case 51726:
+ spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS;
+ spellInfo->SpellFamilyFlags[2] = 0x10;
+ break;
+ case 41013: // Parasitic Shadowfiend Passive
+ spellInfo->EffectApplyAuraName[0] = 4; // proc debuff, and summon infinite fiends
+ break;
+ case 27892: // To Anchor 1
+ case 27928: // To Anchor 1
+ case 27935: // To Anchor 1
+ case 27915: // Anchor to Skulls
+ case 27931: // Anchor to Skulls
+ case 27937: // Anchor to Skulls
+ spellInfo->rangeIndex = 13;
+ break;
+ // target allys instead of enemies, target A is src_caster, spells with effect like that have ally target
+ // this is the only known exception, probably just wrong data
+ case 29214: // Wrath of the Plaguebringer
+ case 54836: // Wrath of the Plaguebringer
+ spellInfo->EffectImplicitTargetB[0] = TARGET_UNIT_SRC_AREA_ALLY;
+ spellInfo->EffectImplicitTargetB[1] = TARGET_UNIT_SRC_AREA_ALLY;
+ break;
+ case 31687: // Summon Water Elemental
+ // 322-330 switch - effect changed to dummy, target entry not changed in client:(
+ spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_CASTER;
+ break;
+ case 57994: // Wind Shear - improper data for EFFECT_1 in 3.3.5 DBC, but is correct in 4.x
+ spellInfo->Effect[EFFECT_1] = SPELL_EFFECT_MODIFY_THREAT_PERCENT;
+ spellInfo->EffectBasePoints[EFFECT_1] = -6; // -5%
+ break;
+ case 63675: // Improved Devouring Plague
+ spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS;
+ break;
+ case 8145: // Tremor Totem (instant pulse)
+ case 6474: // Earthbind Totem (instant pulse)
+ spellInfo->AttributesEx5 |= SPELL_ATTR5_START_PERIODIC_AT_APPLY;
+ break;
+ case 53241: // Marked for Death (Rank 1)
+ case 53243: // Marked for Death (Rank 2)
+ case 53244: // Marked for Death (Rank 3)
+ case 53245: // Marked for Death (Rank 4)
+ case 53246: // Marked for Death (Rank 5)
+ spellInfo->EffectSpellClassMask[0] = flag96(423937, 276955137, 2049);
+ break;
+ case 70728: // Exploit Weakness
+ case 70840: // Devious Minds
+ spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_CASTER;
+ spellInfo->EffectImplicitTargetB[0] = TARGET_UNIT_PET;
+ break;
+ case 70893: // Culling The Herd
+ spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_CASTER;
+ spellInfo->EffectImplicitTargetB[0] = TARGET_UNIT_MASTER;
+ break;
+ case 54800: // Sigil of the Frozen Conscience - change class mask to custom extended flags of Icy Touch
+ // this is done because another spell also uses the same SpellFamilyFlags as Icy Touch
+ // SpellFamilyFlags[0] & 0x00000040 in SPELLFAMILY_DEATHKNIGHT is currently unused (3.3.5a)
+ // this needs research on modifier applying rules, does not seem to be in Attributes fields
+ spellInfo->EffectSpellClassMask[0] = flag96(0x00000040, 0x00000000, 0x00000000);
+ break;
+ case 19970: // Entangling Roots (Rank 6) -- Nature's Grasp Proc
+ case 19971: // Entangling Roots (Rank 5) -- Nature's Grasp Proc
+ case 19972: // Entangling Roots (Rank 4) -- Nature's Grasp Proc
+ case 19973: // Entangling Roots (Rank 3) -- Nature's Grasp Proc
+ case 19974: // Entangling Roots (Rank 2) -- Nature's Grasp Proc
+ case 19975: // Entangling Roots (Rank 1) -- Nature's Grasp Proc
+ case 27010: // Entangling Roots (Rank 7) -- Nature's Grasp Proc
+ case 53313: // Entangling Roots (Rank 8) -- Nature's Grasp Proc
+ spellInfo->CastingTimeIndex = 1;
+ break;
+ case 61719: // Easter Lay Noblegarden Egg Aura - Interrupt flags copied from aura which this aura is linked with
+ spellInfo->AuraInterruptFlags = AURA_INTERRUPT_FLAG_HITBYSPELL | AURA_INTERRUPT_FLAG_TAKE_DAMAGE;
+ break;
+ // ULDUAR SPELLS
+ //
+ case 63342: // Focused Eyebeam Summon Trigger (Kologarn)
+ spellInfo->MaxAffectedTargets = 1;
+ break;
+ case 62716: // Growth of Nature (Freya)
+ case 65584: // Growth of Nature (Freya)
+ case 64381: // Strength of the Pack (Auriaya)
+ spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS;
+ break;
+ case 63018: // Searing Light (XT-002)
+ case 65121: // Searing Light (25m) (XT-002)
+ case 63024: // Gravity Bomb (XT-002)
+ case 64234: // Gravity Bomb (25m) (XT-002)
+ spellInfo->MaxAffectedTargets = 1;
+ break;
+ case 62834: // Boom (XT-002)
+ // This hack is here because we suspect our implementation of spell effect execution on targets
+ // is done in the wrong order. We suspect that EFFECT_0 needs to be applied on all targets,
+ // then EFFECT_1, etc - instead of applying each effect on target1, then target2, etc.
+ // The above situation causes the visual for this spell to be bugged, so we remove the instakill
+ // effect and implement a script hack for that.
+ spellInfo->Effect[EFFECT_1] = 0;
+ break;
+ case 64386: // Terrifying Screech (Auriaya)
+ case 64389: // Sentinel Blast (Auriaya)
+ case 64678: // Sentinel Blast (Auriaya)
+ spellInfo->DurationIndex = 28; // 5 seconds, wrong DBC data?
+ break;
+ case 64321: // Potent Pheromones (Freya)
+ // spell should dispel area aura, but doesn't have the attribute
+ // may be db data bug, or blizz may keep reapplying area auras every update with checking immunity
+ // that will be clear if we get more spells with problem like this
+ spellInfo->AttributesEx |= SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY;
+ break;
+ // ENDOF ULDUAR SPELLS
+ //
+ // TRIAL OF THE CRUSADER SPELLS
+ //
+ case 66258: // Infernal Eruption (10N)
+ case 67901: // Infernal Eruption (25N)
+ // increase duration from 15 to 18 seconds because caster is already
+ // unsummoned when spell missile hits the ground so nothing happen in result
+ spellInfo->DurationIndex = 85;
+ break;
+ // ENDOF TRIAL OF THE CRUSADER SPELLS
+ //
+ // ICECROWN CITADEL SPELLS
+ //
+ // THESE SPELLS ARE WORKING CORRECTLY EVEN WITHOUT THIS HACK
+ // THE ONLY REASON ITS HERE IS THAT CURRENT GRID SYSTEM
+ // DOES NOT ALLOW FAR OBJECT SELECTION (dist > 333)
+ case 70781: // Light's Hammer Teleport
+ case 70856: // Oratory of the Damned Teleport
+ case 70857: // Rampart of Skulls Teleport
+ case 70858: // Deathbringer's Rise Teleport
+ case 70859: // Upper Spire Teleport
+ case 70860: // Frozen Throne Teleport
+ case 70861: // Sindragosa's Lair Teleport
+ spellInfo->EffectImplicitTargetA[0] = TARGET_DEST_DB;
+ break;
+ case 69055: // Saber Lash (Lord Marrowgar)
+ case 70814: // Saber Lash (Lord Marrowgar)
+ spellInfo->EffectRadiusIndex[0] = 8; // 5yd
+ break;
+ case 69075: // Bone Storm (Lord Marrowgar)
+ case 70834: // Bone Storm (Lord Marrowgar)
+ case 70835: // Bone Storm (Lord Marrowgar)
+ case 70836: // Bone Storm (Lord Marrowgar)
+ case 72864: // Death Plague (Rotting Frost Giant)
+ case 72378: // Blood Nova (Deathbringer Saurfang)
+ case 73058: // Blood Nova (Deathbringer Saurfang)
+ case 71160: // Plague Stench (Stinky)
+ case 71161: // Plague Stench (Stinky)
+ case 71123: // Decimate (Stinky & Precious)
+ spellInfo->EffectRadiusIndex[0] = 12; // 100yd
+ break;
+ case 72723: // Resistant Skin (Deathbringer Saurfang adds)
+ // this spell initially granted Shadow damage immunity, however it was removed but the data was left in client
+ spellInfo->Effect[2] = 0;
+ break;
+ case 70460: // Coldflame Jets (Traps after Saurfang)
+ spellInfo->DurationIndex = 1; // 10 seconds
+ break;
+ case 71413: // Green Ooze Summon (Professor Putricide)
+ case 71414: // Orange Ooze Summon (Professor Putricide)
+ spellInfo->EffectImplicitTargetA[0] = TARGET_DEST_DEST;
+ break;
+ case 71159: // Awaken Plagued Zombies
+ spellInfo->DurationIndex = 21;
+ break;
+ // THIS IS HERE BECAUSE COOLDOWN ON CREATURE PROCS IS NOT IMPLEMENTED
+ case 71604: // Mutated Strength (Professor Putricide)
+ case 72673: // Mutated Strength (Professor Putricide)
+ case 72674: // Mutated Strength (Professor Putricide)
+ case 72675: // Mutated Strength (Professor Putricide)
+ spellInfo->Effect[1] = 0;
+ break;
+ case 72454: // Mutated Plague (Professor Putricide)
+ case 72464: // Mutated Plague (Professor Putricide)
+ case 72506: // Mutated Plague (Professor Putricide)
+ case 72507: // Mutated Plague (Professor Putricide)
+ spellInfo->EffectRadiusIndex[0] = 28; // 50000yd
+ break;
+ case 70911: // Unbound Plague (Professor Putricide)
+ case 72854: // Unbound Plague (Professor Putricide)
+ case 72855: // Unbound Plague (Professor Putricide)
+ case 72856: // Unbound Plague (Professor Putricide)
+ spellInfo->EffectImplicitTargetB[0] = TARGET_UNIT_TARGET_ENEMY;
+ break;
+ case 71518: // Unholy Infusion Quest Credit (Professor Putricide)
+ case 72934: // Blood Infusion Quest Credit (Blood-Queen Lana'thel)
+ case 72289: // Frost Infusion Quest Credit (Sindragosa)
+ spellInfo->EffectRadiusIndex[0] = 28; // another missing radius
+ break;
+ case 71708: // Empowered Flare (Blood Prince Council)
+ case 72785: // Empowered Flare (Blood Prince Council)
+ case 72786: // Empowered Flare (Blood Prince Council)
+ case 72787: // Empowered Flare (Blood Prince Council)
+ spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS;
+ break;
+ case 71266: // Swarming Shadows
+ case 72890: // Swarming Shadows
+ spellInfo->AreaGroupId = 0; // originally, these require area 4522, which is... outside of Icecrown Citadel
+ break;
+ case 70602: // Corruption
+ spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS;
+ break;
+ case 70715: // Column of Frost (visual marker)
+ spellInfo->DurationIndex = 32; // 6 seconds (missing)
+ break;
+ case 71085: // Mana Void (periodic aura)
+ spellInfo->DurationIndex = 9; // 30 seconds (missing)
+ break;
+ case 70936: // Summon Suppressor
+ spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_TARGET_ANY;
+ spellInfo->EffectImplicitTargetB[0] = 0;
+ break;
+ case 72706: // Achievement Check (Valithria Dreamwalker)
+ case 71357: // Order Whelp
+ spellInfo->EffectRadiusIndex[0] = 22; // 200yd
+ break;
+ case 70598: // Sindragosa's Fury
+ spellInfo->EffectImplicitTargetA[0] = TARGET_DEST_CASTER;
+ break;
+ case 69846: // Frost Bomb
+ spellInfo->speed = 10;
+ spellInfo->EffectImplicitTargetA[0] = TARGET_DEST_TARGET_ANY;
+ spellInfo->EffectImplicitTargetB[0] = TARGET_UNIT_TARGET_ANY;
+ spellInfo->Effect[1] = 0;
+ break;
+ default:
+ break;
}
switch (spellInfo->SpellFamilyName)
diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h
index f6f8fb4d080..e8ac3ce9862 100755
--- a/src/server/game/Spells/SpellMgr.h
+++ b/src/server/game/Spells/SpellMgr.h
@@ -24,6 +24,7 @@
#include <ace/Singleton.h>
#include "Common.h"
#include "SharedDefines.h"
+#include "Unit.h"
class SpellInfo;
class Player;
@@ -550,8 +551,8 @@ class SpellMgr
// Spell difficulty
uint32 GetSpellDifficultyId(uint32 spellId) const;
void SetSpellDifficultyId(uint32 spellId, uint32 id);
- uint32 GetSpellIdForDifficulty(uint32 spellId, Unit* caster) const;
- SpellInfo const* GetSpellForDifficultyFromSpell(SpellInfo const* spell, Unit* caster) const;
+ uint32 GetSpellIdForDifficulty(uint32 spellId, Unit const* caster) const;
+ SpellInfo const* GetSpellForDifficultyFromSpell(SpellInfo const* spell, Unit const* caster) const;
// Spell Ranks table
SpellChainNode const* GetSpellChainNode(uint32 spell_id) const;
diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp
index bb7b242a561..5c9a6a23304 100755
--- a/src/server/game/Spells/SpellScript.cpp
+++ b/src/server/game/Spells/SpellScript.cpp
@@ -477,6 +477,11 @@ void SpellScript::SetCustomCastResultMessage(SpellCustomErrors result)
m_spell->m_customError = result;
}
+SpellValue const* SpellScript::GetSpellValue()
+{
+ return m_spell->m_spellValue;
+}
+
bool AuraScript::_Validate(SpellInfo const* entry)
{
for (std::list<CheckAreaTargetHandler>::iterator itr = DoCheckAreaTarget.begin(); itr != DoCheckAreaTarget.end(); ++itr)
diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index e28030d7605..c9f88092028 100755
--- a/src/server/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
@@ -256,6 +256,7 @@ class SpellScript : public _SpellScript
Unit* GetCaster();
Unit* GetOriginalCaster();
SpellInfo const* GetSpellInfo();
+ SpellValue const* GetSpellValue();
// methods useable after spell targets are set
// accessors to the "focus" targets of the spell
@@ -287,10 +288,12 @@ class SpellScript : public _SpellScript
// returns: target of current effect if it was GameObject otherwise NULL
GameObject* GetHitGObj();
// setter/getter for for damage done by spell to target of spell hit
+ // returns damage calculated before hit, and real dmg done after hit
int32 GetHitDamage();
void SetHitDamage(int32 damage);
void PreventHitDamage() { SetHitDamage(0); }
// setter/getter for for heal done by spell to target of spell hit
+ // returns healing calculated before hit, and real dmg done after hit
int32 GetHitHeal();
void SetHitHeal(int32 heal);
void PreventHitHeal() { SetHitHeal(0); }
diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.cpp b/src/server/game/Tools/CharacterDatabaseCleaner.cpp
index e77d07f0762..f690b5401b4 100644
--- a/src/server/game/Tools/CharacterDatabaseCleaner.cpp
+++ b/src/server/game/Tools/CharacterDatabaseCleaner.cpp
@@ -20,6 +20,7 @@
#include "CharacterDatabaseCleaner.h"
#include "World.h"
#include "Database/DatabaseEnv.h"
+#include "SpellMgr.h"
#include "DBCStores.h"
void CharacterDatabaseCleaner::CleanDatabase()
diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp
index 86fb5cce425..7961c705d5b 100755..100644
--- a/src/server/game/Tools/PlayerDump.cpp
+++ b/src/server/game/Tools/PlayerDump.cpp
@@ -176,7 +176,7 @@ bool changeGuid(std::string &str, int n, std::map<uint32, uint32> &guidMap, uint
return true; // not an error
uint32 newGuid = registerNewGuid(oldGuid, guidMap, hiGuid);
- snprintf(chritem, 20, "%d", newGuid);
+ snprintf(chritem, 20, "%u", newGuid);
return changenth(str, n, chritem, false, nonzero);
}
@@ -189,7 +189,7 @@ bool changetokGuid(std::string &str, int n, std::map<uint32, uint32> &guidMap, u
return true; // not an error
uint32 newGuid = registerNewGuid(oldGuid, guidMap, hiGuid);
- snprintf(chritem, 20, "%d", newGuid);
+ snprintf(chritem, 20, "%u", newGuid);
return changetoknth(str, n, chritem, false, nonzero);
}
@@ -421,9 +421,9 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
// name encoded or empty
- snprintf(newguid, 20, "%d", guid);
- snprintf(chraccount, 20, "%d", account);
- snprintf(newpetid, 20, "%d", sObjectMgr->GeneratePetNumber());
+ snprintf(newguid, 20, "%u", guid);
+ snprintf(chraccount, 20, "%u", account);
+ snprintf(newpetid, 20, "%u", sObjectMgr->GeneratePetNumber());
snprintf(lastpetid, 20, "%s", "");
std::map<uint32, uint32> items;
@@ -520,11 +520,11 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
ROLLBACK(DUMP_FILE_BROKEN);
const char null[5] = "NULL";
- if (!changenth(line, 68, null)) // characters.deleteInfos_Account
+ if (!changenth(line, 69, null)) // characters.deleteInfos_Account
ROLLBACK(DUMP_FILE_BROKEN);
- if (!changenth(line, 69, null)) // characters.deleteInfos_Name
+ if (!changenth(line, 70, null)) // characters.deleteInfos_Name
ROLLBACK(DUMP_FILE_BROKEN);
- if (!changenth(line, 70, null)) // characters.deleteDate
+ if (!changenth(line, 71, null)) // characters.deleteDate
ROLLBACK(DUMP_FILE_BROKEN);
break;
}
diff --git a/src/server/game/Weather/Weather.h b/src/server/game/Weather/Weather.h
index b3146ddafe6..3db1b503eb1 100755
--- a/src/server/game/Weather/Weather.h
+++ b/src/server/game/Weather/Weather.h
@@ -56,7 +56,8 @@ enum WeatherState
WEATHER_STATE_MEDIUM_SANDSTORM = 41,
WEATHER_STATE_HEAVY_SANDSTORM = 42,
WEATHER_STATE_THUNDERS = 86,
- WEATHER_STATE_BLACKRAIN = 90
+ WEATHER_STATE_BLACKRAIN = 90,
+ WEATHER_STATE_BLACKSNOW = 106,
};
/// Weather for one zone
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 639af40fa1d..aa4ce9444ae 100755
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1754,7 +1754,7 @@ void World::DetectDBCLang()
uint8 default_locale = TOTAL_LOCALES;
for (uint8 i = default_locale-1; i < TOTAL_LOCALES; --i) // -1 will be 255 due to uint8
{
- if (strlen(race->name[i]) > 0) // check by race names
+ if (race->name[i][0] != '\0') // check by race names
{
default_locale = i;
m_availableDbcLocaleMask |= (1 << i);
diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp
index 1fa697f3f44..f077d6ec9c0 100644
--- a/src/server/scripts/Commands/cs_go.cpp
+++ b/src/server/scripts/Commands/cs_go.cpp
@@ -44,7 +44,6 @@ public:
{ "taxinode", SEC_MODERATOR, false, &HandleGoTaxinodeCommand, "", NULL },
{ "trigger", SEC_MODERATOR, false, &HandleGoTriggerCommand, "", NULL },
{ "zonexy", SEC_MODERATOR, false, &HandleGoZoneXYCommand, "", NULL },
- { "xy", SEC_MODERATOR, false, &HandleGoXYCommand, "", NULL },
{ "xyz", SEC_MODERATOR, false, &HandleGoXYZCommand, "", NULL },
{ "ticket", SEC_MODERATOR, false, &HandleGoTicketCommand, "", NULL },
{ "", SEC_MODERATOR, false, &HandleGoXYZCommand, "", NULL },
@@ -477,8 +476,8 @@ public:
return true;
}
- //teleport at coordinates
- static bool HandleGoXYCommand(ChatHandler* handler, const char* args)
+ //teleport at coordinates, including Z and orientation
+ static bool HandleGoXYZCommand(ChatHandler* handler, const char* args)
{
if (!*args)
return false;
@@ -487,75 +486,51 @@ public:
char* px = strtok((char*)args, " ");
char* py = strtok(NULL, " ");
+ char* pz = strtok(NULL, " ");
char* pmapid = strtok(NULL, " ");
+ char* port = strtok(NULL, " ");
if (!px || !py)
return false;
float x = (float)atof(px);
float y = (float)atof(py);
+ float z;
+ float ort;
uint32 mapid;
+
if (pmapid)
mapid = (uint32)atoi(pmapid);
else
mapid = _player->GetMapId();
-
- if (!MapManager::IsValidMapCoord(mapid, x, y))
- {
- handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, mapid);
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- // stop flight if need
- if (_player->isInFlight())
+
+ if( port )
+ ort = (float)atof(port);
+ else
+ ort = _player->GetOrientation();
+
+ if( pz )
{
- _player->GetMotionMaster()->MovementExpired();
- _player->CleanupAfterTaxiFlight();
+ z = (float)atof(pz);
+ if (!MapManager::IsValidMapCoord(mapid, x, y, z))
+ {
+ handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, mapid);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
}
- // save only in non-flight case
- else
- _player->SaveRecallPosition();
-
- Map const *map = sMapMgr->CreateBaseMap(mapid);
- float z = std::max(map->GetHeight(x, y, MAX_HEIGHT), map->GetWaterLevel(x, y));
-
- _player->TeleportTo(mapid, x, y, z, _player->GetOrientation());
-
- return true;
- }
- //teleport at coordinates, including Z
- static bool HandleGoXYZCommand(ChatHandler* handler, const char* args)
- {
- if (!*args)
- return false;
-
- Player* _player = handler->GetSession()->GetPlayer();
-
- char* px = strtok((char*)args, " ");
- char* py = strtok(NULL, " ");
- char* pz = strtok(NULL, " ");
- char* pmapid = strtok(NULL, " ");
-
- if (!px || !py || !pz)
- return false;
-
- float x = (float)atof(px);
- float y = (float)atof(py);
- float z = (float)atof(pz);
- uint32 mapid;
- if (pmapid)
- mapid = (uint32)atoi(pmapid);
else
- mapid = _player->GetMapId();
-
- if (!MapManager::IsValidMapCoord(mapid, x, y, z))
{
- handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, mapid);
- handler->SetSentErrorMessage(true);
- return false;
+ if (!MapManager::IsValidMapCoord(mapid, x, y))
+ {
+ handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, mapid);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ Map const *map = sMapMgr->CreateBaseMap(mapid);
+ z = std::max(map->GetHeight(x, y, MAX_HEIGHT), map->GetWaterLevel(x, y));
}
-
+
// stop flight if need
if (_player->isInFlight())
{
@@ -566,7 +541,7 @@ public:
else
_player->SaveRecallPosition();
- _player->TeleportTo(mapid, x, y, z, _player->GetOrientation());
+ _player->TeleportTo(mapid, x, y, z, ort);
return true;
}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.h b/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.h
index 926acc8c965..2282acaa233 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.h
@@ -54,6 +54,7 @@ enum eTypes
DATA_THRONE_DOOR = 24,
DATA_SF_BRAZIER_N = 25,
- DATA_SF_BRAZIER_S = 26
+ DATA_SF_BRAZIER_S = 26,
+ DATA_MOIRA = 27,
};
#endif
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp
index 3ff21b428d6..1d9878a331a 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp
@@ -24,6 +24,7 @@ SDCategory: Blackrock Depths
EndScriptData */
#include "ScriptPCH.h"
+#include "blackrock_depths.h"
enum Yells
{
@@ -49,8 +50,12 @@ public:
struct boss_draganthaurissanAI : public ScriptedAI
{
- boss_draganthaurissanAI(Creature* c) : ScriptedAI(c) {}
+ boss_draganthaurissanAI(Creature* c) : ScriptedAI(c)
+ {
+ instance = me->GetInstanceScript();
+ }
+ InstanceScript* instance;
uint32 HandOfThaurissan_Timer;
uint32 AvatarOfFlame_Timer;
//uint32 Counter;
@@ -73,6 +78,15 @@ public:
DoScriptText(SAY_SLAY, me);
}
+ void JustDied(Unit* /*who*/)
+ {
+ if (Creature* Moira = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_MOIRA) : 0))
+ {
+ Moira->AI()->EnterEvadeMode();
+ Moira->setFaction(35);
+ }
+ }
+
void UpdateAI(const uint32 diff)
{
//Return since we have no target
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/instance_blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/instance_blackrock_depths.cpp
index 95d15ceb4bd..f6fa3ca18d9 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/instance_blackrock_depths.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/instance_blackrock_depths.cpp
@@ -42,6 +42,7 @@ enum eEnums
NPC_GLOOMREL = 9037,
NPC_DOOMREL = 9039,
NPC_MAGMUS = 9938,
+ NPC_MOIRA = 8929,
GO_ARENA1 = 161525,
GO_ARENA2 = 161522,
@@ -87,6 +88,7 @@ public:
uint64 EmperorGUID;
uint64 PhalanxGUID;
uint64 MagmusGUID;
+ uint64 MoiraGUID;
uint64 GoArena1GUID;
uint64 GoArena2GUID;
@@ -124,6 +126,7 @@ public:
EmperorGUID = 0;
PhalanxGUID = 0;
MagmusGUID = 0;
+ MoiraGUID = 0;
GoArena1GUID = 0;
GoArena2GUID = 0;
@@ -163,6 +166,7 @@ public:
{
case NPC_EMPEROR: EmperorGUID = creature->GetGUID(); break;
case NPC_PHALANX: PhalanxGUID = creature->GetGUID(); break;
+ case NPC_MOIRA: MoiraGUID = creature->GetGUID(); break;
case NPC_DOOMREL: TombBossGUIDs[0] = creature->GetGUID(); break;
case NPC_DOPEREL: TombBossGUIDs[1] = creature->GetGUID(); break;
case NPC_HATEREL: TombBossGUIDs[2] = creature->GetGUID(); break;
@@ -308,6 +312,8 @@ public:
return EmperorGUID;
case DATA_PHALANX:
return PhalanxGUID;
+ case DATA_MOIRA:
+ return MoiraGUID;
case DATA_ARENA1:
return GoArena1GUID;
case DATA_ARENA2:
diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
index ffea5fc8dc5..f18fc5ee243 100644
--- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
+++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
@@ -357,7 +357,7 @@ public:
if (GameObject* pGo = me->SummonGameObject(183410, -533.140f, -105.322f, -156.016f, 0, 0, 0, 0, 0, 1000))
{
GoSummonList.push_back(pGo->GetGUID());
- pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); //We can't use it!
+ pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); //We can't use it!
}
Summon(3);
break;
@@ -372,7 +372,7 @@ public:
if (GameObject* pGo = me->SummonGameObject(183410, -542.199f, -96.854f, -155.790f, 0, 0, 0, 0, 0, 1000))
{
GoSummonList.push_back(pGo->GetGUID());
- pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
break;
case 5:
@@ -392,7 +392,7 @@ public:
if (GameObject* pGo = me->SummonGameObject(183410, -507.820f, -103.333f, -151.353f, 0, 0, 0, 0, 0, 1000))
{
GoSummonList.push_back(pGo->GetGUID());
- pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); //We can't use it!
+ pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); //We can't use it!
Summon(6);
}
break;
@@ -400,7 +400,7 @@ public:
if (GameObject* pGo = me->SummonGameObject(183410, -511.829f, -86.249f, -151.431f, 0, 0, 0, 0, 0, 1000))
{
GoSummonList.push_back(pGo->GetGUID());
- pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); //We can't use it!
+ pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); //We can't use it!
}
break;
case 9:
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
index afd39b9b8d0..303a307d2b9 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
@@ -58,7 +58,7 @@ public:
if (pInstance)
{
pGo->SetGoState(GO_STATE_ACTIVE);
- pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
pInstance->SetData(DATA_FIRE, pInstance->GetData(DATA_FIRE) + 1);
return true;
}
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp
index 0b0e9076fc1..07c7fcf6f27 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp
@@ -126,12 +126,12 @@ public:
case GO_SHRINE_OF_GELIHAST:
m_uiShrineOfGelihastGUID = go->GetGUID();
if (m_auiEncounter[0] != DONE)
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_ALTAR_OF_THE_DEEPS:
m_uiAltarOfTheDeepsGUID = go->GetGUID();
if (m_auiEncounter[3] != DONE)
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_AKU_MAI_DOOR:
if (m_auiEncounter[2] == DONE)
@@ -149,14 +149,14 @@ public:
m_auiEncounter[0] = uiData;
if (uiData == DONE)
if (GameObject* go = instance->GetGameObject(m_uiShrineOfGelihastGUID))
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case TYPE_AKU_MAI:
m_auiEncounter[3] = uiData;
if (uiData == DONE)
if (GameObject* go = instance->GetGameObject(m_uiAltarOfTheDeepsGUID))
{
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
go->SummonCreature(NPC_MORRIDUNE, SpawnsLocation[4], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
}
break;
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
index 60cd1b5f82a..19287d656a8 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
@@ -105,7 +105,7 @@ public:
case GO_GONG:
uiGongGUID = go->GetGUID();
if (m_auiEncounter[0] == DONE)
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
default:
break;
@@ -123,7 +123,7 @@ public:
case 9:
case 14:
if (GameObject* go = instance->GetGameObject(uiGongGUID))
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case 1:
case 10:
@@ -134,7 +134,7 @@ public:
if (!go)
return;
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
uint32 uiCreature = 0;
uint8 uiSummonTimes = 0;
diff --git a/src/server/scripts/Kalimdor/ashenvale.cpp b/src/server/scripts/Kalimdor/ashenvale.cpp
index da38e26fd22..527d6b3d3e4 100644
--- a/src/server/scripts/Kalimdor/ashenvale.cpp
+++ b/src/server/scripts/Kalimdor/ashenvale.cpp
@@ -331,7 +331,7 @@ class npc_muglash : public CreatureScript
if (GameObject* pGo = GetClosestGameObjectWithEntry(me, GO_NAGA_BRAZIER, INTERACTION_DISTANCE*2))
{
- pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
SetEscortPaused(true);
}
break;
diff --git a/src/server/scripts/Kalimdor/dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/dustwallow_marsh.cpp
index 6e11930a441..a0f30c53a4d 100644
--- a/src/server/scripts/Kalimdor/dustwallow_marsh.cpp
+++ b/src/server/scripts/Kalimdor/dustwallow_marsh.cpp
@@ -812,8 +812,8 @@ class spell_energize_aoe : public SpellScriptLoader
void Register()
{
OnEffect += SpellEffectFn(spell_energize_aoe_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_energize_aoe_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENTRY_SRC);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_energize_aoe_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_AREA_ENTRY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_energize_aoe_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_energize_aoe_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENTRY);
}
};
diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp
index ba34591b84c..a4ded3f65b0 100644
--- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp
@@ -394,7 +394,7 @@ public:
if (pPrinceTaldaram && pPrinceTaldaram->isAlive())
{
// maybe these are hacks :(
- pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
pGO->SetGoState(GO_STATE_ACTIVE);
switch(pGO->GetEntry())
diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp
index f9922009b1f..7472efcdc42 100644
--- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp
@@ -115,17 +115,17 @@ public:
if (spheres[0] == IN_PROGRESS)
{
go->SetGoState(GO_STATE_ACTIVE);
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
- else go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ else go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case 193094: Prince_TaldaramSpheres[1] = go->GetGUID();
if (spheres[1] == IN_PROGRESS)
{
go->SetGoState(GO_STATE_ACTIVE);
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
- else go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ else go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case 192236: Prince_TaldaramGate = go->GetGUID(); // Web gate past Prince Taldaram
if (m_auiEncounter[1] == DONE)HandleGameObject(0, true, go);break;
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
index 784684ad42d..3bbe7b125af 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
@@ -369,8 +369,8 @@ class spell_baltharus_enervating_brand_trigger : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_baltharus_enervating_brand_trigger_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ALLY_SRC);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_baltharus_enervating_brand_trigger_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_AREA_ALLY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_baltharus_enervating_brand_trigger_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_baltharus_enervating_brand_trigger_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ALLY);
}
};
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
index d4d03a9c819..cc1e4051bbc 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
@@ -217,7 +217,7 @@ class spell_saviana_conflagration_init : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_saviana_conflagration_init_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_saviana_conflagration_init_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
OnEffect += SpellEffectFn(spell_saviana_conflagration_init_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
index f58f43f2f72..f605942e34f 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
@@ -83,8 +83,8 @@ class spell_eadric_radiance : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_SRC);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_AREA_ENEMY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
index ff579e18799..f8aaf0ee363 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
@@ -390,8 +390,8 @@ class spell_bronjahm_soulstorm_targeting : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_bronjahm_soulstorm_targeting_SpellScript::FilterTargetsInitial, EFFECT_1, TARGET_UNIT_AREA_ENEMY_DST);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_bronjahm_soulstorm_targeting_SpellScript::FilterTargetsSubsequent, EFFECT_2, TARGET_UNIT_AREA_ENEMY_DST);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_bronjahm_soulstorm_targeting_SpellScript::FilterTargetsInitial, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_bronjahm_soulstorm_targeting_SpellScript::FilterTargetsSubsequent, EFFECT_2, TARGET_UNIT_DEST_AREA_ENEMY);
}
std::list<Unit*> sharedUnitList;
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
index e62e9508d22..fffd2a48ce4 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
@@ -598,7 +598,6 @@ class spell_exploding_orb_hasty_grow : public SpellScriptLoader
if (GetStackAmount() == 15)
{
Unit* target = GetTarget(); // store target because aura gets removed
- PreventDefaultAction();
target->CastSpell(target, SPELL_EXPLOSIVE_BARRAGE_DAMAGE, false);
target->RemoveAurasDueToSpell(SPELL_HASTY_GROW);
target->RemoveAurasDueToSpell(SPELL_AUTO_GROW);
diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
index 8eca03a2075..f9ba820d54d 100644
--- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
+++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
@@ -159,11 +159,11 @@ public:
case 192518:
uiSladRanAltar = go->GetGUID();
// Make sure that they start out as unusuable
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
if (m_auiEncounter[0] == DONE)
{
if (uiSladRanStatueState == GO_STATE_ACTIVE)
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
else
{
++phase;
@@ -174,11 +174,11 @@ public:
case 192519:
uiMoorabiAltar = go->GetGUID();
// Make sure that they start out as unusuable
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
if (m_auiEncounter[0] == DONE)
{
if (uiMoorabiStatueState == GO_STATE_ACTIVE)
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
else
{
++phase;
@@ -189,11 +189,11 @@ public:
case 192520:
uiDrakkariColossusAltar = go->GetGUID();
// Make sure that they start out as unusuable
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
if (m_auiEncounter[0] == DONE)
{
if (uiDrakkariColossusStatueState == GO_STATE_ACTIVE)
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
else
{
++phase;
@@ -261,7 +261,7 @@ public:
{
GameObject* go = instance->GetGameObject(uiSladRanAltar);
if (go)
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
break;
case DATA_MOORABI_EVENT:
@@ -270,7 +270,7 @@ public:
{
GameObject* go = instance->GetGameObject(uiMoorabiAltar);
if (go)
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
if (bHeroicMode)
HandleGameObject(uiEckTheFerociousDoor, true);
}
@@ -281,7 +281,7 @@ public:
{
GameObject* go = instance->GetGameObject(uiDrakkariColossusAltar);
if (go)
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
break;
case DATA_GAL_DARAH_EVENT:
@@ -524,7 +524,7 @@ public:
InstanceScript *pInstance = pGO->GetInstanceScript();
uint64 uiStatue = 0;
- pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
pGO->SetGoState(GO_STATE_ACTIVE);
if (pInstance)
@@ -545,7 +545,7 @@ public:
if (!pInstance->GetData64(DATA_STATUE_ACTIVATE))
{
pInstance->SetData64(DATA_STATUE_ACTIVATE, uiStatue);
- pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
pGO->SetGoState(GO_STATE_ACTIVE);
}
return true;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
index d9e1a07df64..1954e18bafd 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
@@ -668,7 +668,7 @@ class spell_blood_queen_bloodbolt : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_blood_queen_bloodbolt_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_blood_queen_bloodbolt_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
AfterHit += SpellHitFn(spell_blood_queen_bloodbolt_SpellScript::HandleDummy);
}
};
@@ -731,7 +731,7 @@ class spell_blood_queen_pact_of_the_darkfallen : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_blood_queen_pact_of_the_darkfallen_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ALLY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_blood_queen_pact_of_the_darkfallen_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
}
};
@@ -796,7 +796,7 @@ class spell_blood_queen_pact_of_the_darkfallen_dmg_target : public SpellScriptLo
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_blood_queen_pact_of_the_darkfallen_dmg_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ALLY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_blood_queen_pact_of_the_darkfallen_dmg_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
}
};
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
index 66f839fe143..b17de17e74a 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
@@ -1208,8 +1208,8 @@ class spell_deathbringer_blood_nova_targeting : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_deathbringer_blood_nova_targeting_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_AREA_ENEMY_SRC);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_deathbringer_blood_nova_targeting_SpellScript::FilterTargetsSubsequent, EFFECT_1, TARGET_UNIT_AREA_ENEMY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_deathbringer_blood_nova_targeting_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_deathbringer_blood_nova_targeting_SpellScript::FilterTargetsSubsequent, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
}
Unit* target;
@@ -1250,7 +1250,7 @@ class spell_deathbringer_boiling_blood : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_deathbringer_boiling_blood_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_deathbringer_boiling_blood_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
index ba3a2bc1e43..92431629872 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
@@ -811,9 +811,9 @@ class spell_putricide_ooze_channel : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_putricide_ooze_channel_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_AREA_ENEMY_SRC);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_putricide_ooze_channel_SpellScript::SetTarget, EFFECT_1, TARGET_UNIT_AREA_ENEMY_SRC);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_putricide_ooze_channel_SpellScript::SetTarget, EFFECT_2, TARGET_UNIT_AREA_ENEMY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_putricide_ooze_channel_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_putricide_ooze_channel_SpellScript::SetTarget, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_putricide_ooze_channel_SpellScript::SetTarget, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY);
AfterHit += SpellHitFn(spell_putricide_ooze_channel_SpellScript::StartAttack);
}
@@ -1006,7 +1006,7 @@ class spell_putricide_ooze_summon : public SpellScriptLoader
z = GetTarget()->GetMap()->GetHeight(x, y, z, true, 25.0f);
x += 10.0f * cosf(caster->GetOrientation());
y += 10.0f * sinf(caster->GetOrientation());
- caster->CastSpell(x, y, z, triggerSpellId, true, NULL, NULL, GetCasterGUID(), caster);
+ caster->CastSpell(x, y, z, triggerSpellId, true, NULL, NULL, GetCasterGUID());
}
}
@@ -1192,7 +1192,7 @@ class spell_putricide_eat_ooze : public SpellScriptLoader
void Register()
{
OnEffect += SpellEffectFn(spell_putricide_eat_ooze_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_putricide_eat_ooze_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_AREA_ENTRY_DST);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_putricide_eat_ooze_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY);
}
};
@@ -1447,7 +1447,7 @@ public:
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_putricide_mutated_transformation_dmg_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_AREA_ALLY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_putricide_mutated_transformation_dmg_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
}
};
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
index 0b7da6486dc..b341a87c176 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
@@ -468,7 +468,7 @@ class spell_rotface_ooze_flood : public SpellScriptLoader
void Register()
{
OnEffect += SpellEffectFn(spell_rotface_ooze_flood_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_rotface_ooze_flood_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENTRY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_rotface_ooze_flood_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
}
};
@@ -664,12 +664,10 @@ class spell_rotface_unstable_ooze_explosion : public SpellScriptLoader
uint32 triggered_spell_id = GetSpellInfo()->Effects[effIndex].TriggerSpell;
- float x, y, z;
- GetTargetUnit()->GetPosition(x, y, z);
// let Rotface handle the cast - caster dies before this executes
if (InstanceScript* script = GetTargetUnit()->GetInstanceScript())
if (Creature* rotface = script->instance->GetCreature(script->GetData64(DATA_ROTFACE)))
- rotface->CastSpell(x, y, z, triggered_spell_id, true, NULL, NULL, GetCaster()->GetGUID(), GetTargetUnit());
+ rotface->CastSpell(GetTargetUnit(), triggered_spell_id, true, NULL, NULL, GetCaster()->GetGUID());
}
void Register()
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index 02224a4b6b4..0c2d1e8fe00 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -986,7 +986,7 @@ class spell_sindragosa_s_fury : public SpellScriptLoader
void Register()
{
OnEffect += SpellEffectFn(spell_sindragosa_s_fury_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_sindragosa_s_fury_SpellScript::CountTargets, EFFECT_1, TARGET_UNIT_AREA_ENTRY_DST);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_sindragosa_s_fury_SpellScript::CountTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY);
}
uint32 _targetCount;
@@ -1028,7 +1028,7 @@ class spell_sindragosa_unchained_magic : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_sindragosa_unchained_magic_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_sindragosa_unchained_magic_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
@@ -1219,7 +1219,7 @@ class spell_sindragosa_collision_filter : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_sindragosa_collision_filter_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_sindragosa_collision_filter_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
@@ -1365,7 +1365,7 @@ class spell_frostwarden_handler_order_whelp : public SpellScriptLoader
void Register()
{
OnEffect += SpellEffectFn(spell_frostwarden_handler_order_whelp_SpellScript::HandleForcedCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_frostwarden_handler_order_whelp_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_DST);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_frostwarden_handler_order_whelp_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
}
};
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
index e09ab90f5c7..a237f239386 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
@@ -1190,7 +1190,7 @@ class spell_dreamwalker_summoner : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_dreamwalker_summoner_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENTRY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_dreamwalker_summoner_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
}
};
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
index b2532a7b295..56c42f4f285 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -1839,8 +1839,8 @@ class spell_frost_giant_death_plague : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_frost_giant_death_plague_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_AREA_ALLY_SRC);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_frost_giant_death_plague_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_AREA_ALLY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_frost_giant_death_plague_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_frost_giant_death_plague_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ALLY);
OnEffect += SpellEffectFn(spell_frost_giant_death_plague_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
}
@@ -1912,7 +1912,7 @@ class spell_svalna_revive_champion : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_svalna_revive_champion_SpellScript::RemoveAliveTarget, EFFECT_0, TARGET_UNIT_AREA_ENTRY_DST);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_svalna_revive_champion_SpellScript::RemoveAliveTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY);
}
};
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
index 62b00a90dc6..09f3bd49279 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
@@ -74,6 +74,7 @@ enum Event
EVENT_TRIGGER,
EVENT_PHASE,
+ EVENT_MORTAL_WOUND,
};
enum Spells
@@ -121,6 +122,10 @@ enum Spells
//death knight
SPELL_PLAGUE_STRIKE = 49921,
SPELL_HOWLING_BLAST = 51411,
+
+ // Abomination spells
+ SPELL_FRENZY = 28468,
+ SPELL_MORTAL_WOUND = 28467,
};
enum Creatures
@@ -302,6 +307,9 @@ public:
FindGameObjects();
+ if (instance)
+ instance->SetData(DATA_ABOMINATION_KILLED, 0);
+
if (GameObject* pKTTrigger = me->GetMap()->GetGameObject(KTTriggerGUID))
{
pKTTrigger->ResetDoorOrButton();
@@ -709,8 +717,86 @@ public:
};
+class npc_kelthuzad_abomination : public CreatureScript
+{
+ public:
+ npc_kelthuzad_abomination() : CreatureScript("npc_kelthuzad_abomination") { }
+
+ struct npc_kelthuzad_abominationAI : public ScriptedAI
+ {
+ npc_kelthuzad_abominationAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = me->GetInstanceScript();
+ }
+
+ InstanceScript* instance;
+ EventMap events;
+
+ void Reset()
+ {
+ events.Reset();
+ events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(2000, 5000));
+ DoCast(me, SPELL_FRENZY, true);
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_MORTAL_WOUND:
+ DoCastVictim(SPELL_MORTAL_WOUND, true);
+ events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(10000, 15000));
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ void JustDied(Unit* /*who*/)
+ {
+ if (instance)
+ instance->SetData(DATA_ABOMINATION_KILLED, instance->GetData(DATA_ABOMINATION_KILLED) + 1);
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_kelthuzad_abominationAI(creature);
+ }
+};
+
+class achievement_just_cant_get_enough : public AchievementCriteriaScript
+{
+ public:
+ achievement_just_cant_get_enough() : AchievementCriteriaScript("achievement_just_cant_get_enough")
+ {
+ }
+
+ bool OnCheck(Player* /*player*/, Unit* target)
+ {
+ if (!target)
+ return false;
+
+ if (InstanceScript* instance = target->GetInstanceScript())
+ if (instance->GetData(DATA_ABOMINATION_KILLED) >= 18)
+ return true;
+
+ return false;
+ }
+};
+
void AddSC_boss_kelthuzad()
{
new boss_kelthuzad();
new at_kelthuzad_center();
+ new npc_kelthuzad_abomination();
+ new achievement_just_cant_get_enough();
}
diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
index f57a81f4296..f08e0ccb5cf 100644
--- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
@@ -140,11 +140,33 @@ public:
uint64 uiKelthuzadTrigger;
uint64 uiPortals[4];
+ uint32 AbominationCount;
+
GOState gothikDoorState;
time_t minHorsemenDiedTime;
time_t maxHorsemenDiedTime;
+ void Initialize()
+ {
+ GothikGateGUID = 0;
+ HorsemenChestGUID = 0;
+ SapphironGUID = 0;
+ uiFaerlina = 0;
+ uiThane = 0;
+ uiLady = 0;
+ uiBaron = 0;
+ uiSir = 0;
+ uiThaddius = 0;
+ uiHeigan = 0;
+ uiFeugen = 0;
+ uiStalagg = 0;
+ uiKelthuzad = 0;
+ uiKelthuzadTrigger = 0;
+
+ memset(uiPortals, 0, sizeof(uiPortals));
+ }
+
void OnCreatureCreate(Creature* creature)
{
switch(creature->GetEntry())
@@ -273,7 +295,23 @@ public:
maxHorsemenDiedTime = now;
}
break;
+ case DATA_ABOMINATION_KILLED:
+ AbominationCount = value;
+ break;
+ }
+ }
+
+ uint32 GetData(uint32 id)
+ {
+ switch (id)
+ {
+ case DATA_ABOMINATION_KILLED:
+ return AbominationCount;
+ default:
+ break;
}
+
+ return 0;
}
uint64 GetData64(uint32 id)
diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
index 86a7f67c11d..bb25ad691e0 100644
--- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h
+++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
@@ -48,6 +48,7 @@ enum Data
DATA_HORSEMEN1,
DATA_HORSEMEN2,
DATA_HORSEMEN3,
+ DATA_ABOMINATION_KILLED,
};
enum Data64
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
index 6d3f32a0cae..cd742b11d58 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
@@ -216,7 +216,7 @@ public:
if (pKeristrasza && pKeristrasza->isAlive())
{
// maybe these are hacks :(
- pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
pGO->SetGoState(GO_STATE_ACTIVE);
CAST_AI(boss_keristrasza::boss_keristraszaAI, pKeristrasza->AI())->CheckContainmentSpheres(true);
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp
index 5ab6a96dff3..a4676dee852 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp
@@ -129,21 +129,21 @@ public:
{
AnomalusContainmentSphere = go->GetGUID();
if (m_auiEncounter[1] == DONE)
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
}
case 188528:
{
OrmoroksContainmentSphere = go->GetGUID();
if (m_auiEncounter[2] == DONE)
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
}
case 188526:
{
TelestrasContainmentSphere = go->GetGUID();
if (m_auiEncounter[0] == DONE)
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
}
}
@@ -171,7 +171,7 @@ public:
{
GameObject* Sphere = instance->GetGameObject(TelestrasContainmentSphere);
if (Sphere)
- Sphere->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ Sphere->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
m_auiEncounter[0] = data;
break;
@@ -181,7 +181,7 @@ public:
if (data == DONE)
{
if (GameObject* Sphere = instance->GetGameObject(AnomalusContainmentSphere))
- Sphere->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ Sphere->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
m_auiEncounter[1] = data;
break;
@@ -191,7 +191,7 @@ public:
if (data == DONE)
{
if (GameObject* Sphere = instance->GetGameObject(OrmoroksContainmentSphere))
- Sphere->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ Sphere->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
m_auiEncounter[2] = data;
break;
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
index 8800c709f67..343ca29ddca 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
@@ -323,7 +323,7 @@ class spell_varos_energize_core_area_enemy : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_varos_energize_core_area_enemySpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_varos_energize_core_area_enemySpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
@@ -370,7 +370,7 @@ class spell_varos_energize_core_area_entry : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_varos_energize_core_area_entrySpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENTRY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_varos_energize_core_area_entrySpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
}
};
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_assembly_of_iron.cpp
index 4b2776b688f..a7abfcf42be 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_assembly_of_iron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_assembly_of_iron.cpp
@@ -95,6 +95,7 @@ enum AssemblyActions
ACTION_STEELBREAKER = 0,
ACTION_MOLGEIM = 1,
ACTION_BRUNDIR = 2,
+ ACTION_ADD_CHARGE = 3,
};
enum AssemblyYells
@@ -243,7 +244,10 @@ class boss_steelbreaker : public CreatureScript
events.RescheduleEvent(EVENT_STATIC_DISRUPTION, 30000);
if (phase >= 3)
events.RescheduleEvent(EVENT_OVERWHELMING_POWER, urand(2000, 5000));
- break;
+ break;
+ case ACTION_ADD_CHARGE:
+ DoCast(me, SPELL_ELECTRICAL_CHARGE, true);
+ break;
}
}
@@ -413,7 +417,7 @@ class boss_runemaster_molgeim : public CreatureScript
DoCast(SPELL_BERSERK);
events.CancelEvent(EVENT_BERSERK);
break;
- case EVENT_RUNE_OF_POWER: // Improve target selection; random alive friendly
+ case EVENT_RUNE_OF_POWER:
{
Unit* target = NULL;
switch (urand(0, 2))
@@ -628,7 +632,7 @@ class boss_stormcaller_brundir : public CreatureScript
Steelbreaker->AI()->DoAction(ACTION_STEELBREAKER);
// Prevent to have Brundir somewhere in the air when he die in Air phase
- if (me->GetPositionZ() > FLOOR_Z/* + 5.0f*/)
+ if (me->GetPositionZ() > FLOOR_Z)
me->GetMotionMaster()->MoveFall(FLOOR_Z);
}
@@ -765,6 +769,34 @@ class spell_shield_of_runes : public SpellScriptLoader
}
};
+class spell_assembly_meltdown : public SpellScriptLoader
+{
+ public:
+ spell_assembly_meltdown() : SpellScriptLoader("spell_assembly_meltdown") { }
+
+ class spell_assembly_meltdown_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_assembly_meltdown_SpellScript);
+
+ void HandleInstaKill(SpellEffIndex /*effIndex*/)
+ {
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ if (Creature* Steelbreaker = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(BOSS_STEELBREAKER)))
+ Steelbreaker->AI()->DoAction(ACTION_ADD_CHARGE);
+ }
+
+ void Register()
+ {
+ OnEffect += SpellEffectFn(spell_assembly_meltdown_SpellScript::HandleInstaKill, EFFECT_1, SPELL_EFFECT_INSTAKILL);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_assembly_meltdown_SpellScript();
+ }
+};
+
void AddSC_boss_assembly_of_iron()
{
new boss_steelbreaker();
@@ -774,4 +806,5 @@ void AddSC_boss_assembly_of_iron()
new mob_rune_of_summoning();
new mob_rune_of_power();
new spell_shield_of_runes();
+ new spell_assembly_meltdown();
}
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp
index 0684e8a4fac..685870d6d44 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp
@@ -497,7 +497,7 @@ class spell_auriaya_strenght_of_the_pack : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_auriaya_strenght_of_the_pack_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ALLY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_auriaya_strenght_of_the_pack_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
}
};
@@ -523,8 +523,8 @@ class spell_auriaya_sentinel_blast : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_auriaya_sentinel_blast_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_SRC);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_auriaya_sentinel_blast_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_AREA_ENEMY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_auriaya_sentinel_blast_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_auriaya_sentinel_blast_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp
index 779abd6ddf8..9a0e912eab0 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp
@@ -25,13 +25,14 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
+#include "ScriptedEscortAI.h"
#include "CombatAI.h"
#include "PassiveAI.h"
-#include "ScriptedEscortAI.h"
#include "ObjectMgr.h"
-#include "ulduar.h"
#include "SpellInfo.h"
+#include "SpellScript.h"
#include "Vehicle.h"
+#include "ulduar.h"
enum Spells
{
@@ -49,6 +50,7 @@ enum Spells
SPELL_SMOKE_TRAIL = 63575,
SPELL_ELECTROSHOCK = 62522,
SPELL_NAPALM = 63666,
+ SPELL_INVIS_AND_STEALTH_DETECT = 18950, // Passive
//TOWER Additional SPELLS
SPELL_THORIM_S_HAMMER = 62911, // Tower of Storms
SPELL_MIMIRON_S_INFERNO = 62909, // Tower of Flames
@@ -243,6 +245,8 @@ class boss_flame_leviathan : public CreatureScript
Shutout = true;
Unbroken = true;
+ DoCast(SPELL_INVIS_AND_STEALTH_DETECT);
+
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED);
me->SetReactState(REACT_PASSIVE);
}
@@ -327,6 +331,9 @@ class boss_flame_leviathan : public CreatureScript
void JustDied(Unit* /*victim*/)
{
_JustDied();
+ // Set Field Flags 67108928 = 64 | 67108864 = UNIT_FLAG_UNK_6 | UNIT_FLAG_SKINNABLE
+ // Set DynFlags 12
+ // Set NPCFlags 0
DoScriptText(SAY_DEATH, me);
}
@@ -1466,6 +1473,51 @@ class achievement_orbit_uary : public AchievementCriteriaScript
}
};
+class spell_load_into_catapult : public SpellScriptLoader
+{
+ enum Spells
+ {
+ SPELL_PASSENGER_LOADED = 62340,
+ };
+
+ public:
+ spell_load_into_catapult() : SpellScriptLoader("spell_load_into_catapult") { }
+
+ class spell_load_into_catapult_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_load_into_catapult_AuraScript);
+
+ void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* owner = GetOwner()->ToUnit();
+ if (!owner)
+ return;
+
+ owner->CastSpell(owner, SPELL_PASSENGER_LOADED, true);
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* owner = GetOwner()->ToUnit();
+ if (!owner)
+ return;
+
+ owner->RemoveAurasDueToSpell(SPELL_PASSENGER_LOADED);
+ }
+
+ void Register()
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_load_into_catapult_AuraScript::OnApply, EFFECT_0, SPELL_AURA_CONTROL_VEHICLE, AURA_EFFECT_HANDLE_REAL);
+ OnEffectRemove += AuraEffectRemoveFn(spell_load_into_catapult_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_CONTROL_VEHICLE, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_load_into_catapult_AuraScript();
+ }
+};
+
void AddSC_boss_flame_leviathan()
{
new boss_flame_leviathan();
@@ -1495,4 +1547,6 @@ void AddSC_boss_flame_leviathan()
new achievement_orbital_devastation();
new achievement_nuked_from_orbit();
new achievement_orbit_uary();
+
+ new spell_load_into_catapult();
}
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_hodir.cpp
index 3b86968c2d2..bb21da94bc5 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_hodir.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_hodir.cpp
@@ -138,14 +138,14 @@ enum HodirActions
ACTION_CHEESE_THE_FREEZE = 2,
};
-#define ACHIEVEMENT_CHEESE_THE_FREEZE RAID_MODE(2961, 2962)
-#define ACHIEVEMENT_GETTING_COLD_IN_HERE RAID_MODE(2967, 2968)
-#define ACHIEVEMENT_THIS_CACHE_WAS_RARE RAID_MODE(3182, 3184)
-#define ACHIEVEMENT_COOLEST_FRIENDS RAID_MODE(2963, 2965)
-#define FRIENDS_COUNT RAID_MODE(4, 8)
+#define ACHIEVEMENT_CHEESE_THE_FREEZE RAID_MODE<uint8>(2961, 2962)
+#define ACHIEVEMENT_GETTING_COLD_IN_HERE RAID_MODE<uint8>(2967, 2968)
+#define ACHIEVEMENT_THIS_CACHE_WAS_RARE RAID_MODE<uint8>(3182, 3184)
+#define ACHIEVEMENT_COOLEST_FRIENDS RAID_MODE<uint8>(2963, 2965)
+#define FRIENDS_COUNT RAID_MODE<uint8>(4, 8)
#define DATA_GETTING_COLD_IN_HERE 29672968 // 2967, 2968 are achievement IDs
-const Position SummonPositions[8] =
+Position const SummonPositions[8] =
{
{ 1983.75f, -243.36f, 432.767f, 1.57f }, // Field Medic Penny && Battle-Priest Eliza
{ 1999.90f, -230.49f, 432.767f, 1.57f }, // Eivi Nightfeather && Tor Greycloud
@@ -157,9 +157,16 @@ const Position SummonPositions[8] =
{ 1976.60f, -233.53f, 432.767f, 1.57f }, // Sissy Flamecuffs && Veesha Blazeweaver
};
-uint32 Entry[8] =
+uint32 const Entry[8] =
{
- 32897, 33325, 33328, 32893, 33326, 32901, 32900, 33327,
+ NPC_FIELD_MEDIC_PENNY,
+ NPC_EIVI_NIGHTFEATHER,
+ NPC_ELEMENTALIST_MAHFUUN,
+ NPC_MISSY_FLAMECUFFS,
+ NPC_FIELD_MEDIC_JESSI,
+ NPC_ELLIE_NIGHTFEATHER,
+ NPC_ELEMENTALIST_AVUUN,
+ NPC_SISSY_FLAMECUFFS,
};
class npc_flash_freeze : public CreatureScript
@@ -452,7 +459,7 @@ class boss_hodir : public CreatureScript
DoMeleeAttackIfReady();
}
- void DoAction(const int32 action)
+ void DoAction(int32 const action)
{
switch (action)
{
@@ -540,7 +547,7 @@ class npc_icicle : public CreatureScript
CreatureAI* GetAI(Creature* creature) const
{
- return new npc_icicleAI(creature);
+ return GetUlduarAI<npc_icicleAI>(creature);
};
};
@@ -580,7 +587,7 @@ class npc_snowpacked_icicle : public CreatureScript
CreatureAI* GetAI(Creature* creature) const
{
- return new npc_snowpacked_icicleAI(creature);
+ return GetUlduarAI<npc_snowpacked_icicleAI>(creature);
};
};
@@ -657,7 +664,7 @@ class npc_hodir_priest : public CreatureScript
CreatureAI* GetAI(Creature* creature) const
{
- return new npc_hodir_priestAI(creature);
+ return GetUlduarAI<npc_hodir_priestAI>(creature);
};
};
@@ -719,7 +726,7 @@ class npc_hodir_shaman : public CreatureScript
CreatureAI* GetAI(Creature* creature) const
{
- return new npc_hodir_shamanAI(creature);
+ return GetUlduarAI<npc_hodir_shamanAI>(creature);
};
};
@@ -780,7 +787,7 @@ class npc_hodir_druid : public CreatureScript
CreatureAI* GetAI(Creature* creature) const
{
- return new npc_hodir_druidAI(creature);
+ return GetUlduarAI<npc_hodir_druidAI>(creature);
};
};
@@ -861,7 +868,7 @@ class npc_hodir_mage : public CreatureScript
CreatureAI* GetAI(Creature* creature) const
{
- return new npc_hodir_mageAI(creature);
+ return GetUlduarAI<npc_hodir_mageAI>(creature);
};
};
@@ -895,7 +902,7 @@ class npc_toasty_fire : public CreatureScript
CreatureAI* GetAI(Creature* creature) const
{
- return new npc_toasty_fireAI(creature);
+ return GetUlduarAI<npc_toasty_fireAI>(creature);
};
};
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp
index e867a1aa5fc..e75baffe600 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp
@@ -429,9 +429,9 @@ class spell_ulduar_stone_grip_cast_target : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_ulduar_stone_grip_cast_target_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_AREA_ENEMY_SRC);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_ulduar_stone_grip_cast_target_SpellScript::FillTargetsSubsequential, EFFECT_1, TARGET_UNIT_AREA_ENEMY_SRC);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_ulduar_stone_grip_cast_target_SpellScript::FillTargetsSubsequential, EFFECT_2, TARGET_UNIT_AREA_ENEMY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_ulduar_stone_grip_cast_target_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_ulduar_stone_grip_cast_target_SpellScript::FillTargetsSubsequential, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_ulduar_stone_grip_cast_target_SpellScript::FillTargetsSubsequential, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY);
}
// Shared between effects
@@ -619,7 +619,7 @@ class spell_kologarn_stone_shout : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_kologarn_stone_shout_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_kologarn_stone_shout_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp
index 5ba0d1da53c..b3f77e893c3 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp
@@ -301,7 +301,7 @@ class go_razorscale_harpoon : public GameObjectScript
{
InstanceScript* instance = go->GetInstanceScript();
if (ObjectAccessor::GetCreature(*go, instance ? instance->GetData64(BOSS_RAZORSCALE) : 0))
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
return false;
}
};
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp
index 913e2a611c1..26b200bdbbc 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp
@@ -952,8 +952,8 @@ class spell_xt002_tympanic_tantrum : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_xt002_tympanic_tantrum_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_SRC);
- OnUnitTargetSelect += SpellUnitTargetFn(spell_xt002_tympanic_tantrum_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_AREA_ENEMY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_xt002_tympanic_tantrum_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_xt002_tympanic_tantrum_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
index cb250adc01a..e7dffae5c9d 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
@@ -446,7 +446,7 @@ class instance_ulduar : public InstanceMapScript
{
if (GameObject* HodirRareCache = instance->GetGameObject(HodirRareCacheGUID))
if (GetData(DATA_HODIR_RARE_CACHE))
- HodirRareCache->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ HodirRareCache->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
if (GameObject* HodirChest = instance->GetGameObject(HodirChestGUID))
HodirChest->SetRespawnTime(HodirChest->GetRespawnDelay());
HandleGameObject(HodirDoorGUID, true);
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
index 137492c16ca..9727ce3cbec 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
@@ -147,7 +147,7 @@ public:
if (pGo)
{
pGo->SetGoState(GO_STATE_READY);
- pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
}
}
@@ -841,7 +841,7 @@ public:
Creature* pPalehoof = Unit::GetCreature(*pGO, pInstance ? pInstance->GetData64(DATA_GORTOK_PALEHOOF) : 0);
if (pPalehoof && pPalehoof->isAlive())
{
- pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
pGO->SetGoState(GO_STATE_ACTIVE);
CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->NextPhase();
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp
index e2c5dc5d341..2eff50c1f8e 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp
@@ -136,7 +136,7 @@ public:
if (m_auiEncounter[1] == DONE)
{
HandleGameObject(0, true, go);
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
break;
}
diff --git a/src/server/scripts/Northrend/storm_peaks.cpp b/src/server/scripts/Northrend/storm_peaks.cpp
index 690b8015ca6..0fedf101a9c 100644
--- a/src/server/scripts/Northrend/storm_peaks.cpp
+++ b/src/server/scripts/Northrend/storm_peaks.cpp
@@ -727,31 +727,40 @@ class npc_hyldsmeet_protodrake : public CreatureScript
class npc_hyldsmeet_protodrakeAI : public CreatureAI
{
- npc_hyldsmeet_protodrakeAI(Creature* c) : CreatureAI(c), _accessoryRespawnTimer(0), _vehicleKit(NULL) {}
+ public:
+ npc_hyldsmeet_protodrakeAI(Creature* c) : CreatureAI(c), _accessoryRespawnTimer(0), _vehicleKit(c->GetVehicleKit()) {}
- void PassengerBoarded(Unit* who, int8 /*seat*/, bool apply)
- {
- if (apply)
- return;
+ void PassengerBoarded(Unit* who, int8 /*seat*/, bool apply)
+ {
+ if (apply)
+ return;
- if (who->GetEntry() == NPC_HYLDSMEET_DRAKERIDER)
- _accessoryRespawnTimer = who->ToCreature()->GetRespawnDelay();
- }
+ if (who->GetEntry() == NPC_HYLDSMEET_DRAKERIDER)
+ _accessoryRespawnTimer = 5 * MINUTE * IN_MILLISECONDS;
+ }
- void UpdateAI(uint32 const diff)
- {
- //! We need to manually reinstall accessories because the vehicle itself is friendly to players,
- //! so EnterEvadeMode is never triggered. The accessory on the other hand is hostile and killable.
- if (_accessoryRespawnTimer && _accessoryRespawnTimer <= diff && _vehicleKit)
- _vehicleKit->InstallAllAccessories(false);
- else
- _accessoryRespawnTimer -= diff;
- }
+ void UpdateAI(uint32 const diff)
+ {
+ //! We need to manually reinstall accessories because the vehicle itself is friendly to players,
+ //! so EnterEvadeMode is never triggered. The accessory on the other hand is hostile and killable.
+ if (_accessoryRespawnTimer && _accessoryRespawnTimer <= diff && _vehicleKit)
+ {
+ _vehicleKit->InstallAllAccessories(true);
+ _accessoryRespawnTimer = 0;
+ }
+ else
+ _accessoryRespawnTimer -= diff;
+ }
- uint32 _accessoryRespawnTimer;
- Vehicle* _vehicleKit;
+ private:
+ uint32 _accessoryRespawnTimer;
+ Vehicle* _vehicleKit;
};
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_hyldsmeet_protodrakeAI (creature);
+ }
};
void AddSC_storm_peaks()
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
index 3852d0b7c46..d827533610d 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
@@ -138,7 +138,7 @@ class boss_void_reaver : public CreatureScript
target = me->getVictim();
if (target)
- me->CastSpell(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), SPELL_ARCANE_ORB, false, NULL, NULL, 0, target);
+ me->CastSpell(target, SPELL_ARCANE_ORB, false, NULL, NULL, 0);
ArcaneOrb_Timer = 3000;
}
else
diff --git a/src/server/scripts/Outland/nagrand.cpp b/src/server/scripts/Outland/nagrand.cpp
index a18f16fbf2c..21265a1b7f2 100644
--- a/src/server/scripts/Outland/nagrand.cpp
+++ b/src/server/scripts/Outland/nagrand.cpp
@@ -26,7 +26,6 @@ EndScriptData */
/* ContentData
mob_shattered_rumbler
mob_lump
-mob_sunspring_villager
npc_altruis_the_sufferer
npc_greatmother_geyah
npc_lantresor_of_the_blade
@@ -243,44 +242,6 @@ public:
};
-/*####
-# mob_sunspring_villager - should be done with ACID
-####*/
-
-class mob_sunspring_villager : public CreatureScript
-{
-public:
- mob_sunspring_villager() : CreatureScript("mob_sunspring_villager") { }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new mob_sunspring_villagerAI (creature);
- }
-
- struct mob_sunspring_villagerAI : public ScriptedAI
- {
- mob_sunspring_villagerAI(Creature* c) : ScriptedAI(c) {}
-
- void Reset()
- {
- me->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
- me->SetStandState(UNIT_STAND_STATE_DEAD);
- }
-
- void EnterCombat(Unit* /*who*/) {}
-
- void SpellHit(Unit* /*caster*/, const SpellInfo *spell)
- {
- if (spell->Id == 32146)
- {
- me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- me->RemoveCorpse();
- }
- }
- };
-
-};
-
/*######
## npc_altruis_the_sufferer
######*/
@@ -1013,7 +974,6 @@ void AddSC_nagrand()
{
new mob_shattered_rumbler();
new mob_lump();
- new mob_sunspring_villager();
new npc_altruis_the_sufferer();
new npc_greatmother_geyah();
new npc_lantresor_of_the_blade();
diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp
index b6384d5f185..f5817ba0d9d 100644
--- a/src/server/scripts/Spells/spell_dk.cpp
+++ b/src/server/scripts/Spells/spell_dk.cpp
@@ -354,7 +354,7 @@ class spell_dk_death_pact : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_dk_death_pact_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_AREA_ALLY_DST);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_dk_death_pact_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ALLY);
}
};
diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp
index fec95a2294d..8dc4b3063a5 100644
--- a/src/server/scripts/Spells/spell_druid.cpp
+++ b/src/server/scripts/Spells/spell_druid.cpp
@@ -260,7 +260,7 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_dru_t10_restoration_4p_bonus_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ALLY_DST);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_dru_t10_restoration_4p_bonus_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
}
};
@@ -286,7 +286,7 @@ class spell_dru_starfall_aoe : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_dru_starfall_aoe_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_DST);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_dru_starfall_aoe_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
}
};
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 48deb028625..3d6b4fba8bc 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -25,6 +25,7 @@
#include "ScriptPCH.h"
#include "SpellAuraEffects.h"
#include "SkillDiscovery.h"
+#include "GridNotifiers.h"
class spell_gen_absorb0_hitlimit1 : public SpellScriptLoader
{
@@ -161,6 +162,60 @@ class spell_gen_burn_brutallus : public SpellScriptLoader
}
};
+enum eCannibalizeSpells
+{
+ SPELL_CANNIBALIZE_TRIGGERED = 20578,
+};
+
+class spell_gen_cannibalize : public SpellScriptLoader
+{
+ public:
+ spell_gen_cannibalize() : SpellScriptLoader("spell_gen_cannibalize") { }
+
+ class spell_gen_cannibalize_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_cannibalize_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellEntry*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_CANNIBALIZE_TRIGGERED))
+ return false;
+ return true;
+ }
+
+ SpellCastResult CheckIfCorpseNear()
+ {
+ Unit* caster = GetCaster();
+ float max_range = GetSpellInfo()->GetMaxRange(false);
+ WorldObject* result = NULL;
+ // search for nearby enemy corpse in range
+ Trinity::AnyDeadUnitSpellTargetInRangeCheck check(caster, max_range, GetSpellInfo(), TARGET_SELECT_CHECK_ENEMY);
+ Trinity::WorldObjectSearcher<Trinity::AnyDeadUnitSpellTargetInRangeCheck> searcher(caster, result, check);
+ caster->GetMap()->VisitFirstFound(caster->m_positionX, caster->m_positionY, max_range, searcher);
+ if (!result)
+ return SPELL_FAILED_NO_EDIBLE_CORPSES;
+ return SPELL_CAST_OK;
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ caster->CastSpell(caster, SPELL_CANNIBALIZE_TRIGGERED, false);
+ }
+
+ void Register()
+ {
+ OnEffect += SpellEffectFn(spell_gen_cannibalize_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnCheckCast += SpellCheckCastFn(spell_gen_cannibalize_SpellScript::CheckIfCorpseNear);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_cannibalize_SpellScript();
+ }
+};
+
// 45472 Parachute
enum eParachuteSpells
{
@@ -1264,6 +1319,7 @@ void AddSC_generic_spell_scripts()
new spell_gen_aura_of_anger();
new spell_gen_av_drekthar_presence();
new spell_gen_burn_brutallus();
+ new spell_gen_cannibalize();
new spell_gen_leeching_swarm();
new spell_gen_parachute();
new spell_gen_pet_summoned();
diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp
index 79f92368ff9..0a81b13ed64 100644
--- a/src/server/scripts/Spells/spell_hunter.cpp
+++ b/src/server/scripts/Spells/spell_hunter.cpp
@@ -23,6 +23,7 @@
#include "ScriptPCH.h"
#include "SpellAuraEffects.h"
+#include "GridNotifiers.h"
enum HunterSpells
{
@@ -468,10 +469,22 @@ public:
return true;
}
+ SpellCastResult CheckIfCorpseNear()
+ {
+ Unit* caster = GetCaster();
+ float max_range = GetSpellInfo()->GetMaxRange(false);
+ WorldObject* result = NULL;
+ // search for nearby enemy corpse in range
+ Trinity::AnyDeadUnitSpellTargetInRangeCheck check(caster, max_range, GetSpellInfo(), TARGET_SELECT_CHECK_ENEMY);
+ Trinity::WorldObjectSearcher<Trinity::AnyDeadUnitSpellTargetInRangeCheck> searcher(caster, result, check);
+ caster->GetMap()->VisitFirstFound(caster->m_positionX, caster->m_positionY, max_range, searcher);
+ if (!result)
+ return SPELL_FAILED_NO_EDIBLE_CORPSES;
+ return SPELL_CAST_OK;
+ }
+
void HandleDummy(SpellEffIndex /*effIndex*/)
{
- if (!GetHitUnit())
- return;
Unit* caster = GetCaster();
caster->CastSpell(caster, HUNTER_PET_SPELL_CARRION_FEEDER_TRIGGERED, false);
}
@@ -480,6 +493,7 @@ public:
{
// add dummy effect spell handler to pet's Last Stand
OnEffect += SpellEffectFn(spell_hun_pet_carrion_feeder_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnCheckCast += SpellCheckCastFn(spell_hun_pet_carrion_feeder_SpellScript::CheckIfCorpseNear);
}
bool Load()
diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index 4d2cd15199b..e2f37912931 100644
--- a/src/server/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
@@ -1067,6 +1067,67 @@ class spell_item_ashbringer : public SpellScriptLoader
}
};
+enum MagicEater
+{
+ SPELL_WILD_MAGIC = 58891,
+ SPELL_WELL_FED_1 = 57288,
+ SPELL_WELL_FED_2 = 57139,
+ SPELL_WELL_FED_3 = 57111,
+ SPELL_WELL_FED_4 = 57286,
+ SPELL_WELL_FED_5 = 57291,
+};
+
+class spell_magic_eater_food : public SpellScriptLoader
+{
+ public:
+ spell_magic_eater_food() : SpellScriptLoader("spell_magic_eater_food")
+ {
+ }
+
+ class spell_magic_eater_food_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_magic_eater_food_AuraScript);
+
+ void HandleTriggerSpell(AuraEffect const* aurEff)
+ {
+ PreventDefaultAction();
+ Unit* target = GetTarget();
+
+ switch (urand(0, 5))
+ {
+ case 0:
+ target->CastSpell(target, SPELL_WILD_MAGIC, true);
+ break;
+ case 1:
+ target->CastSpell(target, SPELL_WELL_FED_1, true);
+ break;
+ case 2:
+ target->CastSpell(target, SPELL_WELL_FED_2, true);
+ break;
+ case 3:
+ target->CastSpell(target, SPELL_WELL_FED_3, true);
+ break;
+ case 4:
+ target->CastSpell(target, SPELL_WELL_FED_4, true);
+ break;
+ case 5:
+ target->CastSpell(target, SPELL_WELL_FED_5, true);
+ break;
+ }
+ }
+
+ void Register()
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_magic_eater_food_AuraScript::HandleTriggerSpell, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_magic_eater_food_AuraScript();
+ }
+};
+
void AddSC_item_spell_scripts()
{
// 23074 Arcanite Dragonling
@@ -1098,4 +1159,5 @@ void AddSC_item_spell_scripts()
new spell_item_vanquished_clutches();
new spell_item_ashbringer();
+ new spell_magic_eater_food();
}
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index c07e6dfbf7f..623bfe0a5da 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -135,7 +135,7 @@ class spell_pri_mind_sear : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_pri_mind_sear_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_DST);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_pri_mind_sear_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
}
};
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index c7a174ff3d5..ae8069747e3 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -857,6 +857,88 @@ public:
};
};
+enum StoppingTheSpread
+{
+ NPC_VILLAGER_KILL_CREDIT = 18240,
+ SPELL_FLAMES = 39199,
+};
+
+class spell_q9874_liquid_fire : public SpellScriptLoader
+{
+ public:
+ spell_q9874_liquid_fire() : SpellScriptLoader("spell_q9874_liquid_fire")
+ {
+ }
+
+ class spell_q9874_liquid_fire_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_q9874_liquid_fire_SpellScript);
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ Player* caster = GetCaster()->ToPlayer();
+ Creature* target = GetHitUnit()->ToCreature();
+ if (!caster || !target || (target && target->HasAura(SPELL_FLAMES)))
+ return;
+
+ caster->KilledMonsterCredit(NPC_VILLAGER_KILL_CREDIT, 0);
+ target->CastSpell(target, SPELL_FLAMES, true);
+ target->DespawnOrUnsummon(60000);
+ }
+
+ void Register()
+ {
+ OnEffect += SpellEffectFn(spell_q9874_liquid_fire_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_q9874_liquid_fire_SpellScript();
+ };
+};
+
+
+enum SalvagingLifesStength
+{
+ NPC_SHARD_KILL_CREDIT = 29303,
+};
+
+class spell_q12805_lifeblood_dummy : public SpellScriptLoader
+{
+ public:
+ spell_q12805_lifeblood_dummy() : SpellScriptLoader("spell_q12805_lifeblood_dummy")
+ {
+ }
+
+ class spell_q12805_lifeblood_dummy_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_q12805_lifeblood_dummy_SpellScript);
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ Player* caster = GetCaster()->ToPlayer();
+ Creature* target = GetHitUnit()->ToCreature();
+ if (!caster || !target)
+ return;
+
+ caster->KilledMonsterCredit(NPC_SHARD_KILL_CREDIT, 0);
+ target->CastSpell(target, uint32(GetEffectValue()), true);
+ target->DespawnOrUnsummon(2000);
+ }
+
+ void Register()
+ {
+ OnEffect += SpellEffectFn(spell_q12805_lifeblood_dummy_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_q12805_lifeblood_dummy_SpellScript();
+ };
+};
+
void AddSC_quest_spell_scripts()
{
new spell_q55_sacred_cleansing();
@@ -877,4 +959,6 @@ void AddSC_quest_spell_scripts()
new spell_q10041_q10040_who_are_they();
new spell_symbol_of_life_dummy();
new spell_q12659_ahunaes_knife();
+ new spell_q9874_liquid_fire();
+ new spell_q12805_lifeblood_dummy();
}
diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp
index 1915697e018..f1add24fc73 100644
--- a/src/server/scripts/Spells/spell_rogue.cpp
+++ b/src/server/scripts/Spells/spell_rogue.cpp
@@ -351,7 +351,7 @@ class spell_rog_deadly_poison : public SpellScriptLoader
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(enchant->spellid[s]);
if (!spellInfo)
{
- sLog->outError("Player::CastItemCombatSpell Enchant %i, cast unknown spell %i", enchant->ID, enchant->spellid[s]);
+ sLog->outError("Player::CastItemCombatSpell Enchant %i, player (Name: %s, GUID: %u) cast unknown spell %i", enchant->ID, player->GetName(), player->GetGUIDLow(), enchant->spellid[s]);
continue;
}
diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp
index 2ce34be1a70..da6fde2c8f0 100644
--- a/src/server/scripts/Spells/spell_warlock.cpp
+++ b/src/server/scripts/Spells/spell_warlock.cpp
@@ -220,7 +220,7 @@ class spell_warl_seed_of_corruption : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_warl_seed_of_corruption_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_DST);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_warl_seed_of_corruption_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
}
};
diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp
index 1019456aab3..9f484f4966d 100644
--- a/src/server/scripts/Spells/spell_warrior.cpp
+++ b/src/server/scripts/Spells/spell_warrior.cpp
@@ -79,7 +79,7 @@ class spell_warr_improved_spell_reflection : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_warr_improved_spell_reflection_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_PARTY_CASTER);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_warr_improved_spell_reflection_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY);
}
};
diff --git a/src/server/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp
index 26f3e238193..bd058ad25bf 100644
--- a/src/server/scripts/World/boss_emerald_dragons.cpp
+++ b/src/server/scripts/World/boss_emerald_dragons.cpp
@@ -246,7 +246,7 @@ class spell_dream_fog_sleep : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_dream_fog_sleep_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_DST);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_dream_fog_sleep_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
}
};
@@ -305,7 +305,7 @@ class spell_mark_of_nature : public SpellScriptLoader
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_mark_of_nature_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_SRC);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_mark_of_nature_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
OnEffect += SpellEffectFn(spell_mark_of_nature_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
}
};
diff --git a/src/server/shared/Database/QueryResult.h b/src/server/shared/Database/QueryResult.h
index 53290a5735b..399779fb66f 100755
--- a/src/server/shared/Database/QueryResult.h
+++ b/src/server/shared/Database/QueryResult.h
@@ -58,7 +58,7 @@ class ResultSet
MYSQL_FIELD *m_fields;
};
-typedef ACE_Refcounted_Auto_Ptr<ResultSet, ACE_Thread_Mutex> QueryResult;
+typedef ACE_Refcounted_Auto_Ptr<ResultSet, ACE_Null_Mutex> QueryResult;
class PreparedResultSet
{
@@ -103,7 +103,7 @@ class PreparedResultSet
};
-typedef ACE_Refcounted_Auto_Ptr<PreparedResultSet, ACE_Thread_Mutex> PreparedQueryResult;
+typedef ACE_Refcounted_Auto_Ptr<PreparedResultSet, ACE_Null_Mutex> PreparedQueryResult;
#endif