diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 317449c67..7d06300f6 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -7931,8 +7931,9 @@ void Spell::GetSpellRangeAndRadius(SpellEffectEntry const* spellEffect, float& r case 67296: // Touch of Light (Mode 1) case 67297: // Touch of Light (Mode 2) case 67298: // Touch of Light (Mode 3) - case 68950: // Fear (FoS) case 68912: // Wailing Souls (FoS) + case 68950: // Fear (FoS) + case 68987: // Pursuit (PoS) case 69048: // Mirrored Soul (FoS) case 69057: // Bone Spike Graveyard (Icecrown Citadel, Lord Marrowgar) 10 man case 72088: diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 93ebe2d0d..651ddba88 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -1804,6 +1804,20 @@ void Aura::TriggerSpell() // case 65422: break; // // Rolling Throw // case 67546: break; + case 69012: // Explosive Barrage + { + // Summon an Exploding Orb for each player in combat with the caster + ThreatList const& threatList = target->getThreatManager().getThreatList(); + for (ThreatList::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr) + { + if (Unit* expectedTarget = target->GetMap()->GetUnit((*itr)->getUnitGuid())) + { + if (expectedTarget->GetTypeId() == TYPEID_PLAYER) + target->CastSpell(expectedTarget, 69015, true); + } + } + return; + } // // Gunship Cannon Fire // case 70017: break; // // Ice Tomb @@ -3116,6 +3130,19 @@ void Aura::HandleAuraDummy(bool apply, bool Real) target->PlayDirectSound(14972, (Player*)target); } return; + case 68987: // Pursuit + { + Unit* caster = GetCaster(); + if (!caster || target->GetTypeId() != TYPEID_PLAYER) + return; + + if (apply) + caster->FixateTarget(target); + else if (target->GetObjectGuid() == caster->GetFixateTargetGuid()) + caster->FixateTarget(NULL); + + return; + } case 27978: case 40131: if (apply) diff --git a/src/game/Unit.h b/src/game/Unit.h index 2261225cd..44b686b7a 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -122,7 +122,8 @@ enum SpellModOp // spellmod 25 unused SPELLMOD_FREQUENCY_OF_SUCCESS = 26, // Only used with SPELL_AURA_ADD_PCT_MODIFIER and affects used on proc spells SPELLMOD_MULTIPLE_VALUE = 27, - SPELLMOD_RESIST_DISPEL_CHANCE = 28 + SPELLMOD_RESIST_DISPEL_CHANCE = 28, + SPELLMOD_SPELL_COST_REFUND_ON_FAIL = 30, }; #define MAX_SPELLMOD 32 @@ -178,7 +179,7 @@ enum UnitBytes1_Flags UNIT_BYTE1_FLAG_ALL = 0xFF }; -// byte value (UNIT_FIELD_BYTES_2,0) +// byte value (UNIT_FIELD_BYTES_2,0) // TODO - solve conflicting with SharedDefines.h enum SheathTypes enum SheathState { SHEATH_STATE_UNARMED = 0, // non prepared weapon @@ -210,7 +211,7 @@ enum UnitRename // byte flags value (UNIT_FIELD_BYTES_2,3) See enum ShapeshiftForm in SharedDefines.h -#define CREATURE_MAX_SPELLS 4 +#define CREATURE_MAX_SPELLS 10 enum Swing { @@ -325,7 +326,7 @@ enum AuraRemoveMode AURA_REMOVE_BY_DELETE, // use for speedup and prevent unexpected effects at player logout/pet unsummon (must be used _only_ after save), delete. AURA_REMOVE_BY_SHIELD_BREAK, // when absorb shield is removed by damage, heal absorb debuf AURA_REMOVE_BY_EXPIRE, // at duration end - + AURA_REMOVE_BY_TRACKING, // aura is removed because of a conflicting tracked aura }; enum UnitMods @@ -426,7 +427,14 @@ enum UnitState UNIT_STAT_FOLLOW_MOVE = 0x00010000, UNIT_STAT_FLEEING = 0x00020000, // FleeMovementGenerator/TimedFleeingMovementGenerator active/onstack UNIT_STAT_FLEEING_MOVE = 0x00040000, - UNIT_STAT_IGNORE_PATHFINDING = 0x00080000, // do not use pathfinding in any MovementGenerator + // More room for other MMGens + + // High-Level states (usually only with Creatures) + UNIT_STAT_NO_COMBAT_MOVEMENT = 0x01000000, // Combat Movement for MoveChase stopped + UNIT_STAT_RUNNING = 0x02000000, // SetRun for waypoints and such + UNIT_STAT_WAYPOINT_PAUSED = 0x04000000, // Waypoint-Movement paused genericly (ie by script) + + UNIT_STAT_IGNORE_PATHFINDING = 0x10000000, // do not use pathfinding in any MovementGenerator // masks (only for check) @@ -457,6 +465,8 @@ enum UnitState // for real move using movegen check and stop (except unstoppable flight) UNIT_STAT_MOVING = UNIT_STAT_ROAMING_MOVE | UNIT_STAT_CHASE_MOVE | UNIT_STAT_FOLLOW_MOVE | UNIT_STAT_FLEEING_MOVE, + UNIT_STAT_RUNNING_STATE = UNIT_STAT_CHASE_MOVE | UNIT_STAT_FLEEING_MOVE | UNIT_STAT_RUNNING, + UNIT_STAT_ALL_STATE = 0xFFFFFFFF }; @@ -522,7 +532,7 @@ enum UnitVisibility VISIBILITY_GROUP_STEALTH = 2, // detect chance, seen and can see group members VISIBILITY_GROUP_INVISIBILITY = 3, // invisibility, can see and can be seen only another invisible unit or invisible detection unit, set only if not stealthed, and in checks not used (mask used instead) VISIBILITY_GROUP_NO_DETECT = 4, // state just at stealth apply for update Grid state. Don't remove, otherwise stealth spells will break - VISIBILITY_RESPAWN = 5 // special totally not detectable visibility for force delete object at respawn command + VISIBILITY_REMOVE_CORPSE = 5 // special totally not detectable visibility for force delete object while removing a corpse }; // Value masks for UNIT_FIELD_FLAGS @@ -611,6 +621,7 @@ enum NPCFlags UNIT_NPC_FLAG_STABLEMASTER = 0x00400000, // 100% UNIT_NPC_FLAG_GUILD_BANKER = 0x00800000, // cause client to send 997 opcode UNIT_NPC_FLAG_SPELLCLICK = 0x01000000, // cause client to send 1015 opcode (spell click), dynamic, set at loading and don't must be set in DB + UNIT_NPC_FLAG_PLAYER_VEHICLE = 0x02000000, // players with mounts that have vehicle data should have it set }; // used in most movement packets (send and received), 30 bits in client @@ -1044,6 +1055,7 @@ struct CharmInfo ReactStates GetReactState() { return m_reactState; } bool HasReactState(ReactStates state) { return (m_reactState == state); } + void InitVehicleCreateSpells(); void InitPossessCreateSpells(); void InitCharmCreateSpells(); void InitPetActionBar(); @@ -1113,8 +1125,9 @@ enum IgnoreUnitState #define MAX_CREATURE_ATTACK_RADIUS 45.0f // max distance for creature aggro (use with CONFIG_FLOAT_RATE_CREATURE_AGGRO) // Regeneration defines -#define REGEN_TIME_FULL 2000 // For this time difference is computed regen value -#define REGEN_TIME_PRECISE 500 // Used in Spell::CheckPower for precise regeneration in spell cast time +#define REGEN_TIME_FULL 2000 // This determines how often regen value is computed +#define REGEN_TIME_PRECISE 500 // Used in Spell::CheckPower for precise regeneration in spell cast time +#define REGEN_TIME_HOLY_POWER 10000 // This determines how often holy power regen is processed struct SpellProcEventEntry; // used only privately @@ -1122,15 +1135,15 @@ class MANGOS_DLL_SPEC Unit : public WorldObject { public: typedef std::set AttackerSet; - typedef std::multimap< uint32, SpellAuraHolder*> SpellAuraHolderMap; + typedef std::multimap SpellAuraHolderMap; typedef std::pair SpellAuraHolderBounds; typedef std::pair SpellAuraHolderConstBounds; typedef std::list SpellAuraHolderList; typedef std::list AuraList; typedef std::list Diminishing; - typedef std::set ComboPointHolderSet; - typedef std::map VisibleAuraMap; - typedef std::map SingleCastSpellTargetMap; + typedef std::set ComboPointHolderSet; + typedef std::map VisibleAuraMap; + typedef std::map TrackedAuraTargetMap; virtual ~Unit(); @@ -1260,6 +1273,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject int32 ModifyPower(Powers power, int32 val); void ApplyPowerMod(Powers power, uint32 val, bool apply); void ApplyMaxPowerMod(Powers power, uint32 val, bool apply); + void ResetHolyPowerRegenTimer() { m_holyPowerRegenTimer = REGEN_TIME_HOLY_POWER; } static uint32 GetPowerIndexByClass(Powers power, uint32 classId); static Powers GetPowerTypeByIndex(uint32 index, uint32 classId); @@ -1315,7 +1329,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject VehicleInfo* GetVehicleInfo() { return m_vehicleInfo; } bool IsVehicle() const { return m_vehicleInfo != NULL; } - void SetVehicleId(uint32 entry); + void SetVehicleId(uint32 entry, uint32 overwriteNpcEntry); uint16 GetMaxSkillValueForLevel(Unit const* target = NULL) const { return (target ? GetLevelForTarget(target) : getLevel()) * 5; } void DealDamageMods(Unit* pVictim, uint32& damage, uint32* absorb); @@ -1567,12 +1581,12 @@ class MANGOS_DLL_SPEC Unit : public WorldObject // removing specific aura stacks by diff reasons and selections void RemoveAurasDueToSpell(uint32 spellId, SpellAuraHolder* except = NULL, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT); void RemoveAurasDueToItemSpell(Item* castItem, uint32 spellId); - void RemoveAurasByCasterSpell(uint32 spellId, ObjectGuid casterGuid); + void RemoveAurasByCasterSpell(uint32 spellId, ObjectGuid casterGuid, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT); void RemoveAurasDueToSpellBySteal(uint32 spellId, ObjectGuid casterGuid, Unit* stealer); void RemoveAurasDueToSpellByCancel(uint32 spellId); // removing unknown aura stacks by diff reasons and selections - void RemoveNotOwnSingleTargetAuras(uint32 newPhase = 0x0); + void RemoveNotOwnTrackedTargetAuras(uint32 newPhase = 0x0); void RemoveAurasAtMechanicImmunity(uint32 mechMask, uint32 exceptSpellId, bool non_positive = false); void RemoveSpellsCausingAura(AuraType auraType); void RemoveSpellsCausingAura(AuraType auraType, SpellAuraHolder* except); @@ -1585,6 +1599,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject void RemoveAllAuras(AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT); void RemoveArenaAuras(bool onleave = false); void RemoveAllAurasOnDeath(); + void RemoveAllAurasOnEvade(); // removing specific aura FROM stack by diff reasons and selections void RemoveAuraHolderFromStack(uint32 spellId, uint32 stackAmount = 1, ObjectGuid casterGuid = ObjectGuid(), AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT); @@ -1613,6 +1628,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject void SetCreateMana(uint32 val) { SetUInt32Value(UNIT_FIELD_BASE_MANA, val); } uint32 GetCreateMana() const { return GetUInt32Value(UNIT_FIELD_BASE_MANA); } uint32 GetCreatePowers(Powers power) const; + uint32 GetCreateMaxPowers(Powers power) const; float GetPosStat(Stats stat) const { return GetFloatValue(UNIT_FIELD_POSSTAT0 + stat); } float GetNegStat(Stats stat) const { return GetFloatValue(UNIT_FIELD_NEGSTAT0 + stat); } float GetCreateStat(Stats stat) const { return m_createStats[stat]; } @@ -1707,12 +1723,12 @@ class MANGOS_DLL_SPEC Unit : public WorldObject virtual bool IsVisibleInGridForPlayer(Player* pl) const = 0; bool isInvisibleForAlive() const; - SingleCastSpellTargetMap& GetSingleCastSpellTargets() { return m_singleCastSpellTargets; } - SingleCastSpellTargetMap const& GetSingleCastSpellTargets() const { return m_singleCastSpellTargets; } + TrackedAuraTargetMap& GetTrackedAuraTargets(TrackedAuraType type) { return m_trackedAuraTargets[type]; } + TrackedAuraTargetMap const& GetTrackedAuraTargets(TrackedAuraType type) const { return m_trackedAuraTargets[type]; } SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY]; // Threat related methods - bool CanHaveThreatList() const; + bool CanHaveThreatList(bool ignoreAliveState = false) const; void AddThreat(Unit* pVictim, float threat = 0.0f, bool crit = false, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NONE, SpellEntry const* threatSpell = NULL); float ApplyTotalThreatModifier(float threat, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NORMAL); void DeleteThreatList(); @@ -1720,6 +1736,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject bool SelectHostileTarget(); void TauntApply(Unit* pVictim); void TauntFadeOut(Unit* taunter); + void FixateTarget(Unit* pVictim); + ObjectGuid GetFixateTargetGuid() const { return m_fixateTargetGuid; } ThreatManager& getThreatManager() { return m_ThreatManager; } ThreatManager const& getThreatManager() const { return m_ThreatManager; } void addHatedBy(HostileReference* pHostileReference) { m_HostileRefManager.insertFirst(pHostileReference); }; @@ -1745,6 +1763,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject Aura* GetAura(uint32 spellId, SpellEffectIndex effindex); Aura* GetAura(AuraType type, SpellFamily family, uint64 familyFlag, uint32 familyFlag2 = 0, ObjectGuid casterGuid = ObjectGuid()); + Aura* GetTriggeredByClientAura(uint32 spellId) const; SpellAuraHolder* GetSpellAuraHolder(uint32 spellid) const; SpellAuraHolder* GetSpellAuraHolder(uint32 spellid, ObjectGuid casterGUID) const; @@ -1863,11 +1882,9 @@ class MANGOS_DLL_SPEC Unit : public WorldObject void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply); void ApplySpellDispelImmunity(const SpellEntry* spellProto, DispelType type, bool apply); - virtual bool IsImmuneToSpell(SpellEntry const* spellInfo); - // redefined in Creature + virtual bool IsImmuneToSpell(SpellEntry const* spellInfo, bool castOnSelf); bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask); - virtual bool IsImmuneToSpellEffect(SpellEntry const* spellInfo, SpellEffectIndex index) const; - // redefined in Creature + virtual bool IsImmuneToSpellEffect(SpellEntry const* spellInfo, SpellEffectIndex index, bool castOnSelf) const; uint32 CalcArmorReducedDamage(Unit* pVictim, const uint32 damage); void CalculateDamageAbsorbAndResist(Unit* pCaster, SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32* absorb, uint32* resist, bool canReflect = false); @@ -1889,7 +1906,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject uint32 CalcNotIgnoreAbsorbDamage(uint32 damage, SpellSchoolMask damageSchoolMask, SpellEntry const* spellInfo = NULL); uint32 CalcNotIgnoreDamageReduction(uint32 damage, SpellSchoolMask damageSchoolMask); - int32 CalculateAuraDuration(SpellEntry const* spellProto, uint32 effectMask, int32 duration, Unit const* caster); + int32 CalculateAuraDuration(SpellEntry const* spellProto, uint32 effectMask, int32 duration, Unit const* caster, Spell const* spell = NULL); float CalculateLevelPenalty(SpellEntry const* spellProto) const; @@ -1910,7 +1927,6 @@ class MANGOS_DLL_SPEC Unit : public WorldObject void ClearComboPointHolders(); ///----------Pet responses methods----------------- - void SendPetCastFail(uint32 spellid, SpellCastResult msg); void SendPetActionFeedback(uint8 msg); void SendPetTalk(uint32 pettalk); void SendPetAIReaction(); @@ -1946,12 +1962,14 @@ class MANGOS_DLL_SPEC Unit : public WorldObject bool IsSplineEnabled() const; bool IsInWorgenForm(bool inPermanent = false) const; + bool HasWorgenForm() const; // Packet builders void BuildForceMoveRootPacket(WorldPacket* data, bool apply, uint32 value); void BuildMoveWaterWalkPacket(WorldPacket* data, bool apply, uint32 value); void BuildSendPlayVisualPacket(WorldPacket* data, uint32 value, bool impact); void BuildMoveSetCanFlyPacket(WorldPacket* data, bool apply, uint32 value); + void BuildMoveFeatherFallPacket(WorldPacket* data, bool apply, uint32 value); protected: explicit Unit(); @@ -1973,7 +1991,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject AuraList m_deletedAuras; // auras removed while in ApplyModifier and waiting deleted SpellAuraHolderList m_deletedHolders; - SingleCastSpellTargetMap m_singleCastSpellTargets; // casted by unit single per-caster auras + // Store Auras for which the target must be tracked + TrackedAuraTargetMap m_trackedAuraTargets[MAX_TRACKED_AURA_TYPES]; GuidList m_dynObjGUIDs; @@ -2001,6 +2020,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject uint32 m_reactiveTimer[MAX_REACTIVE]; uint32 m_regenTimer; + uint32 m_holyPowerRegenTimer; VehicleInfo* m_vehicleInfo; void DisableSpline(); @@ -2018,7 +2038,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject Unit* _GetTotem(TotemSlot slot) const; // for templated function without include need Pet* _GetPet(ObjectGuid guid) const; // for templated function without include need - void JustKilledCreature(Creature* victim); // Wrapper called by DealDamage when a creature is killed + // Wrapper called by DealDamage when a creature is killed + void JustKilledCreature(Creature* victim, Player* responsiblePlayer); uint32 m_state; // Even derived shouldn't modify uint32 m_CombatTimer; @@ -2045,6 +2066,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject ObjectGuid m_TotemSlot[MAX_TOTEM_SLOT]; + ObjectGuid m_fixateTargetGuid; //< Stores the Guid of a fixated target + private: // Error traps for some wrong args using // this will catch and prevent build for any cases when all optional args skipped and instead triggered used non boolean type // no bodies expected for this declarations @@ -2070,7 +2093,7 @@ void Unit::CallForAllControlledUnits(Func const& func, uint32 controlledMask) func(pet); if (controlledMask & CONTROLLED_MINIPET) - if (Unit* mini = GetMiniPet()) + if (Pet* mini = GetMiniPet()) func(mini); if (controlledMask & CONTROLLED_GUARDIANS) @@ -2092,7 +2115,6 @@ void Unit::CallForAllControlledUnits(Func const& func, uint32 controlledMask) func(charm); } - template bool Unit::CheckAllControlledUnits(Func const& func, uint32 controlledMask) const { @@ -2102,7 +2124,7 @@ bool Unit::CheckAllControlledUnits(Func const& func, uint32 controlledMask) cons return true; if (controlledMask & CONTROLLED_MINIPET) - if (Unit const* mini = GetMiniPet()) + if (Pet const* mini = GetMiniPet()) if (func(mini)) return true; @@ -2112,7 +2134,6 @@ bool Unit::CheckAllControlledUnits(Func const& func, uint32 controlledMask) cons if (Pet const* guardian = _GetPet(*(itr++))) if (func(guardian)) return true; - } if (controlledMask & CONTROLLED_TOTEMS) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index dc6cc6c62..19fbeae16 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "12583" + #define REVISION_NR "12584" #endif // __REVISION_NR_H__