mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
Merge commit 'origin/master' into 310
This commit is contained in:
commit
5ab735d374
14 changed files with 172 additions and 140 deletions
|
|
@ -705,12 +705,10 @@ void BattleGround::EndBattleGround(uint32 winner)
|
||||||
if (team == winner)
|
if (team == winner)
|
||||||
{
|
{
|
||||||
RewardMark(plr,ITEM_WINNER_COUNT);
|
RewardMark(plr,ITEM_WINNER_COUNT);
|
||||||
RewardQuest(plr);
|
RewardQuestComplete(plr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
RewardMark(plr,ITEM_LOSER_COUNT);
|
RewardMark(plr,ITEM_LOSER_COUNT);
|
||||||
}
|
|
||||||
|
|
||||||
plr->CombatStopWithPets(true);
|
plr->CombatStopWithPets(true);
|
||||||
|
|
||||||
|
|
@ -764,10 +762,6 @@ uint32 BattleGround::GetBattlemasterEntry() const
|
||||||
|
|
||||||
void BattleGround::RewardMark(Player *plr,uint32 count)
|
void BattleGround::RewardMark(Player *plr,uint32 count)
|
||||||
{
|
{
|
||||||
// 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
|
|
||||||
if (plr->GetDummyAura(SPELL_AURA_PLAYER_INACTIVE))
|
|
||||||
return;
|
|
||||||
|
|
||||||
BattleGroundMarks mark;
|
BattleGroundMarks mark;
|
||||||
bool IsSpell;
|
bool IsSpell;
|
||||||
switch(GetTypeID())
|
switch(GetTypeID())
|
||||||
|
|
@ -802,22 +796,52 @@ void BattleGround::RewardMark(Player *plr,uint32 count)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsSpell)
|
if (IsSpell)
|
||||||
plr->CastSpell(plr, mark, true);
|
RewardSpellCast(plr,mark);
|
||||||
else if (objmgr.GetItemPrototype( mark ) )
|
else
|
||||||
|
RewardItem(plr,mark,count);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BattleGround::RewardSpellCast(Player *plr, uint32 spell_id)
|
||||||
|
{
|
||||||
|
// 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
|
||||||
|
if (plr->GetDummyAura(SPELL_AURA_PLAYER_INACTIVE))
|
||||||
|
return;
|
||||||
|
|
||||||
|
SpellEntry const *spellInfo = sSpellStore.LookupEntry(spell_id);
|
||||||
|
if(!spellInfo)
|
||||||
{
|
{
|
||||||
ItemPosCountVec dest;
|
sLog.outError("Battleground reward casting spell %u not exist.",spell_id);
|
||||||
uint32 no_space_count = 0;
|
return;
|
||||||
uint8 msg = plr->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, mark, count, &no_space_count );
|
|
||||||
if( msg != EQUIP_ERR_OK ) // convert to possible store amount
|
|
||||||
count -= no_space_count;
|
|
||||||
|
|
||||||
if( count != 0 && !dest.empty()) // can add some
|
|
||||||
if (Item* item = plr->StoreNewItem( dest, mark, true, 0))
|
|
||||||
plr->SendNewItem(item,count,false,true);
|
|
||||||
|
|
||||||
if (no_space_count > 0)
|
|
||||||
SendRewardMarkByMail(plr,mark,no_space_count);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
plr->CastSpell(plr, spellInfo, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BattleGround::RewardItem(Player *plr, uint32 item_id, uint32 count)
|
||||||
|
{
|
||||||
|
// 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
|
||||||
|
if (plr->GetDummyAura(SPELL_AURA_PLAYER_INACTIVE))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ItemPosCountVec dest;
|
||||||
|
uint32 no_space_count = 0;
|
||||||
|
uint8 msg = plr->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, item_id, count, &no_space_count );
|
||||||
|
|
||||||
|
if( msg == EQUIP_ERR_ITEM_NOT_FOUND)
|
||||||
|
{
|
||||||
|
sLog.outErrorDb("Battleground reward item (Entry %u) not exist in `item_template`.",item_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( msg != EQUIP_ERR_OK ) // convert to possible store amount
|
||||||
|
count -= no_space_count;
|
||||||
|
|
||||||
|
if( count != 0 && !dest.empty()) // can add some
|
||||||
|
if (Item* item = plr->StoreNewItem( dest, item_id, true, 0))
|
||||||
|
plr->SendNewItem(item,count,false,true);
|
||||||
|
|
||||||
|
if (no_space_count > 0)
|
||||||
|
SendRewardMarkByMail(plr,item_id,no_space_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BattleGround::SendRewardMarkByMail(Player *plr,uint32 mark, uint32 count)
|
void BattleGround::SendRewardMarkByMail(Player *plr,uint32 mark, uint32 count)
|
||||||
|
|
@ -857,12 +881,8 @@ void BattleGround::SendRewardMarkByMail(Player *plr,uint32 mark, uint32 count)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BattleGround::RewardQuest(Player *plr)
|
void BattleGround::RewardQuestComplete(Player *plr)
|
||||||
{
|
{
|
||||||
// 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
|
|
||||||
if (plr->GetDummyAura(SPELL_AURA_PLAYER_INACTIVE))
|
|
||||||
return;
|
|
||||||
|
|
||||||
uint32 quest;
|
uint32 quest;
|
||||||
switch(GetTypeID())
|
switch(GetTypeID())
|
||||||
{
|
{
|
||||||
|
|
@ -882,7 +902,7 @@ void BattleGround::RewardQuest(Player *plr)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
plr->CastSpell(plr, quest, true);
|
RewardSpellCast(plr, quest);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BattleGround::BlockMovement(Player *plr)
|
void BattleGround::BlockMovement(Player *plr)
|
||||||
|
|
|
||||||
|
|
@ -411,7 +411,9 @@ class BattleGround
|
||||||
void RewardReputationToTeam(uint32 faction_id, uint32 Reputation, uint32 TeamID);
|
void RewardReputationToTeam(uint32 faction_id, uint32 Reputation, uint32 TeamID);
|
||||||
void RewardMark(Player *plr,uint32 count);
|
void RewardMark(Player *plr,uint32 count);
|
||||||
void SendRewardMarkByMail(Player *plr,uint32 mark, uint32 count);
|
void SendRewardMarkByMail(Player *plr,uint32 mark, uint32 count);
|
||||||
void RewardQuest(Player *plr);
|
void RewardItem(Player *plr, uint32 item_id, uint32 count);
|
||||||
|
void RewardQuestComplete(Player *plr);
|
||||||
|
void RewardSpellCast(Player *plr, uint32 spell_id);
|
||||||
void UpdateWorldState(uint32 Field, uint32 Value);
|
void UpdateWorldState(uint32 Field, uint32 Value);
|
||||||
void UpdateWorldStateForPlayer(uint32 Field, uint32 Value, Player *Source);
|
void UpdateWorldStateForPlayer(uint32 Field, uint32 Value, Player *Source);
|
||||||
void EndBattleGround(uint32 winner);
|
void EndBattleGround(uint32 winner);
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,21 @@ enum Gossip_Guard_Skill
|
||||||
GOSSIP_GUARD_SKILL_ENGINERING = 91
|
GOSSIP_GUARD_SKILL_ENGINERING = 91
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum GossipOptionIcon
|
||||||
|
{
|
||||||
|
GOSSIP_ICON_CHAT = 0, //white chat bubble
|
||||||
|
GOSSIP_ICON_VENDOR = 1, //brown bag
|
||||||
|
GOSSIP_ICON_TAXI = 2, //flight
|
||||||
|
GOSSIP_ICON_TRAINER = 3, //book
|
||||||
|
GOSSIP_ICON_INTERACT_1 = 4, //interaction wheel
|
||||||
|
GOSSIP_ICON_INTERACT_2 = 5, //interaction wheel
|
||||||
|
GOSSIP_ICON_MONEY_BAG = 6, //brown bag with yellow dot
|
||||||
|
GOSSIP_ICON_TALK = 7, //white chat bubble with black dots
|
||||||
|
GOSSIP_ICON_TABARD = 8, //tabard
|
||||||
|
GOSSIP_ICON_BATTLE = 9, //two swords
|
||||||
|
GOSSIP_ICON_DOT = 10 //yellow dot
|
||||||
|
};
|
||||||
|
|
||||||
struct GossipOption
|
struct GossipOption
|
||||||
{
|
{
|
||||||
uint32 Id;
|
uint32 Id;
|
||||||
|
|
@ -600,6 +615,7 @@ class MANGOS_DLL_SPEC Creature : public Unit
|
||||||
bool IsVisibleInGridForPlayer(Player* pl) const;
|
bool IsVisibleInGridForPlayer(Player* pl) const;
|
||||||
|
|
||||||
void RemoveCorpse();
|
void RemoveCorpse();
|
||||||
|
bool isDeadByDefault() const { return m_isDeadByDefault; };
|
||||||
|
|
||||||
time_t const& GetRespawnTime() const { return m_respawnTime; }
|
time_t const& GetRespawnTime() const { return m_respawnTime; }
|
||||||
time_t GetRespawnTimeEx() const;
|
time_t GetRespawnTimeEx() const;
|
||||||
|
|
|
||||||
|
|
@ -504,6 +504,53 @@ namespace MaNGOS
|
||||||
// CHECKS && DO classes
|
// CHECKS && DO classes
|
||||||
|
|
||||||
// WorldObject check classes
|
// WorldObject check classes
|
||||||
|
class RaiseDeadObjectCheck
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RaiseDeadObjectCheck(Unit* funit, float range) : i_funit(funit), i_range(range) {}
|
||||||
|
bool operator()(Creature* u)
|
||||||
|
{
|
||||||
|
if (i_funit->GetTypeId()!=TYPEID_PLAYER || !((Player*)i_funit)->isHonorOrXPTarget(u) ||
|
||||||
|
u->getDeathState() != CORPSE || u->isDeadByDefault() || u->isInFlight() ||
|
||||||
|
( u->GetCreatureTypeMask() & (1 << (CREATURE_TYPE_HUMANOID-1)) )==0 ||
|
||||||
|
(u->GetDisplayId() != u->GetNativeDisplayId()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return i_funit->IsWithinDistInMap(u, i_range);
|
||||||
|
}
|
||||||
|
template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
|
||||||
|
private:
|
||||||
|
Unit* const i_funit;
|
||||||
|
float i_range;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ExplodeCorpseObjectCheck
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ExplodeCorpseObjectCheck(Unit* funit, float range) : i_funit(funit), i_range(range) {}
|
||||||
|
bool operator()(Player* u)
|
||||||
|
{
|
||||||
|
if (u->getDeathState()!=CORPSE || u->isInFlight() ||
|
||||||
|
u->HasAuraType(SPELL_AURA_GHOST) || (u->GetDisplayId() != u->GetNativeDisplayId()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return i_funit->IsWithinDistInMap(u, i_range);
|
||||||
|
}
|
||||||
|
bool operator()(Creature* u)
|
||||||
|
{
|
||||||
|
if (u->getDeathState()!=CORPSE || u->isInFlight() || u->isDeadByDefault() ||
|
||||||
|
(u->GetDisplayId() != u->GetNativeDisplayId()) ||
|
||||||
|
(u->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL)!=0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return i_funit->IsWithinDistInMap(u, i_range);
|
||||||
|
}
|
||||||
|
template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
|
||||||
|
private:
|
||||||
|
Unit* const i_funit;
|
||||||
|
float i_range;
|
||||||
|
};
|
||||||
|
|
||||||
class CannibalizeObjectCheck
|
class CannibalizeObjectCheck
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
@ -513,22 +560,16 @@ namespace MaNGOS
|
||||||
if( i_funit->IsFriendlyTo(u) || u->isAlive() || u->isInFlight() )
|
if( i_funit->IsFriendlyTo(u) || u->isAlive() || u->isInFlight() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(i_funit->IsWithinDistInMap(u, i_range) )
|
return i_funit->IsWithinDistInMap(u, i_range);
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
bool operator()(Corpse* u);
|
bool operator()(Corpse* u);
|
||||||
bool operator()(Creature* u)
|
bool operator()(Creature* u)
|
||||||
{
|
{
|
||||||
if( i_funit->IsFriendlyTo(u) || u->isAlive() || u->isInFlight() ||
|
if (i_funit->IsFriendlyTo(u) || u->isAlive() || u->isInFlight() ||
|
||||||
(u->GetCreatureTypeMask() & CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD)==0)
|
(u->GetCreatureTypeMask() & CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD)==0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(i_funit->IsWithinDistInMap(u, i_range) )
|
return i_funit->IsWithinDistInMap(u, i_range);
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
|
template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
|
|
@ -1064,11 +1064,7 @@ bool ChatHandler::HandleCooldownCommand(const char* args)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
WorldPacket data( SMSG_CLEAR_COOLDOWN, (4+8) );
|
target->RemoveSpellCooldown(spell_id,true);
|
||||||
data << uint32(spell_id);
|
|
||||||
data << uint64(target->GetGUID());
|
|
||||||
target->GetSession()->SendPacket(&data);
|
|
||||||
target->RemoveSpellCooldown(spell_id);
|
|
||||||
PSendSysMessage(LANG_REMOVE_COOLDOWN, spell_id, target==m_session->GetPlayer() ? GetMangosString(LANG_YOU) : tNameLink.c_str());
|
PSendSysMessage(LANG_REMOVE_COOLDOWN, spell_id, target==m_session->GetPlayer() ? GetMangosString(LANG_YOU) : tNameLink.c_str());
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -3213,6 +3213,20 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool update_action_bar_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Player::RemoveSpellCooldown( uint32 spell_id, bool update /* = false */ )
|
||||||
|
{
|
||||||
|
m_spellCooldowns.erase(spell_id);
|
||||||
|
|
||||||
|
if(update)
|
||||||
|
{
|
||||||
|
WorldPacket data(SMSG_CLEAR_COOLDOWN, (4+8));
|
||||||
|
data << uint32(spell_id);
|
||||||
|
data << uint64(GetGUID());
|
||||||
|
SendDirectMessage(&data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Player::RemoveArenaSpellCooldowns()
|
void Player::RemoveArenaSpellCooldowns()
|
||||||
{
|
{
|
||||||
// remove cooldowns on spells that has < 15 min CD
|
// remove cooldowns on spells that has < 15 min CD
|
||||||
|
|
|
||||||
|
|
@ -1416,7 +1416,7 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
void AddSpellCooldown(uint32 spell_id, uint32 itemid, time_t end_time);
|
void AddSpellCooldown(uint32 spell_id, uint32 itemid, time_t end_time);
|
||||||
void SendCooldownEvent(SpellEntry const *spellInfo, uint32 itemId = 0, Spell* spell = NULL);
|
void SendCooldownEvent(SpellEntry const *spellInfo, uint32 itemId = 0, Spell* spell = NULL);
|
||||||
void ProhibitSpellScholl(SpellSchoolMask idSchoolMask, uint32 unTimeMs );
|
void ProhibitSpellScholl(SpellSchoolMask idSchoolMask, uint32 unTimeMs );
|
||||||
void RemoveSpellCooldown(uint32 spell_id) { m_spellCooldowns.erase(spell_id); }
|
void RemoveSpellCooldown(uint32 spell_id, bool update = false);
|
||||||
void RemoveArenaSpellCooldowns();
|
void RemoveArenaSpellCooldowns();
|
||||||
void RemoveAllSpellCooldown();
|
void RemoveAllSpellCooldown();
|
||||||
void _LoadSpellCooldowns(QueryResult *result);
|
void _LoadSpellCooldowns(QueryResult *result);
|
||||||
|
|
|
||||||
|
|
@ -1769,6 +1769,7 @@ enum CreatureType
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32 const CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD = (1 << (CREATURE_TYPE_HUMANOID-1)) | (1 << (CREATURE_TYPE_UNDEAD-1));
|
uint32 const CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD = (1 << (CREATURE_TYPE_HUMANOID-1)) | (1 << (CREATURE_TYPE_UNDEAD-1));
|
||||||
|
uint32 const CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL = (1 << (CREATURE_TYPE_MECHANICAL-1)) | (1 << (CREATURE_TYPE_ELEMENTAL-1));
|
||||||
|
|
||||||
// CreatureFamily.dbc
|
// CreatureFamily.dbc
|
||||||
enum CreatureFamily
|
enum CreatureFamily
|
||||||
|
|
|
||||||
|
|
@ -423,6 +423,36 @@ Spell::~Spell()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
WorldObject* Spell::FindCorpseUsing()
|
||||||
|
{
|
||||||
|
// non-standard target selection
|
||||||
|
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex);
|
||||||
|
float max_range = GetSpellMaxRange(srange);
|
||||||
|
|
||||||
|
CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
||||||
|
Cell cell(p);
|
||||||
|
cell.data.Part.reserved = ALL_DISTRICT;
|
||||||
|
cell.SetNoCreate();
|
||||||
|
|
||||||
|
WorldObject* result = NULL;
|
||||||
|
|
||||||
|
T u_check(m_caster, max_range);
|
||||||
|
MaNGOS::WorldObjectSearcher<T> searcher(m_caster, result, u_check);
|
||||||
|
|
||||||
|
TypeContainerVisitor<MaNGOS::WorldObjectSearcher<T>, GridTypeMapContainer > grid_searcher(searcher);
|
||||||
|
CellLock<GridReadGuard> cell_lock(cell, p);
|
||||||
|
cell_lock->Visit(cell_lock, grid_searcher, *m_caster->GetMap());
|
||||||
|
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
TypeContainerVisitor<MaNGOS::WorldObjectSearcher<T>, WorldTypeMapContainer > world_searcher(searcher);
|
||||||
|
cell_lock->Visit(cell_lock, world_searcher, *m_caster->GetMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void Spell::FillTargetMap()
|
void Spell::FillTargetMap()
|
||||||
{
|
{
|
||||||
// TODO: ADD the correct target FILLS!!!!!!
|
// TODO: ADD the correct target FILLS!!!!!!
|
||||||
|
|
@ -537,29 +567,7 @@ void Spell::FillTargetMap()
|
||||||
{
|
{
|
||||||
case 20577: // Cannibalize
|
case 20577: // Cannibalize
|
||||||
{
|
{
|
||||||
// non-standard target selection
|
WorldObject* result = FindCorpseUsing<MaNGOS::CannibalizeObjectCheck> ();
|
||||||
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex);
|
|
||||||
float max_range = GetSpellMaxRange(srange);
|
|
||||||
|
|
||||||
CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
WorldObject* result = NULL;
|
|
||||||
|
|
||||||
MaNGOS::CannibalizeObjectCheck u_check(m_caster, max_range);
|
|
||||||
MaNGOS::WorldObjectSearcher<MaNGOS::CannibalizeObjectCheck > searcher(m_caster, result, u_check);
|
|
||||||
|
|
||||||
TypeContainerVisitor<MaNGOS::WorldObjectSearcher<MaNGOS::CannibalizeObjectCheck >, GridTypeMapContainer > grid_searcher(searcher);
|
|
||||||
CellLock<GridReadGuard> cell_lock(cell, p);
|
|
||||||
cell_lock->Visit(cell_lock, grid_searcher, *m_caster->GetMap());
|
|
||||||
|
|
||||||
if(!result)
|
|
||||||
{
|
|
||||||
TypeContainerVisitor<MaNGOS::WorldObjectSearcher<MaNGOS::CannibalizeObjectCheck >, WorldTypeMapContainer > world_searcher(searcher);
|
|
||||||
cell_lock->Visit(cell_lock, world_searcher, *m_caster->GetMap());
|
|
||||||
}
|
|
||||||
|
|
||||||
if(result)
|
if(result)
|
||||||
{
|
{
|
||||||
|
|
@ -580,15 +588,7 @@ void Spell::FillTargetMap()
|
||||||
{
|
{
|
||||||
// clear cooldown at fail
|
// clear cooldown at fail
|
||||||
if(m_caster->GetTypeId()==TYPEID_PLAYER)
|
if(m_caster->GetTypeId()==TYPEID_PLAYER)
|
||||||
{
|
((Player*)m_caster)->RemoveSpellCooldown(m_spellInfo->Id,true);
|
||||||
((Player*)m_caster)->RemoveSpellCooldown(m_spellInfo->Id);
|
|
||||||
|
|
||||||
WorldPacket data(SMSG_CLEAR_COOLDOWN, (4+8));
|
|
||||||
data << uint32(m_spellInfo->Id);
|
|
||||||
data << uint64(m_caster->GetGUID());
|
|
||||||
((Player*)m_caster)->GetSession()->SendPacket(&data);
|
|
||||||
}
|
|
||||||
|
|
||||||
SendCastResult(SPELL_FAILED_NO_EDIBLE_CORPSES);
|
SendCastResult(SPELL_FAILED_NO_EDIBLE_CORPSES);
|
||||||
finish(false);
|
finish(false);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -381,6 +381,8 @@ class Spell
|
||||||
void SetTargetMap(uint32 i,uint32 cur,UnitList& TagUnitMap);
|
void SetTargetMap(uint32 i,uint32 cur,UnitList& TagUnitMap);
|
||||||
void FillAreaTargets( UnitList& TagUnitMap, float x, float y, float radius, SpellNotifyPushType pushType, SpellTargets spellTargets );
|
void FillAreaTargets( UnitList& TagUnitMap, float x, float y, float radius, SpellNotifyPushType pushType, SpellTargets spellTargets );
|
||||||
|
|
||||||
|
template<typename T> WorldObject* FindCorpseUsing();
|
||||||
|
|
||||||
bool CheckTarget( Unit* target, uint32 eff );
|
bool CheckTarget( Unit* target, uint32 eff );
|
||||||
bool CanAutoCast(Unit* target);
|
bool CanAutoCast(Unit* target);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2386,29 +2386,7 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SPELLFAMILY_HUNTER:
|
case SPELLFAMILY_HUNTER:
|
||||||
{
|
|
||||||
// Improved Aspect of the Viper
|
|
||||||
if( GetId()==38390 && m_target->GetTypeId()==TYPEID_PLAYER )
|
|
||||||
{
|
|
||||||
if(apply)
|
|
||||||
{
|
|
||||||
// + effect value for Aspect of the Viper
|
|
||||||
SpellModifier *mod = new SpellModifier;
|
|
||||||
mod->op = SPELLMOD_EFFECT1;
|
|
||||||
mod->value = m_modifier.m_amount;
|
|
||||||
mod->type = SPELLMOD_FLAT;
|
|
||||||
mod->spellId = GetId();
|
|
||||||
mod->mask = 0x4000000000000LL;
|
|
||||||
mod->mask2= 0LL;
|
|
||||||
|
|
||||||
m_spellmod = mod;
|
|
||||||
}
|
|
||||||
|
|
||||||
((Player*)m_target)->AddSpellMod(m_spellmod, apply);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case SPELLFAMILY_SHAMAN:
|
case SPELLFAMILY_SHAMAN:
|
||||||
{
|
{
|
||||||
// Improved Weapon Totems
|
// Improved Weapon Totems
|
||||||
|
|
|
||||||
|
|
@ -1199,12 +1199,7 @@ void Spell::EffectDummy(uint32 i)
|
||||||
(GetSpellSchoolMask(spellInfo) & SPELL_SCHOOL_MASK_FROST) &&
|
(GetSpellSchoolMask(spellInfo) & SPELL_SCHOOL_MASK_FROST) &&
|
||||||
spellInfo->Id != 11958 && GetSpellRecoveryTime(spellInfo) > 0 )
|
spellInfo->Id != 11958 && GetSpellRecoveryTime(spellInfo) > 0 )
|
||||||
{
|
{
|
||||||
((Player*)m_caster)->RemoveSpellCooldown(classspell);
|
((Player*)m_caster)->RemoveSpellCooldown(classspell,true);
|
||||||
|
|
||||||
WorldPacket data(SMSG_CLEAR_COOLDOWN, (4+8));
|
|
||||||
data << uint32(classspell);
|
|
||||||
data << uint64(m_caster->GetGUID());
|
|
||||||
((Player*)m_caster)->GetSession()->SendPacket(&data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
@ -1447,14 +1442,7 @@ void Spell::EffectDummy(uint32 i)
|
||||||
SpellEntry const *spellInfo = sSpellStore.LookupEntry(classspell);
|
SpellEntry const *spellInfo = sSpellStore.LookupEntry(classspell);
|
||||||
|
|
||||||
if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && (spellInfo->SpellFamilyFlags & 0x0000024000000860LL))
|
if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && (spellInfo->SpellFamilyFlags & 0x0000024000000860LL))
|
||||||
{
|
((Player*)m_caster)->RemoveSpellCooldown(classspell,true);
|
||||||
((Player*)m_caster)->RemoveSpellCooldown(classspell);
|
|
||||||
|
|
||||||
WorldPacket data(SMSG_CLEAR_COOLDOWN, (4+8));
|
|
||||||
data << uint32(classspell);
|
|
||||||
data << uint64(m_caster->GetGUID());
|
|
||||||
((Player*)m_caster)->GetSession()->SendPacket(&data);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -1505,14 +1493,7 @@ void Spell::EffectDummy(uint32 i)
|
||||||
SpellEntry const *spellInfo = sSpellStore.LookupEntry(classspell);
|
SpellEntry const *spellInfo = sSpellStore.LookupEntry(classspell);
|
||||||
|
|
||||||
if (spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && spellInfo->Id != 23989 && GetSpellRecoveryTime(spellInfo) > 0 )
|
if (spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && spellInfo->Id != 23989 && GetSpellRecoveryTime(spellInfo) > 0 )
|
||||||
{
|
((Player*)m_caster)->RemoveSpellCooldown(classspell,true);
|
||||||
((Player*)m_caster)->RemoveSpellCooldown(classspell);
|
|
||||||
|
|
||||||
WorldPacket data(SMSG_CLEAR_COOLDOWN, (4+8));
|
|
||||||
data << uint32(classspell);
|
|
||||||
data << uint64(m_caster->GetGUID());
|
|
||||||
((Player*)m_caster)->GetSession()->SendPacket(&data);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -1611,17 +1592,8 @@ void Spell::EffectDummy(uint32 i)
|
||||||
// non-standard cast requirement check
|
// non-standard cast requirement check
|
||||||
if (!unitTarget || unitTarget->getAttackers().empty())
|
if (!unitTarget || unitTarget->getAttackers().empty())
|
||||||
{
|
{
|
||||||
// clear cooldown at fail
|
|
||||||
if(m_caster->GetTypeId()==TYPEID_PLAYER)
|
if(m_caster->GetTypeId()==TYPEID_PLAYER)
|
||||||
{
|
((Player*)m_caster)->RemoveSpellCooldown(m_spellInfo->Id,true);
|
||||||
((Player*)m_caster)->RemoveSpellCooldown(m_spellInfo->Id);
|
|
||||||
|
|
||||||
WorldPacket data(SMSG_CLEAR_COOLDOWN, (4+8));
|
|
||||||
data << uint32(m_spellInfo->Id);
|
|
||||||
data << uint64(m_caster->GetGUID());
|
|
||||||
((Player*)m_caster)->GetSession()->SendPacket(&data);
|
|
||||||
}
|
|
||||||
|
|
||||||
SendCastResult(SPELL_FAILED_TARGET_AFFECTING_COMBAT);
|
SendCastResult(SPELL_FAILED_TARGET_AFFECTING_COMBAT);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -671,16 +671,6 @@ void Player::UpdateManaRegen()
|
||||||
power_regen_mp5 += GetStat(Stats(mod->m_miscvalue)) * mod->m_amount / 500.0f;
|
power_regen_mp5 += GetStat(Stats(mod->m_miscvalue)) * mod->m_amount / 500.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bonus from some dummy auras
|
|
||||||
AuraList const& mDummyAuras = GetAurasByType(SPELL_AURA_PERIODIC_DUMMY);
|
|
||||||
for(AuraList::const_iterator i = mDummyAuras.begin();i != mDummyAuras.end(); ++i)
|
|
||||||
if((*i)->GetId() == 34074) // Aspect of the Viper
|
|
||||||
{
|
|
||||||
power_regen_mp5 += (*i)->GetModifier()->m_amount * Intellect / 500.0f;
|
|
||||||
// Add regen bonus from level in this dummy
|
|
||||||
power_regen_mp5 += getLevel() * 35 / 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set regen rate in cast state apply only on spirit based regen
|
// Set regen rate in cast state apply only on spirit based regen
|
||||||
int32 modManaRegenInterrupt = GetTotalAuraModifier(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT);
|
int32 modManaRegenInterrupt = GetTotalAuraModifier(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT);
|
||||||
if (modManaRegenInterrupt > 100)
|
if (modManaRegenInterrupt > 100)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7804"
|
#define REVISION_NR "7809"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue