diff options
-rw-r--r-- | sql/updates/hotfixes/master/2020_06_13_00_hotfixes.sql | 13 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.cpp | 5 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.h | 3 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2LoadInfo.h | 17 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 4 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 1 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Structure.h | 9 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 9 | ||||
-rw-r--r-- | src/server/game/DataStores/GameTables.h | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Entities/Item/ItemTemplate.h | 12 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 34 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/StatSystem.cpp | 27 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 4 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 2 |
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)) |