aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOvahlord <dreadkiller@gmx.de>2023-11-22 17:36:14 +0100
committerOvahlord <dreadkiller@gmx.de>2023-11-22 17:36:14 +0100
commit40ddd29d03b862765bceac0caa435bd9352c77b8 (patch)
treea9e2e6aaee1a1827397e8a46cb201f55c5d27b4f /src
parent89d7ed3b9c450b96a36fb7c048643770639d0e8e (diff)
Core/Items: fixed calculating shield block amount
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DataStores/GameTables.cpp2
-rw-r--r--src/server/game/DataStores/GameTables.h40
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.cpp9
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp3
5 files changed, 53 insertions, 3 deletions
diff --git a/src/server/game/DataStores/GameTables.cpp b/src/server/game/DataStores/GameTables.cpp
index 505f1c2242c..d220fe0445e 100644
--- a/src/server/game/DataStores/GameTables.cpp
+++ b/src/server/game/DataStores/GameTables.cpp
@@ -39,6 +39,7 @@ GameTable<GtOCTRegenHPEntry> sOCTRegenHPGameTable;
GameTable<GtOCTRegenMPEntry> sOCTRegenMPGameTable;
GameTable<GtRegenHPPerSptEntry> sRegenHPPerSptGameTable;
GameTable<GtRegenMPPerSptEntry> sRegenMPPerSptGameTable;
+GameTable<GtShieldBlockRegularEntry> sShieldBlockRegularGameTable;
GameTable<GtSpellScalingEntry> sSpellScalingGameTable;
GameTable<GtXpEntry> sXpGameTable;
@@ -129,6 +130,7 @@ void LoadGameTables(std::string const& dataPath)
LOAD_GT(sOCTRegenMPGameTable, "OCTRegenMP.txt");
LOAD_GT(sRegenHPPerSptGameTable, "RegenHPPerSpt.txt");
LOAD_GT(sRegenMPPerSptGameTable, "RegenMPPerSpt.txt");
+ LOAD_GT(sShieldBlockRegularGameTable, "ShieldBlockRegular.txt");
LOAD_GT(sSpellScalingGameTable, "SpellScaling.txt");
LOAD_GT(sXpGameTable, "xp.txt");
diff --git a/src/server/game/DataStores/GameTables.h b/src/server/game/DataStores/GameTables.h
index ea0f5f043ed..24ebda356da 100644
--- a/src/server/game/DataStores/GameTables.h
+++ b/src/server/game/DataStores/GameTables.h
@@ -181,6 +181,18 @@ struct GtRegenMPPerSptEntry
float Druid = 0.0f;
};
+struct GtShieldBlockRegularEntry
+{
+ float Poor = 0.0f;
+ float Standard = 0.0f;
+ float Good = 0.0f;
+ float Superior = 0.0f;
+ float Epic = 0.0f;
+ float Legendary = 0.0f;
+ float Artifact = 0.0f;
+ float ScalingStat = 0.0f;
+};
+
struct GtSpellScalingEntry
{
float Rogue = 0.0f;
@@ -254,6 +266,7 @@ TC_GAME_API extern GameTable<GtOCTRegenHPEntry> sOCTRegenHPG
TC_GAME_API extern GameTable<GtOCTRegenMPEntry> sOCTRegenMPGameTable;
TC_GAME_API extern GameTable<GtRegenHPPerSptEntry> sRegenHPPerSptGameTable;
TC_GAME_API extern GameTable<GtRegenMPPerSptEntry> sRegenMPPerSptGameTable;
+TC_GAME_API extern GameTable<GtShieldBlockRegularEntry> sShieldBlockRegularGameTable;
TC_GAME_API extern GameTable<GtSpellScalingEntry> sSpellScalingGameTable;
TC_GAME_API extern GameTable<GtXpEntry> sXpGameTable;
@@ -382,4 +395,31 @@ inline float GetBattlePetXPPerLevel(GtBattlePetXPEntry const* row)
return row->Wins * row->Xp;
}
+inline float GetShieldBlockRegularColumnForQuality(GtShieldBlockRegularEntry const* row, ItemQualities quality)
+{
+ switch (quality)
+ {
+ case ITEM_QUALITY_POOR:
+ return row->Poor;
+ case ITEM_QUALITY_NORMAL:
+ return row->Standard;
+ case ITEM_QUALITY_UNCOMMON:
+ return row->Good;
+ case ITEM_QUALITY_RARE:
+ return row->Superior;
+ case ITEM_QUALITY_EPIC:
+ return row->Epic;
+ case ITEM_QUALITY_LEGENDARY:
+ return row->Legendary;
+ case ITEM_QUALITY_ARTIFACT:
+ return row->Artifact;
+ case ITEM_QUALITY_HEIRLOOM:
+ return row->ScalingStat;
+ default:
+ break;
+ }
+
+ return 0.0f;
+}
+
#endif // GameTables_h__
diff --git a/src/server/game/Entities/Item/ItemTemplate.cpp b/src/server/game/Entities/Item/ItemTemplate.cpp
index 1b58631ed0c..77226ff986d 100644
--- a/src/server/game/Entities/Item/ItemTemplate.cpp
+++ b/src/server/game/Entities/Item/ItemTemplate.cpp
@@ -16,9 +16,10 @@
*/
#include "DB2Stores.h"
-#include "World.h"
+#include "GameTables.h"
#include "ItemTemplate.h"
#include "Player.h"
+#include "World.h"
int32 const SocketColorToGemTypeMask[26] =
{
@@ -232,3 +233,9 @@ std::size_t ItemTemplate::CalculateItemSpecBit(ChrSpecializationEntry const* spe
{
return (spec->ClassID - 1) * MAX_SPECIALIZATIONS + spec->OrderIndex;
}
+
+int16 ItemTemplate::GetShieldBlockValue(uint32 itemLevel) const
+{
+ GtShieldBlockRegularEntry const* blockEntry = sShieldBlockRegularGameTable.GetRow(itemLevel);
+ return static_cast<int16>(GetShieldBlockRegularColumnForQuality(blockEntry, static_cast<ItemQualities>(GetQuality())));
+}
diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h
index 37f87cc9905..161aeef0892 100644
--- a/src/server/game/Entities/Item/ItemTemplate.h
+++ b/src/server/game/Entities/Item/ItemTemplate.h
@@ -824,7 +824,7 @@ struct TC_GAME_API ItemTemplate
uint8 GetArtifactID() const { return ExtendedData->ArtifactID; }
uint8 GetRequiredExpansion() const { return ExtendedData->ExpansionID; }
int16 GetResistance(SpellSchools school) const { return ExtendedData->Resistances[school]; }
- int16 GetShieldBlockValue() const { return BasicData->Resistances[SPELL_SCHOOL_NORMAL]; }
+ int16 GetShieldBlockValue(uint32 itemLevel) const;
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 bf0919712ab..f00d5912be6 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -7802,6 +7802,7 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply)
return;
uint32 itemLevel = item->GetItemLevel(this);
+
float combatRatingMultiplier = 1.0f;
//if (GtCombatRatingsMultByILvl const* ratingMult = sCombatRatingsMultByILvlGameTable.GetRow(itemLevel))
// combatRatingMultiplier = GetIlvlStatMultiplier(ratingMult, proto->GetInventoryType());
@@ -8041,7 +8042,7 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply)
if (int16 resistance = proto->GetResistance(SpellSchools(i)))
HandleStatFlatModifier(UnitMods(UNIT_MOD_ARMOR + i), BASE_VALUE, float(resistance), apply);
- if (int16 shieldBlockValue = proto->GetShieldBlockValue())
+ if (int16 shieldBlockValue = proto->GetShieldBlockValue(itemLevel))
if (proto->GetClass() == ITEM_CLASS_ARMOR && proto->GetSubClass() == ITEM_SUBCLASS_ARMOR_SHIELD)
SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ShieldBlock), apply ? shieldBlockValue : 0);