mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 07:37:01 +00:00
[12198] - Remove weapon skillgains, defense skill, thanks @FailzorD for original patch.
- Update dodge, parry, block to cata. - Some mastery fixes and stylefixes. - Remove some no longer used functions. Signed-off-by: Yaki Khadafi <elsoldollo@gmail.com>
This commit is contained in:
parent
7637add86c
commit
8e84b0ff71
20 changed files with 170 additions and 410 deletions
|
|
@ -550,9 +550,9 @@ class MANGOS_DLL_SPEC Creature : public Unit
|
||||||
void SetRoot(bool enable) override;
|
void SetRoot(bool enable) override;
|
||||||
void SetWaterWalk(bool enable) override;
|
void SetWaterWalk(bool enable) override;
|
||||||
|
|
||||||
uint32 GetShieldBlockValue() const override // dunno mob block value
|
uint32 GetShieldBlockDamageValue() const override // dunno mob block value
|
||||||
{
|
{
|
||||||
return (getLevel() / 2 + uint32(GetStat(STAT_STRENGTH) / 20));
|
return uint32(BASE_BLOCK_DAMAGE_PERCENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
SpellSchoolMask GetMeleeDamageSchoolMask() const override { return m_meleeDamageSchoolMask; }
|
SpellSchoolMask GetMeleeDamageSchoolMask() const override { return m_meleeDamageSchoolMask; }
|
||||||
|
|
|
||||||
|
|
@ -740,46 +740,6 @@ uint32 Item::GetSkill()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Item::GetSpell()
|
|
||||||
{
|
|
||||||
ItemPrototype const* proto = GetProto();
|
|
||||||
|
|
||||||
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)
|
int32 Item::GenerateItemRandomPropertyId(uint32 item_id)
|
||||||
{
|
{
|
||||||
ItemPrototype const* itemProto = sItemStorage.LookupEntry<ItemPrototype>(item_id);
|
ItemPrototype const* itemProto = sItemStorage.LookupEntry<ItemPrototype>(item_id);
|
||||||
|
|
|
||||||
|
|
@ -329,7 +329,6 @@ class MANGOS_DLL_SPEC Item : public Object
|
||||||
bool IsEquipped() const;
|
bool IsEquipped() const;
|
||||||
|
|
||||||
uint32 GetSkill();
|
uint32 GetSkill();
|
||||||
uint32 GetSpell();
|
|
||||||
|
|
||||||
// RandomPropertyId (signed but stored as unsigned)
|
// RandomPropertyId (signed but stored as unsigned)
|
||||||
int32 GetItemRandomPropertyId() const { return GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID); }
|
int32 GetItemRandomPropertyId() const { return GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID); }
|
||||||
|
|
|
||||||
|
|
@ -8338,12 +8338,10 @@ SkillRangeType GetSkillRangeType(SkillLineEntry const* pSkill, bool racial)
|
||||||
{
|
{
|
||||||
switch (pSkill->categoryId)
|
switch (pSkill->categoryId)
|
||||||
{
|
{
|
||||||
case SKILL_CATEGORY_LANGUAGES: return SKILL_RANGE_LANGUAGE;
|
case SKILL_CATEGORY_LANGUAGES:
|
||||||
|
return SKILL_RANGE_LANGUAGE;
|
||||||
case SKILL_CATEGORY_WEAPON:
|
case SKILL_CATEGORY_WEAPON:
|
||||||
if (pSkill->id != SKILL_FIST_WEAPONS)
|
|
||||||
return SKILL_RANGE_LEVEL;
|
return SKILL_RANGE_LEVEL;
|
||||||
else
|
|
||||||
return SKILL_RANGE_MONO;
|
|
||||||
case SKILL_CATEGORY_ARMOR:
|
case SKILL_CATEGORY_ARMOR:
|
||||||
case SKILL_CATEGORY_CLASS:
|
case SKILL_CATEGORY_CLASS:
|
||||||
return SKILL_RANGE_MONO;
|
return SKILL_RANGE_MONO;
|
||||||
|
|
|
||||||
|
|
@ -2754,7 +2754,7 @@ void Player::InitStatsForLevel(bool reapplyMods)
|
||||||
|
|
||||||
SetFloatValue(PLAYER_PARRY_PERCENTAGE, 0.0f);
|
SetFloatValue(PLAYER_PARRY_PERCENTAGE, 0.0f);
|
||||||
SetFloatValue(PLAYER_BLOCK_PERCENTAGE, 0.0f);
|
SetFloatValue(PLAYER_BLOCK_PERCENTAGE, 0.0f);
|
||||||
SetUInt32Value(PLAYER_SHIELD_BLOCK, 0);
|
SetUInt32Value(PLAYER_SHIELD_BLOCK, uint32(BASE_BLOCK_DAMAGE_PERCENT));
|
||||||
|
|
||||||
// Dodge percentage
|
// Dodge percentage
|
||||||
SetFloatValue(PLAYER_DODGE_PERCENTAGE, 0.0f);
|
SetFloatValue(PLAYER_DODGE_PERCENTAGE, 0.0f);
|
||||||
|
|
@ -5037,17 +5037,6 @@ void Player::LeaveLFGChannel()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::UpdateDefense()
|
|
||||||
{
|
|
||||||
uint32 defense_skill_gain = sWorld.getConfig(CONFIG_UINT32_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)
|
void Player::HandleBaseModValue(BaseModGroup modGroup, BaseModType modType, float amount, bool apply)
|
||||||
{
|
{
|
||||||
if (modGroup >= BASEMOD_END || modType >= MOD_END)
|
if (modGroup >= BASEMOD_END || modType >= MOD_END)
|
||||||
|
|
@ -5080,7 +5069,7 @@ void Player::HandleBaseModValue(BaseModGroup modGroup, BaseModType modType, floa
|
||||||
case CRIT_PERCENTAGE: UpdateCritPercentage(BASE_ATTACK); break;
|
case CRIT_PERCENTAGE: UpdateCritPercentage(BASE_ATTACK); break;
|
||||||
case RANGED_CRIT_PERCENTAGE: UpdateCritPercentage(RANGED_ATTACK); break;
|
case RANGED_CRIT_PERCENTAGE: UpdateCritPercentage(RANGED_ATTACK); break;
|
||||||
case OFFHAND_CRIT_PERCENTAGE: UpdateCritPercentage(OFF_ATTACK); break;
|
case OFFHAND_CRIT_PERCENTAGE: UpdateCritPercentage(OFF_ATTACK); break;
|
||||||
case SHIELD_BLOCK_VALUE: UpdateShieldBlockValue(); break;
|
case SHIELD_BLOCK_DAMAGE_VALUE: UpdateShieldBlockDamageValue(); break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -5113,9 +5102,10 @@ float Player::GetTotalBaseModValue(BaseModGroup modGroup) const
|
||||||
return m_auraBaseMod[modGroup][FLAT_MOD] * m_auraBaseMod[modGroup][PCT_MOD];
|
return m_auraBaseMod[modGroup][FLAT_MOD] * m_auraBaseMod[modGroup][PCT_MOD];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Player::GetShieldBlockValue() const
|
uint32 Player::GetShieldBlockDamageValue() const
|
||||||
{
|
{
|
||||||
float value = (m_auraBaseMod[SHIELD_BLOCK_VALUE][FLAT_MOD] + GetStat(STAT_STRENGTH) * 0.5f - 10) * m_auraBaseMod[SHIELD_BLOCK_VALUE][PCT_MOD];
|
float value = m_canBlock ? BASE_BLOCK_DAMAGE_PERCENT : 0;
|
||||||
|
value = (value + m_auraBaseMod[SHIELD_BLOCK_DAMAGE_VALUE][FLAT_MOD]) * m_auraBaseMod[SHIELD_BLOCK_DAMAGE_VALUE][PCT_MOD];
|
||||||
|
|
||||||
value = (value < 0) ? 0 : value;
|
value = (value < 0) ? 0 : value;
|
||||||
|
|
||||||
|
|
@ -5140,6 +5130,14 @@ float Player::GetMeleeCritFromAgility()
|
||||||
|
|
||||||
void Player::GetDodgeFromAgility(float& diminishing, float& nondiminishing)
|
void Player::GetDodgeFromAgility(float& diminishing, float& nondiminishing)
|
||||||
{
|
{
|
||||||
|
// 4.2.0: these classes no longer receive dodge from agility and have 5% base
|
||||||
|
if (getClass() == CLASS_WARRIOR || getClass() == CLASS_PALADIN || getClass() == CLASS_DEATH_KNIGHT)
|
||||||
|
{
|
||||||
|
diminishing = 0.0f;
|
||||||
|
nondiminishing = 5.0f;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Table for base dodge values
|
// Table for base dodge values
|
||||||
const float dodge_base[MAX_CLASSES] =
|
const float dodge_base[MAX_CLASSES] =
|
||||||
{
|
{
|
||||||
|
|
@ -5328,9 +5326,8 @@ void Player::UpdateRating(CombatRating cr)
|
||||||
|
|
||||||
switch (cr)
|
switch (cr)
|
||||||
{
|
{
|
||||||
case CR_WEAPON_SKILL: // Implemented in Unit::RollMeleeOutcomeAgainst
|
case CR_WEAPON_SKILL:
|
||||||
case CR_DEFENSE_SKILL:
|
case CR_DEFENSE_SKILL:
|
||||||
UpdateDefenseBonusesMod();
|
|
||||||
break;
|
break;
|
||||||
case CR_DODGE:
|
case CR_DODGE:
|
||||||
UpdateDodgePercentage();
|
UpdateDodgePercentage();
|
||||||
|
|
@ -5599,69 +5596,6 @@ bool Player::UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::UpdateWeaponSkill(WeaponAttackType attType)
|
|
||||||
{
|
|
||||||
// no skill gain in pvp
|
|
||||||
Unit* pVictim = getVictim();
|
|
||||||
if (pVictim && pVictim->IsCharmerOrOwnerPlayerOrPlayerItself())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (IsInFeralForm())
|
|
||||||
return; // always maximized SKILL_FERAL_COMBAT in fact
|
|
||||||
|
|
||||||
if (GetShapeshiftForm() == FORM_TREE)
|
|
||||||
return; // use weapon but not skill up
|
|
||||||
|
|
||||||
uint32 weaponSkillGain = sWorld.getConfig(CONFIG_UINT32_SKILL_GAIN_WEAPON);
|
|
||||||
|
|
||||||
Item* pWeapon = GetWeaponForAttack(attType, true, true);
|
|
||||||
if (pWeapon && pWeapon->GetProto()->SubClass != ITEM_SUBCLASS_WEAPON_FISHING_POLE)
|
|
||||||
UpdateSkill(pWeapon->GetSkill(), weaponSkillGain);
|
|
||||||
else if (!pWeapon && attType == BASE_ATTACK)
|
|
||||||
UpdateSkill(SKILL_UNARMED, weaponSkillGain);
|
|
||||||
|
|
||||||
UpdateAllCritPercentages();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Player::UpdateCombatSkills(Unit* pVictim, WeaponAttackType attType, bool defence)
|
|
||||||
{
|
|
||||||
uint32 plevel = getLevel(); // if defense than pVictim == attacker
|
|
||||||
uint32 greylevel = MaNGOS::XP::GetGrayLevel(plevel);
|
|
||||||
uint32 moblevel = pVictim->GetLevelForTarget(this);
|
|
||||||
if (moblevel < greylevel)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (moblevel > plevel + 5)
|
|
||||||
moblevel = plevel + 5;
|
|
||||||
|
|
||||||
uint32 lvldif = moblevel - greylevel;
|
|
||||||
if (lvldif < 3)
|
|
||||||
lvldif = 3;
|
|
||||||
|
|
||||||
int32 skilldif = 5 * plevel - (defence ? GetBaseDefenseSkillValue() : GetBaseWeaponSkillValue(attType));
|
|
||||||
|
|
||||||
// Max skill reached for level.
|
|
||||||
// Can in some cases be less than 0: having max skill and then .level -1 as example.
|
|
||||||
if (skilldif <= 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
float chance = float(3 * lvldif * skilldif) / plevel;
|
|
||||||
if (!defence)
|
|
||||||
chance *= 0.1f * 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)
|
void Player::ModifySkillBonus(uint32 skillid, int32 val, bool talent)
|
||||||
{
|
{
|
||||||
SkillStatusMap::const_iterator itr = mSkillStatus.find(skillid);
|
SkillStatusMap::const_iterator itr = mSkillStatus.find(skillid);
|
||||||
|
|
@ -5678,11 +5612,8 @@ void Player::ModifySkillBonus(uint32 skillid, int32 val, bool talent)
|
||||||
|
|
||||||
void Player::UpdateSkillsForLevel()
|
void Player::UpdateSkillsForLevel()
|
||||||
{
|
{
|
||||||
uint16 maxconfskill = sWorld.GetConfigMaxSkillValue();
|
|
||||||
uint32 maxSkill = GetMaxSkillValueForLevel();
|
uint32 maxSkill = GetMaxSkillValueForLevel();
|
||||||
|
|
||||||
bool alwaysMaxSkill = sWorld.getConfig(CONFIG_BOOL_ALWAYS_MAX_SKILL_FOR_LEVEL);
|
|
||||||
|
|
||||||
for (SkillStatusMap::iterator itr = mSkillStatus.begin(); itr != mSkillStatus.end(); ++itr)
|
for (SkillStatusMap::iterator itr = mSkillStatus.begin(); itr != mSkillStatus.end(); ++itr)
|
||||||
{
|
{
|
||||||
if (itr->second.uState == SKILL_DELETED)
|
if (itr->second.uState == SKILL_DELETED)
|
||||||
|
|
@ -5705,9 +5636,6 @@ void Player::UpdateSkillsForLevel()
|
||||||
|
|
||||||
/// update only level dependent max skill values
|
/// update only level dependent max skill values
|
||||||
if (max != 1)
|
if (max != 1)
|
||||||
{
|
|
||||||
/// maximize skill always
|
|
||||||
if (alwaysMaxSkill)
|
|
||||||
{
|
{
|
||||||
SetUInt16Value(PLAYER_SKILL_RANK_0 + field, offset, maxSkill);
|
SetUInt16Value(PLAYER_SKILL_RANK_0 + field, offset, maxSkill);
|
||||||
SetUInt16Value(PLAYER_SKILL_MAX_RANK_0 + field, offset, maxSkill);
|
SetUInt16Value(PLAYER_SKILL_MAX_RANK_0 + field, offset, maxSkill);
|
||||||
|
|
@ -5715,14 +5643,6 @@ void Player::UpdateSkillsForLevel()
|
||||||
itr->second.uState = SKILL_CHANGED;
|
itr->second.uState = SKILL_CHANGED;
|
||||||
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, pskill);
|
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, pskill);
|
||||||
}
|
}
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5748,9 +5668,6 @@ void Player::UpdateSkillsToMaxSkillsForLevel()
|
||||||
itr->second.uState = SKILL_CHANGED;
|
itr->second.uState = SKILL_CHANGED;
|
||||||
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, pskill);
|
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, pskill);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pskill == SKILL_DEFENSE)
|
|
||||||
UpdateDefenseBonusesMod();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -15627,6 +15544,22 @@ bool Player::LoadFromDB(ObjectGuid guid, SqlQueryHolder* holder)
|
||||||
SetGuidValue(PLAYER_DUEL_ARBITER, ObjectGuid());
|
SetGuidValue(PLAYER_DUEL_ARBITER, ObjectGuid());
|
||||||
SetUInt32Value(PLAYER_DUEL_TEAM, 0);
|
SetUInt32Value(PLAYER_DUEL_TEAM, 0);
|
||||||
|
|
||||||
|
m_specsCount = fields[52].GetUInt8();
|
||||||
|
m_activeSpec = fields[53].GetUInt8();
|
||||||
|
|
||||||
|
Tokens talentTrees = StrSplit(fields[26].GetString(), " ");
|
||||||
|
for (uint8 i = 0; i < MAX_TALENT_SPEC_COUNT; ++i)
|
||||||
|
{
|
||||||
|
if (i >= talentTrees.size())
|
||||||
|
break;
|
||||||
|
|
||||||
|
uint32 talentTree = atol(talentTrees[i].c_str());
|
||||||
|
if (!talentTree || sTalentTabStore.LookupEntry(talentTree))
|
||||||
|
m_talentsPrimaryTree[i] = talentTree;
|
||||||
|
else if (i == m_activeSpec)
|
||||||
|
SetAtLoginFlag(AT_LOGIN_RESET_TALENTS); // invalid tree, reset talents
|
||||||
|
}
|
||||||
|
|
||||||
// reset stats before loading any modifiers
|
// reset stats before loading any modifiers
|
||||||
InitStatsForLevel();
|
InitStatsForLevel();
|
||||||
InitGlyphsForLevel();
|
InitGlyphsForLevel();
|
||||||
|
|
@ -15659,9 +15592,6 @@ bool Player::LoadFromDB(ObjectGuid guid, SqlQueryHolder* holder)
|
||||||
_LoadMailedItems(holder->GetResult(PLAYER_LOGIN_QUERY_LOADMAILEDITEMS));
|
_LoadMailedItems(holder->GetResult(PLAYER_LOGIN_QUERY_LOADMAILEDITEMS));
|
||||||
UpdateNextMailTimeAndUnreads();
|
UpdateNextMailTimeAndUnreads();
|
||||||
|
|
||||||
m_specsCount = fields[52].GetUInt8();
|
|
||||||
m_activeSpec = fields[53].GetUInt8();
|
|
||||||
|
|
||||||
_LoadGlyphs(holder->GetResult(PLAYER_LOGIN_QUERY_LOADGLYPHS));
|
_LoadGlyphs(holder->GetResult(PLAYER_LOGIN_QUERY_LOADGLYPHS));
|
||||||
|
|
||||||
_LoadAuras(holder->GetResult(PLAYER_LOGIN_QUERY_LOADAURAS), time_diff);
|
_LoadAuras(holder->GetResult(PLAYER_LOGIN_QUERY_LOADAURAS), time_diff);
|
||||||
|
|
@ -15782,20 +15712,6 @@ bool Player::LoadFromDB(ObjectGuid guid, SqlQueryHolder* holder)
|
||||||
DEBUG_FILTER_LOG(LOG_FILTER_PLAYER_STATS, "The value of player %s after load item and aura is: ", m_name.c_str());
|
DEBUG_FILTER_LOG(LOG_FILTER_PLAYER_STATS, "The value of player %s after load item and aura is: ", m_name.c_str());
|
||||||
outDebugStatsValues();
|
outDebugStatsValues();
|
||||||
|
|
||||||
// must be after loading spells and talents
|
|
||||||
Tokens talentTrees = StrSplit(fields[26].GetString(), " ");
|
|
||||||
for (uint8 i = 0; i < MAX_TALENT_SPEC_COUNT; ++i)
|
|
||||||
{
|
|
||||||
if (i >= talentTrees.size())
|
|
||||||
break;
|
|
||||||
|
|
||||||
uint32 talentTree = atol(talentTrees[i].c_str());
|
|
||||||
if (!talentTree || sTalentTabStore.LookupEntry(talentTree))
|
|
||||||
m_talentsPrimaryTree[i] = talentTree;
|
|
||||||
else if (i == m_activeSpec)
|
|
||||||
SetAtLoginFlag(AT_LOGIN_RESET_TALENTS); // invalid tree, reset talents
|
|
||||||
}
|
|
||||||
|
|
||||||
// all fields read
|
// all fields read
|
||||||
delete result;
|
delete result;
|
||||||
|
|
||||||
|
|
@ -21069,19 +20985,6 @@ bool Player::IsAtGroupRewardDistance(WorldObject const* pRewardSource) const
|
||||||
return pRewardSource->IsWithinDistInMap(corpse, sWorld.getConfig(CONFIG_FLOAT_GROUP_XP_DISTANCE));
|
return pRewardSource->IsWithinDistInMap(corpse, sWorld.getConfig(CONFIG_FLOAT_GROUP_XP_DISTANCE));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Player::GetBaseWeaponSkillValue(WeaponAttackType attType) const
|
|
||||||
{
|
|
||||||
Item* item = GetWeaponForAttack(attType, true, true);
|
|
||||||
|
|
||||||
// unarmed only with base attack
|
|
||||||
if (attType != BASE_ATTACK && !item)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// weapon skill or (unarmed for base attack)
|
|
||||||
uint32 skill = item ? item->GetSkill() : uint32(SKILL_UNARMED);
|
|
||||||
return GetBaseSkillValue(skill);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Player::ResurectUsingRequestData()
|
void Player::ResurectUsingRequestData()
|
||||||
{
|
{
|
||||||
/// Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse
|
/// Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse
|
||||||
|
|
@ -21394,6 +21297,7 @@ void Player::SetCanBlock(bool value)
|
||||||
|
|
||||||
m_canBlock = value;
|
m_canBlock = value;
|
||||||
UpdateBlockPercentage();
|
UpdateBlockPercentage();
|
||||||
|
UpdateShieldBlockDamageValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ItemPosCount::isContainedIn(ItemPosCountVec const& vec) const
|
bool ItemPosCount::isContainedIn(ItemPosCountVec const& vec) const
|
||||||
|
|
|
||||||
|
|
@ -1797,11 +1797,6 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
bool UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator = 1);
|
bool UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator = 1);
|
||||||
bool UpdateFishingSkill();
|
bool UpdateFishingSkill();
|
||||||
|
|
||||||
uint32 GetBaseDefenseSkillValue() const { return GetBaseSkillValue(SKILL_DEFENSE); }
|
|
||||||
uint32 GetBaseWeaponSkillValue(WeaponAttackType attType) const;
|
|
||||||
|
|
||||||
uint32 GetSpellByProto(ItemPrototype* proto);
|
|
||||||
|
|
||||||
float GetHealthBonusFromStamina();
|
float GetHealthBonusFromStamina();
|
||||||
float GetManaBonusFromIntellect();
|
float GetManaBonusFromIntellect();
|
||||||
|
|
||||||
|
|
@ -1813,7 +1808,7 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
void UpdateMaxPower(Powers power) override;
|
void UpdateMaxPower(Powers power) override;
|
||||||
void ApplyFeralAPBonus(int32 amount, bool apply);
|
void ApplyFeralAPBonus(int32 amount, bool apply);
|
||||||
void UpdateAttackPowerAndDamage(bool ranged = false) override;
|
void UpdateAttackPowerAndDamage(bool ranged = false) override;
|
||||||
void UpdateShieldBlockValue();
|
void UpdateShieldBlockDamageValue();
|
||||||
void UpdateDamagePhysical(WeaponAttackType attType) override;
|
void UpdateDamagePhysical(WeaponAttackType attType) override;
|
||||||
void ApplySpellPowerBonus(int32 amount, bool apply);
|
void ApplySpellPowerBonus(int32 amount, bool apply);
|
||||||
void UpdateSpellDamageAndHealingBonus();
|
void UpdateSpellDamageAndHealingBonus();
|
||||||
|
|
@ -1823,7 +1818,6 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
|
|
||||||
void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, float& min_damage, float& max_damage);
|
void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, float& min_damage, float& max_damage);
|
||||||
|
|
||||||
void UpdateDefenseBonusesMod();
|
|
||||||
float GetMeleeCritFromAgility();
|
float GetMeleeCritFromAgility();
|
||||||
void GetDodgeFromAgility(float& diminishing, float& nondiminishing);
|
void GetDodgeFromAgility(float& diminishing, float& nondiminishing);
|
||||||
float GetSpellCritFromIntellect();
|
float GetSpellCritFromIntellect();
|
||||||
|
|
@ -1925,10 +1919,6 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
void UpdateLocalChannels(uint32 newZone);
|
void UpdateLocalChannels(uint32 newZone);
|
||||||
void LeaveLFGChannel();
|
void LeaveLFGChannel();
|
||||||
|
|
||||||
void UpdateDefense();
|
|
||||||
void UpdateWeaponSkill(WeaponAttackType attType);
|
|
||||||
void UpdateCombatSkills(Unit* pVictim, WeaponAttackType attType, bool defence);
|
|
||||||
|
|
||||||
void SetSkill(uint16 id, uint16 currVal, uint16 maxVal, uint16 step = 0);
|
void SetSkill(uint16 id, uint16 currVal, uint16 maxVal, uint16 step = 0);
|
||||||
uint16 GetMaxSkillValue(uint32 skill) const; // max + perm. bonus + temp bonus
|
uint16 GetMaxSkillValue(uint32 skill) const; // max + perm. bonus + temp bonus
|
||||||
uint16 GetPureMaxSkillValue(uint32 skill) const; // max
|
uint16 GetPureMaxSkillValue(uint32 skill) const; // max
|
||||||
|
|
@ -2012,7 +2002,7 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
void UpdateCorpseReclaimDelay();
|
void UpdateCorpseReclaimDelay();
|
||||||
void SendCorpseReclaimDelay(bool load = false);
|
void SendCorpseReclaimDelay(bool load = false);
|
||||||
|
|
||||||
uint32 GetShieldBlockValue() const override; // overwrite Unit version (virtual)
|
uint32 GetShieldBlockDamageValue() const override; // overwrite Unit version (virtual)
|
||||||
bool CanParry() const { return m_canParry; }
|
bool CanParry() const { return m_canParry; }
|
||||||
void SetCanParry(bool value);
|
void SetCanParry(bool value);
|
||||||
bool CanBlock() const { return m_canBlock; }
|
bool CanBlock() const { return m_canBlock; }
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ enum AuraType
|
||||||
SPELL_AURA_48 = 48, // One periodic spell
|
SPELL_AURA_48 = 48, // One periodic spell
|
||||||
SPELL_AURA_MOD_DODGE_PERCENT = 49,
|
SPELL_AURA_MOD_DODGE_PERCENT = 49,
|
||||||
SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT = 50,
|
SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT = 50,
|
||||||
SPELL_AURA_MOD_BLOCK_PERCENT = 51,
|
SPELL_AURA_MOD_BLOCK_CHANCE_PERCENT = 51,
|
||||||
SPELL_AURA_MOD_CRIT_PERCENT = 52,
|
SPELL_AURA_MOD_CRIT_PERCENT = 52,
|
||||||
SPELL_AURA_PERIODIC_LEECH = 53,
|
SPELL_AURA_PERIODIC_LEECH = 53,
|
||||||
SPELL_AURA_MOD_HIT_CHANCE = 54,
|
SPELL_AURA_MOD_HIT_CHANCE = 54,
|
||||||
|
|
@ -185,7 +185,7 @@ enum AuraType
|
||||||
SPELL_AURA_MECHANIC_IMMUNITY_MASK = 147,
|
SPELL_AURA_MECHANIC_IMMUNITY_MASK = 147,
|
||||||
SPELL_AURA_RETAIN_COMBO_POINTS = 148,
|
SPELL_AURA_RETAIN_COMBO_POINTS = 148,
|
||||||
SPELL_AURA_REDUCE_PUSHBACK = 149, // Reduce Pushback
|
SPELL_AURA_REDUCE_PUSHBACK = 149, // Reduce Pushback
|
||||||
SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT = 150,
|
SPELL_AURA_MOD_SHIELD_BLOCKDAMAGE = 150,
|
||||||
SPELL_AURA_TRACK_STEALTHED = 151, // Track Stealthed
|
SPELL_AURA_TRACK_STEALTHED = 151, // Track Stealthed
|
||||||
SPELL_AURA_MOD_DETECTED_RANGE = 152, // Mod Detected Range
|
SPELL_AURA_MOD_DETECTED_RANGE = 152, // Mod Detected Range
|
||||||
SPELL_AURA_SPLIT_DAMAGE_FLAT = 153, // Split Damage Flat
|
SPELL_AURA_SPLIT_DAMAGE_FLAT = 153, // Split Damage Flat
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS] =
|
||||||
&Aura::HandleNULL, // 48 SPELL_AURA_48 4 spells in 4.3.4 Napalm (area damage spell with additional delayed damage effect)
|
&Aura::HandleNULL, // 48 SPELL_AURA_48 4 spells in 4.3.4 Napalm (area damage spell with additional delayed damage effect)
|
||||||
&Aura::HandleAuraModDodgePercent, // 49 SPELL_AURA_MOD_DODGE_PERCENT
|
&Aura::HandleAuraModDodgePercent, // 49 SPELL_AURA_MOD_DODGE_PERCENT
|
||||||
&Aura::HandleNoImmediateEffect, // 50 SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT implemented in Unit::SpellCriticalHealingBonus
|
&Aura::HandleNoImmediateEffect, // 50 SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT implemented in Unit::SpellCriticalHealingBonus
|
||||||
&Aura::HandleAuraModBlockPercent, // 51 SPELL_AURA_MOD_BLOCK_PERCENT
|
&Aura::HandleAuraModBlockChancePercent, // 51 SPELL_AURA_MOD_BLOCK_CHANCE_PERCENT
|
||||||
&Aura::HandleAuraModCritPercent, // 52 SPELL_AURA_MOD_CRIT_PERCENT
|
&Aura::HandleAuraModCritPercent, // 52 SPELL_AURA_MOD_CRIT_PERCENT
|
||||||
&Aura::HandlePeriodicLeech, // 53 SPELL_AURA_PERIODIC_LEECH
|
&Aura::HandlePeriodicLeech, // 53 SPELL_AURA_PERIODIC_LEECH
|
||||||
&Aura::HandleModHitChance, // 54 SPELL_AURA_MOD_HIT_CHANCE
|
&Aura::HandleModHitChance, // 54 SPELL_AURA_MOD_HIT_CHANCE
|
||||||
|
|
@ -203,7 +203,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS] =
|
||||||
&Aura::HandleModMechanicImmunityMask, //147 SPELL_AURA_MECHANIC_IMMUNITY_MASK implemented in Unit::IsImmuneToSpell and Unit::IsImmuneToSpellEffect (check part)
|
&Aura::HandleModMechanicImmunityMask, //147 SPELL_AURA_MECHANIC_IMMUNITY_MASK implemented in Unit::IsImmuneToSpell and Unit::IsImmuneToSpellEffect (check part)
|
||||||
&Aura::HandleAuraRetainComboPoints, //148 SPELL_AURA_RETAIN_COMBO_POINTS
|
&Aura::HandleAuraRetainComboPoints, //148 SPELL_AURA_RETAIN_COMBO_POINTS
|
||||||
&Aura::HandleNoImmediateEffect, //149 SPELL_AURA_REDUCE_PUSHBACK implemented in Spell::Delayed and Spell::DelayedChannel
|
&Aura::HandleNoImmediateEffect, //149 SPELL_AURA_REDUCE_PUSHBACK implemented in Spell::Delayed and Spell::DelayedChannel
|
||||||
&Aura::HandleShieldBlockValue, //150 SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT
|
&Aura::HandleModShieldBlockDamage, //150 SPELL_AURA_MOD_SHIELD_BLOCKDAMAGE
|
||||||
&Aura::HandleAuraTrackStealthed, //151 SPELL_AURA_TRACK_STEALTHED
|
&Aura::HandleAuraTrackStealthed, //151 SPELL_AURA_TRACK_STEALTHED
|
||||||
&Aura::HandleNoImmediateEffect, //152 SPELL_AURA_MOD_DETECTED_RANGE implemented in Creature::GetAttackDistance
|
&Aura::HandleNoImmediateEffect, //152 SPELL_AURA_MOD_DETECTED_RANGE implemented in Creature::GetAttackDistance
|
||||||
&Aura::HandleNoImmediateEffect, //153 SPELL_AURA_SPLIT_DAMAGE_FLAT implemented in Unit::CalculateAbsorbAndResist
|
&Aura::HandleNoImmediateEffect, //153 SPELL_AURA_SPLIT_DAMAGE_FLAT implemented in Unit::CalculateAbsorbAndResist
|
||||||
|
|
@ -211,7 +211,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS] =
|
||||||
&Aura::HandleNoImmediateEffect, //155 SPELL_AURA_MOD_WATER_BREATHING implemented in Player::getMaxTimer
|
&Aura::HandleNoImmediateEffect, //155 SPELL_AURA_MOD_WATER_BREATHING implemented in Player::getMaxTimer
|
||||||
&Aura::HandleNoImmediateEffect, //156 SPELL_AURA_MOD_REPUTATION_GAIN implemented in Player::CalculateReputationGain
|
&Aura::HandleNoImmediateEffect, //156 SPELL_AURA_MOD_REPUTATION_GAIN implemented in Player::CalculateReputationGain
|
||||||
&Aura::HandleUnused, //157 SPELL_AURA_PET_DAMAGE_MULTI (single test like spell 20782, also single for 214 aura)
|
&Aura::HandleUnused, //157 SPELL_AURA_PET_DAMAGE_MULTI (single test like spell 20782, also single for 214 aura)
|
||||||
&Aura::HandleShieldBlockValue, //158 SPELL_AURA_MOD_SHIELD_BLOCKVALUE
|
&Aura::HandleNULL, //158 SPELL_AURA_MOD_SHIELD_BLOCKVALUE
|
||||||
&Aura::HandleNoImmediateEffect, //159 SPELL_AURA_NO_PVP_CREDIT implemented in Player::RewardHonor
|
&Aura::HandleNoImmediateEffect, //159 SPELL_AURA_NO_PVP_CREDIT implemented in Player::RewardHonor
|
||||||
&Aura::HandleNoImmediateEffect, //160 SPELL_AURA_MOD_AOE_AVOIDANCE implemented in Unit::MagicSpellHitResult
|
&Aura::HandleNoImmediateEffect, //160 SPELL_AURA_MOD_AOE_AVOIDANCE implemented in Unit::MagicSpellHitResult
|
||||||
&Aura::HandleNoImmediateEffect, //161 SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT implemented in Player::RegenerateAll and Player::RegenerateHealth
|
&Aura::HandleNoImmediateEffect, //161 SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT implemented in Player::RegenerateAll and Player::RegenerateHealth
|
||||||
|
|
@ -306,7 +306,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS] =
|
||||||
&Aura::HandleAuraModIncreaseHealth, //250 SPELL_AURA_MOD_INCREASE_HEALTH_2
|
&Aura::HandleAuraModIncreaseHealth, //250 SPELL_AURA_MOD_INCREASE_HEALTH_2
|
||||||
&Aura::HandleNULL, //251 SPELL_AURA_MOD_ENEMY_DODGE
|
&Aura::HandleNULL, //251 SPELL_AURA_MOD_ENEMY_DODGE
|
||||||
&Aura::HandleModCombatSpeedPct, //252 SPELL_AURA_SLOW_ALL
|
&Aura::HandleModCombatSpeedPct, //252 SPELL_AURA_SLOW_ALL
|
||||||
&Aura::HandleNoImmediateEffect, //253 SPELL_AURA_MOD_BLOCK_CRIT_CHANCE implemented in Unit::CalculateMeleeDamage
|
&Aura::HandleAuraModBlockCritChance, //253 SPELL_AURA_MOD_BLOCK_CRIT_CHANCE obsolete in 4.x, but spells exist
|
||||||
&Aura::HandleAuraModDisarm, //254 SPELL_AURA_MOD_DISARM_OFFHAND also 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::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::HandleNoReagentUseAura, //256 SPELL_AURA_NO_REAGENT_USE Use SpellClassMask for spell select
|
||||||
|
|
@ -3975,9 +3975,12 @@ void Aura::HandleAuraModSkill(bool apply, bool /*Real*/)
|
||||||
uint32 prot = m_spellEffect->EffectMiscValue;
|
uint32 prot = m_spellEffect->EffectMiscValue;
|
||||||
int32 points = GetModifier()->m_amount;
|
int32 points = GetModifier()->m_amount;
|
||||||
|
|
||||||
((Player*)GetTarget())->ModifySkillBonus(prot, (apply ? points : -points), m_modifier.m_auraname == SPELL_AURA_MOD_SKILL_TALENT);
|
// defense skill is removed in 4.x.x, spell tooltips updated,
|
||||||
|
// but auras still exist
|
||||||
if (prot == SKILL_DEFENSE)
|
if (prot == SKILL_DEFENSE)
|
||||||
((Player*)GetTarget())->UpdateDefenseBonusesMod();
|
return;
|
||||||
|
|
||||||
|
((Player*)GetTarget())->ModifySkillBonus(prot, (apply ? points : -points), m_modifier.m_auraname == SPELL_AURA_MOD_SKILL_TALENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Aura::HandleChannelDeathItem(bool apply, bool Real)
|
void Aura::HandleChannelDeathItem(bool apply, bool Real)
|
||||||
|
|
@ -6199,7 +6202,7 @@ void Aura::HandleAuraModDodgePercent(bool /*apply*/, bool /*Real*/)
|
||||||
// sLog.outError("BONUS DODGE CHANCE: + %f", float(m_modifier.m_amount));
|
// sLog.outError("BONUS DODGE CHANCE: + %f", float(m_modifier.m_amount));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Aura::HandleAuraModBlockPercent(bool /*apply*/, bool /*Real*/)
|
void Aura::HandleAuraModBlockChancePercent(bool /*apply*/, bool /*Real*/)
|
||||||
{
|
{
|
||||||
if (GetTarget()->GetTypeId() != TYPEID_PLAYER)
|
if (GetTarget()->GetTypeId() != TYPEID_PLAYER)
|
||||||
return;
|
return;
|
||||||
|
|
@ -7012,14 +7015,10 @@ void Aura::HandleModTargetResistance(bool apply, bool Real)
|
||||||
target->ApplyModInt32Value(PLAYER_FIELD_MOD_TARGET_RESISTANCE, m_modifier.m_amount, apply);
|
target->ApplyModInt32Value(PLAYER_FIELD_MOD_TARGET_RESISTANCE, m_modifier.m_amount, apply);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Aura::HandleShieldBlockValue(bool apply, bool /*Real*/)
|
void Aura::HandleModShieldBlockDamage(bool apply, bool /*Real*/)
|
||||||
{
|
{
|
||||||
BaseModType modType = FLAT_MOD;
|
|
||||||
if (m_modifier.m_auraname == SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT)
|
|
||||||
modType = PCT_MOD;
|
|
||||||
|
|
||||||
if (GetTarget()->GetTypeId() == TYPEID_PLAYER)
|
if (GetTarget()->GetTypeId() == TYPEID_PLAYER)
|
||||||
((Player*)GetTarget())->HandleBaseModValue(SHIELD_BLOCK_VALUE, modType, float(m_modifier.m_amount), apply);
|
((Player*)GetTarget())->HandleBaseModValue(SHIELD_BLOCK_DAMAGE_VALUE, FLAT_MOD, float(m_modifier.m_amount), apply);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Aura::HandleAuraRetainComboPoints(bool apply, bool Real)
|
void Aura::HandleAuraRetainComboPoints(bool apply, bool Real)
|
||||||
|
|
@ -8746,9 +8745,6 @@ void Aura::HandleAuraStopNaturalManaRegen(bool apply, bool Real)
|
||||||
|
|
||||||
void Aura::HandleAuraMastery(bool apply, bool Real)
|
void Aura::HandleAuraMastery(bool apply, bool Real)
|
||||||
{
|
{
|
||||||
if (!Real)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Unit* target = GetTarget();
|
Unit* target = GetTarget();
|
||||||
if (target->GetTypeId() != TYPEID_PLAYER)
|
if (target->GetTypeId() != TYPEID_PLAYER)
|
||||||
return;
|
return;
|
||||||
|
|
@ -8756,6 +8752,12 @@ void Aura::HandleAuraMastery(bool apply, bool Real)
|
||||||
((Player*)target)->UpdateMasteryAuras();
|
((Player*)target)->UpdateMasteryAuras();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Aura::HandleAuraModBlockCritChance(bool apply, bool Real)
|
||||||
|
{
|
||||||
|
if (GetTarget()->GetTypeId() == TYPEID_PLAYER)
|
||||||
|
((Player*)GetTarget())->ApplyModUInt32Value(PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE, m_modifier.m_amount, apply);
|
||||||
|
}
|
||||||
|
|
||||||
bool Aura::IsLastAuraOnHolder()
|
bool Aura::IsLastAuraOnHolder()
|
||||||
{
|
{
|
||||||
for (int32 i = 0; i < MAX_EFFECT_INDEX; ++i)
|
for (int32 i = 0; i < MAX_EFFECT_INDEX; ++i)
|
||||||
|
|
|
||||||
|
|
@ -288,7 +288,7 @@ class MANGOS_DLL_SPEC Aura
|
||||||
void HandleAuraTrackResources(bool Apply, bool Real);
|
void HandleAuraTrackResources(bool Apply, bool Real);
|
||||||
void HandleAuraModParryPercent(bool Apply, bool Real);
|
void HandleAuraModParryPercent(bool Apply, bool Real);
|
||||||
void HandleAuraModDodgePercent(bool Apply, bool Real);
|
void HandleAuraModDodgePercent(bool Apply, bool Real);
|
||||||
void HandleAuraModBlockPercent(bool Apply, bool Real);
|
void HandleAuraModBlockChancePercent(bool Apply, bool Real);
|
||||||
void HandleAuraModCritPercent(bool Apply, bool Real);
|
void HandleAuraModCritPercent(bool Apply, bool Real);
|
||||||
void HandlePeriodicLeech(bool Apply, bool Real);
|
void HandlePeriodicLeech(bool Apply, bool Real);
|
||||||
void HandleModHitChance(bool Apply, bool Real);
|
void HandleModHitChance(bool Apply, bool Real);
|
||||||
|
|
@ -321,9 +321,7 @@ class MANGOS_DLL_SPEC Aura
|
||||||
void HandleModPercentStat(bool Apply, bool Real);
|
void HandleModPercentStat(bool Apply, bool Real);
|
||||||
void HandleModResistancePercent(bool Apply, bool Real);
|
void HandleModResistancePercent(bool Apply, bool Real);
|
||||||
void HandleAuraModBaseResistancePCT(bool Apply, bool Real);
|
void HandleAuraModBaseResistancePCT(bool Apply, bool Real);
|
||||||
void HandleModShieldBlockPCT(bool Apply, bool Real);
|
|
||||||
void HandleAuraTrackStealthed(bool Apply, bool Real);
|
void HandleAuraTrackStealthed(bool Apply, bool Real);
|
||||||
void HandleModShieldBlock(bool Apply, bool Real);
|
|
||||||
void HandleForceReaction(bool Apply, bool Real);
|
void HandleForceReaction(bool Apply, bool Real);
|
||||||
void HandleAuraModRangedHaste(bool Apply, bool Real);
|
void HandleAuraModRangedHaste(bool Apply, bool Real);
|
||||||
void HandleRangedAmmoHaste(bool Apply, bool Real);
|
void HandleRangedAmmoHaste(bool Apply, bool Real);
|
||||||
|
|
@ -345,7 +343,7 @@ class MANGOS_DLL_SPEC Aura
|
||||||
void HandleSpiritOfRedemption(bool apply, bool Real);
|
void HandleSpiritOfRedemption(bool apply, bool Real);
|
||||||
void HandleModManaRegen(bool apply, bool Real);
|
void HandleModManaRegen(bool apply, bool Real);
|
||||||
void HandleComprehendLanguage(bool apply, bool Real);
|
void HandleComprehendLanguage(bool apply, bool Real);
|
||||||
void HandleShieldBlockValue(bool apply, bool Real);
|
void HandleModShieldBlockDamage(bool apply, bool Real);
|
||||||
void HandleModSpellCritChanceShool(bool apply, bool Real);
|
void HandleModSpellCritChanceShool(bool apply, bool Real);
|
||||||
void HandleAuraRetainComboPoints(bool apply, bool Real);
|
void HandleAuraRetainComboPoints(bool apply, bool Real);
|
||||||
void HandleModSpellDamagePercentFromStat(bool apply, bool Real);
|
void HandleModSpellDamagePercentFromStat(bool apply, bool Real);
|
||||||
|
|
@ -375,6 +373,7 @@ class MANGOS_DLL_SPEC Aura
|
||||||
void HandleAuraAddMechanicAbilities(bool apply, bool Real);
|
void HandleAuraAddMechanicAbilities(bool apply, bool Real);
|
||||||
void HandleAuraStopNaturalManaRegen(bool apply, bool Real);
|
void HandleAuraStopNaturalManaRegen(bool apply, bool Real);
|
||||||
void HandleAuraMastery(bool apply, bool Real);
|
void HandleAuraMastery(bool apply, bool Real);
|
||||||
|
void HandleAuraModBlockCritChance(bool apply, bool Real);
|
||||||
|
|
||||||
virtual ~Aura();
|
virtual ~Aura();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -430,9 +430,6 @@ void Spell::EffectSchoolDMG(SpellEffectEntry const* effect)
|
||||||
{
|
{
|
||||||
damage = uint32(damage * (m_caster->GetTotalAttackPowerValue(BASE_ATTACK)) / 100);
|
damage = uint32(damage * (m_caster->GetTotalAttackPowerValue(BASE_ATTACK)) / 100);
|
||||||
}
|
}
|
||||||
// Shield Slam
|
|
||||||
else if ((classOptions && classOptions->SpellFamilyFlags & UI64LIT(0x0000020000000000)) && m_spellInfo->GetCategory()==1209)
|
|
||||||
damage += int32(m_caster->GetShieldBlockValue());
|
|
||||||
// Victory Rush
|
// Victory Rush
|
||||||
else if (classOptions && classOptions->SpellFamilyFlags & UI64LIT(0x10000000000))
|
else if (classOptions && classOptions->SpellFamilyFlags & UI64LIT(0x10000000000))
|
||||||
{
|
{
|
||||||
|
|
@ -765,11 +762,6 @@ void Spell::EffectSchoolDMG(SpellEffectEntry const* effect)
|
||||||
int32 count = m_caster->CalculateSpellDamage(unitTarget, m_spellInfo, EFFECT_INDEX_2);
|
int32 count = m_caster->CalculateSpellDamage(unitTarget, m_spellInfo, EFFECT_INDEX_2);
|
||||||
damage += count * int32(average * IN_MILLISECONDS) / m_caster->GetAttackTime(BASE_ATTACK);
|
damage += count * int32(average * IN_MILLISECONDS) / m_caster->GetAttackTime(BASE_ATTACK);
|
||||||
}
|
}
|
||||||
// Shield of Righteousness
|
|
||||||
else if (classOptions && classOptions->SpellFamilyFlags & UI64LIT(0x0010000000000000))
|
|
||||||
{
|
|
||||||
damage += int32(m_caster->GetShieldBlockValue());
|
|
||||||
}
|
|
||||||
// Judgement
|
// Judgement
|
||||||
else if (m_spellInfo->Id == 54158)
|
else if (m_spellInfo->Id == 54158)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -4750,3 +4750,33 @@ SpellEntry const* GetSpellEntryByDifficulty(uint32 id, Difficulty difficulty, bo
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32 GetMasteryCoefficient(SpellEntry const * spellProto)
|
||||||
|
{
|
||||||
|
if (!spellProto || !spellProto->HasAttribute(SPELL_ATTR_EX8_MASTERY))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Find mastery scaling coef
|
||||||
|
int32 coef = 0;
|
||||||
|
for (uint32 j = 0; j < MAX_EFFECT_INDEX; ++j)
|
||||||
|
{
|
||||||
|
SpellEffectEntry const * effectEntry = spellProto->GetSpellEffect(SpellEffectIndex(j));
|
||||||
|
if (!effectEntry)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// mastery scaling coef is stored in dummy aura, except 77215 (Potent Afflictions, zero effect)
|
||||||
|
// and 76808 (Executioner, not stored at all)
|
||||||
|
int32 bp = effectEntry->CalculateSimpleValue();
|
||||||
|
if (spellProto->Id == 76808)
|
||||||
|
bp = 250;
|
||||||
|
|
||||||
|
if (!bp)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
coef = bp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return coef;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -607,6 +607,8 @@ int32 GetDiminishingReturnsLimitDuration(DiminishingGroup group, SpellEntry cons
|
||||||
|
|
||||||
SpellEntry const* GetSpellEntryByDifficulty(uint32 id, Difficulty difficulty, bool isRaid);
|
SpellEntry const* GetSpellEntryByDifficulty(uint32 id, Difficulty difficulty, bool isRaid);
|
||||||
|
|
||||||
|
int32 GetMasteryCoefficient(SpellEntry const * spellProto);
|
||||||
|
|
||||||
// Spell proc event related declarations (accessed using SpellMgr functions)
|
// Spell proc event related declarations (accessed using SpellMgr functions)
|
||||||
enum ProcFlags
|
enum ProcFlags
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -16,12 +16,14 @@
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "DBCStores.h"
|
||||||
#include "Unit.h"
|
#include "Unit.h"
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
#include "Pet.h"
|
#include "Pet.h"
|
||||||
#include "Creature.h"
|
#include "Creature.h"
|
||||||
#include "SharedDefines.h"
|
#include "SharedDefines.h"
|
||||||
#include "SpellAuras.h"
|
#include "SpellAuras.h"
|
||||||
|
#include "SpellMgr.h"
|
||||||
|
|
||||||
/*#######################################
|
/*#######################################
|
||||||
######## ########
|
######## ########
|
||||||
|
|
@ -49,7 +51,6 @@ bool Player::UpdateStats(Stats stat)
|
||||||
switch (stat)
|
switch (stat)
|
||||||
{
|
{
|
||||||
case STAT_STRENGTH:
|
case STAT_STRENGTH:
|
||||||
UpdateShieldBlockValue();
|
|
||||||
break;
|
break;
|
||||||
case STAT_AGILITY:
|
case STAT_AGILITY:
|
||||||
UpdateArmor();
|
UpdateArmor();
|
||||||
|
|
@ -131,8 +132,10 @@ bool Player::UpdateAllStats()
|
||||||
UpdateAllRatings();
|
UpdateAllRatings();
|
||||||
UpdateAllCritPercentages();
|
UpdateAllCritPercentages();
|
||||||
UpdateAllSpellCritChances();
|
UpdateAllSpellCritChances();
|
||||||
UpdateDefenseBonusesMod();
|
UpdateBlockPercentage();
|
||||||
UpdateShieldBlockValue();
|
UpdateParryPercentage();
|
||||||
|
UpdateShieldBlockDamageValue();
|
||||||
|
UpdateDodgePercentage();
|
||||||
UpdateArmorPenetration();
|
UpdateArmorPenetration();
|
||||||
UpdateSpellDamageAndHealingBonus();
|
UpdateSpellDamageAndHealingBonus();
|
||||||
UpdateManaRegen();
|
UpdateManaRegen();
|
||||||
|
|
@ -393,9 +396,9 @@ void Player::UpdateAttackPowerAndDamage(bool ranged)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::UpdateShieldBlockValue()
|
void Player::UpdateShieldBlockDamageValue()
|
||||||
{
|
{
|
||||||
SetUInt32Value(PLAYER_SHIELD_BLOCK, GetShieldBlockValue());
|
SetUInt32Value(PLAYER_SHIELD_BLOCK, GetShieldBlockDamageValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, float& min_damage, float& max_damage)
|
void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, float& min_damage, float& max_damage)
|
||||||
|
|
@ -479,13 +482,6 @@ void Player::UpdateDamagePhysical(WeaponAttackType attType)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::UpdateDefenseBonusesMod()
|
|
||||||
{
|
|
||||||
UpdateBlockPercentage();
|
|
||||||
UpdateParryPercentage();
|
|
||||||
UpdateDodgePercentage();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Player::UpdateBlockPercentage()
|
void Player::UpdateBlockPercentage()
|
||||||
{
|
{
|
||||||
// No block
|
// No block
|
||||||
|
|
@ -494,11 +490,9 @@ void Player::UpdateBlockPercentage()
|
||||||
{
|
{
|
||||||
// Base value
|
// Base value
|
||||||
value = 5.0f;
|
value = 5.0f;
|
||||||
// Modify value from defense skill
|
// Increase from SPELL_AURA_MOD_BLOCK_CHANCE_PERCENT aura
|
||||||
value += (int32(GetDefenseSkillValue()) - int32(GetMaxSkillValueForLevel())) * 0.04f;
|
value += GetTotalAuraModifier(SPELL_AURA_MOD_BLOCK_CHANCE_PERCENT);
|
||||||
// Increase from SPELL_AURA_MOD_BLOCK_PERCENT aura
|
// Increase from rating (exists only on auras)
|
||||||
value += GetTotalAuraModifier(SPELL_AURA_MOD_BLOCK_PERCENT);
|
|
||||||
// Increase from rating
|
|
||||||
value += GetRatingBonusValue(CR_BLOCK);
|
value += GetRatingBonusValue(CR_BLOCK);
|
||||||
value = value < 0.0f ? 0.0f : value;
|
value = value < 0.0f ? 0.0f : value;
|
||||||
}
|
}
|
||||||
|
|
@ -533,7 +527,7 @@ void Player::UpdateCritPercentage(WeaponAttackType attType)
|
||||||
|
|
||||||
float value = GetTotalPercentageModValue(modGroup) + GetRatingBonusValue(cr);
|
float value = GetTotalPercentageModValue(modGroup) + GetRatingBonusValue(cr);
|
||||||
// Modify crit from weapon skill and maximized defense skill of same level victim difference
|
// 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;
|
value = value < 0.0f ? 0.0f : value;
|
||||||
SetStatFloatValue(index, value);
|
SetStatFloatValue(index, value);
|
||||||
}
|
}
|
||||||
|
|
@ -570,12 +564,12 @@ void Player::UpdateParryPercentage()
|
||||||
{
|
{
|
||||||
const float parry_cap[MAX_CLASSES] =
|
const float parry_cap[MAX_CLASSES] =
|
||||||
{
|
{
|
||||||
47.003525f, // Warrior
|
65.631440f, // Warrior
|
||||||
47.003525f, // Paladin
|
65.631440f, // Paladin
|
||||||
145.560408f, // Hunter
|
145.560408f, // Hunter
|
||||||
145.560408f, // Rogue
|
145.560408f, // Rogue
|
||||||
0.0f, // Priest
|
0.0f, // Priest
|
||||||
47.003525f, // DK
|
65.631440f, // DK
|
||||||
145.560408f, // Shaman
|
145.560408f, // Shaman
|
||||||
0.0f, // Mage
|
0.0f, // Mage
|
||||||
0.0f, // Warlock
|
0.0f, // Warlock
|
||||||
|
|
@ -592,9 +586,6 @@ void Player::UpdateParryPercentage()
|
||||||
float nondiminishing = 5.0f;
|
float nondiminishing = 5.0f;
|
||||||
// Parry from rating
|
// Parry from rating
|
||||||
float diminishing = GetRatingBonusValue(CR_PARRY);
|
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
|
// Parry from SPELL_AURA_MOD_PARRY_PERCENT aura
|
||||||
nondiminishing += GetTotalAuraModifier(SPELL_AURA_MOD_PARRY_PERCENT);
|
nondiminishing += GetTotalAuraModifier(SPELL_AURA_MOD_PARRY_PERCENT);
|
||||||
// apply diminishing formula to diminishing parry chance
|
// apply diminishing formula to diminishing parry chance
|
||||||
|
|
@ -609,12 +600,12 @@ void Player::UpdateDodgePercentage()
|
||||||
{
|
{
|
||||||
const float dodge_cap[MAX_CLASSES] =
|
const float dodge_cap[MAX_CLASSES] =
|
||||||
{
|
{
|
||||||
88.129021f, // Warrior
|
65.631440f, // Warrior
|
||||||
88.129021f, // Paladin
|
65.631440f, // Paladin
|
||||||
145.560408f, // Hunter
|
145.560408f, // Hunter
|
||||||
145.560408f, // Rogue
|
145.560408f, // Rogue
|
||||||
150.375940f, // Priest
|
150.375940f, // Priest
|
||||||
88.129021f, // DK
|
65.631440f, // DK
|
||||||
145.560408f, // Shaman
|
145.560408f, // Shaman
|
||||||
150.375940f, // Mage
|
150.375940f, // Mage
|
||||||
150.375940f, // Warlock
|
150.375940f, // Warlock
|
||||||
|
|
@ -625,9 +616,6 @@ void Player::UpdateDodgePercentage()
|
||||||
float diminishing = 0.0f, nondiminishing = 0.0f;
|
float diminishing = 0.0f, nondiminishing = 0.0f;
|
||||||
// Dodge from agility
|
// Dodge from agility
|
||||||
GetDodgeFromAgility(diminishing, nondiminishing);
|
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
|
// Dodge from SPELL_AURA_MOD_DODGE_PERCENT aura
|
||||||
nondiminishing += GetTotalAuraModifier(SPELL_AURA_MOD_DODGE_PERCENT);
|
nondiminishing += GetTotalAuraModifier(SPELL_AURA_MOD_DODGE_PERCENT);
|
||||||
// Dodge from rating
|
// Dodge from rating
|
||||||
|
|
@ -804,28 +792,9 @@ void Player::UpdateMasteryAuras()
|
||||||
|
|
||||||
SpellEntry const* spellEntry = holder->GetSpellProto();
|
SpellEntry const* spellEntry = holder->GetSpellProto();
|
||||||
|
|
||||||
// Find mastery scaling coef
|
// calculate mastery scaling coef
|
||||||
int32 masteryBonus = 0;
|
int32 masteryCoef = GetMasteryCoefficient(spellEntry);
|
||||||
for (uint32 j = 0; j < MAX_EFFECT_INDEX; ++j)
|
if (!masteryCoef)
|
||||||
{
|
|
||||||
SpellEffectEntry const * effectEntry = spellEntry->GetSpellEffect(SpellEffectIndex(j));
|
|
||||||
if (!effectEntry)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// mastery scaling coef is stored in dummy aura, except 77215 (Potent Afflictions, zero effect)
|
|
||||||
// and 76808 (Executioner, not stored at all)
|
|
||||||
uint32 bp = effectEntry->CalculateSimpleValue();
|
|
||||||
if (holder->GetId() == 76808)
|
|
||||||
bp = 250;
|
|
||||||
|
|
||||||
if (!bp)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
masteryBonus = bp;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!masteryBonus)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// update aura modifiers
|
// update aura modifiers
|
||||||
|
|
@ -835,11 +804,11 @@ void Player::UpdateMasteryAuras()
|
||||||
if (!aura)
|
if (!aura)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (aura->GetSpellProto()->CalculateSimpleValue(SpellEffectIndex(j)))
|
if (spellEntry->CalculateSimpleValue(SpellEffectIndex(j)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
aura->ApplyModifier(false, false);
|
aura->ApplyModifier(false, false);
|
||||||
aura->GetModifier()->m_amount = int32(masteryValue * masteryBonus / 100.0f);
|
aura->GetModifier()->m_amount = int32(masteryValue * masteryCoef / 100.0f);
|
||||||
aura->ApplyModifier(true, false);
|
aura->ApplyModifier(true, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1854,7 +1854,7 @@ void Unit::CalculateMeleeDamage(Unit* pVictim, uint32 damage, CalcDamageInfo* da
|
||||||
damageInfo->TargetState = VICTIMSTATE_NORMAL;
|
damageInfo->TargetState = VICTIMSTATE_NORMAL;
|
||||||
damageInfo->HitInfo |= HITINFO_BLOCK;
|
damageInfo->HitInfo |= HITINFO_BLOCK;
|
||||||
damageInfo->procEx |= PROC_EX_BLOCK;
|
damageInfo->procEx |= PROC_EX_BLOCK;
|
||||||
damageInfo->blocked_amount = damageInfo->target->GetShieldBlockValue();
|
damageInfo->blocked_amount = damageInfo->target->GetShieldBlockDamageValue() * damageInfo->damage / 100.0f;
|
||||||
|
|
||||||
// Target has a chance to double the blocked amount if it has SPELL_AURA_MOD_BLOCK_CRIT_CHANCE
|
// Target has a chance to double the blocked amount if it has SPELL_AURA_MOD_BLOCK_CRIT_CHANCE
|
||||||
if (roll_chance_i(pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_BLOCK_CRIT_CHANCE)))
|
if (roll_chance_i(pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_BLOCK_CRIT_CHANCE)))
|
||||||
|
|
@ -1903,7 +1903,7 @@ void Unit::CalculateMeleeDamage(Unit* pVictim, uint32 damage, CalcDamageInfo* da
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate values
|
// calculate values
|
||||||
int32 diff = damageInfo->target->GetDefenseSkillValue() - GetWeaponSkillValue(damageInfo->attackType);
|
int32 diff = damageInfo->target->GetMaxSkillValueForLevel() - GetMaxSkillValueForLevel();
|
||||||
float lowEnd = baseLowEnd - (0.05f * diff);
|
float lowEnd = baseLowEnd - (0.05f * diff);
|
||||||
float highEnd = baseHighEnd - (0.03f * diff);
|
float highEnd = baseHighEnd - (0.03f * diff);
|
||||||
|
|
||||||
|
|
@ -2046,8 +2046,8 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
|
||||||
if (pVictim->getLevel() < 30)
|
if (pVictim->getLevel() < 30)
|
||||||
Probability = 0.65f * pVictim->getLevel() + 0.5f;
|
Probability = 0.65f * pVictim->getLevel() + 0.5f;
|
||||||
|
|
||||||
uint32 VictimDefense = pVictim->GetDefenseSkillValue();
|
uint32 VictimDefense = pVictim->GetMaxSkillValueForLevel(this);
|
||||||
uint32 AttackerMeleeSkill = GetUnitMeleeSkill();
|
uint32 AttackerMeleeSkill = GetMaxSkillValueForLevel();
|
||||||
|
|
||||||
Probability *= AttackerMeleeSkill / (float)VictimDefense;
|
Probability *= AttackerMeleeSkill / (float)VictimDefense;
|
||||||
|
|
||||||
|
|
@ -2758,7 +2758,7 @@ void Unit::CalculateAbsorbResistBlock(Unit* pCaster, SpellNonMeleeDamage* damage
|
||||||
|
|
||||||
if (blocked)
|
if (blocked)
|
||||||
{
|
{
|
||||||
damageInfo->blocked = GetShieldBlockValue();
|
damageInfo->blocked = uint32(damageInfo->damage * GetShieldBlockDamageValue() / 100.0f);
|
||||||
if (damageInfo->damage < damageInfo->blocked)
|
if (damageInfo->damage < damageInfo->blocked)
|
||||||
damageInfo->blocked = damageInfo->damage;
|
damageInfo->blocked = damageInfo->damage;
|
||||||
damageInfo->damage -= damageInfo->blocked;
|
damageInfo->damage -= damageInfo->blocked;
|
||||||
|
|
@ -2930,11 +2930,8 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(const Unit* pVictim, WeaponAttackT
|
||||||
int32 attackerMaxSkillValueForLevel = GetMaxSkillValueForLevel(pVictim);
|
int32 attackerMaxSkillValueForLevel = GetMaxSkillValueForLevel(pVictim);
|
||||||
int32 victimMaxSkillValueForLevel = pVictim->GetMaxSkillValueForLevel(this);
|
int32 victimMaxSkillValueForLevel = pVictim->GetMaxSkillValueForLevel(this);
|
||||||
|
|
||||||
int32 attackerWeaponSkill = GetWeaponSkillValue(attType, pVictim);
|
|
||||||
int32 victimDefenseSkill = pVictim->GetDefenseSkillValue(this);
|
|
||||||
|
|
||||||
// bonus from skills is 0.04%
|
// bonus from skills is 0.04%
|
||||||
int32 skillBonus = 4 * (attackerWeaponSkill - victimMaxSkillValueForLevel);
|
int32 skillBonus = 4 * (attackerMaxSkillValueForLevel - victimMaxSkillValueForLevel);
|
||||||
int32 sum = 0, tmp = 0;
|
int32 sum = 0, tmp = 0;
|
||||||
int32 roll = urand(0, 10000);
|
int32 roll = urand(0, 10000);
|
||||||
|
|
||||||
|
|
@ -3019,11 +3016,9 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(const Unit* pVictim, WeaponAttackT
|
||||||
getLevel() < pVictim->GetLevelForTarget(this))
|
getLevel() < pVictim->GetLevelForTarget(this))
|
||||||
{
|
{
|
||||||
// cap possible value (with bonuses > max skill)
|
// cap possible value (with bonuses > max skill)
|
||||||
int32 skill = attackerWeaponSkill;
|
int32 skill = attackerMaxSkillValueForLevel;
|
||||||
int32 maxskill = attackerMaxSkillValueForLevel;
|
|
||||||
skill = (skill > maxskill) ? maxskill : skill;
|
|
||||||
|
|
||||||
tmp = (10 + (victimDefenseSkill - skill)) * 100;
|
tmp = (10 + (victimMaxSkillValueForLevel - skill)) * 100;
|
||||||
tmp = tmp > 4000 ? 4000 : tmp;
|
tmp = tmp > 4000 ? 4000 : tmp;
|
||||||
if (roll < (sum += tmp))
|
if (roll < (sum += tmp))
|
||||||
{
|
{
|
||||||
|
|
@ -3066,10 +3061,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(const Unit* pVictim, WeaponAttackT
|
||||||
GetTypeId() == TYPEID_PLAYER && GetCharmerOrOwnerGuid()))
|
GetTypeId() == TYPEID_PLAYER && GetCharmerOrOwnerGuid()))
|
||||||
{
|
{
|
||||||
// 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;
|
tmp = victimMaxSkillValueForLevel;
|
||||||
int32 tmpmax = victimMaxSkillValueForLevel;
|
|
||||||
// having defense above your maximum (from items, talents etc.) has no effect
|
|
||||||
tmp = tmp > tmpmax ? tmpmax : tmp;
|
|
||||||
// tmp = mob's level * 5 - player's current defense skill
|
// tmp = mob's level * 5 - player's current defense skill
|
||||||
tmp = attackerMaxSkillValueForLevel - tmp;
|
tmp = attackerMaxSkillValueForLevel - tmp;
|
||||||
if (tmp >= 15)
|
if (tmp >= 15)
|
||||||
|
|
@ -3204,7 +3196,11 @@ bool Unit::IsSpellBlocked(Unit* pCaster, SpellEntry const* spellEntry, WeaponAtt
|
||||||
}
|
}
|
||||||
|
|
||||||
float blockChance = GetUnitBlockChance();
|
float blockChance = GetUnitBlockChance();
|
||||||
blockChance += (int32(pCaster->GetWeaponSkillValue(attackType)) - int32(GetMaxSkillValueForLevel())) * 0.04f;
|
// For each point of difference between the attacker's level and the defender's level,
|
||||||
|
// the block chance is modified by 0.5% if the target is a mob and 0.2% if the target is a player.
|
||||||
|
blockChance += (getLevel() - pCaster->GetLevelForTarget(this)) * (pCaster->GetTypeId() == TYPEID_PLAYER ? 0.2f : 0.5f);
|
||||||
|
if (blockChance < 0.0f)
|
||||||
|
blockChance = 0.0f;
|
||||||
|
|
||||||
return roll_chance_f(blockChance);
|
return roll_chance_f(blockChance);
|
||||||
}
|
}
|
||||||
|
|
@ -3262,13 +3258,12 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* pVictim, SpellEntry const* spell)
|
||||||
attType = RANGED_ATTACK;
|
attType = RANGED_ATTACK;
|
||||||
|
|
||||||
// bonus from skills is 0.04% per skill Diff
|
// bonus from skills is 0.04% per skill Diff
|
||||||
int32 attackerWeaponSkill = (spell->GetEquippedItemClass() == ITEM_CLASS_WEAPON) ? int32(GetWeaponSkillValue(attType,pVictim)) : GetMaxSkillValueForLevel();
|
int32 attackerWeaponSkill = GetMaxSkillValueForLevel();
|
||||||
int32 skillDiff = attackerWeaponSkill - int32(pVictim->GetMaxSkillValueForLevel(this));
|
int32 skillDiff = attackerWeaponSkill - int32(pVictim->GetMaxSkillValueForLevel(this));
|
||||||
int32 fullSkillDiff = attackerWeaponSkill - int32(pVictim->GetDefenseSkillValue(this));
|
|
||||||
|
|
||||||
uint32 roll = urand(0, 10000);
|
uint32 roll = urand(0, 10000);
|
||||||
|
|
||||||
uint32 missChance = uint32(MeleeSpellMissChance(pVictim, attType, fullSkillDiff, spell) * 100.0f);
|
uint32 missChance = uint32(MeleeSpellMissChance(pVictim, attType, skillDiff, spell) * 100.0f);
|
||||||
// Roll miss
|
// Roll miss
|
||||||
uint32 tmp = spell->HasAttribute(SPELL_ATTR_EX3_CANT_MISS) ? 0 : missChance;
|
uint32 tmp = spell->HasAttribute(SPELL_ATTR_EX3_CANT_MISS) ? 0 : missChance;
|
||||||
if (roll < tmp)
|
if (roll < tmp)
|
||||||
|
|
@ -3559,7 +3554,7 @@ float Unit::MeleeMissChanceCalc(const Unit* pVictim, WeaponAttackType attType) c
|
||||||
missChance += 19.0f;
|
missChance += 19.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 skillDiff = int32(GetWeaponSkillValue(attType, pVictim)) - int32(pVictim->GetDefenseSkillValue(this));
|
int32 skillDiff = int32(GetMaxSkillValueForLevel(pVictim)) - int32(pVictim->GetMaxSkillValueForLevel(this));
|
||||||
|
|
||||||
// PvP - PvE melee chances
|
// PvP - PvE melee chances
|
||||||
// TODO: implement diminishing returns for defense from player's defense rating
|
// TODO: implement diminishing returns for defense from player's defense rating
|
||||||
|
|
@ -3592,21 +3587,6 @@ float Unit::MeleeMissChanceCalc(const Unit* pVictim, WeaponAttackType attType) c
|
||||||
return missChance;
|
return missChance;
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|
||||||
? ((Player*)this)->GetMaxSkillValue(SKILL_DEFENSE)
|
|
||||||
: ((Player*)this)->GetSkillValue(SKILL_DEFENSE);
|
|
||||||
value += uint32(((Player*)this)->GetRatingBonusValue(CR_DEFENSE_SKILL));
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return GetUnitMeleeSkill(target);
|
|
||||||
}
|
|
||||||
|
|
||||||
float Unit::GetUnitDodgeChance() const
|
float Unit::GetUnitDodgeChance() const
|
||||||
{
|
{
|
||||||
if (hasUnitState(UNIT_STAT_STUNNED))
|
if (hasUnitState(UNIT_STAT_STUNNED))
|
||||||
|
|
@ -3682,7 +3662,7 @@ float Unit::GetUnitBlockChance() const
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
float block = 5.0f;
|
float block = 5.0f;
|
||||||
block += GetTotalAuraModifier(SPELL_AURA_MOD_BLOCK_PERCENT);
|
block += GetTotalAuraModifier(SPELL_AURA_MOD_BLOCK_CHANCE_PERCENT);
|
||||||
return block > 0.0f ? block : 0.0f;
|
return block > 0.0f ? block : 0.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -3725,44 +3705,11 @@ float Unit::GetUnitCriticalChance(WeaponAttackType attackType, const Unit* pVict
|
||||||
|
|
||||||
crit += pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
|
crit += pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
|
||||||
|
|
||||||
|
|
||||||
// Apply crit chance from defence skill
|
|
||||||
crit += (int32(GetMaxSkillValueForLevel(pVictim)) - int32(pVictim->GetDefenseSkillValue(this))) * 0.04f;
|
|
||||||
|
|
||||||
if (crit < 0.0f)
|
if (crit < 0.0f)
|
||||||
crit = 0.0f;
|
crit = 0.0f;
|
||||||
return crit;
|
return crit;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Unit::GetWeaponSkillValue(WeaponAttackType attType, Unit const* target) const
|
|
||||||
{
|
|
||||||
uint32 value = 0;
|
|
||||||
if (GetTypeId() == TYPEID_PLAYER)
|
|
||||||
{
|
|
||||||
Item* item = ((Player*)this)->GetWeaponForAttack(attType, true, 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)
|
|
||||||
uint32 skill = item ? item->GetSkill() : uint32(SKILL_UNARMED);
|
|
||||||
|
|
||||||
// in PvP use full skill instead current skill value
|
|
||||||
value = (target && target->GetTypeId() == TYPEID_PLAYER)
|
|
||||||
? ((Player*)this)->GetMaxSkillValue(skill)
|
|
||||||
: ((Player*)this)->GetSkillValue(skill);
|
|
||||||
// Modify value from ratings
|
|
||||||
value += uint32(((Player*)this)->GetRatingBonusValue(CR_WEAPON_SKILL));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
value = GetUnitMeleeSkill(target);
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Unit::_UpdateSpells(uint32 time)
|
void Unit::_UpdateSpells(uint32 time)
|
||||||
{
|
{
|
||||||
if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL])
|
if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL])
|
||||||
|
|
@ -9257,6 +9204,13 @@ int32 Unit::CalculateSpellDamage(Unit const* target, SpellEntry const* spellProt
|
||||||
|
|
||||||
Player* unitPlayer = (GetTypeId() == TYPEID_PLAYER) ? (Player*)this : NULL;
|
Player* unitPlayer = (GetTypeId() == TYPEID_PLAYER) ? (Player*)this : NULL;
|
||||||
|
|
||||||
|
// calculate basepoints dependent on mastery
|
||||||
|
if (unitPlayer && spellProto->HasAttribute(SPELL_ATTR_EX8_MASTERY) && !spellProto->CalculateSimpleValue(effect_index))
|
||||||
|
{
|
||||||
|
if (int32 masteryCoef = GetMasteryCoefficient(spellProto))
|
||||||
|
return int32(GetFloatValue(PLAYER_MASTERY) * masteryCoef / 100.0f);
|
||||||
|
}
|
||||||
|
|
||||||
uint8 comboPoints = unitPlayer ? unitPlayer->GetComboPoints() : 0;
|
uint8 comboPoints = unitPlayer ? unitPlayer->GetComboPoints() : 0;
|
||||||
|
|
||||||
int32 basePoints = 0;
|
int32 basePoints = 0;
|
||||||
|
|
@ -10373,19 +10327,6 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* pTarget, uint32 procFlag,
|
||||||
// For melee/ranged based attack need update skills and set some Aura states
|
// For melee/ranged based attack need update skills and set some Aura states
|
||||||
if (!(procExtra & PROC_EX_CAST_END) && procFlag & MELEE_BASED_TRIGGER_MASK)
|
if (!(procExtra & PROC_EX_CAST_END) && procFlag & MELEE_BASED_TRIGGER_MASK)
|
||||||
{
|
{
|
||||||
// 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 (pTarget->GetTypeId() != TYPEID_PLAYER && pTarget->GetCreatureType() != CREATURE_TYPE_CRITTER)
|
|
||||||
((Player*)this)->UpdateCombatSkills(pTarget, attType, isVictim);
|
|
||||||
}
|
|
||||||
// Update defence if player is victim and parry/dodge/block
|
|
||||||
if (isVictim && procExtra & (PROC_EX_DODGE | PROC_EX_PARRY | PROC_EX_BLOCK))
|
|
||||||
((Player*)this)->UpdateDefense();
|
|
||||||
}
|
|
||||||
// If exist crit/parry/dodge/block need update aura state (for victim and attacker)
|
// 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))
|
if (procExtra & (PROC_EX_CRITICAL_HIT | PROC_EX_PARRY | PROC_EX_DODGE | PROC_EX_BLOCK))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -136,6 +136,7 @@ enum SpellFacingFlags
|
||||||
#define BASE_MINDAMAGE 1.0f
|
#define BASE_MINDAMAGE 1.0f
|
||||||
#define BASE_MAXDAMAGE 2.0f
|
#define BASE_MAXDAMAGE 2.0f
|
||||||
#define BASE_ATTACK_TIME 2000
|
#define BASE_ATTACK_TIME 2000
|
||||||
|
#define BASE_BLOCK_DAMAGE_PERCENT 30
|
||||||
|
|
||||||
// byte value (UNIT_FIELD_BYTES_1,0)
|
// byte value (UNIT_FIELD_BYTES_1,0)
|
||||||
enum UnitStandStateType
|
enum UnitStandStateType
|
||||||
|
|
@ -375,7 +376,7 @@ enum BaseModGroup
|
||||||
CRIT_PERCENTAGE,
|
CRIT_PERCENTAGE,
|
||||||
RANGED_CRIT_PERCENTAGE,
|
RANGED_CRIT_PERCENTAGE,
|
||||||
OFFHAND_CRIT_PERCENTAGE,
|
OFFHAND_CRIT_PERCENTAGE,
|
||||||
SHIELD_BLOCK_VALUE,
|
SHIELD_BLOCK_DAMAGE_VALUE,
|
||||||
BASEMOD_END
|
BASEMOD_END
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -479,7 +480,7 @@ extern float baseMoveSpeed[MAX_MOVE_TYPE];
|
||||||
enum CombatRating
|
enum CombatRating
|
||||||
{
|
{
|
||||||
CR_WEAPON_SKILL = 0,
|
CR_WEAPON_SKILL = 0,
|
||||||
CR_DEFENSE_SKILL = 1,
|
CR_DEFENSE_SKILL = 1, // obsolete
|
||||||
CR_DODGE = 2,
|
CR_DODGE = 2,
|
||||||
CR_PARRY = 3,
|
CR_PARRY = 3,
|
||||||
CR_BLOCK = 4,
|
CR_BLOCK = 4,
|
||||||
|
|
@ -1356,10 +1357,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
|
||||||
float GetUnitBlockChance() const;
|
float GetUnitBlockChance() const;
|
||||||
float GetUnitCriticalChance(WeaponAttackType attackType, const Unit* pVictim) const;
|
float GetUnitCriticalChance(WeaponAttackType attackType, const Unit* pVictim) const;
|
||||||
|
|
||||||
virtual uint32 GetShieldBlockValue() const = 0;
|
virtual uint32 GetShieldBlockDamageValue() const = 0;
|
||||||
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 GetWeaponProcChance() const;
|
||||||
float GetPPMProcChance(uint32 WeaponSpeed, float PPM) const;
|
float GetPPMProcChance(uint32 WeaponSpeed, float PPM) const;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ pAuraProcHandler AuraProcHandler[TOTAL_AURAS] =
|
||||||
&Unit::HandleNULLProc, // 48 SPELL_AURA_48 4 spells in 4.3.4 Napalm (area damage spell with additional delayed damage effect)
|
&Unit::HandleNULLProc, // 48 SPELL_AURA_48 4 spells in 4.3.4 Napalm (area damage spell with additional delayed damage effect)
|
||||||
&Unit::HandleNULLProc, // 49 SPELL_AURA_MOD_DODGE_PERCENT
|
&Unit::HandleNULLProc, // 49 SPELL_AURA_MOD_DODGE_PERCENT
|
||||||
&Unit::HandleNULLProc, // 50 SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT
|
&Unit::HandleNULLProc, // 50 SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT
|
||||||
&Unit::HandleNULLProc, // 51 SPELL_AURA_MOD_BLOCK_PERCENT
|
&Unit::HandleNULLProc, // 51 SPELL_AURA_MOD_BLOCK_CHANCE_PERCENT
|
||||||
&Unit::HandleNULLProc, // 52 SPELL_AURA_MOD_CRIT_PERCENT
|
&Unit::HandleNULLProc, // 52 SPELL_AURA_MOD_CRIT_PERCENT
|
||||||
&Unit::HandleNULLProc, // 53 SPELL_AURA_PERIODIC_LEECH
|
&Unit::HandleNULLProc, // 53 SPELL_AURA_PERIODIC_LEECH
|
||||||
&Unit::HandleNULLProc, // 54 SPELL_AURA_MOD_HIT_CHANCE
|
&Unit::HandleNULLProc, // 54 SPELL_AURA_MOD_HIT_CHANCE
|
||||||
|
|
@ -182,7 +182,7 @@ pAuraProcHandler AuraProcHandler[TOTAL_AURAS] =
|
||||||
&Unit::HandleNULLProc, //147 SPELL_AURA_MECHANIC_IMMUNITY_MASK
|
&Unit::HandleNULLProc, //147 SPELL_AURA_MECHANIC_IMMUNITY_MASK
|
||||||
&Unit::HandleNULLProc, //148 SPELL_AURA_RETAIN_COMBO_POINTS
|
&Unit::HandleNULLProc, //148 SPELL_AURA_RETAIN_COMBO_POINTS
|
||||||
&Unit::HandleCantTrigger, //149 SPELL_AURA_REDUCE_PUSHBACK
|
&Unit::HandleCantTrigger, //149 SPELL_AURA_REDUCE_PUSHBACK
|
||||||
&Unit::HandleNULLProc, //150 SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT
|
&Unit::HandleNULLProc, //150 SPELL_AURA_MOD_SHIELD_BLOCKDAMAGE
|
||||||
&Unit::HandleNULLProc, //151 SPELL_AURA_TRACK_STEALTHED
|
&Unit::HandleNULLProc, //151 SPELL_AURA_TRACK_STEALTHED
|
||||||
&Unit::HandleNULLProc, //152 SPELL_AURA_MOD_DETECTED_RANGE
|
&Unit::HandleNULLProc, //152 SPELL_AURA_MOD_DETECTED_RANGE
|
||||||
&Unit::HandleNULLProc, //153 SPELL_AURA_SPLIT_DAMAGE_FLAT
|
&Unit::HandleNULLProc, //153 SPELL_AURA_SPLIT_DAMAGE_FLAT
|
||||||
|
|
@ -1246,13 +1246,6 @@ SpellAuraProcResult Unit::HandleDummyAuraProc(Unit* pVictim, uint32 damage, Aura
|
||||||
target = this;
|
target = this;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// Damage Shield
|
|
||||||
if (dummySpell->SpellIconID == 3214)
|
|
||||||
{
|
|
||||||
triggered_spell_id = 59653;
|
|
||||||
basepoints[0] = GetShieldBlockValue() * triggerAmount / 100;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sweeping Strikes
|
// Sweeping Strikes
|
||||||
if (dummySpell->Id == 12328)
|
if (dummySpell->Id == 12328)
|
||||||
|
|
|
||||||
|
|
@ -666,9 +666,7 @@ void World::LoadConfigSettings(bool reload)
|
||||||
setConfig(CONFIG_BOOL_SKILL_MILLING, "SkillChance.Milling", false);
|
setConfig(CONFIG_BOOL_SKILL_MILLING, "SkillChance.Milling", false);
|
||||||
|
|
||||||
setConfig(CONFIG_UINT32_SKILL_GAIN_CRAFTING, "SkillGain.Crafting", 1);
|
setConfig(CONFIG_UINT32_SKILL_GAIN_CRAFTING, "SkillGain.Crafting", 1);
|
||||||
setConfig(CONFIG_UINT32_SKILL_GAIN_DEFENSE, "SkillGain.Defense", 1);
|
|
||||||
setConfig(CONFIG_UINT32_SKILL_GAIN_GATHERING, "SkillGain.Gathering", 1);
|
setConfig(CONFIG_UINT32_SKILL_GAIN_GATHERING, "SkillGain.Gathering", 1);
|
||||||
setConfig(CONFIG_UINT32_SKILL_GAIN_WEAPON, "SkillGain.Weapon", 1);
|
|
||||||
|
|
||||||
setConfig(CONFIG_BOOL_SKILL_FAIL_LOOT_FISHING, "SkillFail.Loot.Fishing", true);
|
setConfig(CONFIG_BOOL_SKILL_FAIL_LOOT_FISHING, "SkillFail.Loot.Fishing", true);
|
||||||
setConfig(CONFIG_BOOL_SKILL_FAIL_GAIN_FISHING, "SkillFail.Gain.Fishing", true);
|
setConfig(CONFIG_BOOL_SKILL_FAIL_GAIN_FISHING, "SkillFail.Gain.Fishing", true);
|
||||||
|
|
@ -684,8 +682,6 @@ void World::LoadConfigSettings(bool reload)
|
||||||
setConfig(CONFIG_BOOL_SAVE_RESPAWN_TIME_IMMEDIATELY, "SaveRespawnTimeImmediately", true);
|
setConfig(CONFIG_BOOL_SAVE_RESPAWN_TIME_IMMEDIATELY, "SaveRespawnTimeImmediately", true);
|
||||||
setConfig(CONFIG_BOOL_WEATHER, "ActivateWeather", true);
|
setConfig(CONFIG_BOOL_WEATHER, "ActivateWeather", true);
|
||||||
|
|
||||||
setConfig(CONFIG_BOOL_ALWAYS_MAX_SKILL_FOR_LEVEL, "AlwaysMaxSkillForLevel", false);
|
|
||||||
|
|
||||||
if (configNoReload(reload, CONFIG_UINT32_EXPANSION, "Expansion", MAX_EXPANSION))
|
if (configNoReload(reload, CONFIG_UINT32_EXPANSION, "Expansion", MAX_EXPANSION))
|
||||||
setConfigMinMax(CONFIG_UINT32_EXPANSION, "Expansion", MAX_EXPANSION, 0, MAX_EXPANSION);
|
setConfigMinMax(CONFIG_UINT32_EXPANSION, "Expansion", MAX_EXPANSION, 0, MAX_EXPANSION);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -145,9 +145,7 @@ enum eConfigUInt32Values
|
||||||
CONFIG_UINT32_SKILL_CHANCE_MINING_STEPS,
|
CONFIG_UINT32_SKILL_CHANCE_MINING_STEPS,
|
||||||
CONFIG_UINT32_SKILL_CHANCE_SKINNING_STEPS,
|
CONFIG_UINT32_SKILL_CHANCE_SKINNING_STEPS,
|
||||||
CONFIG_UINT32_SKILL_GAIN_CRAFTING,
|
CONFIG_UINT32_SKILL_GAIN_CRAFTING,
|
||||||
CONFIG_UINT32_SKILL_GAIN_DEFENSE,
|
|
||||||
CONFIG_UINT32_SKILL_GAIN_GATHERING,
|
CONFIG_UINT32_SKILL_GAIN_GATHERING,
|
||||||
CONFIG_UINT32_SKILL_GAIN_WEAPON,
|
|
||||||
CONFIG_UINT32_MAX_OVERSPEED_PINGS,
|
CONFIG_UINT32_MAX_OVERSPEED_PINGS,
|
||||||
CONFIG_UINT32_EXPANSION,
|
CONFIG_UINT32_EXPANSION,
|
||||||
CONFIG_UINT32_CHATFLOOD_MESSAGE_COUNT,
|
CONFIG_UINT32_CHATFLOOD_MESSAGE_COUNT,
|
||||||
|
|
@ -302,7 +300,6 @@ enum eConfigBoolValues
|
||||||
CONFIG_BOOL_GM_LOWER_SECURITY,
|
CONFIG_BOOL_GM_LOWER_SECURITY,
|
||||||
CONFIG_BOOL_GM_ALLOW_ACHIEVEMENT_GAINS,
|
CONFIG_BOOL_GM_ALLOW_ACHIEVEMENT_GAINS,
|
||||||
CONFIG_BOOL_SKILL_PROSPECTING,
|
CONFIG_BOOL_SKILL_PROSPECTING,
|
||||||
CONFIG_BOOL_ALWAYS_MAX_SKILL_FOR_LEVEL,
|
|
||||||
CONFIG_BOOL_WEATHER,
|
CONFIG_BOOL_WEATHER,
|
||||||
CONFIG_BOOL_EVENT_ANNOUNCE,
|
CONFIG_BOOL_EVENT_ANNOUNCE,
|
||||||
CONFIG_BOOL_QUEST_IGNORE_RAID,
|
CONFIG_BOOL_QUEST_IGNORE_RAID,
|
||||||
|
|
|
||||||
|
|
@ -548,11 +548,6 @@ LogColors = ""
|
||||||
# Default: 0 (false)
|
# Default: 0 (false)
|
||||||
# 1 (true)
|
# 1 (true)
|
||||||
#
|
#
|
||||||
# AlwaysMaxSkillForLevel
|
|
||||||
# Players will automatically gain max level dependent (weapon/defense) skill when logging in, leveling up etc.
|
|
||||||
# Default: 0 (false)
|
|
||||||
# 1 (true)
|
|
||||||
#
|
|
||||||
# ActivateWeather
|
# ActivateWeather
|
||||||
# Activate weather system
|
# Activate weather system
|
||||||
# Default: 1 (true)
|
# Default: 1 (true)
|
||||||
|
|
@ -772,7 +767,6 @@ StartPlayerMoney = 0
|
||||||
InstantLogout = 1
|
InstantLogout = 1
|
||||||
DisableWaterBreath = 4
|
DisableWaterBreath = 4
|
||||||
AllFlightPaths = 0
|
AllFlightPaths = 0
|
||||||
AlwaysMaxSkillForLevel = 0
|
|
||||||
ActivateWeather = 1
|
ActivateWeather = 1
|
||||||
CastUnstuck = 1
|
CastUnstuck = 1
|
||||||
MaxSpellCastsInChain = 10
|
MaxSpellCastsInChain = 10
|
||||||
|
|
@ -1276,10 +1270,8 @@ Visibility.AIRelocationNotifyDelay = 1000
|
||||||
# Default: 1
|
# Default: 1
|
||||||
#
|
#
|
||||||
# SkillGain.Crafting
|
# SkillGain.Crafting
|
||||||
# SkillGain.Defense
|
|
||||||
# SkillGain.Gathering
|
# SkillGain.Gathering
|
||||||
# SkillGain.Weapon
|
# Crafting and gathering skill gains at skill grow (1,2,...)
|
||||||
# crafting/defense/gathering/weapon skills gain at skill grow (1,2,...)
|
|
||||||
# Default: 1
|
# Default: 1
|
||||||
#
|
#
|
||||||
# SkillChance.Orange
|
# SkillChance.Orange
|
||||||
|
|
@ -1389,9 +1381,7 @@ Rate.Reputation.LowLevel.Kill = 1
|
||||||
Rate.Reputation.LowLevel.Quest = 1
|
Rate.Reputation.LowLevel.Quest = 1
|
||||||
Rate.InstanceResetTime = 1
|
Rate.InstanceResetTime = 1
|
||||||
SkillGain.Crafting = 1
|
SkillGain.Crafting = 1
|
||||||
SkillGain.Defense = 1
|
|
||||||
SkillGain.Gathering = 1
|
SkillGain.Gathering = 1
|
||||||
SkillGain.Weapon = 1
|
|
||||||
SkillChance.Orange = 100
|
SkillChance.Orange = 100
|
||||||
SkillChance.Yellow = 75
|
SkillChance.Yellow = 75
|
||||||
SkillChance.Green = 25
|
SkillChance.Green = 25
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "12197"
|
#define REVISION_NR "12198"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue