diff options
19 files changed, 109 insertions, 122 deletions
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index 4b0581b623c..6a7b62e93ce 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -1056,7 +1056,6 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi { data << int32(BonusResistanceMods[i]); data << int32(PowerCostModifier[i]); - data << float(PowerCostMultiplier[i]); } } data << int32(BaseMana); @@ -1123,35 +1122,35 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const { - UpdateMask<196> allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFBFFFF81u, 0x03F8007Fu, 0x00000000u, 0x00000000u }); + UpdateMask<189> allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFBFFFF81u, 0x03F8007Fu, 0x00000000u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } -void UnitData::AppendAllowedFieldsMaskForFlag(UpdateMask<196>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const +void UnitData::AppendAllowedFieldsMaskForFlag(UpdateMask<189>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x0400007Eu, 0xFC07FF80u, 0xFFFFFFFFu, 0x0000000Fu }; + allowedMaskForTarget |= { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x0400007Eu, 0xFC07FF80u, 0x1FFFFFFFu }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll)) - allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x04000000u, 0x0007FF80u, 0x00000000u, 0x00000000u }; + allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x04000000u, 0x0007FF80u, 0x00000000u }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath)) - allowedMaskForTarget |= { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00007F80u, 0x00000000u }; + allowedMaskForTarget |= { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00007F80u }; } -void UnitData::FilterDisallowedFieldsMaskForFlag(UpdateMask<196>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const +void UnitData::FilterDisallowedFieldsMaskForFlag(UpdateMask<189>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const { if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - changesMask &= { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFBFFFF81u, 0x03F8007Fu, 0x00000000u, 0xFFFFFFF0u }; + changesMask &= { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFBFFFF81u, 0x03F8007Fu, 0xE0000000u }; if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll)) - changesMask &= { 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFBFFFFFFu, 0xFFF8007Fu, 0xFFFFFFFFu, 0xFFFFFFFFu }; + changesMask &= { 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFBFFFFFFu, 0xFFF8007Fu, 0xFFFFFFFFu }; if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath)) - changesMask &= { 0xFFFFFFFFu, 0xE1FFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFF807Fu, 0xFFFFFFFFu }; + changesMask &= { 0xFFFFFFFFu, 0xE1FFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFF807Fu }; } -void UnitData::WriteUpdate(ByteBuffer& data, UpdateMask<196> const& changesMask, bool ignoreNestedChangesMask, Unit const* owner, Player const* receiver) const +void UnitData::WriteUpdate(ByteBuffer& data, UpdateMask<189> const& changesMask, bool ignoreNestedChangesMask, Unit const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlocksMask(0), 7); - for (std::size_t i = 0; i < 7; ++i) + data.WriteBits(changesMask.GetBlocksMask(0), 6); + for (std::size_t i = 0; i < 6; ++i) if (changesMask.GetBlock(i)) data.WriteBits(changesMask.GetBlock(i), 32); @@ -1764,10 +1763,6 @@ void UnitData::WriteUpdate(ByteBuffer& data, UpdateMask<196> const& changesMask, { data << int32(PowerCostModifier[i]); } - if (changesMask[189 + i]) - { - data << float(PowerCostMultiplier[i]); - } } } } @@ -1902,7 +1897,6 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(Resistances); Base::ClearChangesMask(BonusResistanceMods); Base::ClearChangesMask(PowerCostModifier); - Base::ClearChangesMask(PowerCostMultiplier); _changesMask.ResetAll(); } @@ -4676,6 +4670,7 @@ void ScaleCurve::ClearChangesMask() void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const { + OverrideScaleCurve->WriteCreate(data, owner, receiver); data << Caster; data << uint32(Duration); data << uint32(TimeToTarget); @@ -4687,7 +4682,6 @@ void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi data << float(BoundsRadius2D); data << uint32(DecalPropertiesID); data << CreatingEffectGUID; - OverrideScaleCurve->WriteCreate(data, owner, receiver); ExtraScaleCurve->WriteCreate(data, owner, receiver); } diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 787742ac021..6d0998d631b 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -249,7 +249,7 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); } }; -struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<196> +struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<189> { UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs; DynamicUpdateField<UF::PassiveSpellHistory, 0, 2> PassiveSpells; @@ -385,13 +385,12 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<196> UpdateFieldArray<int32, 7, 167, 168> Resistances; UpdateFieldArray<int32, 7, 167, 175> BonusResistanceMods; UpdateFieldArray<int32, 7, 167, 182> PowerCostModifier; - UpdateFieldArray<float, 7, 167, 189> PowerCostMultiplier; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, UpdateMask<196> const& changesMask, bool ignoreNestedChangesMask, Unit const* owner, Player const* receiver) const; - void AppendAllowedFieldsMaskForFlag(UpdateMask<196>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; - void FilterDisallowedFieldsMaskForFlag(UpdateMask<196>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; + void WriteUpdate(ByteBuffer& data, UpdateMask<189> const& changesMask, bool ignoreNestedChangesMask, Unit const* owner, Player const* receiver) const; + void AppendAllowedFieldsMaskForFlag(UpdateMask<189>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; + void FilterDisallowedFieldsMaskForFlag(UpdateMask<189>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; void ClearChangesMask(); }; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index e3af501cb59..56ff90ccb56 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2449,6 +2449,8 @@ void Player::InitStatsForLevel(bool reapplyMods) SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::MaxLevel), sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)); SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::NextLevelXP), sObjectMgr->GetXPForLevel(getLevel())); + if (m_activePlayerData->XP >= m_activePlayerData->NextLevelXP) + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::XP), m_activePlayerData->NextLevelXP - 1); // reset before any aura state sources (health set/aura apply) SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::AuraState), 0); @@ -2550,10 +2552,7 @@ void Player::InitStatsForLevel(bool reapplyMods) SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModTargetResistance), 0); SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModTargetPhysicalResistance), 0); for (uint8 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i) - { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::PowerCostModifier, i), 0); - SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::PowerCostMultiplier, i), 0.0f); - } // Reset no reagent cost field SetNoRegentCostMask(flag128()); @@ -5183,13 +5182,6 @@ void Player::ApplyRatingMod(CombatRating combatRating, int32 value, bool apply) void Player::UpdateRating(CombatRating cr) { int32 amount = m_baseRatingValue[cr]; - // Apply bonus from SPELL_AURA_MOD_RATING_FROM_STAT - // stat used stored in miscValueB for this aura - AuraEffectList const& modRatingFromStat = GetAuraEffectsByType(SPELL_AURA_MOD_RATING_FROM_STAT); - for (AuraEffect const* aurEff : modRatingFromStat) - if (aurEff->GetMiscValue() & (1 << cr)) - amount += int32(CalculatePct(GetStat(Stats(aurEff->GetMiscValueB())), aurEff->GetAmount())); - AuraEffectList const& modRatingPct = GetAuraEffectsByType(SPELL_AURA_MOD_RATING_PCT); for (AuraEffect const* aurEff : modRatingPct) if (aurEff->GetMiscValue() & (1 << cr)) diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index a312228ffc0..eaec4bc15ac 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -134,19 +134,6 @@ bool Player::UpdateStats(Stats stat) UpdateSpellDamageAndHealingBonus(); UpdateManaRegen(); - - // Update ratings in exist SPELL_AURA_MOD_RATING_FROM_STAT and only depends from stat - uint32 mask = 0; - AuraEffectList const& modRatingFromStat = GetAuraEffectsByType(SPELL_AURA_MOD_RATING_FROM_STAT); - for (AuraEffectList::const_iterator i = modRatingFromStat.begin(); i != modRatingFromStat.end(); ++i) - if (Stats((*i)->GetMiscValueB()) == stat) - mask |= (*i)->GetMiscValue(); - if (mask) - { - for (uint32 rating = 0; rating < MAX_COMBAT_RATING; ++rating) - if (mask & (1 << rating)) - ApplyRatingMod(CombatRating(rating), 0, true); - } return true; } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 9480942eea5..f0e79c36768 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -77,11 +77,12 @@ enum SpellModOp : uint8 SPELLMOD_SPELL_COST2 = 34, // Used when SpellPowerEntry::PowerIndex == 1 SPELLMOD_JUMP_DISTANCE = 35, // spellmod 36 - SPELLMOD_STACK_AMOUNT2 = 37 // same as SPELLMOD_STACK_AMOUNT but affects tooltips + SPELLMOD_STACK_AMOUNT2 = 37, // same as SPELLMOD_STACK_AMOUNT but affects tooltips // spellmod 38 + SPELLMOD_SPELL_COST3 = 39 }; -#define MAX_SPELLMOD 39 +#define MAX_SPELLMOD 40 enum SpellValueMod : uint8 { @@ -1087,7 +1088,6 @@ class TC_GAME_API Unit : public WorldObject int32 ModifyPower(Powers power, int32 val); void ApplyModPowerCostModifier(SpellSchools school, int32 mod, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::PowerCostModifier, school), mod, apply); } - void ApplyModPowerCostMultiplier(SpellSchools school, float pct, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::PowerCostMultiplier, school), pct, apply); } uint32 GetBaseAttackTime(WeaponAttackType att) const; void SetBaseAttackTime(WeaponAttackType att, uint32 val); diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index 4353e10d403..dba55c66ac2 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -163,6 +163,8 @@ ByteBuffer& operator<<(ByteBuffer& data, EnumCharactersResult::CharacterInfo::Vi ByteBuffer& operator<<(ByteBuffer& data, EnumCharactersResult::CharacterInfo const& charInfo) { + ASSERT(charInfo.MailSenders.size() == charInfo.MailSenderTypes.size()); + data << charInfo.Guid; data << uint64(charInfo.GuildClubMemberID); data << uint8(charInfo.ListPosition); @@ -194,11 +196,15 @@ ByteBuffer& operator<<(ByteBuffer& data, EnumCharactersResult::CharacterInfo con data << uint32(charInfo.LastLoginVersion); data << uint32(charInfo.Flags4); data << uint32(charInfo.MailSenders.size()); + data << uint32(charInfo.MailSenderTypes.size()); data << uint32(charInfo.OverrideSelectScreenFileDataID); - for (ChrCustomizationChoice customization : charInfo.Customizations) + for (ChrCustomizationChoice const& customization : charInfo.Customizations) data << customization; + if (!charInfo.MailSenderTypes.empty()) + data.append(charInfo.MailSenderTypes.data(), charInfo.MailSenderTypes.size()); + data.WriteBits(charInfo.Name.length(), 6); data.WriteBit(charInfo.FirstLogin); data.WriteBit(charInfo.BoostInProgress); @@ -244,6 +250,7 @@ WorldPacket const* EnumCharactersResult::Write() _worldPacket.WriteBit(Success); _worldPacket.WriteBit(IsDeletedCharacters); _worldPacket.WriteBit(IsNewPlayerRestrictionSkipped); + _worldPacket.WriteBit(IsNewPlayerRestricted); _worldPacket.WriteBit(IsNewPlayer); _worldPacket.WriteBit(DisabledClassesMask.is_initialized()); _worldPacket.WriteBit(IsAlliedRacesCreationAllowed); diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index 2cfc28b3e09..0847720436c 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -161,6 +161,7 @@ namespace WorldPackets std::array<VisualItemInfo, 23> VisualItems = { }; std::vector<std::string> MailSenders; + std::vector<uint32> MailSenderTypes; }; struct RaceUnlock @@ -184,6 +185,7 @@ namespace WorldPackets bool Success = false; ///< bool IsDeletedCharacters = false; ///< used for character undelete list bool IsNewPlayerRestrictionSkipped = false; ///< allows client to skip new player restrictions + bool IsNewPlayerRestricted = false; ///< forbids using level boost and class trials bool IsNewPlayer = false; ///< forbids hero classes and allied races bool IsAlliedRacesCreationAllowed = false; diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp index cfdb4b39f40..390fb70170e 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.cpp +++ b/src/server/game/Server/Packets/CombatLogPackets.cpp @@ -352,7 +352,7 @@ WorldPacket const* WorldPackets::CombatLog::AttackerStateUpdate::Write() attackRoundInfo << float(ContentTuning.PlayerItemLevel); attackRoundInfo << float(ContentTuning.TargetItemLevel); attackRoundInfo << uint16(ContentTuning.ScalingHealthItemLevelCurveID); - attackRoundInfo << uint8(ContentTuning.ScalesWithItemLevel ? 1 : 0); + attackRoundInfo << uint32(ContentTuning.Flags); WriteLogDataBit(); FlushBits(); diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp index 7a48a3ed2da..47d806aef30 100644 --- a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp +++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp @@ -177,8 +177,8 @@ ByteBuffer& operator<<(ByteBuffer& data, ContentTuningParams const& contentTunin data << uint8(contentTuningParams.TargetMinScalingLevel); data << uint8(contentTuningParams.TargetMaxScalingLevel); data << int8(contentTuningParams.TargetScalingLevelDelta); + data << uint32(contentTuningParams.Flags); data.WriteBits(contentTuningParams.Type, 4); - data.WriteBit(contentTuningParams.ScalesWithItemLevel); data.FlushBits(); return data; } diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.h b/src/server/game/Server/Packets/CombatLogPacketsCommon.h index 298d478cc94..c08298b0f58 100644 --- a/src/server/game/Server/Packets/CombatLogPacketsCommon.h +++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.h @@ -52,11 +52,17 @@ namespace WorldPackets { enum ContentTuningType : uint32 { - TYPE_PLAYER_TO_PLAYER = 7, // NYI - TYPE_PLAYER_TO_PLAYER_HEALING = 8, - TYPE_CREATURE_TO_PLAYER_DAMAGE = 1, - TYPE_PLAYER_TO_CREATURE_DAMAGE = 2, - TYPE_CREATURE_TO_CREATURE_DAMAGE = 4 + TYPE_CREATURE_TO_PLAYER_DAMAGE = 1, + TYPE_PLAYER_TO_CREATURE_DAMAGE = 2, + TYPE_CREATURE_TO_CREATURE_DAMAGE = 4, + TYPE_PLAYER_TO_PLAYER_SANDBOX_SCALING = 7, // NYI + TYPE_PLAYER_TO_PLAYER_EXPECTED_STAT = 8, + }; + + enum ContentTuningFlags : uint32 + { + NO_LEVEL_SCALING = 0x1, + NO_ITEM_LEVEL_SCALING = 0x2 }; uint32 Type = 0; @@ -69,7 +75,7 @@ namespace WorldPackets uint8 TargetMinScalingLevel = 0; uint8 TargetMaxScalingLevel = 0; int8 TargetScalingLevelDelta = 0; - bool ScalesWithItemLevel = false; + uint32 Flags = NO_LEVEL_SCALING | NO_ITEM_LEVEL_SCALING; template<class T, class U> bool GenerateDataForUnits(T* attacker, U* target); diff --git a/src/server/game/Server/Packets/GarrisonPackets.cpp b/src/server/game/Server/Packets/GarrisonPackets.cpp index 55f778b39b6..a6cbf89ba15 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.cpp +++ b/src/server/game/Server/Packets/GarrisonPackets.cpp @@ -108,12 +108,17 @@ ByteBuffer& operator<<(ByteBuffer& data, GarrisonMission const& mission) ByteBuffer& operator<<(ByteBuffer& data, GarrisonMissionReward const& missionRewardItem) { data << int32(missionRewardItem.ItemID); - data << uint32(missionRewardItem.Quantity); + data << uint32(missionRewardItem.ItemQuantity); data << int32(missionRewardItem.CurrencyID); data << uint32(missionRewardItem.CurrencyQuantity); data << uint32(missionRewardItem.FollowerXP); - data << uint32(missionRewardItem.BonusAbilityID); - data << int32(missionRewardItem.Unknown); + data << uint32(missionRewardItem.GarrMssnBonusAbilityID); + data << int32(missionRewardItem.ItemFileDataID); + data.WriteBit(missionRewardItem.ItemInstance.is_initialized()); + data.FlushBits(); + + if (missionRewardItem.ItemInstance) + data << *missionRewardItem.ItemInstance; return data; } @@ -219,17 +224,9 @@ ByteBuffer& operator<<(ByteBuffer& data, GarrisonInfo const& garrison) for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionRewards) data << uint32(missionReward.size()); - for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionRewards) - for (GarrisonMissionReward const& missionRewardItem : missionReward) - data << missionRewardItem; - for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionOvermaxRewards) data << uint32(missionReward.size()); - for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionOvermaxRewards) - for (GarrisonMissionReward const& missionRewardItem : missionReward) - data << missionRewardItem; - for (GarrisonMissionBonusAbility const* areaBonus : garrison.MissionAreaBonuses) data << *areaBonus; @@ -259,6 +256,14 @@ ByteBuffer& operator<<(ByteBuffer& data, GarrisonInfo const& garrison) for (GarrisonTalent const& talent : garrison.Talents) data << talent; + for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionRewards) + for (GarrisonMissionReward const& missionRewardItem : missionReward) + data << missionRewardItem; + + for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionOvermaxRewards) + for (GarrisonMissionReward const& missionRewardItem : missionReward) + data << missionRewardItem; + return data; } diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h index cb33d51ff42..69fc2f14229 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.h +++ b/src/server/game/Server/Packets/GarrisonPackets.h @@ -19,6 +19,7 @@ #define GarrisonPackets_h__ #include "Packet.h" +#include "ItemPacketsCommon.h" #include "ObjectGuid.h" #include "Optional.h" #include "Position.h" @@ -119,12 +120,13 @@ namespace WorldPackets struct GarrisonMissionReward { int32 ItemID = 0; - uint32 Quantity = 0; + uint32 ItemQuantity = 0; int32 CurrencyID = 0; uint32 CurrencyQuantity = 0; uint32 FollowerXP = 0; - uint32 BonusAbilityID = 0; - int32 Unknown = 0; + uint32 GarrMssnBonusAbilityID = 0; + int32 ItemFileDataID = 0; + Optional<Item::ItemInstance> ItemInstance; }; struct GarrisonMissionBonusAbility diff --git a/src/server/game/Server/Packets/NPCPackets.cpp b/src/server/game/Server/Packets/NPCPackets.cpp index 770a7bb7ea3..951a5f152b8 100644 --- a/src/server/game/Server/Packets/NPCPackets.cpp +++ b/src/server/game/Server/Packets/NPCPackets.cpp @@ -80,12 +80,16 @@ WorldPacket const* GossipMessage::Write() _worldPacket.WriteBits(options.Text.size(), 12); _worldPacket.WriteBits(options.Confirm.size(), 12); _worldPacket.WriteBits(AsUnderlyingType(options.Status), 2); + _worldPacket.WriteBit(options.SpellID.is_initialized()); _worldPacket.FlushBits(); _worldPacket << options.Treasure; _worldPacket.WriteString(options.Text); _worldPacket.WriteString(options.Confirm); + + if (options.SpellID) + _worldPacket << int32(*options.SpellID); } for (ClientGossipText const& text : GossipText) diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h index c5d57b31efc..b3f85e218ed 100644 --- a/src/server/game/Server/Packets/NPCPackets.h +++ b/src/server/game/Server/Packets/NPCPackets.h @@ -70,6 +70,7 @@ namespace WorldPackets std::string Text; std::string Confirm; TreasureLootList Treasure; + Optional<int32> SpellID; }; struct ClientGossipText diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index 72388d1b98c..74a73352086 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -411,7 +411,7 @@ WorldPacket const* WorldPackets::Party::RolePollInform::Write() WorldPacket const* WorldPackets::Party::GroupNewLeader::Write() { _worldPacket << PartyIndex; - _worldPacket.WriteBits(Name.size(), 6); + _worldPacket.WriteBits(Name.size(), 9); _worldPacket.WriteString(Name); return &_worldPacket; diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 7c471793585..e75437322aa 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -23,13 +23,16 @@ enum AURA_FLAGS { - AFLAG_NONE = 0x00, - AFLAG_NOCASTER = 0x01, - AFLAG_POSITIVE = 0x02, - AFLAG_DURATION = 0x04, - AFLAG_SCALABLE = 0x08, - AFLAG_NEGATIVE = 0x10, - AFLAG_UNK20 = 0x20 + AFLAG_NONE = 0x0000, + AFLAG_NOCASTER = 0x0001, + AFLAG_POSITIVE = 0x0002, + AFLAG_DURATION = 0x0004, + AFLAG_SCALABLE = 0x0008, + AFLAG_NEGATIVE = 0x0010, + AFLAG_UNK20 = 0x0020, + AFLAG_UNK40 = 0x0040, + AFLAG_UNK80 = 0x0080, + AFLAG_MAW_POWER = 0x0100, }; // these are modes, in which aura effect handler may be called @@ -289,7 +292,7 @@ enum AuraType : uint32 SPELL_AURA_MOD_MELEE_HASTE_2 = 217, SPELL_AURA_218 = 218, // old SPELL_AURA_HASTE_RANGED SPELL_AURA_MOD_MANA_REGEN_FROM_STAT = 219, - SPELL_AURA_MOD_RATING_FROM_STAT = 220, + SPELL_AURA_MOD_ABILITY_SCHOOL_MASK = 220, // NYI SPELL_AURA_MOD_DETAUNT = 221, SPELL_AURA_222 = 222, SPELL_AURA_223 = 223, // old SPELL_AURA_RAID_PROC_FROM_CHARGE diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index b01003763d2..b9b599be9ea 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -138,7 +138,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNoImmediateEffect, // 69 SPELL_AURA_SCHOOL_ABSORB implemented in Unit::CalcAbsorbResist &AuraEffect::HandleUnused, // 70 SPELL_AURA_EXTRA_ATTACKS clientside &AuraEffect::HandleNULL, // 71 SPELL_AURA_71 - &AuraEffect::HandleModPowerCostPCT, // 72 SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT + &AuraEffect::HandleNoImmediateEffect, // 72 SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT &AuraEffect::HandleModPowerCost, // 73 SPELL_AURA_MOD_POWER_COST_SCHOOL &AuraEffect::HandleNoImmediateEffect, // 74 SPELL_AURA_REFLECT_SPELLS_SCHOOL implemented in Unit::SpellHitResult &AuraEffect::HandleNoImmediateEffect, // 75 SPELL_AURA_MOD_LANGUAGE @@ -286,7 +286,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleModMeleeSpeedPct, //217 SPELL_AURA_MOD_MELEE_HASTE_2 &AuraEffect::HandleNULL, //218 Affects item stats from equipment &AuraEffect::HandleModManaRegen, //219 SPELL_AURA_MOD_MANA_REGEN_FROM_STAT - &AuraEffect::HandleModRatingFromStat, //220 SPELL_AURA_MOD_RATING_FROM_STAT + &AuraEffect::HandleNULL, //220 SPELL_AURA_MOD_ABILITY_SCHOOL_MASK &AuraEffect::HandleNULL, //221 SPELL_AURA_MOD_DETAUNT &AuraEffect::HandleUnused, //222 unused (3.2.0) only for spell 44586 that not used in real spell cast &AuraEffect::HandleUnused, //223 unused (7.2.0) @@ -4238,22 +4238,6 @@ void AuraEffect::HandleModRating(AuraApplication const* aurApp, uint8 mode, bool target->ToPlayer()->ApplyRatingMod(CombatRating(rating), GetAmount(), apply); } -void AuraEffect::HandleModRatingFromStat(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const -{ - if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT))) - return; - - Unit* target = aurApp->GetTarget(); - - if (target->GetTypeId() != TYPEID_PLAYER) - return; - - // Just recalculate ratings - for (uint32 rating = 0; rating < MAX_COMBAT_RATING; ++rating) - if (GetMiscValue() & (1 << rating)) - target->ToPlayer()->UpdateRating(CombatRating(rating)); -} - void AuraEffect::HandleModRatingPct(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const { if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT))) @@ -4432,19 +4416,6 @@ void AuraEffect::HandleShieldBlockValuePercent(AuraApplication const* aurApp, ui /*** POWER COST ***/ /********************************/ -void AuraEffect::HandleModPowerCostPCT(AuraApplication const* aurApp, uint8 mode, bool apply) const -{ - if (!(mode & AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK)) - return; - - Unit* target = aurApp->GetTarget(); - - float amount = CalculatePct(1.0f, GetAmount()); - for (int i = 0; i < MAX_SPELL_SCHOOL; ++i) - if (GetMiscValue() & (1 << i)) - target->ApplyModPowerCostMultiplier(SpellSchools(i), amount, apply); -} - void AuraEffect::HandleModPowerCost(AuraApplication const* aurApp, uint8 mode, bool apply) const { if (!(mode & AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK)) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 68b581b03ca..153d22fdc1a 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -279,7 +279,6 @@ class TC_GAME_API AuraEffect void HandleAuraModRangedHaste(AuraApplication const* aurApp, uint8 mode, bool apply) const; // combat rating void HandleModRating(AuraApplication const* aurApp, uint8 mode, bool apply) const; - void HandleModRatingFromStat(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleModRatingPct(AuraApplication const* aurApp, uint8 mode, bool apply) const; // attack power void HandleAuraModAttackPower(AuraApplication const* aurApp, uint8 mode, bool apply) const; @@ -293,7 +292,6 @@ class TC_GAME_API AuraEffect void HandleShieldBlockValue(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleShieldBlockValuePercent(AuraApplication const* aurApp, uint8 mode, bool apply) const; // power cost - void HandleModPowerCostPCT(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleModPowerCost(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleArenaPreparation(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleNoReagentUseAura(AuraApplication const* aurApp, uint8 mode, bool apply) const; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index b0864d5b5d7..17de88f5fc0 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -3811,6 +3811,7 @@ std::vector<SpellPowerCost> SpellInfo::CalcPowerCost(Unit const* caster, SpellSc if (power->PowerType != POWER_HEALTH) { // Flat mod from caster auras by spell school and power type + int32 flatMod = 0; Unit::AuraEffectList const& auras = caster->GetAuraEffectsByType(SPELL_AURA_MOD_POWER_COST_SCHOOL); for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i) { @@ -3820,8 +3821,13 @@ std::vector<SpellPowerCost> SpellInfo::CalcPowerCost(Unit const* caster, SpellSc if (!((*i)->GetMiscValueB() & (1 << power->PowerType))) continue; - powerCost += (*i)->GetAmount(); + flatMod += (*i)->GetAmount(); } + + if (power->PowerType == POWER_MANA) + flatMod *= 1.0f + caster->m_unitData->ManaCostModifierModifier; + + powerCost += flatMod; } // Shiv - costs 20 + weaponSpeed*10 energy (apply only to non-triggered spell with energy cost) @@ -3833,7 +3839,7 @@ std::vector<SpellPowerCost> SpellInfo::CalcPowerCost(Unit const* caster, SpellSc else { WeaponAttackType slot = BASE_ATTACK; - if (HasAttribute(SPELL_ATTR3_REQ_OFFHAND)) + if (!HasAttribute(SPELL_ATTR3_MAIN_HAND) && HasAttribute(SPELL_ATTR3_REQ_OFFHAND)) slot = OFF_ATTACK; speed = caster->GetBaseAttackTime(slot); @@ -3845,13 +3851,23 @@ std::vector<SpellPowerCost> SpellInfo::CalcPowerCost(Unit const* caster, SpellSc // Apply cost mod by spell if (Player* modOwner = caster->GetSpellModOwner()) { - if (power->OrderIndex == 0) - modOwner->ApplySpellMod(Id, SPELLMOD_COST, powerCost, spell); - else if (power->OrderIndex == 1) - modOwner->ApplySpellMod(Id, SPELLMOD_SPELL_COST2, powerCost, spell); + switch (power->OrderIndex) + { + case 0: + modOwner->ApplySpellMod(Id, SPELLMOD_COST, powerCost, spell); + break; + case 1: + modOwner->ApplySpellMod(Id, SPELLMOD_SPELL_COST2, powerCost, spell); + break; + case 2: + modOwner->ApplySpellMod(Id, SPELLMOD_SPELL_COST3, powerCost, spell); + break; + default: + break; + } } - if (!caster->IsControlledByPlayer() && G3D::fuzzyEq(power->PowerCostPct, 0.0f) && SpellLevel) + if (!caster->IsControlledByPlayer() && G3D::fuzzyEq(power->PowerCostPct, 0.0f) && SpellLevel && power->PowerType == POWER_MANA) { if (HasAttribute(SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION)) { |