diff --git a/BH/Constants.h b/BH/Constants.h index ef5d5ca2..41ab839a 100644 --- a/BH/Constants.h +++ b/BH/Constants.h @@ -1490,6 +1490,7 @@ enum TransactionTypes #define ITEM_TYPE_MISSILE_WEAPON 47 #define ITEM_TYPE_THROWN_WEAPON 48 #define ITEM_TYPE_HAND_TO_HAND 67 +#define ITEM_TYPE_ASSASSIN_MASTERY 91 #define ITEM_TYPE_TWOHANDED_MELEE_WEAPON 114 #define ITEM_TYPE_GENERAL_WEAPON 115 #define ITEM_TYPE_ONEHANDED_MELEE_WEAPON 116 diff --git a/BH/D2Helpers.cpp b/BH/D2Helpers.cpp index 3ff7d617..96770696 100644 --- a/BH/D2Helpers.cpp +++ b/BH/D2Helpers.cpp @@ -463,8 +463,10 @@ int __stdcall GetMasteryStat(UnitAny* pUnit, int nStatId, int nSkill) break; case STAT_CRITICALSTRIKE: { - if (((nSkill == SKILL_ONEHANDMASTERY && D2COMMON_11034_ITEMS_CheckItemTypes(nRightSkillItemType, ITEM_TYPE_WEAPON) && !D2COMMON_11034_ITEMS_CheckItemTypes(nRightSkillItemType, ITEM_TYPE_MISSILE_WEAPON) && !D2COMMON_11034_ITEMS_CheckItemTypes(nRightSkillItemType, ITEM_TYPE_THROWN_WEAPON)) || nRightSkillItemType <= 0) || - (nSkill == SKILL_CLAWANDDAGGERMASTERY && D2COMMON_11034_ITEMS_CheckItemTypes(nRightSkillItemType, ITEM_TYPE_HAND_TO_HAND)) || + // Claw and Dagger Mastery: PD2's claw skills (Tiger Strike, Fists of Fire, ...) use the "asm" item type, plain melee skills (Attack) use "weap" + bool bMeleeWeaponSkill = D2COMMON_11034_ITEMS_CheckItemTypes(nRightSkillItemType, ITEM_TYPE_WEAPON) && !D2COMMON_11034_ITEMS_CheckItemTypes(nRightSkillItemType, ITEM_TYPE_MISSILE_WEAPON) && !D2COMMON_11034_ITEMS_CheckItemTypes(nRightSkillItemType, ITEM_TYPE_THROWN_WEAPON); + if (((nSkill == SKILL_ONEHANDMASTERY && bMeleeWeaponSkill) || nRightSkillItemType <= 0) || + (nSkill == SKILL_CLAWANDDAGGERMASTERY && (bMeleeWeaponSkill || D2COMMON_11034_ITEMS_CheckItemTypes(nRightSkillItemType, ITEM_TYPE_ASSASSIN_MASTERY))) || (nSkill == SKILL_THROWINGMASTERY && D2COMMON_11034_ITEMS_CheckItemTypes(nRightSkillItemType, ITEM_TYPE_THROWN_WEAPON))) { nStatValue = D2COMMON_10786_SKILLS_EvaluateSkillFormula(pUnit, pSkillsTxt->dwPassiveCalc3, nSkill, nSkillLevel); @@ -535,7 +537,8 @@ int __stdcall GetMasteryStat(UnitAny* pUnit, int nStatId, int nSkill) } else { - if (nStatId == STAT_PIERCE) + // The client's stat list carries these passive stats whatever the weapon; the critical strike chance is only added above on a match + if (nStatId == STAT_CRUSHINGBLOW || nStatId == STAT_CRUSHINGBLOW_EFFICIENCY || nStatId == STAT_CRITICALSTRIKE_MULTIPLIER || nStatId == STAT_PIERCE) { return -nStatValue; } diff --git a/BH/Drawing/Stats/StatsDisplay.cpp b/BH/Drawing/Stats/StatsDisplay.cpp index 444f25d7..acc36c0e 100644 --- a/BH/Drawing/Stats/StatsDisplay.cpp +++ b/BH/Drawing/Stats/StatsDisplay.cpp @@ -428,14 +428,14 @@ void StatsDisplay::OnDraw() L"Poison Resist:ÿc2 %d ÿc0/ %d ÿc4Length:ÿc: %d%%", static_cast(D2COMMON_GetUnitStat(unit, STAT_POISONRESIST, 0)) + penalty, pMax, - (100 - penalty - pLengthReduce) + 100 - max(min(pLengthReduce + penalty, 75), -100) ); Texthook::Draw(column1, (y += 16), None, 6, Gold, - L"Curse Resist:ÿc8 %d /ÿc0 75 ÿc4Length:ÿc0 %d%%", + L"Curse Resist:ÿc8 %d ÿc0/ 75 ÿc4Length:ÿc0 %d%%", static_cast(min(D2COMMON_GetUnitStat(unit, STAT_CURSE_EFFECTIVENESS, 0), 75)), static_cast(max(100 - D2COMMON_GetUnitStat(unit, STAT_CURSERESISTANCE, 0), 25))); y += 8; @@ -729,7 +729,7 @@ void StatsDisplay::OnDraw() int nCrushingBlowEfficiency = 100 + D2COMMON_GetUnitStat(unit, STAT_CRUSHINGBLOW_EFFICIENCY, 0) + GetMasteryStat(unit, STAT_CRUSHINGBLOW_EFFICIENCY, SKILL_TWOHANDMASTERY); int nCriticalStrike = D2COMMON_GetUnitStat(unit, STAT_CRITICALSTRIKE, 0) + D2COMMON_GetUnitStat(unit, STAT_ITEM_CRITICALSTRIKE_CHANCE, 0) + GetMasteryStat(unit, STAT_CRITICALSTRIKE, SKILL_ONEHANDMASTERY) + GetMasteryStat(unit, STAT_CRITICALSTRIKE, SKILL_THROWINGMASTERY) + GetMasteryStat(unit, STAT_CRITICALSTRIKE, SKILL_CLAWANDDAGGERMASTERY); int nCriticalStrikeMultiplier = 200 + D2COMMON_GetUnitStat(unit, STAT_CRITICALSTRIKE_MULTIPLIER, 0) + GetMasteryStat(unit, STAT_CRITICALSTRIKE_MULTIPLIER, SKILL_JAVELINANDSPEARMASTERY); - int nPierce = D2COMMON_GetUnitStat(unit, STAT_PIERCINGATTACK, 0) + D2COMMON_GetUnitStat(unit, STAT_PIERCE, 0); //+ GetMasteryStat(unit, STAT_PIERCE, SKILL_THROWINGMASTERY); + int nPierce = D2COMMON_GetUnitStat(unit, STAT_PIERCINGATTACK, 0) + D2COMMON_GetUnitStat(unit, STAT_PIERCE, 0) + GetMasteryStat(unit, STAT_PIERCE, SKILL_THROWINGMASTERY); Texthook::Draw(column1, (y += 16),