aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-08-02 14:40:12 +0200
committerShauren <shauren.trinity@gmail.com>2024-08-02 14:40:12 +0200
commitdf511503815b7798c83acbffbb1ce5208f189ce7 (patch)
tree92a90871ad4777b43e8d2d77f6f7589a58ded3e3 /src/server/game/Entities
parente59eef5432c7b70679d33f4911c88d0f7d75fd39 (diff)
Core/DataStores: Updated to 11.0.0
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/Item/Item.cpp2
-rw-r--r--src/server/game/Entities/Item/ItemBonusMgr.cpp74
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h10
-rw-r--r--src/server/game/Entities/Player/Player.cpp6
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp16
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
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);