[c12584] Implement spells 68987 and 69012

This commit is contained in:
Xfurry 2013-05-31 10:31:53 +01:00 committed by Antz
parent cda8f44cad
commit e8006b50e3
4 changed files with 81 additions and 32 deletions

View file

@ -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:

View file

@ -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)

View file

@ -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_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<Unit*> AttackerSet;
typedef std::multimap< uint32, SpellAuraHolder*> SpellAuraHolderMap;
typedef std::multimap<uint32 /*spellId*/, SpellAuraHolder*> SpellAuraHolderMap;
typedef std::pair<SpellAuraHolderMap::iterator, SpellAuraHolderMap::iterator> SpellAuraHolderBounds;
typedef std::pair<SpellAuraHolderMap::const_iterator, SpellAuraHolderMap::const_iterator> SpellAuraHolderConstBounds;
typedef std::list<SpellAuraHolder*> SpellAuraHolderList;
typedef std::list<Aura*> AuraList;
typedef std::list<DiminishingReturn> Diminishing;
typedef std::set<uint32> ComboPointHolderSet;
typedef std::map<uint8, SpellAuraHolder*> VisibleAuraMap;
typedef std::map<SpellEntry const*, ObjectGuid> SingleCastSpellTargetMap;
typedef std::set<uint32 /*playerGuidLow*/> ComboPointHolderSet;
typedef std::map<uint8 /*slot*/, SpellAuraHolder* /*spellId*/> VisibleAuraMap;
typedef std::map<SpellEntry const*, ObjectGuid /*targetGuid*/> 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<typename Func>
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)

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "12583"
#define REVISION_NR "12584"
#endif // __REVISION_NR_H__