diff options
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 ¬ifier); + template<class NOTIFIER> void VisitFirstFound(const float &x, const float &y, float radius, NOTIFIER ¬ifier); template<class NOTIFIER> void VisitWorld(const float &x, const float &y, float radius, NOTIFIER ¬ifier); template<class NOTIFIER> void VisitGrid(const float &x, const float &y, float radius, NOTIFIER ¬ifier); CreatureGroupHolderType CreatureGroupHolder; @@ -650,6 +651,25 @@ Map::VisitAll(const float &x, const float &y, float radius, NOTIFIER ¬ifier) 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 ¬ifier) +{ + 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 ¬ifier) 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 |
