aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.cpp32
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h9
-rw-r--r--src/server/game/Entities/Player/Player.cpp12
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp13
-rw-r--r--src/server/game/Entities/Unit/Unit.h6
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.cpp9
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.h2
-rw-r--r--src/server/game/Server/Packets/CombatLogPackets.cpp2
-rw-r--r--src/server/game/Server/Packets/CombatLogPacketsCommon.cpp2
-rw-r--r--src/server/game/Server/Packets/CombatLogPacketsCommon.h18
-rw-r--r--src/server/game/Server/Packets/GarrisonPackets.cpp27
-rw-r--r--src/server/game/Server/Packets/GarrisonPackets.h8
-rw-r--r--src/server/game/Server/Packets/NPCPackets.cpp4
-rw-r--r--src/server/game/Server/Packets/NPCPackets.h1
-rw-r--r--src/server/game/Server/Packets/PartyPackets.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraDefines.h19
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp33
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h2
-rw-r--r--src/server/game/Spells/SpellInfo.cpp30
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))
{