[svn] Fix some aura_interrupt_flag to correctly remove auras.
Add interrupt_flag_unattackable. Source: mangos forum. Adapted by F636y623. Add function CombatStart(). --HG-- branch : trunk
This commit is contained in:
+26
-1
@@ -16605,7 +16605,7 @@ bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, uint32 mount_i
|
|||||||
ModifyMoney(-(int32)totalcost);
|
ModifyMoney(-(int32)totalcost);
|
||||||
|
|
||||||
// prevent stealth flight
|
// prevent stealth flight
|
||||||
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_STEALTH);
|
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_LOOT);
|
||||||
|
|
||||||
WorldPacket data(SMSG_ACTIVATETAXIREPLY, 4);
|
WorldPacket data(SMSG_ACTIVATETAXIREPLY, 4);
|
||||||
data << uint32(ERR_TAXIOK);
|
data << uint32(ERR_TAXIOK);
|
||||||
@@ -18885,6 +18885,7 @@ bool Player::isAllowUseBattleGroundObject()
|
|||||||
{
|
{
|
||||||
return ( //InBattleGround() && // in battleground - not need, check in other cases
|
return ( //InBattleGround() && // in battleground - not need, check in other cases
|
||||||
!IsMounted() && // not mounted
|
!IsMounted() && // not mounted
|
||||||
|
!isTotalImmunity() && // not totally immuned
|
||||||
!HasStealthAura() && // not stealthed
|
!HasStealthAura() && // not stealthed
|
||||||
!HasInvisibilityAura() && // not invisible
|
!HasInvisibilityAura() && // not invisible
|
||||||
!HasAura(SPELL_RECENTLY_DROPPED_FLAG, 0) && // can't pickup
|
!HasAura(SPELL_RECENTLY_DROPPED_FLAG, 0) && // can't pickup
|
||||||
@@ -18900,3 +18901,27 @@ bool ItemPosCount::isContainedIn(ItemPosCountVec const& vec) const
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Player::isTotalImmunity()
|
||||||
|
{
|
||||||
|
AuraList const& immune = GetAurasByType(SPELL_AURA_SCHOOL_IMMUNITY);
|
||||||
|
|
||||||
|
for(AuraList::const_iterator itr = immune.begin(); itr != immune.end(); ++itr)
|
||||||
|
{
|
||||||
|
if (((*itr)->GetModifier()->m_miscvalue & SPELL_SCHOOL_MASK_ALL) !=0) // total immunity
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (((*itr)->GetModifier()->m_miscvalue & SPELL_SCHOOL_MASK_NORMAL) !=0) // physical damage immunity
|
||||||
|
{
|
||||||
|
for(AuraList::const_iterator i = immune.begin(); i != immune.end(); ++i)
|
||||||
|
{
|
||||||
|
if (((*i)->GetModifier()->m_miscvalue & SPELL_SCHOOL_MASK_MAGIC) !=0) // magic immunity
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1914,6 +1914,7 @@ class TRINITY_DLL_SPEC Player : public Unit
|
|||||||
|
|
||||||
bool GetBGAccessByLevel(uint32 bgTypeId) const;
|
bool GetBGAccessByLevel(uint32 bgTypeId) const;
|
||||||
bool isAllowUseBattleGroundObject();
|
bool isAllowUseBattleGroundObject();
|
||||||
|
bool isTotalImmunity();
|
||||||
|
|
||||||
/*********************************************************/
|
/*********************************************************/
|
||||||
/*** OUTDOOR PVP SYSTEM ***/
|
/*** OUTDOOR PVP SYSTEM ***/
|
||||||
|
|||||||
+3
-14
@@ -956,14 +956,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
|
|||||||
if(!unit->IsStandState() && !unit->hasUnitState(UNIT_STAT_STUNNED))
|
if(!unit->IsStandState() && !unit->hasUnitState(UNIT_STAT_STUNNED))
|
||||||
unit->SetStandState(PLAYER_STATE_NONE);
|
unit->SetStandState(PLAYER_STATE_NONE);
|
||||||
|
|
||||||
if(!unit->isInCombat() && unit->GetTypeId() != TYPEID_PLAYER && ((Creature*)unit)->AI())
|
m_caster->CombatStart(unit);
|
||||||
((Creature*)unit)->AI()->AttackStart(m_caster);
|
|
||||||
|
|
||||||
unit->SetInCombatWith(m_caster);
|
|
||||||
m_caster->SetInCombatWith(unit);
|
|
||||||
|
|
||||||
if(Player *attackedPlayer = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
|
|
||||||
m_caster->SetContestedPvP(attackedPlayer);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1002,11 +995,7 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//if(!IsPositiveSpell(m_spellInfo->Id))
|
unit->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_HITBYSPELL);
|
||||||
{
|
|
||||||
//do not remove feign death
|
|
||||||
unit->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_STEALTH + AURA_INTERRUPT_FLAG_DAMAGE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2247,7 +2236,7 @@ void Spell::cast(bool skipCheck)
|
|||||||
// skip triggered spell (item equip spell casting and other not explicit character casts/item uses)
|
// skip triggered spell (item equip spell casting and other not explicit character casts/item uses)
|
||||||
if ( !m_IsTriggeredSpell && isSpellBreakStealth(m_spellInfo) )
|
if ( !m_IsTriggeredSpell && isSpellBreakStealth(m_spellInfo) )
|
||||||
{
|
{
|
||||||
m_caster->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_STEALTH);
|
m_caster->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_CAST);
|
||||||
}
|
}
|
||||||
|
|
||||||
// who did this hack?
|
// who did this hack?
|
||||||
|
|||||||
+11
-10
@@ -3071,6 +3071,7 @@ void Aura::HandleFeignDeath(bool apply, bool Real)
|
|||||||
|
|
||||||
m_target->addUnitState(UNIT_STAT_DIED);
|
m_target->addUnitState(UNIT_STAT_DIED);
|
||||||
m_target->CombatStop();
|
m_target->CombatStop();
|
||||||
|
m_target->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_UNATTACKABLE);
|
||||||
|
|
||||||
// prevent interrupt message
|
// prevent interrupt message
|
||||||
if(m_caster_guid==m_target->GetGUID() && m_target->m_currentSpells[CURRENT_GENERIC_SPELL])
|
if(m_caster_guid==m_target->GetGUID() && m_target->m_currentSpells[CURRENT_GENERIC_SPELL])
|
||||||
@@ -3210,11 +3211,8 @@ void Aura::HandleModStealth(bool apply, bool Real)
|
|||||||
if(Real && m_target->GetTypeId()==TYPEID_PLAYER)
|
if(Real && m_target->GetTypeId()==TYPEID_PLAYER)
|
||||||
{
|
{
|
||||||
// drop flag at stealth in bg
|
// drop flag at stealth in bg
|
||||||
if(((Player*)m_target)->InBattleGround())
|
m_target->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_UNATTACKABLE);
|
||||||
{
|
|
||||||
if(BattleGround *bg = ((Player*)m_target)->GetBattleGround())
|
|
||||||
bg->EventPlayerDroppedFlag((Player*)m_target);
|
|
||||||
}
|
|
||||||
// remove player from the objective's active player count at stealth
|
// remove player from the objective's active player count at stealth
|
||||||
if(OutdoorPvP * pvp = ((Player*)m_target)->GetOutdoorPvP())
|
if(OutdoorPvP * pvp = ((Player*)m_target)->GetOutdoorPvP())
|
||||||
pvp->HandlePlayerActivityChanged((Player*)m_target);
|
pvp->HandlePlayerActivityChanged((Player*)m_target);
|
||||||
@@ -3298,6 +3296,8 @@ void Aura::HandleInvisibility(bool apply, bool Real)
|
|||||||
{
|
{
|
||||||
m_target->m_invisibilityMask |= (1 << m_modifier.m_miscvalue);
|
m_target->m_invisibilityMask |= (1 << m_modifier.m_miscvalue);
|
||||||
|
|
||||||
|
m_target->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_UNATTACKABLE);
|
||||||
|
|
||||||
if(Real && m_target->GetTypeId()==TYPEID_PLAYER)
|
if(Real && m_target->GetTypeId()==TYPEID_PLAYER)
|
||||||
{
|
{
|
||||||
// apply glow vision
|
// apply glow vision
|
||||||
@@ -3305,11 +3305,6 @@ void Aura::HandleInvisibility(bool apply, bool Real)
|
|||||||
// remove player from the objective's active player count at invisibility
|
// remove player from the objective's active player count at invisibility
|
||||||
if(OutdoorPvP * pvp = ((Player*)m_target)->GetOutdoorPvP())
|
if(OutdoorPvP * pvp = ((Player*)m_target)->GetOutdoorPvP())
|
||||||
pvp->HandlePlayerActivityChanged((Player*)m_target);
|
pvp->HandlePlayerActivityChanged((Player*)m_target);
|
||||||
|
|
||||||
// drop flag at invisible in bg
|
|
||||||
if(((Player*)m_target)->InBattleGround())
|
|
||||||
if(BattleGround *bg = ((Player*)m_target)->GetBattleGround())
|
|
||||||
bg->EventPlayerDroppedFlag((Player*)m_target);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// apply only if not in GM invisibility and not stealth
|
// apply only if not in GM invisibility and not stealth
|
||||||
@@ -3816,6 +3811,9 @@ void Aura::HandleAuraModStateImmunity(bool apply, bool Real)
|
|||||||
|
|
||||||
void Aura::HandleAuraModSchoolImmunity(bool apply, bool Real)
|
void Aura::HandleAuraModSchoolImmunity(bool apply, bool Real)
|
||||||
{
|
{
|
||||||
|
if(apply && m_modifier.m_miscvalue == SPELL_SCHOOL_MASK_NORMAL)
|
||||||
|
m_target->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_UNATTACKABLE);
|
||||||
|
|
||||||
m_target->ApplySpellImmune(GetId(),IMMUNITY_SCHOOL,m_modifier.m_miscvalue,apply);
|
m_target->ApplySpellImmune(GetId(),IMMUNITY_SCHOOL,m_modifier.m_miscvalue,apply);
|
||||||
|
|
||||||
if(Real && apply && GetSpellProto()->AttributesEx & SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY)
|
if(Real && apply && GetSpellProto()->AttributesEx & SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY)
|
||||||
@@ -5376,7 +5374,10 @@ void Aura::HandleAuraRetainComboPoints(bool apply, bool Real)
|
|||||||
void Aura::HandleModUnattackable( bool Apply, bool Real )
|
void Aura::HandleModUnattackable( bool Apply, bool Real )
|
||||||
{
|
{
|
||||||
if(Real && Apply)
|
if(Real && Apply)
|
||||||
|
{
|
||||||
m_target->CombatStop();
|
m_target->CombatStop();
|
||||||
|
m_target->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_UNATTACKABLE);
|
||||||
|
}
|
||||||
|
|
||||||
m_target->ApplyModFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE,Apply);
|
m_target->ApplyModFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE,Apply);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3479,7 +3479,7 @@ void Spell::EffectPickPocket(uint32 /*i*/)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Reveal action + get attack
|
// Reveal action + get attack
|
||||||
m_caster->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_STEALTH);
|
m_caster->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_LOOT);
|
||||||
if (((Creature*)unitTarget)->AI())
|
if (((Creature*)unitTarget)->AI())
|
||||||
((Creature*)unitTarget)->AI()->AttackStart(m_caster);
|
((Creature*)unitTarget)->AI()->AttackStart(m_caster);
|
||||||
}
|
}
|
||||||
|
|||||||
+53
-24
@@ -472,7 +472,7 @@ void Unit::RemoveAurasWithInterruptFlags(uint32 flag)
|
|||||||
++next;
|
++next;
|
||||||
|
|
||||||
//sLog.outDetail("auraflag:%u flag:%u = %u",(*iter)->GetSpellProto()->AuraInterruptFlags,flag,(*iter)->GetSpellProto()->AuraInterruptFlags & flag);
|
//sLog.outDetail("auraflag:%u flag:%u = %u",(*iter)->GetSpellProto()->AuraInterruptFlags,flag,(*iter)->GetSpellProto()->AuraInterruptFlags & flag);
|
||||||
if(*iter && ((*iter)->GetSpellProto()->AuraInterruptFlags & flag) == flag)
|
if(*iter && ((*iter)->GetSpellProto()->AuraInterruptFlags & flag))
|
||||||
{
|
{
|
||||||
RemoveAurasDueToSpell((*iter)->GetId());
|
RemoveAurasDueToSpell((*iter)->GetId());
|
||||||
if (!m_interruptableAuras.empty())
|
if (!m_interruptableAuras.empty())
|
||||||
@@ -488,6 +488,30 @@ bool Unit::HasAuraType(AuraType auraType) const
|
|||||||
return (!m_modAuras[auraType].empty());
|
return (!m_modAuras[auraType].empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Called by DealDamage for auras that have a chance to be dispelled on damage taken. */
|
||||||
|
void Unit::RemoveSpellbyDamageTaken(uint32 damage, uint32 spell)
|
||||||
|
{
|
||||||
|
// The chance to dispel an aura depends on the damage taken with respect to the casters level.
|
||||||
|
uint32 max_dmg = getLevel() > 8 ? 25 * getLevel() - 150 : 50;
|
||||||
|
float chance = float(damage) / max_dmg * 100.0f;
|
||||||
|
|
||||||
|
AuraList::iterator i, next;
|
||||||
|
for(i = m_ccAuras.begin(); i != m_ccAuras.end(); i = next)
|
||||||
|
{
|
||||||
|
next = i;
|
||||||
|
++next;
|
||||||
|
|
||||||
|
if(*i && (!spell || (*i)->GetId() != spell) && roll_chance_f(chance))
|
||||||
|
{
|
||||||
|
RemoveAurasDueToSpell((*i)->GetId());
|
||||||
|
if (!m_ccAuras.empty())
|
||||||
|
next = m_ccAuras.begin();
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellEntry const *spellProto, bool durabilityLoss)
|
uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellEntry const *spellProto, bool durabilityLoss)
|
||||||
{
|
{
|
||||||
if (!pVictim->isAlive() || pVictim->isInFlight() || pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode())
|
if (!pVictim->isAlive() || pVictim->isInFlight() || pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode())
|
||||||
@@ -509,8 +533,6 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
|
|||||||
// remove affects from attacker at any non-DoT damage (including 0 damage)
|
// remove affects from attacker at any non-DoT damage (including 0 damage)
|
||||||
if( damagetype != DOT)
|
if( damagetype != DOT)
|
||||||
{
|
{
|
||||||
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_STEALTH);
|
|
||||||
|
|
||||||
if(pVictim->GetTypeId() == TYPEID_PLAYER && !pVictim->IsStandState() && !pVictim->hasUnitState(UNIT_STAT_STUNNED))
|
if(pVictim->GetTypeId() == TYPEID_PLAYER && !pVictim->IsStandState() && !pVictim->hasUnitState(UNIT_STAT_STUNNED))
|
||||||
pVictim->SetStandState(PLAYER_STATE_NONE);
|
pVictim->SetStandState(PLAYER_STATE_NONE);
|
||||||
}
|
}
|
||||||
@@ -888,7 +910,7 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Store auras by interrupt flag to speed this up.
|
// TODO: Store auras by interrupt flag to speed this up.
|
||||||
AuraMap& vAuras = pVictim->GetAuras();
|
/*AuraMap& vAuras = pVictim->GetAuras();
|
||||||
for (AuraMap::iterator i = vAuras.begin(), next; i != vAuras.end(); i = next)
|
for (AuraMap::iterator i = vAuras.begin(), next; i != vAuras.end(); i = next)
|
||||||
{
|
{
|
||||||
const SpellEntry *se = i->second->GetSpellProto();
|
const SpellEntry *se = i->second->GetSpellProto();
|
||||||
@@ -908,17 +930,9 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
|
|||||||
next = vAuras.begin();
|
next = vAuras.begin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( (se->Attributes & SPELL_ATTR_BREAKABLE_BY_DAMAGE) && (!spellProto || se->Id != spellProto->Id) )
|
else */
|
||||||
{
|
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_DAMAGE);
|
||||||
uint32 max_dmg = pVictim->getLevel() > 8 ? 25 * pVictim->getLevel() - 150 : 50;
|
pVictim->RemoveSpellbyDamageTaken(damage, spellProto ? spellProto->Id : 0);
|
||||||
float chance = float(damage) / max_dmg * 100.0f;
|
|
||||||
if (roll_chance_f(chance))
|
|
||||||
{
|
|
||||||
pVictim->RemoveAurasDueToSpell(i->second->GetId());
|
|
||||||
next = vAuras.begin();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (damagetype != NODAMAGE && damage && pVictim->GetTypeId() == TYPEID_PLAYER)
|
if (damagetype != NODAMAGE && damage && pVictim->GetTypeId() == TYPEID_PLAYER)
|
||||||
{
|
{
|
||||||
@@ -2192,14 +2206,7 @@ void Unit::AttackerStateUpdate (Unit *pVictim, WeaponAttackType attType, bool ex
|
|||||||
if(IsNonMeleeSpellCasted(false))
|
if(IsNonMeleeSpellCasted(false))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(!pVictim->isInCombat() && pVictim->GetTypeId() != TYPEID_PLAYER && ((Creature*)pVictim)->AI())
|
CombatStart(pVictim);
|
||||||
((Creature*)pVictim)->AI()->AttackStart(this);
|
|
||||||
|
|
||||||
SetInCombatWith(pVictim);
|
|
||||||
pVictim->SetInCombatWith(this);
|
|
||||||
|
|
||||||
if(Player* attackedPlayer = pVictim->GetCharmerOrOwnerPlayerOrPlayerItself())
|
|
||||||
SetContestedPvP(attackedPlayer);
|
|
||||||
|
|
||||||
uint32 hitInfo;
|
uint32 hitInfo;
|
||||||
if (attType == BASE_ATTACK)
|
if (attType == BASE_ATTACK)
|
||||||
@@ -3789,6 +3796,11 @@ bool Unit::AddAura(Aura *Aur)
|
|||||||
m_modAuras[Aur->GetModifier()->m_auraname].push_back(Aur);
|
m_modAuras[Aur->GetModifier()->m_auraname].push_back(Aur);
|
||||||
if(Aur->GetSpellProto()->AuraInterruptFlags)
|
if(Aur->GetSpellProto()->AuraInterruptFlags)
|
||||||
m_interruptableAuras.push_back(Aur);
|
m_interruptableAuras.push_back(Aur);
|
||||||
|
if(Aur->GetSpellProto()->Attributes & SPELL_ATTR_BREAKABLE_BY_DAMAGE)
|
||||||
|
{
|
||||||
|
m_ccAuras.push_back(Aur);
|
||||||
|
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_CC);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Aur->ApplyModifier(true,true);
|
Aur->ApplyModifier(true,true);
|
||||||
@@ -4152,6 +4164,8 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode)
|
|||||||
m_modAuras[(*i).second->GetModifier()->m_auraname].remove((*i).second);
|
m_modAuras[(*i).second->GetModifier()->m_auraname].remove((*i).second);
|
||||||
if((*i).second->GetSpellProto()->AuraInterruptFlags)
|
if((*i).second->GetSpellProto()->AuraInterruptFlags)
|
||||||
m_interruptableAuras.remove((*i).second);
|
m_interruptableAuras.remove((*i).second);
|
||||||
|
if((*i).second->GetSpellProto()->Attributes & SPELL_ATTR_BREAKABLE_BY_DAMAGE)
|
||||||
|
m_ccAuras.remove((*i).second);
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove from list before mods removing (prevent cyclic calls, mods added before including to aura list - use reverse order)
|
// remove from list before mods removing (prevent cyclic calls, mods added before including to aura list - use reverse order)
|
||||||
@@ -8398,7 +8412,7 @@ void Unit::Mount(uint32 mount)
|
|||||||
if(!mount)
|
if(!mount)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOUNTING);
|
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOUNT);
|
||||||
|
|
||||||
SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, mount);
|
SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, mount);
|
||||||
|
|
||||||
@@ -8468,6 +8482,21 @@ void Unit::SetInCombatWith(Unit* enemy)
|
|||||||
SetInCombatState(false);
|
SetInCombatState(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Unit::CombatStart(Unit* target)
|
||||||
|
{
|
||||||
|
if(!target->isInCombat() && target->GetTypeId() != TYPEID_PLAYER && ((Creature*)target)->AI())
|
||||||
|
((Creature*)target)->AI()->AttackStart(this);
|
||||||
|
|
||||||
|
SetInCombatWith(target);
|
||||||
|
target->SetInCombatWith(this);
|
||||||
|
|
||||||
|
if(Player* attackedPlayer = target->GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||||
|
SetContestedPvP(attackedPlayer);
|
||||||
|
|
||||||
|
if(!isInCombat()) // remove this?
|
||||||
|
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ATTACK);
|
||||||
|
}
|
||||||
|
|
||||||
void Unit::SetInCombatState(bool PvP)
|
void Unit::SetInCombatState(bool PvP)
|
||||||
{
|
{
|
||||||
// only alive units can be in combat
|
// only alive units can be in combat
|
||||||
|
|||||||
+14
-12
@@ -57,30 +57,29 @@ enum SpellChannelInterruptFlags
|
|||||||
|
|
||||||
enum SpellAuraInterruptFlags
|
enum SpellAuraInterruptFlags
|
||||||
{
|
{
|
||||||
AURA_INTERRUPT_FLAG_UNK0 = 0x00000001, // 0 removed when getting hit by a negative spell?
|
AURA_INTERRUPT_FLAG_HITBYSPELL = 0x00000001, // 0 removed when getting hit by a negative spell?
|
||||||
AURA_INTERRUPT_FLAG_DAMAGE = 0x00000002, // 1 removed by any damage
|
AURA_INTERRUPT_FLAG_DAMAGE = 0x00000002, // 1 removed by any damage
|
||||||
AURA_INTERRUPT_FLAG_UNK2 = 0x00000004, // 2
|
AURA_INTERRUPT_FLAG_CC = 0x00000004, // 2 crowd control
|
||||||
AURA_INTERRUPT_FLAG_MOVE = 0x00000008, // 3 removed by any movement
|
AURA_INTERRUPT_FLAG_MOVE = 0x00000008, // 3 removed by any movement
|
||||||
AURA_INTERRUPT_FLAG_TURNING = 0x00000010, // 4 removed by any turning
|
AURA_INTERRUPT_FLAG_TURNING = 0x00000010, // 4 removed by any turning
|
||||||
AURA_INTERRUPT_FLAG_ENTER_COMBAT = 0x00000020, // 5 removed by entering combat
|
AURA_INTERRUPT_FLAG_JUMP = 0x00000020, // 5 removed by entering combat
|
||||||
AURA_INTERRUPT_FLAG_NOT_MOUNTED = 0x00000040, // 6 removed by unmounting
|
AURA_INTERRUPT_FLAG_NOT_MOUNTED = 0x00000040, // 6 removed by unmounting
|
||||||
AURA_INTERRUPT_FLAG_NOT_ABOVEWATER = 0x00000080, // 7 removed by entering water
|
AURA_INTERRUPT_FLAG_NOT_ABOVEWATER = 0x00000080, // 7 removed by entering water
|
||||||
AURA_INTERRUPT_FLAG_NOT_UNDERWATER = 0x00000100, // 8 removed by leaving water
|
AURA_INTERRUPT_FLAG_NOT_UNDERWATER = 0x00000100, // 8 removed by leaving water
|
||||||
AURA_INTERRUPT_FLAG_NOT_SHEATHED = 0x00000200, // 9 removed by unsheathing
|
AURA_INTERRUPT_FLAG_NOT_SHEATHED = 0x00000200, // 9 removed by unsheathing
|
||||||
AURA_INTERRUPT_FLAG_UNK10 = 0x00000400, // 10
|
AURA_INTERRUPT_FLAG_LOOT = 0x00000400, // 10
|
||||||
AURA_INTERRUPT_FLAG_UNK11 = 0x00000800, // 11
|
AURA_INTERRUPT_FLAG_MOUNT = 0x00000800, // 11 removed by mounting
|
||||||
AURA_INTERRUPT_FLAG_UNK12 = 0x00001000, // 12 removed by attack?
|
AURA_INTERRUPT_FLAG_ATTACK = 0x00001000, // 12 removed by attacking
|
||||||
AURA_INTERRUPT_FLAG_UNK13 = 0x00002000, // 13
|
AURA_INTERRUPT_FLAG_CAST = 0x00002000, // 13 ???
|
||||||
AURA_INTERRUPT_FLAG_STEALTH = 0x00003C00,
|
|
||||||
AURA_INTERRUPT_FLAG_UNK14 = 0x00004000, // 14
|
AURA_INTERRUPT_FLAG_UNK14 = 0x00004000, // 14
|
||||||
AURA_INTERRUPT_FLAG_UNK15 = 0x00008000, // 15 removed by casting a spell?
|
AURA_INTERRUPT_FLAG_TRANSFORM = 0x00008000, // 15 removed by transform?
|
||||||
AURA_INTERRUPT_FLAG_UNK16 = 0x00010000, // 16
|
AURA_INTERRUPT_FLAG_UNK16 = 0x00010000, // 16
|
||||||
AURA_INTERRUPT_FLAG_MOUNTING = 0x00020000, // 17 removed by mounting
|
AURA_INTERRUPT_FLAG_UNK17 = 0x00020000, // 17 misdirect, aspect, swim speed
|
||||||
AURA_INTERRUPT_FLAG_NOT_SEATED = 0x00040000, // 18 removed by standing up
|
AURA_INTERRUPT_FLAG_NOT_SEATED = 0x00040000, // 18 removed by standing up
|
||||||
AURA_INTERRUPT_FLAG_CHANGE_MAP = 0x00080000, // 19 leaving map/getting teleported
|
AURA_INTERRUPT_FLAG_CHANGE_MAP = 0x00080000, // 19 leaving map/getting teleported
|
||||||
AURA_INTERRUPT_FLAG_UNK20 = 0x00100000, // 20
|
AURA_INTERRUPT_FLAG_UNATTACKABLE = 0x00100000, // 20 invulnerable or stealth
|
||||||
AURA_INTERRUPT_FLAG_UNK21 = 0x00200000, // 21
|
AURA_INTERRUPT_FLAG_UNK21 = 0x00200000, // 21
|
||||||
AURA_INTERRUPT_FLAG_UNK22 = 0x00400000, // 22
|
AURA_INTERRUPT_FLAG_TELEPORTED = 0x00400000, // 22
|
||||||
AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT = 0x00800000, // 23 removed by entering pvp combat
|
AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT = 0x00800000, // 23 removed by entering pvp combat
|
||||||
AURA_INTERRUPT_FLAG_DIRECT_DAMAGE = 0x01000000 // 24 removed by any direct damage
|
AURA_INTERRUPT_FLAG_DIRECT_DAMAGE = 0x01000000 // 24 removed by any direct damage
|
||||||
};
|
};
|
||||||
@@ -844,6 +843,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
|||||||
void Unmount();
|
void Unmount();
|
||||||
|
|
||||||
uint16 GetMaxSkillValueForLevel(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; }
|
uint16 GetMaxSkillValueForLevel(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; }
|
||||||
|
void RemoveSpellbyDamageTaken(uint32 damage, uint32 spell);
|
||||||
uint32 DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellEntry const *spellProto, bool durabilityLoss);
|
uint32 DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellEntry const *spellProto, bool durabilityLoss);
|
||||||
void DealFlatDamage(Unit *pVictim, SpellEntry const *spellInfo, uint32 *damage, CleanDamage *cleanDamage, bool *crit = false, bool isTriggeredSpell = false);
|
void DealFlatDamage(Unit *pVictim, SpellEntry const *spellInfo, uint32 *damage, CleanDamage *cleanDamage, bool *crit = false, bool isTriggeredSpell = false);
|
||||||
void DoAttackDamage(Unit *pVictim, uint32 *damage, CleanDamage *cleanDamage, uint32 *blocked_amount, SpellSchoolMask damageSchoolMask, uint32 *hitInfo, VictimState *victimState, uint32 *absorbDamage, uint32 *resistDamage, WeaponAttackType attType, SpellEntry const *spellCasted = NULL, bool isTriggeredSpell = false);
|
void DoAttackDamage(Unit *pVictim, uint32 *damage, CleanDamage *cleanDamage, uint32 *blocked_amount, SpellSchoolMask damageSchoolMask, uint32 *hitInfo, VictimState *victimState, uint32 *absorbDamage, uint32 *resistDamage, WeaponAttackType attType, SpellEntry const *spellCasted = NULL, bool isTriggeredSpell = false);
|
||||||
@@ -902,6 +902,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
|||||||
bool isInFlight() const { return hasUnitState(UNIT_STAT_IN_FLIGHT); }
|
bool isInFlight() const { return hasUnitState(UNIT_STAT_IN_FLIGHT); }
|
||||||
|
|
||||||
bool isInCombat() const { return HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); }
|
bool isInCombat() const { return HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); }
|
||||||
|
void CombatStart(Unit* target);
|
||||||
void SetInCombatState(bool PvP);
|
void SetInCombatState(bool PvP);
|
||||||
void SetInCombatWith(Unit* enemy);
|
void SetInCombatWith(Unit* enemy);
|
||||||
void ClearInCombat();
|
void ClearInCombat();
|
||||||
@@ -1334,6 +1335,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
|||||||
|
|
||||||
AuraList m_modAuras[TOTAL_AURAS];
|
AuraList m_modAuras[TOTAL_AURAS];
|
||||||
AuraList m_interruptableAuras;
|
AuraList m_interruptableAuras;
|
||||||
|
AuraList m_ccAuras;
|
||||||
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END];
|
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END];
|
||||||
float m_weaponDamage[MAX_ATTACK][2];
|
float m_weaponDamage[MAX_ATTACK][2];
|
||||||
bool m_canModifyStats;
|
bool m_canModifyStats;
|
||||||
|
|||||||
Reference in New Issue
Block a user