diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-08-02 14:40:12 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-08-02 14:40:12 +0200 |
| commit | df511503815b7798c83acbffbb1ce5208f189ce7 (patch) | |
| tree | 92a90871ad4777b43e8d2d77f6f7589a58ded3e3 /src/server/game/Entities | |
| parent | e59eef5432c7b70679d33f4911c88d0f7d75fd39 (diff) | |
Core/DataStores: Updated to 11.0.0
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Item/ItemBonusMgr.cpp | 74 | ||||
| -rw-r--r-- | src/server/game/Entities/Item/ItemTemplate.h | 10 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 16 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 |
6 files changed, 45 insertions, 65 deletions
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 6ba4473bfd8..febce29419d 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -332,7 +332,7 @@ void ItemAdditionalLoadInfo::Init(std::unordered_map<ObjectGuid::LowType, ItemAd { uint32 maxRank = artifactPower->MaxPurchasableRank; // allow ARTIFACT_POWER_FLAG_FINAL to overflow maxrank here - needs to be handled in Item::CheckArtifactUnlock (will refund artifact power) - if (artifactPower->Flags & ARTIFACT_POWER_FLAG_MAX_RANK_WITH_TIER && artifactPower->Tier < info.Artifact->ArtifactTierId) + if (artifactPower->Flags & ARTIFACT_POWER_FLAG_MAX_RANK_WITH_TIER && uint32(artifactPower->Tier) < info.Artifact->ArtifactTierId) maxRank += info.Artifact->ArtifactTierId - artifactPower->Tier; if (artifactPowerData.PurchasedRank > maxRank) diff --git a/src/server/game/Entities/Item/ItemBonusMgr.cpp b/src/server/game/Entities/Item/ItemBonusMgr.cpp index 42e2a800fd3..d379c88762c 100644 --- a/src/server/game/Entities/Item/ItemBonusMgr.cpp +++ b/src/server/game/Entities/Item/ItemBonusMgr.cpp @@ -189,80 +189,36 @@ bool CanApplyBonusTreeToItem(ItemTemplate const* itemTemplate, uint32 itemBonusT uint32 GetBonusTreeIdOverride(uint32 itemBonusTreeId, ItemBonusGenerationParams const& params) { - // TODO: configure seasons globally - if (MythicPlusSeasonEntry const* mythicPlusSeason = sMythicPlusSeasonStore.LookupEntry(0)) - { - int32 selectedLevel = -1; - int32 selectedMilestoneSeason = -1; - ChallengeModeItemBonusOverrideEntry const* selectedItemBonusOverride = nullptr; - for (auto& [_, itemBonusOverride] : Trinity::Containers::MapEqualRange(_challengeModeItemBonusOverrides, itemBonusTreeId)) - { - if (itemBonusOverride->Type != 0) - continue; - - if (itemBonusOverride->Value > params.MythicPlusKeystoneLevel.value_or(-1)) - continue; - - if (itemBonusOverride->MythicPlusSeasonID) - { - MythicPlusSeasonEntry const* overrideSeason = sMythicPlusSeasonStore.LookupEntry(itemBonusOverride->MythicPlusSeasonID); - if (!overrideSeason) - continue; - - if (mythicPlusSeason->MilestoneSeason < overrideSeason->MilestoneSeason) - continue; - - if (selectedMilestoneSeason > overrideSeason->MilestoneSeason) - continue; - - if (selectedMilestoneSeason == overrideSeason->MilestoneSeason) - if (selectedLevel > itemBonusOverride->Value) - continue; + std::vector<int32> passedTimeEvents; // sorted by date TODO: configure globally - selectedMilestoneSeason = overrideSeason->MilestoneSeason; - } - else if (selectedLevel > itemBonusOverride->Value) - continue; - - selectedLevel = itemBonusOverride->Value; - selectedItemBonusOverride = itemBonusOverride; - } - - if (selectedItemBonusOverride && selectedItemBonusOverride->DstItemBonusTreeID) - itemBonusTreeId = selectedItemBonusOverride->DstItemBonusTreeID; - } - - // TODO: configure seasons globally - if (PvpSeasonEntry const* pvpSeason = sPvpSeasonStore.LookupEntry(0)) + if (!passedTimeEvents.empty()) { int32 selectedLevel = -1; - int32 selectedMilestoneSeason = -1; + std::ptrdiff_t selectedMilestoneSeason = -1; ChallengeModeItemBonusOverrideEntry const* selectedItemBonusOverride = nullptr; for (auto& [_, itemBonusOverride] : Trinity::Containers::MapEqualRange(_challengeModeItemBonusOverrides, itemBonusTreeId)) { - if (itemBonusOverride->Type != 1) + if (params.MythicPlusKeystoneLevel && itemBonusOverride->Value > *params.MythicPlusKeystoneLevel) continue; - if (itemBonusOverride->Value > params.PvpTier.value_or(-1)) + if (params.PvpTier && itemBonusOverride->Value > *params.PvpTier) continue; - if (itemBonusOverride->PvPSeasonID) + if (itemBonusOverride->RequiredTimeEventPassed) { - PvpSeasonEntry const* overrideSeason = sPvpSeasonStore.LookupEntry(itemBonusOverride->PvPSeasonID); - if (!overrideSeason) - continue; - - if (pvpSeason->MilestoneSeason < overrideSeason->MilestoneSeason) - continue; + auto itr = std::ranges::find(passedTimeEvents, itemBonusOverride->RequiredTimeEventPassed); + if (itr == passedTimeEvents.end()) + continue; // season not started yet - if (selectedMilestoneSeason > overrideSeason->MilestoneSeason) - continue; + std::ptrdiff_t overrideMilestoneSeason = std::ranges::distance(passedTimeEvents.begin(), itr); + if (selectedMilestoneSeason > overrideMilestoneSeason) + continue; // older season that what was selected - if (selectedMilestoneSeason == overrideSeason->MilestoneSeason) + if (selectedMilestoneSeason == overrideMilestoneSeason) if (selectedLevel > itemBonusOverride->Value) - continue; + continue; // lower level in current season than what was already found - selectedMilestoneSeason = overrideSeason->MilestoneSeason; + selectedMilestoneSeason = overrideMilestoneSeason; } else if (selectedLevel > itemBonusOverride->Value) continue; diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index bb37ab2ffff..1423e3d9f41 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -109,6 +109,9 @@ enum ItemSpelltriggerType ITEM_SPELLTRIGGER_ON_PICKUP = 5, ITEM_SPELLTRIGGER_ON_LEARN = 6, // used in ItemEffect in second slot with spell_id with SPELL_GENERIC_LEARN in spell_1 ITEM_SPELLTRIGGER_ON_LOOTED = 7, + ITEM_SPELLTRIGGER_TEACH_MOUNT = 8, + ITEM_SPELLTRIGGER_ON_PICKUP_FORCED = 9, + ITEM_SPELLTRIGGER_ON_LOOTED_FORCED = 10, }; enum ItemBondingType @@ -118,10 +121,13 @@ enum ItemBondingType BIND_ON_EQUIP = 2, BIND_ON_USE = 3, BIND_QUEST = 4, + BIND_UNUSED_1 = 5, + BIND_UNUSED_2 = 6, + BIND_WOW_ACCOUNT = 7, + BIND_BNET_ACCOUNT = 8, + BIND_BNET_ACCOUNT_UNTIL_EQUIPPED = 9, }; -#define MAX_BIND_TYPE 5 - /* /// @todo: Requiring actual cases in which using (an) item isn't allowed while shapeshifted. Else, this flag would need an implementation. ITEM_FLAG_USE_WHEN_SHAPESHIFTED = 0x00800000, // Item can be used in shapeshift forms */ diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 32343bbe64d..24b8522ee29 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6414,6 +6414,8 @@ void Player::CheckAreaExplore() XP = std::max(minScaledXP, XP); } + XP += XP * GetTotalAuraMultiplier(SPELL_AURA_MOD_EXPLORATION_EXPERIENCE); + GiveXP(XP, nullptr); SendExplorationExperience(areaId, XP); } @@ -7222,7 +7224,11 @@ void Player::ModifyCurrency(uint32 id, int32 amount, CurrencyGainSource gainSour itr->second.EarnedQuantity += amount; if (!isGainOnRefund) + { UpdateCriteria(CriteriaType::CurrencyGained, id, amount); + if (gainSource == CurrencyGainSource::RenownRepGain) + UpdateCriteria(CriteriaType::ReachRenownLevel, id, itr->second.Quantity); + } } CurrencyChanged(id, amount); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 6c0d491b8ea..db619aba0cb 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1216,7 +1216,11 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama // double blocked amount if block is critical uint32 value = victim->GetBlockPercent(GetLevel()); if (victim->IsBlockCritical()) + { value *= 2; // double blocked percent + value *= GetTotalAuraMultiplier(SPELL_AURA_MOD_CRITICAL_BLOCK_AMOUNT); + } + damageInfo->blocked = CalculatePct(damage, value); if (damage <= int32(damageInfo->blocked)) { @@ -1431,7 +1435,10 @@ void Unit::CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, Weapon // 30% damage blocked, double blocked amount if block is critical damageInfo->Blocked = CalculatePct(damageInfo->Damage, damageInfo->Target->GetBlockPercent(GetLevel())); if (damageInfo->Target->IsBlockCritical()) + { damageInfo->Blocked *= 2; + damageInfo->Blocked *= GetTotalAuraMultiplier(SPELL_AURA_MOD_CRITICAL_BLOCK_AMOUNT); + } damageInfo->OriginalDamage = damageInfo->Damage; damageInfo->Damage -= damageInfo->Blocked; @@ -2488,7 +2495,7 @@ void Unit::SendMeleeAttackStop(Unit* victim) TC_LOG_DEBUG("entities.unit", "{} stopped attacking", GetGUID().ToString()); } -bool Unit::IsBlockCritical() +bool Unit::IsBlockCritical() const { if (roll_chance_i(GetTotalAuraModifier(SPELL_AURA_MOD_BLOCK_CRIT_CHANCE))) return true; @@ -6899,6 +6906,11 @@ int32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, int // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085) TakenTotalMod *= GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, spellProto->GetSchoolMask()); + TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_TAKEN_BY_LABEL, [spellProto](AuraEffect const* aurEff) -> bool + { + return spellProto->HasLabel(aurEff->GetMiscValue()); + }); + // From caster spells if (caster) { @@ -6912,7 +6924,7 @@ int32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, int return aurEff->GetCasterGUID() == caster->GetGUID() && aurEff->IsAffectingSpell(spellProto); }); - TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_TAKEN_FROM_CASTER_BY_LABEL, [caster, spellProto](AuraEffect const* aurEff) -> bool + TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_SPELL_DAMAGE_FROM_CASTER_BY_LABEL, [caster, spellProto](AuraEffect const* aurEff) -> bool { return aurEff->GetCasterGUID() == caster->GetGUID() && spellProto->HasLabel(aurEff->GetMiscValue()); }); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 3adc53fcaaa..1dc8ddec7e1 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1624,7 +1624,7 @@ class TC_GAME_API Unit : public WorldObject int32 MeleeDamageBonusDone(Unit* pVictim, int32 damage, WeaponAttackType attType, DamageEffectType damagetype, SpellInfo const* spellProto = nullptr, Mechanics mechanic = MECHANIC_NONE, SpellSchoolMask damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL, Spell* spell = nullptr, AuraEffect const* aurEff = nullptr); int32 MeleeDamageBonusTaken(Unit* attacker, int32 pdamage, WeaponAttackType attType, DamageEffectType damagetype, SpellInfo const* spellProto = nullptr, SpellSchoolMask damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL); - bool IsBlockCritical(); + bool IsBlockCritical() const; float SpellCritChanceDone(Spell* spell, AuraEffect const* aurEff, SpellSchoolMask schoolMask, WeaponAttackType attackType = BASE_ATTACK) const; float SpellCritChanceTaken(Unit const* caster, Spell* spell, AuraEffect const* aurEff, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType = BASE_ATTACK) const; static uint32 SpellCriticalDamageBonus(Unit const* caster, SpellInfo const* spellProto, uint32 damage, Unit* victim); |
