aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/hotfixes/master/2020_06_13_00_hotfixes.sql13
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.cpp5
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.h3
-rw-r--r--src/server/game/DataStores/DB2LoadInfo.h17
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp4
-rw-r--r--src/server/game/DataStores/DB2Stores.h1
-rw-r--r--src/server/game/DataStores/DB2Structure.h9
-rw-r--r--src/server/game/DataStores/DBCEnums.h9
-rw-r--r--src/server/game/DataStores/GameTables.h4
-rw-r--r--src/server/game/Entities/Item/Item.cpp9
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h12
-rw-r--r--src/server/game/Entities/Player/Player.cpp34
-rw-r--r--src/server/game/Entities/Player/Player.h1
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp27
-rw-r--r--src/server/game/Entities/Unit/Unit.h4
-rw-r--r--src/server/game/Spells/SpellInfo.cpp2
16 files changed, 119 insertions, 35 deletions
diff --git a/sql/updates/hotfixes/master/2020_06_13_00_hotfixes.sql b/sql/updates/hotfixes/master/2020_06_13_00_hotfixes.sql
new file mode 100644
index 00000000000..9b75a7a6984
--- /dev/null
+++ b/sql/updates/hotfixes/master/2020_06_13_00_hotfixes.sql
@@ -0,0 +1,13 @@
+--
+-- Table structure for table `corruption_effects`
+--
+DROP TABLE IF EXISTS `corruption_effects`;
+CREATE TABLE `corruption_effects` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `MinCorruption` float NOT NULL DEFAULT '0',
+ `Aura` int(11) NOT NULL DEFAULT '0',
+ `PlayerConditionID` int(11) NOT NULL DEFAULT '0',
+ `Flags` int(11) NOT NULL DEFAULT '0',
+ `VerifiedBuild` int(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`,`VerifiedBuild`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp
index 0bf870a783c..b4a3a5ae12e 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.cpp
+++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp
@@ -353,6 +353,11 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"AnimKitID, SpeechType, StartAnimation, EndAnimation FROM conversation_line WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_CONVERSATION_LINE, "SELECT MAX(ID) + 1 FROM conversation_line", CONNECTION_SYNCH);
+ // CorruptionEffects.db2
+ PrepareStatement(HOTFIX_SEL_CORRUPTION_EFFECTS, "SELECT ID, MinCorruption, Aura, PlayerConditionID, Flags FROM corruption_effects"
+ " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ PREPARE_MAX_ID_STMT(HOTFIX_SEL_CORRUPTION_EFFECTS, "SELECT MAX(ID) + 1 FROM corruption_effects", CONNECTION_SYNCH);
+
// CreatureDisplayInfo.db2
PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT ID, ModelID, SoundID, SizeClass, CreatureModelScale, CreatureModelAlpha, BloodID, "
"ExtendedDisplayInfoID, NPCSoundID, ParticleColorID, PortraitCreatureDisplayInfoID, PortraitTextureFileDataID, ObjectEffectPackageID, "
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h
index 00828c3b89e..df374496edb 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.h
+++ b/src/server/database/Database/Implementation/HotfixDatabase.h
@@ -216,6 +216,9 @@ enum HotfixDatabaseStatements : uint32
HOTFIX_SEL_CONVERSATION_LINE,
HOTFIX_SEL_CONVERSATION_LINE_MAX_ID,
+ HOTFIX_SEL_CORRUPTION_EFFECTS,
+ HOTFIX_SEL_CORRUPTION_EFFECTS_MAX_ID,
+
HOTFIX_SEL_CREATURE_DISPLAY_INFO,
HOTFIX_SEL_CREATURE_DISPLAY_INFO_MAX_ID,
diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h
index f14772bf9ab..9fa79edfdbd 100644
--- a/src/server/game/DataStores/DB2LoadInfo.h
+++ b/src/server/game/DataStores/DB2LoadInfo.h
@@ -1199,6 +1199,23 @@ struct ConversationLineLoadInfo
}
};
+struct CorruptionEffectsLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static DB2FieldMeta const fields[] =
+ {
+ { false, FT_INT, "ID" },
+ { false, FT_FLOAT, "MinCorruption" },
+ { true, FT_INT, "Aura" },
+ { true, FT_INT, "PlayerConditionID" },
+ { true, FT_INT, "Flags" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CorruptionEffectsMeta::Instance(), HOTFIX_SEL_CORRUPTION_EFFECTS);
+ return &loadInfo;
+ }
+};
+
struct CreatureDisplayInfoLoadInfo
{
static DB2LoadInfo const* Instance()
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index f40a96a8461..3adc0394627 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -93,6 +93,7 @@ DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore("Cinema
DB2Storage<ContentTuningEntry> sContentTuningStore("ContentTuning.db2", ContentTuningLoadInfo::Instance());
DB2Storage<ContentTuningXExpectedEntry> sContentTuningXExpectedStore("ContentTuningXExpected.db2", ContentTuningXExpectedLoadInfo::Instance());
DB2Storage<ConversationLineEntry> sConversationLineStore("ConversationLine.db2", ConversationLineLoadInfo::Instance());
+DB2Storage<CorruptionEffectsEntry> sCorruptionEffectsStore("CorruptionEffects.db2", CorruptionEffectsLoadInfo::Instance());
DB2Storage<CreatureDisplayInfoEntry> sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", CreatureDisplayInfoLoadInfo::Instance());
DB2Storage<CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore("CreatureDisplayInfoExtra.db2", CreatureDisplayInfoExtraLoadInfo::Instance());
DB2Storage<CreatureFamilyEntry> sCreatureFamilyStore("CreatureFamily.db2", CreatureFamilyLoadInfo::Instance());
@@ -361,7 +362,6 @@ namespace
};
StorageMap _stores;
- uint32 _hotfixCount = 0;
DB2Manager::HotfixContainer _hotfixData;
std::map<std::pair<uint32 /*tableHash*/, int32 /*recordId*/>, std::vector<uint8>> _hotfixBlob;
@@ -583,6 +583,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sContentTuningStore);
LOAD_DB2(sContentTuningXExpectedStore);
LOAD_DB2(sConversationLineStore);
+ LOAD_DB2(sCorruptionEffectsStore);
LOAD_DB2(sCreatureDisplayInfoStore);
LOAD_DB2(sCreatureDisplayInfoExtraStore);
LOAD_DB2(sCreatureFamilyStore);
@@ -1398,7 +1399,6 @@ void DB2Manager::LoadHotfixData()
hotfixRecord.RecordID = recordId;
hotfixRecord.HotfixID = id;
_hotfixData.insert(hotfixRecord);
- ++_hotfixCount;
deletedRecords[std::make_pair(tableHash, recordId)] = deleted;
++count;
} while (result->NextRow());
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index 843b1b0479f..7d60c184a9d 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -74,6 +74,7 @@ TC_GAME_API extern DB2Storage<CinematicCameraEntry> sCinematicCa
TC_GAME_API extern DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore;
TC_GAME_API extern DB2Storage<ContentTuningEntry> sContentTuningStore;
TC_GAME_API extern DB2Storage<ConversationLineEntry> sConversationLineStore;
+TC_GAME_API extern DB2Storage<CorruptionEffectsEntry> sCorruptionEffectsStore;
TC_GAME_API extern DB2Storage<CreatureDisplayInfoEntry> sCreatureDisplayInfoStore;
TC_GAME_API extern DB2Storage<CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore;
TC_GAME_API extern DB2Storage<CreatureFamilyEntry> sCreatureFamilyStore;
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index 2a861ad2d2c..329903c5e56 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -689,6 +689,15 @@ struct ConversationLineEntry
uint8 EndAnimation;
};
+struct CorruptionEffectsEntry
+{
+ uint32 ID;
+ float MinCorruption;
+ int32 Aura;
+ int32 PlayerConditionID;
+ int32 Flags;
+};
+
struct CreatureDisplayInfoEntry
{
uint32 ID;
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index dac3557f501..bb1003cd03a 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -19,6 +19,7 @@
#define DBCENUMS_H
#include "Define.h"
+#include "EnumFlag.h"
#include <array>
#pragma pack(push, 1)
@@ -206,6 +207,14 @@ enum ChrSpecializationFlag
CHR_SPECIALIZATION_FLAG_RECOMMENDED = 0x40,
};
+enum class CorruptionEffectsFlag
+{
+ None = 0,
+ Disabled = 0x1
+};
+
+DEFINE_ENUM_FLAG(CorruptionEffectsFlag);
+
enum CriteriaCondition
{
CRITERIA_CONDITION_NONE = 0,
diff --git a/src/server/game/DataStores/GameTables.h b/src/server/game/DataStores/GameTables.h
index 16f5f26dae2..ea14c64c56b 100644
--- a/src/server/game/DataStores/GameTables.h
+++ b/src/server/game/DataStores/GameTables.h
@@ -69,8 +69,8 @@ struct GtCombatRatingsEntry
float CritMelee = 0.0f;
float CritRanged = 0.0f;
float CritSpell = 0.0f;
- float MultiStrike = 0.0f;
- float Readiness = 0.0f;
+ float Corruption = 0.0f;
+ float CorruptionResistance = 0.0f;
float Speed = 0.0f;
float ResilienceCritTaken = 0.0f;
float ResiliencePlayerDamage = 0.0f;
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index 41fcbf6b32e..913d51d1f22 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -2205,6 +2205,15 @@ uint32 Item::GetItemLevel(ItemTemplate const* itemTemplate, BonusData const& bon
int32 Item::GetItemStatValue(uint32 index, Player const* owner) const
{
ASSERT(index < MAX_ITEM_PROTO_STATS);
+ switch (GetItemStatType(index))
+ {
+ case ITEM_MOD_CORRUPTION:
+ case ITEM_MOD_CORRUPTION_RESISTANCE:
+ return _bonusData.ItemStatAllocation[index];
+ default:
+ break;
+ }
+
uint32 itemLevel = GetItemLevel(owner);
if (uint32 randomPropPoints = GetRandomPropertyPoints(itemLevel, GetQuality(), GetTemplate()->GetInventoryType(), GetTemplate()->GetSubClass()))
{
diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h
index df57ffe6d95..b1c522d5860 100644
--- a/src/server/game/Entities/Item/ItemTemplate.h
+++ b/src/server/game/Entities/Item/ItemTemplate.h
@@ -44,8 +44,8 @@ enum ItemModType
ITEM_MOD_CRIT_MELEE_RATING = 19,
ITEM_MOD_CRIT_RANGED_RATING = 20,
ITEM_MOD_CRIT_SPELL_RATING = 21,
- ITEM_MOD_HIT_TAKEN_MELEE_RATING = 22,
- ITEM_MOD_HIT_TAKEN_RANGED_RATING = 23,
+ ITEM_MOD_CORRUPTION = 22,
+ ITEM_MOD_CORRUPTION_RESISTANCE = 23,
ITEM_MOD_HIT_TAKEN_SPELL_RATING = 24,
ITEM_MOD_CRIT_TAKEN_MELEE_RATING = 25,
ITEM_MOD_CRIT_TAKEN_RANGED_RATING = 26,
@@ -80,15 +80,15 @@ enum ItemModType
ITEM_MOD_NATURE_RESISTANCE = 55,
ITEM_MOD_ARCANE_RESISTANCE = 56,
ITEM_MOD_PVP_POWER = 57,
- ITEM_MOD_CR_AMPLIFY = 58,
- ITEM_MOD_CR_MULTISTRIKE = 59,
- ITEM_MOD_CR_READINESS = 60,
+ ITEM_MOD_CR_UNUSED_0 = 58,
+ ITEM_MOD_CR_UNUSED_1 = 59,
+ ITEM_MOD_CR_UNUSED_3 = 60,
ITEM_MOD_CR_SPEED = 61,
ITEM_MOD_CR_LIFESTEAL = 62,
ITEM_MOD_CR_AVOIDANCE = 63,
ITEM_MOD_CR_STURDINESS = 64,
ITEM_MOD_CR_UNUSED_7 = 65,
- ITEM_MOD_CR_CLEAVE = 66,
+ ITEM_MOD_CR_UNUSED_27 = 66,
ITEM_MOD_CR_UNUSED_9 = 67,
ITEM_MOD_CR_UNUSED_10 = 68,
ITEM_MOD_CR_UNUSED_11 = 69,
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 5ac0bbb1bc8..32f2be86bd9 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -5172,10 +5172,10 @@ inline float GetGameTableColumnForCombatRating(GtCombatRatingsEntry const* row,
return row->CritRanged;
case CR_CRIT_SPELL:
return row->CritSpell;
- case CR_MULTISTRIKE:
- return row->MultiStrike;
- case CR_READINESS:
- return row->Readiness;
+ case CR_CORRUPTION:
+ return row->Corruption;
+ case CR_CORRUPTION_RESISTANCE:
+ return row->CorruptionResistance;
case CR_SPEED:
return row->Speed;
case CR_RESILIENCE_CRIT_TAKEN:
@@ -5324,8 +5324,10 @@ void Player::UpdateRating(CombatRating cr)
if (affectStats)
UpdateSpellCritChance();
break;
- case CR_MULTISTRIKE:
- case CR_READINESS:
+ case CR_CORRUPTION:
+ case CR_CORRUPTION_RESISTANCE:
+ UpdateCorruption();
+ break;
case CR_SPEED:
case CR_RESILIENCE_PLAYER_DAMAGE:
case CR_RESILIENCE_CRIT_TAKEN:
@@ -7714,14 +7716,11 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply)
case ITEM_MOD_PVP_POWER:
ApplyRatingMod(CR_PVP_POWER, int32(val), apply);
break;
- case ITEM_MOD_CR_AMPLIFY:
- ApplyRatingMod(CR_AMPLIFY, int32(val), apply);
- break;
- case ITEM_MOD_CR_MULTISTRIKE:
- ApplyRatingMod(CR_MULTISTRIKE, int32(val), apply);
+ case ITEM_MOD_CORRUPTION:
+ ApplyRatingMod(CR_CORRUPTION, int32(val), apply);
break;
- case ITEM_MOD_CR_READINESS:
- ApplyRatingMod(CR_READINESS, int32(val * combatRatingMultiplier), apply);
+ case ITEM_MOD_CORRUPTION_RESISTANCE:
+ ApplyRatingMod(CR_CORRUPTION_RESISTANCE, int32(val), apply);
break;
case ITEM_MOD_CR_SPEED:
ApplyRatingMod(CR_SPEED, int32(val * combatRatingMultiplier), apply);
@@ -7735,15 +7734,6 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply)
case ITEM_MOD_CR_STURDINESS:
ApplyRatingMod(CR_STURDINESS, int32(val * combatRatingMultiplier), apply);
break;
- case ITEM_MOD_CR_UNUSED_7:
- ApplyRatingMod(CR_UNUSED_7, int32(val), apply);
- break;
- case ITEM_MOD_CR_CLEAVE:
- ApplyRatingMod(CR_CLEAVE, int32(val), apply);
- break;
- case ITEM_MOD_CR_UNUSED_12:
- ApplyRatingMod(CR_UNUSED_12, int32(val), apply);
- break;
case ITEM_MOD_AGI_STR_INT:
HandleStatFlatModifier(UNIT_MOD_STAT_AGILITY, BASE_VALUE, float(val), apply);
HandleStatFlatModifier(UNIT_MOD_STAT_STRENGTH, BASE_VALUE, float(val), apply);
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index dafedb22e77..4d3dc2f6493 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1808,6 +1808,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void UpdateSpellHitChances();
void UpdateSpellCritChance();
+ void UpdateCorruption();
void UpdateArmorPenetration(int32 amount);
void UpdateExpertise(WeaponAttackType attType);
void ApplyManaRegenBonus(int32 amount, bool apply);
diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp
index 29596e4b705..ac86632924b 100644
--- a/src/server/game/Entities/Unit/StatSystem.cpp
+++ b/src/server/game/Entities/Unit/StatSystem.cpp
@@ -703,6 +703,33 @@ void Player::UpdateSpellCritChance()
SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::SpellCritPercentage), crit);
}
+void Player::UpdateCorruption()
+{
+ float effectiveCorruption = GetRatingBonusValue(CR_CORRUPTION) - GetRatingBonusValue(CR_CORRUPTION_RESISTANCE);
+ for (CorruptionEffectsEntry const* corruptionEffect : sCorruptionEffectsStore)
+ {
+ if ((CorruptionEffectsFlag(corruptionEffect->Flags) & CorruptionEffectsFlag::Disabled) != CorruptionEffectsFlag::None)
+ continue;
+
+ if (effectiveCorruption < corruptionEffect->MinCorruption)
+ {
+ RemoveAura(corruptionEffect->Aura);
+ continue;
+ }
+
+ if (PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(corruptionEffect->PlayerConditionID))
+ {
+ if (!ConditionMgr::IsPlayerMeetingCondition(this, playerCondition))
+ {
+ RemoveAura(corruptionEffect->Aura);
+ continue;
+ }
+ }
+
+ CastSpell(this, corruptionEffect->Aura, true);
+ }
+}
+
void Player::UpdateArmorPenetration(int32 amount)
{
// Store Rating Value
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index f6ac8d6d3f5..a092fe764cf 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -449,8 +449,8 @@ enum CombatRating
CR_CRIT_MELEE = 8,
CR_CRIT_RANGED = 9,
CR_CRIT_SPELL = 10,
- CR_MULTISTRIKE = 11,
- CR_READINESS = 12,
+ CR_CORRUPTION = 11,
+ CR_CORRUPTION_RESISTANCE = 12,
CR_SPEED = 13,
CR_RESILIENCE_CRIT_TAKEN = 14,
CR_RESILIENCE_PLAYER_DAMAGE = 15,
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index d9c797b053c..8dc5af047ec 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -593,7 +593,7 @@ int32 SpellEffectInfo::CalcBaseValue(Unit const* caster, Unit const* target, uin
if (ItemSparseEntry const* itemSparse = sItemSparseStore.LookupEntry(itemId))
value *= GetIlvlStatMultiplier(ratingMult, InventoryType(itemSparse->InventoryType));
- if (IsAura(SPELL_AURA_MOD_RATING))
+ if (IsAura(SPELL_AURA_MOD_RATING) && !(MiscValue & ((1 << CR_CORRUPTION) | 1 << (CR_CORRUPTION_RESISTANCE))))
{
if (GtCombatRatingsMultByILvl const* ratingMult = sCombatRatingsMultByILvlGameTable.GetRow(effectiveItemLevel))
if (ItemSparseEntry const* itemSparse = sItemSparseStore.LookupEntry(itemId))