aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/DataStores/DB2Structure.h4
-rw-r--r--src/server/game/DataStores/DBCEnums.h1
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp42
4 files changed, 35 insertions, 14 deletions
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index 5f2bc8b7d3f..d020b457199 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -1987,8 +1987,8 @@ struct ItemEntry
int32 ScalingStatValue;
std::array<uint8, 5> DamageType;
std::array<int16, 7> Resistances;
- std::array<uint16, 5> MinDamage;
- std::array<uint16, 5> MaxDamage;
+ std::array<uint16, MAX_ITEM_PROTO_DAMAGES> MinDamage;
+ std::array<uint16, MAX_ITEM_PROTO_DAMAGES> MaxDamage;
};
struct ItemAppearanceEntry
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index 047d5917bb1..bf96b960d75 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -949,6 +949,7 @@ enum class GlobalCurve : int32
#define MAX_ITEM_PROTO_ZONES 2
#define MAX_ITEM_PROTO_SOCKETS 3
#define MAX_ITEM_PROTO_STATS 10
+static constexpr uint8 const MAX_ITEM_PROTO_DAMAGES = 5;
enum GlyphSlotType
{
diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h
index da72315e60a..d7f81c9e97b 100644
--- a/src/server/game/Entities/Item/ItemTemplate.h
+++ b/src/server/game/Entities/Item/ItemTemplate.h
@@ -828,6 +828,8 @@ struct TC_GAME_API ItemTemplate
int16 GetShieldBlockValue(uint32 itemLevel) const;
uint16 GetScalingStatDistributionID() const { return ExtendedData->ScalingStatDistributionID; }
int32 GetScalingStatValue() const { return BasicData->ScalingStatValue; }
+ uint16 GetMinDamage(uint8 index) const { return BasicData->MinDamage[index]; }
+ uint16 GetMaxDamage(uint8 index) const { return BasicData->MaxDamage[index]; }
uint32 MaxDurability;
std::vector<ItemEffectEntry const*> Effects;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index e88339b9d2f..f8727ae0745 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -8033,22 +8033,40 @@ void Player::_ApplyWeaponDamage(uint8 slot, Item* item, bool apply)
if (!IsInFeralForm() && apply && !CanUseAttackType(attType))
return;
- static constexpr uint8 const MAX_ITEM_PROTO_DAMAGES = 5;
+ ScalingStatDistributionEntry const* ssd = sScalingStatDistributionStore.LookupEntry(proto->GetScalingStatDistributionID());
+ ScalingStatValuesEntry const* ssv = (ssd && proto->GetScalingStatValue() != 0) ? sDB2Manager.GetScalingStatValuesForLevel(std::clamp<uint32>(GetLevel(), ssd->MinLevel, ssd->MaxLevel)) : nullptr;
float damage = 0.0f;
- float minDamage, maxDamage;
- proto->GetDamage(minDamage, maxDamage);
-
- if (minDamage > 0)
+ //for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
{
- damage = apply ? minDamage : BASE_MINDAMAGE;
- SetBaseWeaponDamage(attType, MINDAMAGE, damage);
- }
+ float minDamage = proto->GetMinDamage(0);
+ float maxDamage = proto->GetMaxDamage(0);
- if (maxDamage > 0)
- {
- damage = apply ? maxDamage : BASE_MAXDAMAGE;
- SetBaseWeaponDamage(attType, MAXDAMAGE, damage);
+ // If set dpsMod in ScalingStatValue use it for min (70% from average), max (130% from average) damage
+ if (ssv)
+ {
+ int32 extraDPS = ssv->getDPSMod(proto->GetScalingStatValue());
+ if (extraDPS)
+ {
+ float average = extraDPS * proto->GetDelay() / 1000.0f;
+ float mod = ssv->isTwoHand(proto->GetScalingStatValue()) ? 0.2f : 0.3f;
+
+ minDamage = (1.0f - mod) * average;
+ maxDamage = (1.0f + mod) * average;
+ }
+ }
+
+ if (minDamage > 0)
+ {
+ damage = apply ? minDamage : BASE_MINDAMAGE;
+ SetBaseWeaponDamage(attType, MINDAMAGE, damage);
+ }
+
+ if (maxDamage > 0)
+ {
+ damage = apply ? maxDamage : BASE_MAXDAMAGE;
+ SetBaseWeaponDamage(attType, MAXDAMAGE, damage);
+ }
}
SpellShapeshiftFormEntry const* shapeshift = sSpellShapeshiftFormStore.LookupEntry(GetShapeshiftForm());