[10957] Implement auras SPELL_AURA_MOD_DISARM_OFFHAND (254) and SPELL_AURA_MOD_DISARM_RANGED (278).

Thanks to Qsa prepare for mangos.

Note: single unsure case: is block chance must be show or set to 0 in shield disarm time.

Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
QAston 2011-01-04 05:20:56 +03:00 committed by VladimirMangos
parent 883e88fad5
commit 4fe41fb335
9 changed files with 76 additions and 30 deletions

View file

@ -304,7 +304,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleNULL, //251 SPELL_AURA_MOD_ENEMY_DODGE
&Aura::HandleModCombatSpeedPct, //252 SPELL_AURA_SLOW_ALL
&Aura::HandleNoImmediateEffect, //253 SPELL_AURA_MOD_BLOCK_CRIT_CHANCE implemented in Unit::CalculateMeleeDamage
&Aura::HandleNULL, //254 SPELL_AURA_MOD_DISARM_SHIELD disarm Shield
&Aura::HandleAuraModDisarm, //254 SPELL_AURA_MOD_DISARM_OFFHAND also disarm shield
&Aura::HandleNoImmediateEffect, //255 SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT implemented in Unit::SpellDamageBonusTaken
&Aura::HandleNoReagentUseAura, //256 SPELL_AURA_NO_REAGENT_USE Use SpellClassMask for spell select
&Aura::HandleNULL, //257 SPELL_AURA_MOD_TARGET_RESIST_BY_SPELL_CLASS Use SpellClassMask for spell select
@ -328,7 +328,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleNoImmediateEffect, //275 SPELL_AURA_MOD_IGNORE_SHAPESHIFT Use SpellClassMask for spell select
&Aura::HandleNULL, //276 mod damage % mechanic?
&Aura::HandleNoImmediateEffect, //277 SPELL_AURA_MOD_MAX_AFFECTED_TARGETS Use SpellClassMask for spell select
&Aura::HandleNULL, //278 SPELL_AURA_MOD_DISARM_RANGED disarm ranged weapon
&Aura::HandleAuraModDisarm, //278 SPELL_AURA_MOD_DISARM_RANGED disarm ranged weapon
&Aura::HandleNULL, //279 visual effects? 58836 and 57507
&Aura::HandleModTargetArmorPct, //280 SPELL_AURA_MOD_TARGET_ARMOR_PCT
&Aura::HandleNoImmediateEffect, //281 SPELL_AURA_MOD_HONOR_GAIN implemented in Player::RewardHonor
@ -3939,16 +3939,41 @@ void Aura::HandleAuraModDisarm(bool apply, bool Real)
Unit *target = GetTarget();
if(!apply && target->HasAuraType(SPELL_AURA_MOD_DISARM))
if(!apply && target->HasAuraType(GetModifier()->m_auraname))
return;
// not sure for it's correctness
if(apply)
target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISARMED);
else
target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISARMED);
uint32 flags;
uint32 field;
WeaponAttackType attack_type;
switch (GetModifier()->m_auraname)
{
default:
case SPELL_AURA_MOD_DISARM:
{
field = UNIT_FIELD_FLAGS;
flags = UNIT_FLAG_DISARMED;
attack_type = BASE_ATTACK;
break;
}
case SPELL_AURA_MOD_DISARM_OFFHAND:
{
field = UNIT_FIELD_FLAGS_2;
flags = UNIT_FLAG2_DISARM_OFFHAND;
attack_type = OFF_ATTACK;
break;
}
case SPELL_AURA_MOD_DISARM_RANGED:
{
field = UNIT_FIELD_FLAGS_2;
flags = UNIT_FLAG2_DISARM_RANGED;
attack_type = RANGED_ATTACK;
break;
}
}
target->ApplyModFlag(field, flags, apply);
// only at real add/remove aura
if (target->GetTypeId() != TYPEID_PLAYER)
return;
@ -3957,11 +3982,11 @@ void Aura::HandleAuraModDisarm(bool apply, bool Real)
return;
if (apply)
target->SetAttackTime(BASE_ATTACK,BASE_ATTACK_TIME);
target->SetAttackTime(attack_type, BASE_ATTACK_TIME);
else
((Player *)target)->SetRegularAttackTime();
target->UpdateDamagePhysical(BASE_ATTACK);
target->UpdateDamagePhysical(attack_type);
}
void Aura::HandleAuraModStun(bool apply, bool Real)