*Update to Mangos 6989.
--HG-- branch : trunk
This commit is contained in:
+1
-4
@@ -19233,11 +19233,8 @@ void Player::UpdateAreaDependentAuras( uint32 newArea )
|
||||
++iter;
|
||||
}
|
||||
|
||||
// unmount if enter in this subzone
|
||||
if( newArea == 35)
|
||||
RemoveSpellsCausingAura(SPELL_AURA_MOUNTED);
|
||||
// Dragonmaw Illusion
|
||||
else if( newArea == 3759 || newArea == 3966 || newArea == 3939 )
|
||||
if( newArea == 3759 || newArea == 3966 || newArea == 3939 )
|
||||
{
|
||||
if( GetDummyAura(40214) )
|
||||
{
|
||||
|
||||
+7
-9
@@ -1037,14 +1037,15 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
|
||||
|
||||
if( m_caster != unit )
|
||||
{
|
||||
if (unit->GetCharmerOrOwnerGUID() != m_caster->GetGUID())
|
||||
// Recheck UNIT_FLAG_NON_ATTACKABLE for delayed spells
|
||||
if (m_spellInfo->speed > 0.0f &&
|
||||
unit->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE) &&
|
||||
unit->GetCharmerOrOwnerGUID() != m_caster->GetGUID())
|
||||
{
|
||||
if (unit->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
|
||||
{
|
||||
m_caster->SendSpellMiss(unit, m_spellInfo->Id, SPELL_MISS_EVADE);
|
||||
return;
|
||||
}
|
||||
m_caster->SendSpellMiss(unit, m_spellInfo->Id, SPELL_MISS_EVADE);
|
||||
return;
|
||||
}
|
||||
|
||||
if( !m_caster->IsFriendlyTo(unit) )
|
||||
{
|
||||
// for delayed spells ignore not visible explicit target
|
||||
@@ -4249,9 +4250,6 @@ uint8 Spell::CanCast(bool strict)
|
||||
if (m_caster->GetTypeId()==TYPEID_PLAYER && !sMapStore.LookupEntry(m_caster->GetMapId())->IsMountAllowed() && !m_IsTriggeredSpell && !m_spellInfo->AreaId)
|
||||
return SPELL_FAILED_NO_MOUNTS_ALLOWED;
|
||||
|
||||
if (m_caster->GetAreaId()==35)
|
||||
return SPELL_FAILED_NO_MOUNTS_ALLOWED;
|
||||
|
||||
ShapeshiftForm form = m_caster->m_form;
|
||||
if( form == FORM_CAT || form == FORM_TREE || form == FORM_TRAVEL ||
|
||||
form == FORM_AQUA || form == FORM_BEAR || form == FORM_DIREBEAR ||
|
||||
|
||||
@@ -280,7 +280,7 @@ HostilReference* ThreatContainer::selectNextVictim(Creature* pAttacker, HostilRe
|
||||
|
||||
// some units are preferred in comparison to others
|
||||
if(iter != lastRef && (target->IsImmunedToDamage(pAttacker->GetMeleeDamageSchoolMask(), false) ||
|
||||
target->hasUnitState(UNIT_STAT_CONFUSED)
|
||||
target->hasNegativeAuraWithInterruptFlag(AURA_INTERRUPT_FLAG_DAMAGE)
|
||||
) )
|
||||
{
|
||||
// current victim is a second choice target, so don't compare threat with it below
|
||||
|
||||
+27
-21
@@ -2034,10 +2034,10 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(const Unit *pVictim, WeaponAttackT
|
||||
// Useful if want to specify crit & miss chances for melee, else it could be removed
|
||||
DEBUG_LOG("MELEE OUTCOME: miss %f crit %f dodge %f parry %f block %f", miss_chance,crit_chance,dodge_chance,parry_chance,block_chance);
|
||||
|
||||
return RollMeleeOutcomeAgainst(pVictim, attType, int32(crit_chance*100), int32(miss_chance*100), int32(dodge_chance*100),int32(parry_chance*100),int32(block_chance*100), false);
|
||||
return RollMeleeOutcomeAgainst(pVictim, attType, int32(crit_chance*100), int32(miss_chance*100), int32(dodge_chance*100),int32(parry_chance*100),int32(block_chance*100));
|
||||
}
|
||||
|
||||
MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance, bool SpellCasted ) const
|
||||
MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
|
||||
{
|
||||
if(pVictim->GetTypeId()==TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode())
|
||||
return MELEE_HIT_EVADE;
|
||||
@@ -2050,7 +2050,6 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttack
|
||||
|
||||
// bonus from skills is 0.04%
|
||||
int32 skillBonus = 4 * ( attackerWeaponSkill - victimMaxSkillValueForLevel );
|
||||
int32 skillBonus2 = 4 * ( attackerMaxSkillValueForLevel - victimDefenseSkill );
|
||||
int32 sum = 0, tmp = 0;
|
||||
int32 roll = urand (0, 10000);
|
||||
|
||||
@@ -2131,16 +2130,6 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttack
|
||||
&& ((tmp -= skillBonus) > 0)
|
||||
&& (roll < (sum += tmp)))
|
||||
{
|
||||
// Critical chance
|
||||
tmp = crit_chance + skillBonus2;
|
||||
if ( GetTypeId() == TYPEID_PLAYER && SpellCasted && tmp > 0 )
|
||||
{
|
||||
if ( roll_chance_i(tmp/100))
|
||||
{
|
||||
DEBUG_LOG ("RollMeleeOutcomeAgainst: BLOCKED CRIT");
|
||||
return MELEE_HIT_BLOCK_CRIT;
|
||||
}
|
||||
}
|
||||
DEBUG_LOG ("RollMeleeOutcomeAgainst: BLOCK <%d, %d)", sum-tmp, sum);
|
||||
return MELEE_HIT_BLOCK;
|
||||
}
|
||||
@@ -2148,7 +2137,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttack
|
||||
}
|
||||
|
||||
// Critical chance
|
||||
tmp = crit_chance + skillBonus2;
|
||||
tmp = crit_chance;
|
||||
|
||||
if (tmp > 0 && roll < (sum += tmp))
|
||||
{
|
||||
@@ -2157,7 +2146,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttack
|
||||
}
|
||||
|
||||
// Max 40% chance to score a glancing blow against mobs that are higher level (can do only players and pets and not with ranged weapon)
|
||||
if( attType != RANGED_ATTACK && !SpellCasted &&
|
||||
if( attType != RANGED_ATTACK &&
|
||||
(GetTypeId() == TYPEID_PLAYER || ((Creature*)this)->isPet()) &&
|
||||
pVictim->GetTypeId() != TYPEID_PLAYER && !((Creature*)pVictim)->isPet() &&
|
||||
getLevel() < pVictim->getLevelForTarget(this) )
|
||||
@@ -2176,11 +2165,14 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttack
|
||||
}
|
||||
}
|
||||
|
||||
if ((GetTypeId()!=TYPEID_PLAYER && !(((Creature*)this)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSH) && !((Creature*)this)->isPet()) &&
|
||||
!SpellCasted /*Only autoattack can be crashing blow*/ )
|
||||
// mobs can score crushing blows if they're 4 or more levels above victim
|
||||
if (getLevelForTarget(pVictim) >= pVictim->getLevelForTarget(this) + 4 &&
|
||||
// can be from by creature (if can) or from controlled player that considered as creature
|
||||
(GetTypeId()!=TYPEID_PLAYER && !((Creature*)this)->isPet() &&
|
||||
!(((Creature*)this)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSH) ||
|
||||
GetTypeId()==TYPEID_PLAYER && GetCharmerOrOwnerGUID()))
|
||||
{
|
||||
// mobs can score crushing blows if they're 3 or more levels above victim
|
||||
// or when their weapon skill is 15 or more above victim's defense skill
|
||||
// when their weapon skill is 15 or more above victim's defense skill
|
||||
tmp = victimDefenseSkill;
|
||||
int32 tmpmax = victimMaxSkillValueForLevel;
|
||||
// having defense above your maximum (from items, talents etc.) has no effect
|
||||
@@ -2290,15 +2282,17 @@ bool Unit::isSpellBlocked(Unit *pVictim, SpellEntry const *spellProto, WeaponAtt
|
||||
{
|
||||
if (pVictim->HasInArc(M_PI,this))
|
||||
{
|
||||
/* Currently not exist spells with ignore block
|
||||
// Ignore combat result aura (parry/dodge check on prepare)
|
||||
AuraList const& ignore = GetAurasByType(SPELL_AURA_IGNORE_COMBAT_RESULT);
|
||||
for(AuraList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
|
||||
{
|
||||
if (!(*i)->isAffectedOnSpell(spellProto))
|
||||
continue;
|
||||
if ((*i)->GetModifier()->m_miscvalue == MELEE_HIT_BLOCK)
|
||||
if ((*i)->GetModifier()->m_miscvalue == )
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
float blockChance = GetUnitBlockChance();
|
||||
blockChance += (GetWeaponSkillValue(attackType) - pVictim->GetMaxSkillValueForLevel() )*0.04;
|
||||
if (roll_chance_f(blockChance))
|
||||
@@ -2797,6 +2791,9 @@ float Unit::GetUnitCriticalChance(WeaponAttackType attackType, const Unit *pVict
|
||||
crit -= ((Player*)pVictim)->GetRatingBonusValue(CR_CRIT_TAKEN_MELEE);
|
||||
}
|
||||
|
||||
// Apply crit chance from defence skill
|
||||
crit += (int32(GetMaxSkillValueForLevel(pVictim)) - int32(pVictim->GetDefenseSkillValue(this))) * 0.04f;
|
||||
|
||||
if (crit < 0.0f)
|
||||
crit = 0.0f;
|
||||
return crit;
|
||||
@@ -7545,7 +7542,6 @@ bool Unit::isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolM
|
||||
if (pVictim)
|
||||
{
|
||||
crit_chance = GetUnitCriticalChance(attackType, pVictim);
|
||||
crit_chance+= (int32(GetMaxSkillValueForLevel(pVictim)) - int32(pVictim->GetDefenseSkillValue(this))) * 0.04f;
|
||||
crit_chance+= GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, schoolMask);
|
||||
}
|
||||
break;
|
||||
@@ -10555,6 +10551,16 @@ Unit* Unit::SelectNearbyTarget(float dist) const
|
||||
return *tcIter;
|
||||
}
|
||||
|
||||
bool Unit::hasNegativeAuraWithInterruptFlag(uint32 flag)
|
||||
{
|
||||
for (AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end(); ++iter)
|
||||
{
|
||||
if (!iter->second->IsPositive() && iter->second->GetSpellProto()->AuraInterruptFlags & flag)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void Unit::ApplyAttackTimePercentMod( WeaponAttackType att,float val, bool apply )
|
||||
{
|
||||
float remainingTimePct = (float)m_attackTimer[att] / (GetAttackTime(att) * m_modAttackSpeedPct[att]);
|
||||
|
||||
+4
-2
@@ -594,8 +594,9 @@ struct DiminishingReturn
|
||||
enum MeleeHitOutcome
|
||||
{
|
||||
MELEE_HIT_EVADE, MELEE_HIT_MISS, MELEE_HIT_DODGE, MELEE_HIT_BLOCK, MELEE_HIT_PARRY,
|
||||
MELEE_HIT_GLANCING, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_NORMAL, MELEE_HIT_BLOCK_CRIT
|
||||
MELEE_HIT_GLANCING, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_NORMAL
|
||||
};
|
||||
|
||||
struct CleanDamage
|
||||
{
|
||||
CleanDamage(uint32 _damage, WeaponAttackType _attackType, MeleeHitOutcome _hitOutCome) :
|
||||
@@ -843,6 +844,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
||||
void CombatStop(bool cast = false);
|
||||
void CombatStopWithPets(bool cast = false);
|
||||
Unit* SelectNearbyTarget(float dist = NOMINAL_MELEE_RANGE) const;
|
||||
bool hasNegativeAuraWithInterruptFlag(uint32 flag);
|
||||
|
||||
void addUnitState(uint32 f) { m_state |= f; }
|
||||
bool hasUnitState(const uint32 f) const { return (m_state & f); }
|
||||
@@ -972,7 +974,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
||||
float GetPPMProcChance(uint32 WeaponSpeed, float PPM) const;
|
||||
|
||||
MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType) const;
|
||||
MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance, bool SpellCasted ) const;
|
||||
MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const;
|
||||
|
||||
bool isVendor() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_VENDOR ); }
|
||||
bool isTrainer() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_TRAINER ); }
|
||||
|
||||
Reference in New Issue
Block a user