Merge pull request #7732 from Tuxity/defenseWeaponSkills434
[434] Defense and weapon skills
This commit is contained in:
@@ -547,46 +547,6 @@ uint32 Item::GetSkill()
|
||||
}
|
||||
}
|
||||
|
||||
uint32 Item::GetSpell()
|
||||
{
|
||||
ItemTemplate const* proto = GetTemplate();
|
||||
|
||||
switch (proto->Class)
|
||||
{
|
||||
case ITEM_CLASS_WEAPON:
|
||||
switch (proto->SubClass)
|
||||
{
|
||||
case ITEM_SUBCLASS_WEAPON_AXE: return 196;
|
||||
case ITEM_SUBCLASS_WEAPON_AXE2: return 197;
|
||||
case ITEM_SUBCLASS_WEAPON_BOW: return 264;
|
||||
case ITEM_SUBCLASS_WEAPON_GUN: return 266;
|
||||
case ITEM_SUBCLASS_WEAPON_MACE: return 198;
|
||||
case ITEM_SUBCLASS_WEAPON_MACE2: return 199;
|
||||
case ITEM_SUBCLASS_WEAPON_POLEARM: return 200;
|
||||
case ITEM_SUBCLASS_WEAPON_SWORD: return 201;
|
||||
case ITEM_SUBCLASS_WEAPON_SWORD2: return 202;
|
||||
case ITEM_SUBCLASS_WEAPON_STAFF: return 227;
|
||||
case ITEM_SUBCLASS_WEAPON_DAGGER: return 1180;
|
||||
case ITEM_SUBCLASS_WEAPON_THROWN: return 2567;
|
||||
case ITEM_SUBCLASS_WEAPON_SPEAR: return 3386;
|
||||
case ITEM_SUBCLASS_WEAPON_CROSSBOW:return 5011;
|
||||
case ITEM_SUBCLASS_WEAPON_WAND: return 5009;
|
||||
default: return 0;
|
||||
}
|
||||
case ITEM_CLASS_ARMOR:
|
||||
switch (proto->SubClass)
|
||||
{
|
||||
case ITEM_SUBCLASS_ARMOR_CLOTH: return 9078;
|
||||
case ITEM_SUBCLASS_ARMOR_LEATHER: return 9077;
|
||||
case ITEM_SUBCLASS_ARMOR_MAIL: return 8737;
|
||||
case ITEM_SUBCLASS_ARMOR_PLATE: return 750;
|
||||
case ITEM_SUBCLASS_ARMOR_SHIELD: return 9116;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32 Item::GenerateItemRandomPropertyId(uint32 item_id)
|
||||
{
|
||||
ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(item_id);
|
||||
|
||||
@@ -279,7 +279,6 @@ class Item : public Object
|
||||
bool IsEquipped() const;
|
||||
|
||||
uint32 GetSkill();
|
||||
uint32 GetSpell();
|
||||
|
||||
// RandomPropertyId (signed but stored as unsigned)
|
||||
int32 GetItemRandomPropertyId() const { return GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID); }
|
||||
|
||||
@@ -5699,17 +5699,6 @@ void Player::LeaveLFGChannel()
|
||||
}
|
||||
}
|
||||
|
||||
void Player::UpdateDefense()
|
||||
{
|
||||
uint32 defense_skill_gain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_DEFENSE);
|
||||
|
||||
if (UpdateSkill(SKILL_DEFENSE, defense_skill_gain))
|
||||
{
|
||||
// update dependent from defense skill part
|
||||
UpdateDefenseBonusesMod();
|
||||
}
|
||||
}
|
||||
|
||||
void Player::HandleBaseModValue(BaseModGroup modGroup, BaseModType modType, float amount, bool apply)
|
||||
{
|
||||
if (modGroup >= BASEMOD_END || modType >= MOD_END)
|
||||
@@ -5961,9 +5950,8 @@ void Player::UpdateRating(CombatRating cr)
|
||||
|
||||
switch (cr)
|
||||
{
|
||||
case CR_WEAPON_SKILL: // Implemented in Unit::RollMeleeOutcomeAgainst
|
||||
case CR_WEAPON_SKILL:
|
||||
case CR_DEFENSE_SKILL:
|
||||
UpdateDefenseBonusesMod();
|
||||
break;
|
||||
case CR_DODGE:
|
||||
UpdateDodgePercentage();
|
||||
@@ -6239,70 +6227,6 @@ bool Player::UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step)
|
||||
return false;
|
||||
}
|
||||
|
||||
void Player::UpdateWeaponSkill(WeaponAttackType attType)
|
||||
{
|
||||
// no skill gain in pvp
|
||||
Unit* victim = getVictim();
|
||||
if (victim && victim->GetTypeId() == TYPEID_PLAYER)
|
||||
return;
|
||||
|
||||
if (IsInFeralForm())
|
||||
return; // always maximized SKILL_FERAL_COMBAT in fact
|
||||
|
||||
if (GetShapeshiftForm() == FORM_TREE)
|
||||
return; // use weapon but not skill up
|
||||
|
||||
if (victim && victim->GetTypeId() == TYPEID_UNIT && (victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_SKILLGAIN))
|
||||
return;
|
||||
|
||||
uint32 weapon_skill_gain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_WEAPON);
|
||||
|
||||
Item* tmpitem = GetWeaponForAttack(attType, true);
|
||||
if (!tmpitem && attType == BASE_ATTACK)
|
||||
UpdateSkill(SKILL_UNARMED, weapon_skill_gain);
|
||||
else if (tmpitem && tmpitem->GetTemplate()->SubClass != ITEM_SUBCLASS_WEAPON_FISHING_POLE)
|
||||
UpdateSkill(tmpitem->GetSkill(), weapon_skill_gain);
|
||||
|
||||
UpdateAllCritPercentages();
|
||||
}
|
||||
|
||||
void Player::UpdateCombatSkills(Unit* victim, WeaponAttackType attType, bool defence)
|
||||
{
|
||||
uint8 plevel = getLevel(); // if defense than victim == attacker
|
||||
uint8 greylevel = Trinity::XP::GetGrayLevel(plevel);
|
||||
uint8 moblevel = victim->getLevelForTarget(this);
|
||||
if (moblevel < greylevel)
|
||||
return;
|
||||
|
||||
if (moblevel > plevel + 5)
|
||||
moblevel = plevel + 5;
|
||||
|
||||
uint8 lvldif = moblevel - greylevel;
|
||||
if (lvldif < 3)
|
||||
lvldif = 3;
|
||||
|
||||
uint32 skilldif = 5 * plevel - (defence ? GetBaseDefenseSkillValue() : GetBaseWeaponSkillValue(attType));
|
||||
if (skilldif <= 0)
|
||||
return;
|
||||
|
||||
float chance = float(3 * lvldif * skilldif) / plevel;
|
||||
if (!defence)
|
||||
if (getClass() == CLASS_WARRIOR || getClass() == CLASS_ROGUE)
|
||||
chance += chance * 0.02f * GetStat(STAT_INTELLECT);
|
||||
|
||||
chance = chance < 1.0f ? 1.0f : chance; //minimum chance to increase skill is 1%
|
||||
|
||||
if (roll_chance_f(chance))
|
||||
{
|
||||
if (defence)
|
||||
UpdateDefense();
|
||||
else
|
||||
UpdateWeaponSkill(attType);
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
void Player::ModifySkillBonus(uint32 skillid, int32 val, bool talent)
|
||||
{
|
||||
SkillStatusMap::const_iterator itr = mSkillStatus.find(skillid);
|
||||
@@ -6319,11 +6243,8 @@ void Player::ModifySkillBonus(uint32 skillid, int32 val, bool talent)
|
||||
|
||||
void Player::UpdateSkillsForLevel()
|
||||
{
|
||||
uint16 maxconfskill = sWorld->GetConfigMaxSkillValue();
|
||||
uint32 maxSkill = GetMaxSkillValueForLevel();
|
||||
|
||||
bool alwaysMaxSkill = sWorld->getBoolConfig(CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL);
|
||||
|
||||
for (SkillStatusMap::iterator itr = mSkillStatus.begin(); itr != mSkillStatus.end(); ++itr)
|
||||
{
|
||||
if (itr->second.uState == SKILL_DELETED)
|
||||
@@ -6346,22 +6267,10 @@ void Player::UpdateSkillsForLevel()
|
||||
/// update only level dependent max skill values
|
||||
if (max != 1)
|
||||
{
|
||||
/// maximize skill always
|
||||
if (alwaysMaxSkill)
|
||||
{
|
||||
SetUInt16Value(PLAYER_SKILL_RANK_0 + field, offset, maxSkill);
|
||||
SetUInt16Value(PLAYER_SKILL_MAX_RANK_0 + field, offset, maxSkill);
|
||||
if (itr->second.uState != SKILL_NEW)
|
||||
itr->second.uState = SKILL_CHANGED;
|
||||
}
|
||||
|
||||
else if (max != maxconfskill) /// update max skill value if current max skill not maximized
|
||||
{
|
||||
SetUInt16Value(PLAYER_SKILL_RANK_0 + field, offset, val);
|
||||
SetUInt16Value(PLAYER_SKILL_MAX_RANK_0 + field, offset, maxSkill);
|
||||
if (itr->second.uState != SKILL_NEW)
|
||||
itr->second.uState = SKILL_CHANGED;
|
||||
}
|
||||
SetUInt16Value(PLAYER_SKILL_RANK_0 + field, offset, maxSkill);
|
||||
SetUInt16Value(PLAYER_SKILL_MAX_RANK_0 + field, offset, maxSkill);
|
||||
if (itr->second.uState != SKILL_NEW)
|
||||
itr->second.uState = SKILL_CHANGED;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6389,8 +6298,6 @@ void Player::UpdateSkillsToMaxSkillsForLevel()
|
||||
if (itr->second.uState != SKILL_NEW)
|
||||
itr->second.uState = SKILL_CHANGED;
|
||||
}
|
||||
if (pskill == SKILL_DEFENSE)
|
||||
UpdateDefenseBonusesMod();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23388,19 +23295,6 @@ bool Player::IsAtRecruitAFriendDistance(WorldObject const* pOther) const
|
||||
return pOther->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE);
|
||||
}
|
||||
|
||||
uint32 Player::GetBaseWeaponSkillValue (WeaponAttackType attType) const
|
||||
{
|
||||
Item* item = GetWeaponForAttack(attType, true);
|
||||
|
||||
// unarmed only with base attack
|
||||
if (attType != BASE_ATTACK && !item)
|
||||
return 0;
|
||||
|
||||
// weapon skill or (unarmed for base attack and for fist weapons)
|
||||
uint32 skill = (item && item->GetSkill() != SKILL_FIST_WEAPONS) ? item->GetSkill() : uint32(SKILL_UNARMED);
|
||||
return GetBaseSkillValue(skill);
|
||||
}
|
||||
|
||||
void Player::ResurectUsingRequestData()
|
||||
{
|
||||
/// Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse
|
||||
|
||||
@@ -2054,9 +2054,6 @@ class Player : public Unit, public GridObject<Player>
|
||||
bool UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator = 1);
|
||||
bool UpdateFishingSkill();
|
||||
|
||||
uint32 GetBaseDefenseSkillValue() const { return GetBaseSkillValue(SKILL_DEFENSE); }
|
||||
uint32 GetBaseWeaponSkillValue(WeaponAttackType attType) const;
|
||||
|
||||
uint32 GetSpellByProto(ItemTemplate* proto);
|
||||
|
||||
float GetHealthBonusFromStamina();
|
||||
@@ -2078,7 +2075,6 @@ class Player : public Unit, public GridObject<Player>
|
||||
|
||||
void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& min_damage, float& max_damage);
|
||||
|
||||
void UpdateDefenseBonusesMod();
|
||||
inline void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true);}
|
||||
float GetMeleeCritFromAgility();
|
||||
void GetDodgeFromAgility(float &diminishing, float &nondiminishing);
|
||||
@@ -2183,10 +2179,6 @@ class Player : public Unit, public GridObject<Player>
|
||||
void UpdateLocalChannels(uint32 newZone);
|
||||
void LeaveLFGChannel();
|
||||
|
||||
void UpdateDefense();
|
||||
void UpdateWeaponSkill (WeaponAttackType attType);
|
||||
void UpdateCombatSkills(Unit* victim, WeaponAttackType attType, bool defence);
|
||||
|
||||
void SetSkill(uint16 id, uint16 step, uint16 currVal, uint16 maxVal);
|
||||
uint16 GetMaxSkillValue(uint32 skill) const; // max + perm. bonus + temp bonus
|
||||
uint16 GetPureMaxSkillValue(uint32 skill) const; // max
|
||||
|
||||
@@ -75,16 +75,16 @@ bool Player::UpdateStats(Stats stat)
|
||||
UpdateAllCritPercentages();
|
||||
UpdateDodgePercentage();
|
||||
break;
|
||||
case STAT_STAMINA: UpdateMaxHealth(); break;
|
||||
case STAT_STAMINA:
|
||||
UpdateMaxHealth();
|
||||
break;
|
||||
case STAT_INTELLECT:
|
||||
UpdateMaxPower(POWER_MANA);
|
||||
UpdateAllSpellCritChances();
|
||||
UpdateArmor(); //SPELL_AURA_MOD_RESISTANCE_OF_INTELLECT_PERCENT, only armor currently
|
||||
break;
|
||||
|
||||
case STAT_SPIRIT:
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -155,7 +155,9 @@ bool Player::UpdateAllStats()
|
||||
UpdateAllRatings();
|
||||
UpdateAllCritPercentages();
|
||||
UpdateAllSpellCritChances();
|
||||
UpdateDefenseBonusesMod();
|
||||
UpdateBlockPercentage();
|
||||
UpdateParryPercentage();
|
||||
UpdateDodgePercentage();
|
||||
UpdateSpellDamageAndHealingBonus();
|
||||
UpdateManaRegen();
|
||||
UpdateExpertise(BASE_ATTACK);
|
||||
@@ -430,13 +432,6 @@ void Player::UpdateDamagePhysical(WeaponAttackType attType)
|
||||
}
|
||||
}
|
||||
|
||||
void Player::UpdateDefenseBonusesMod()
|
||||
{
|
||||
UpdateBlockPercentage();
|
||||
UpdateParryPercentage();
|
||||
UpdateDodgePercentage();
|
||||
}
|
||||
|
||||
void Player::UpdateBlockPercentage()
|
||||
{
|
||||
// No block
|
||||
@@ -482,7 +477,7 @@ void Player::UpdateCritPercentage(WeaponAttackType attType)
|
||||
|
||||
float value = GetTotalPercentageModValue(modGroup) + GetRatingBonusValue(cr);
|
||||
// Modify crit from weapon skill and maximized defense skill of same level victim difference
|
||||
value += (int32(GetWeaponSkillValue(attType)) - int32(GetMaxSkillValueForLevel())) * 0.04f;
|
||||
value += (int32(GetMaxSkillValueForLevel()) - int32(GetMaxSkillValueForLevel())) * 0.04f;
|
||||
value = value < 0.0f ? 0.0f : value;
|
||||
SetStatFloatValue(index, value);
|
||||
}
|
||||
@@ -540,9 +535,6 @@ void Player::UpdateParryPercentage()
|
||||
float nondiminishing = 5.0f;
|
||||
// Parry from rating
|
||||
float diminishing = GetRatingBonusValue(CR_PARRY);
|
||||
// Modify value from defense skill (only bonus from defense rating diminishes)
|
||||
nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
|
||||
diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
|
||||
// Parry from SPELL_AURA_MOD_PARRY_PERCENT aura
|
||||
nondiminishing += GetTotalAuraModifier(SPELL_AURA_MOD_PARRY_PERCENT);
|
||||
// apply diminishing formula to diminishing parry chance
|
||||
@@ -571,9 +563,6 @@ void Player::UpdateDodgePercentage()
|
||||
|
||||
float diminishing = 0.0f, nondiminishing = 0.0f;
|
||||
GetDodgeFromAgility(diminishing, nondiminishing);
|
||||
// Modify value from defense skill (only bonus from defense rating diminishes)
|
||||
nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
|
||||
diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
|
||||
// Dodge from SPELL_AURA_MOD_DODGE_PERCENT aura
|
||||
nondiminishing += GetTotalAuraModifier(SPELL_AURA_MOD_DODGE_PERCENT);
|
||||
// Dodge from rating
|
||||
|
||||
@@ -1311,8 +1311,8 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
|
||||
if (victim->getLevel() < 30)
|
||||
Probability = 0.65f * victim->getLevel() + 0.5f;
|
||||
|
||||
uint32 VictimDefense=victim->GetDefenseSkillValue();
|
||||
uint32 AttackerMeleeSkill=GetUnitMeleeSkill();
|
||||
uint32 VictimDefense = victim->GetMaxSkillValueForLevel(this);
|
||||
uint32 AttackerMeleeSkill = GetMaxSkillValueForLevel();
|
||||
|
||||
Probability *= AttackerMeleeSkill/(float)VictimDefense;
|
||||
|
||||
@@ -1860,11 +1860,8 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit* victim, WeaponAttackT
|
||||
int32 attackerMaxSkillValueForLevel = GetMaxSkillValueForLevel(victim);
|
||||
int32 victimMaxSkillValueForLevel = victim->GetMaxSkillValueForLevel(this);
|
||||
|
||||
int32 attackerWeaponSkill = GetWeaponSkillValue(attType, victim);
|
||||
int32 victimDefenseSkill = victim->GetDefenseSkillValue(this);
|
||||
|
||||
// bonus from skills is 0.04%
|
||||
int32 skillBonus = 4 * (attackerWeaponSkill - victimMaxSkillValueForLevel);
|
||||
int32 skillBonus = 4 * (attackerMaxSkillValueForLevel - victimMaxSkillValueForLevel);
|
||||
int32 sum = 0, tmp = 0;
|
||||
int32 roll = urand (0, 10000);
|
||||
|
||||
@@ -1973,11 +1970,9 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit* victim, WeaponAttackT
|
||||
getLevel() < victim->getLevelForTarget(this))
|
||||
{
|
||||
// cap possible value (with bonuses > max skill)
|
||||
int32 skill = attackerWeaponSkill;
|
||||
int32 maxskill = attackerMaxSkillValueForLevel;
|
||||
skill = (skill > maxskill) ? maxskill : skill;
|
||||
int32 skill = attackerMaxSkillValueForLevel;
|
||||
|
||||
tmp = (10 + (victimDefenseSkill - skill)) * 100;
|
||||
tmp = (10 + (victimMaxSkillValueForLevel - skill)) * 100;
|
||||
tmp = tmp > 4000 ? 4000 : tmp;
|
||||
if (roll < (sum += tmp))
|
||||
{
|
||||
@@ -1993,10 +1988,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit* victim, WeaponAttackT
|
||||
!(GetTypeId() == TYPEID_UNIT && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSH))
|
||||
{
|
||||
// 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
|
||||
tmp = tmp > tmpmax ? tmpmax : tmp;
|
||||
tmp = victimMaxSkillValueForLevel;
|
||||
// tmp = mob's level * 5 - player's current defense skill
|
||||
tmp = attackerMaxSkillValueForLevel - tmp;
|
||||
if (tmp >= 15)
|
||||
@@ -2441,21 +2433,6 @@ SpellMissInfo Unit::SpellHitResult(Unit* victim, SpellInfo const* spell, bool Ca
|
||||
return SPELL_MISS_NONE;
|
||||
}
|
||||
|
||||
uint32 Unit::GetDefenseSkillValue(Unit const* target) const
|
||||
{
|
||||
if (GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
// in PvP use full skill instead current skill value
|
||||
uint32 value = (target && target->GetTypeId() == TYPEID_PLAYER)
|
||||
? ToPlayer()->GetMaxSkillValue(SKILL_DEFENSE)
|
||||
: ToPlayer()->GetSkillValue(SKILL_DEFENSE);
|
||||
value += uint32(ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
|
||||
return value;
|
||||
}
|
||||
else
|
||||
return GetUnitMeleeSkill(target);
|
||||
}
|
||||
|
||||
float Unit::GetUnitDodgeChance() const
|
||||
{
|
||||
if (IsNonMeleeSpellCasted(false) || HasUnitState(UNIT_STATE_CONTROLLED))
|
||||
@@ -2597,54 +2574,11 @@ float Unit::GetUnitCriticalChance(WeaponAttackType attackType, const Unit* victi
|
||||
else
|
||||
ApplyResilience(victim, &crit, NULL, false, CR_CRIT_TAKEN_RANGED);
|
||||
|
||||
// Apply crit chance from defence skill
|
||||
crit += (int32(GetMaxSkillValueForLevel(victim)) - int32(victim->GetDefenseSkillValue(this))) * 0.04f;
|
||||
|
||||
if (crit < 0.0f)
|
||||
crit = 0.0f;
|
||||
return crit;
|
||||
}
|
||||
|
||||
uint32 Unit::GetWeaponSkillValue (WeaponAttackType attType, Unit const* target) const
|
||||
{
|
||||
uint32 value = 0;
|
||||
if (Player const* player = ToPlayer())
|
||||
{
|
||||
Item* item = player->GetWeaponForAttack(attType, true);
|
||||
|
||||
// feral or unarmed skill only for base attack
|
||||
if (attType != BASE_ATTACK && !item)
|
||||
return 0;
|
||||
|
||||
if (IsInFeralForm())
|
||||
return GetMaxSkillValueForLevel(); // always maximized SKILL_FERAL_COMBAT in fact
|
||||
|
||||
// weapon skill or (unarmed for base attack and fist weapons)
|
||||
uint32 skill;
|
||||
if (item && item->GetSkill() != SKILL_FIST_WEAPONS)
|
||||
skill = item->GetSkill();
|
||||
else
|
||||
skill = SKILL_UNARMED;
|
||||
|
||||
// in PvP use full skill instead current skill value
|
||||
value = (target && target->IsControlledByPlayer())
|
||||
? player->GetMaxSkillValue(skill)
|
||||
: player->GetSkillValue(skill);
|
||||
// Modify value from ratings
|
||||
value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL));
|
||||
switch (attType)
|
||||
{
|
||||
case BASE_ATTACK: value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_MAINHAND)); break;
|
||||
case OFF_ATTACK: value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_OFFHAND)); break;
|
||||
case RANGED_ATTACK: value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_RANGED)); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
else
|
||||
value = GetUnitMeleeSkill(target);
|
||||
return value;
|
||||
}
|
||||
|
||||
void Unit::_DeleteRemovedAuras()
|
||||
{
|
||||
while (!m_removedAuras.empty())
|
||||
@@ -13482,19 +13416,6 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
|
||||
// For melee/ranged based attack need update skills and set some Aura states if victim present
|
||||
if (procFlag & MELEE_BASED_TRIGGER_MASK && target)
|
||||
{
|
||||
// Update skills here for players
|
||||
if (GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
// On melee based hit/miss/resist need update skill (for victim and attacker)
|
||||
if (procExtra & (PROC_EX_NORMAL_HIT|PROC_EX_MISS|PROC_EX_RESIST))
|
||||
{
|
||||
if (target->GetTypeId() != TYPEID_PLAYER && target->GetCreatureType() != CREATURE_TYPE_CRITTER)
|
||||
ToPlayer()->UpdateCombatSkills(target, attType, isVictim);
|
||||
}
|
||||
// Update defence if player is victim and parry/dodge/block
|
||||
else if (isVictim && procExtra & (PROC_EX_DODGE|PROC_EX_PARRY|PROC_EX_BLOCK))
|
||||
ToPlayer()->UpdateCombatSkills(target, attType, true);
|
||||
}
|
||||
// If exist crit/parry/dodge/block need update aura state (for victim and attacker)
|
||||
if (procExtra & (PROC_EX_CRITICAL_HIT|PROC_EX_PARRY|PROC_EX_DODGE|PROC_EX_BLOCK))
|
||||
{
|
||||
|
||||
@@ -546,7 +546,7 @@ enum WeaponAttackType
|
||||
enum CombatRating
|
||||
{
|
||||
CR_WEAPON_SKILL = 0,
|
||||
CR_DEFENSE_SKILL = 1,
|
||||
CR_DEFENSE_SKILL = 1, // Removed in 4.0.1
|
||||
CR_DODGE = 2,
|
||||
CR_PARRY = 3,
|
||||
CR_BLOCK = 4,
|
||||
@@ -1493,8 +1493,6 @@ class Unit : public WorldObject
|
||||
virtual uint32 GetBlockPercent() { return 30; }
|
||||
|
||||
uint32 GetUnitMeleeSkill(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; }
|
||||
uint32 GetDefenseSkillValue(Unit const* target = NULL) const;
|
||||
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const* target = NULL) const;
|
||||
float GetWeaponProcChance() const;
|
||||
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, const SpellInfo* spellProto) const;
|
||||
|
||||
|
||||
@@ -7568,12 +7568,10 @@ SkillRangeType GetSkillRangeType(SkillLineEntry const* pSkill, bool racial)
|
||||
{
|
||||
switch (pSkill->categoryId)
|
||||
{
|
||||
case SKILL_CATEGORY_LANGUAGES: return SKILL_RANGE_LANGUAGE;
|
||||
case SKILL_CATEGORY_LANGUAGES:
|
||||
return SKILL_RANGE_LANGUAGE;
|
||||
case SKILL_CATEGORY_WEAPON:
|
||||
if (pSkill->id != SKILL_FIST_WEAPONS)
|
||||
return SKILL_RANGE_LEVEL;
|
||||
else
|
||||
return SKILL_RANGE_MONO;
|
||||
return SKILL_RANGE_LEVEL;
|
||||
case SKILL_CATEGORY_ARMOR:
|
||||
case SKILL_CATEGORY_CLASS:
|
||||
if (pSkill->id != SKILL_LOCKPICKING)
|
||||
|
||||
@@ -2711,9 +2711,10 @@ void AuraEffect::HandleAuraModSkill(AuraApplication const* aurApp, uint8 mode, b
|
||||
uint32 prot = GetMiscValue();
|
||||
int32 points = GetAmount();
|
||||
|
||||
target->ModifySkillBonus(prot, (apply ? points : -points), GetAuraType() == SPELL_AURA_MOD_SKILL_TALENT);
|
||||
if (prot == SKILL_DEFENSE)
|
||||
target->UpdateDefenseBonusesMod();
|
||||
return;
|
||||
|
||||
target->ModifySkillBonus(prot, (apply ? points : -points), GetAuraType() == SPELL_AURA_MOD_SKILL_TALENT);
|
||||
}
|
||||
|
||||
/****************************/
|
||||
|
||||
@@ -920,12 +920,8 @@ void World::LoadConfigSettings(bool reload)
|
||||
|
||||
m_int_configs[CONFIG_SKILL_GAIN_CRAFTING] = ConfigMgr::GetIntDefault("SkillGain.Crafting", 1);
|
||||
|
||||
m_int_configs[CONFIG_SKILL_GAIN_DEFENSE] = ConfigMgr::GetIntDefault("SkillGain.Defense", 1);
|
||||
|
||||
m_int_configs[CONFIG_SKILL_GAIN_GATHERING] = ConfigMgr::GetIntDefault("SkillGain.Gathering", 1);
|
||||
|
||||
m_int_configs[CONFIG_SKILL_GAIN_WEAPON] = ConfigMgr::GetIntDefault("SkillGain.Weapon", 1);
|
||||
|
||||
m_int_configs[CONFIG_MAX_OVERSPEED_PINGS] = ConfigMgr::GetIntDefault("MaxOverspeedPings", 2);
|
||||
if (m_int_configs[CONFIG_MAX_OVERSPEED_PINGS] != 0 && m_int_configs[CONFIG_MAX_OVERSPEED_PINGS] < 2)
|
||||
{
|
||||
@@ -938,7 +934,6 @@ void World::LoadConfigSettings(bool reload)
|
||||
|
||||
m_int_configs[CONFIG_DISABLE_BREATHING] = ConfigMgr::GetIntDefault("DisableWaterBreath", SEC_CONSOLE);
|
||||
|
||||
m_bool_configs[CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL] = ConfigMgr::GetBoolDefault("AlwaysMaxSkillForLevel", false);
|
||||
|
||||
if (reload)
|
||||
{
|
||||
|
||||
@@ -122,7 +122,6 @@ enum WorldBoolConfigs
|
||||
CONFIG_SKILL_MILLING,
|
||||
CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY,
|
||||
CONFIG_WEATHER,
|
||||
CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL,
|
||||
CONFIG_QUEST_IGNORE_RAID,
|
||||
CONFIG_DETECT_POS_COLLISION,
|
||||
CONFIG_RESTRICTED_LFG_CHANNEL,
|
||||
@@ -256,9 +255,7 @@ enum WorldIntConfigs
|
||||
CONFIG_SKILL_CHANCE_MINING_STEPS,
|
||||
CONFIG_SKILL_CHANCE_SKINNING_STEPS,
|
||||
CONFIG_SKILL_GAIN_CRAFTING,
|
||||
CONFIG_SKILL_GAIN_DEFENSE,
|
||||
CONFIG_SKILL_GAIN_GATHERING,
|
||||
CONFIG_SKILL_GAIN_WEAPON,
|
||||
CONFIG_MAX_OVERSPEED_PINGS,
|
||||
CONFIG_EXPANSION,
|
||||
CONFIG_CHATFLOOD_MESSAGE_COUNT,
|
||||
|
||||
@@ -50,7 +50,7 @@ enum PaladinSpells
|
||||
};
|
||||
|
||||
// 31850 - Ardent Defender
|
||||
class spell_pal_ardent_defender : public SpellScriptLoader
|
||||
/*class spell_pal_ardent_defender : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_pal_ardent_defender() : SpellScriptLoader("spell_pal_ardent_defender") { }
|
||||
@@ -73,7 +73,7 @@ class spell_pal_ardent_defender : public SpellScriptLoader
|
||||
return GetUnitOwner()->GetTypeId() == TYPEID_PLAYER;
|
||||
}
|
||||
|
||||
void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
|
||||
void CalculateAmount(AuraEffect const* aurEff, int32 & amount, bool & canBeRecalculated)
|
||||
{
|
||||
// Set absorbtion amount to unlimited
|
||||
amount = -1;
|
||||
@@ -123,7 +123,7 @@ class spell_pal_ardent_defender : public SpellScriptLoader
|
||||
{
|
||||
return new spell_pal_ardent_defender_AuraScript();
|
||||
}
|
||||
};
|
||||
};*/
|
||||
|
||||
class spell_pal_blessing_of_faith : public SpellScriptLoader
|
||||
{
|
||||
@@ -568,7 +568,7 @@ class spell_pal_exorcism_and_holy_wrath_damage : public SpellScriptLoader
|
||||
|
||||
void AddSC_paladin_spell_scripts()
|
||||
{
|
||||
new spell_pal_ardent_defender();
|
||||
//new spell_pal_ardent_defender();
|
||||
new spell_pal_blessing_of_faith();
|
||||
new spell_pal_blessing_of_sanctuary();
|
||||
new spell_pal_guarded_by_the_light();
|
||||
|
||||
@@ -862,15 +862,6 @@ AllFlightPaths = 0
|
||||
|
||||
InstantFlightPaths = 0
|
||||
|
||||
#
|
||||
# AlwaysMaxSkillForLevel
|
||||
# Description: Players will automatically gain max skill level when logging in or leveling
|
||||
# up.
|
||||
# Default: 0 - (Disabled)
|
||||
# 1 - (Enabled)
|
||||
|
||||
AlwaysMaxSkillForLevel = 0
|
||||
|
||||
#
|
||||
# ActivateWeather
|
||||
# Description: Activate the weather system.
|
||||
@@ -1952,19 +1943,13 @@ Rate.InstanceResetTime = 1
|
||||
|
||||
#
|
||||
# SkillGain.Crafting
|
||||
# SkillGain.Defense
|
||||
# SkillGain.Gathering
|
||||
# SkillGain.Weapon
|
||||
# Description: Crafting/defense/gathering/weapon skills gain rate.
|
||||
# Default: 1 - (SkillGain.Crafting)
|
||||
# 1 - (SkillGain.Defense)
|
||||
# 1 - (SkillGain.Gathering)
|
||||
# 1 - (SkillGain.Weapon)
|
||||
|
||||
SkillGain.Crafting = 1
|
||||
SkillGain.Defense = 1
|
||||
SkillGain.Gathering = 1
|
||||
SkillGain.Weapon = 1
|
||||
|
||||
#
|
||||
# SkillChance.Orange
|
||||
|
||||
Reference in New Issue
Block a user