aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-01-02 15:15:59 +0100
committerShauren <shauren.trinity@gmail.com>2015-01-02 15:15:59 +0100
commit97f7ca315486fdd731569e1bdc44e6b06b91d458 (patch)
tree3f3c319516869b97c13e46c8fae5ff1b744914fc /src/server/game/Server
parent9187e5a5f461245a5494c386a9116bc14d6ad1e6 (diff)
Core/PacketIO: Fixed duration field order in SMSG_AURA_UPDATE
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp100
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h30
2 files changed, 57 insertions, 73 deletions
diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp
index 41e2bf1d819..53ec8a7f3cf 100644
--- a/src/server/game/Server/Packets/SpellPackets.cpp
+++ b/src/server/game/Server/Packets/SpellPackets.cpp
@@ -90,87 +90,49 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData
return data;
}
-WorldPacket const* WorldPackets::Spells::SendAuraUpdate::Write()
+WorldPacket const* WorldPackets::Spells::AuraUpdate::Write()
{
- return &_worldPacket;
-}
-
-void WorldPackets::Spells::SendAuraUpdate::Init(bool IsFullUpdate, ObjectGuid Target, uint32 Count)
-{
- _worldPacket.WriteBit(IsFullUpdate);
- _worldPacket << Target;
- _worldPacket << uint32(Count);
-}
-
-void WorldPackets::Spells::SendAuraUpdate::BuildUpdatePacket(AuraApplication* aurApp, bool remove, uint16 level)
-{
- _worldPacket << uint8(aurApp->GetSlot());
- _worldPacket.ResetBitPos();
- _worldPacket.WriteBit(!remove);
-
- if (remove)
+ _worldPacket.WriteBit(UpdateAll);
+ _worldPacket << UnitGUID;
+ _worldPacket << uint32(Auras.size());
+ for (auto& aura : Auras)
{
- _worldPacket.FlushBits();
- return;
- }
- Aura const* aura = aurApp->GetBase();
- _worldPacket << uint32(aura->GetId());
-
- uint8 flags = aurApp->GetFlags();
- if (aura->GetMaxDuration() > 0 && !(aura->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_HIDE_DURATION))
- flags |= AFLAG_DURATION;
- _worldPacket << uint8(flags);
-
- _worldPacket << uint32(aurApp->GetEffectMask());
+ _worldPacket << aura.Slot;
+ if (_worldPacket.WriteBit(aura.AuraData.HasValue))
+ {
+ AuraDataInfo const& data = aura.AuraData.Value;
+ _worldPacket << uint32(data.SpellID);
+ _worldPacket << uint8(data.Flags);
+ _worldPacket << uint32(data.ActiveFlags);
+ _worldPacket << uint16(data.CastLevel);
+ _worldPacket << uint8(data.Applications);
+ _worldPacket << uint32(data.EstimatedPoints.size());
+ _worldPacket << uint32(data.Points.size());
- _worldPacket << uint16(level);
+ if (!data.EstimatedPoints.empty())
+ _worldPacket.append(data.EstimatedPoints.data(), data.EstimatedPoints.size());
- // send stack amount for aura which could be stacked (never 0 - causes incorrect display) or charges
- // stack amount has priority over charges (checked on retail with spell 50262)
- _worldPacket << uint8(aura->GetSpellInfo()->StackAmount ? aura->GetStackAmount() : aura->GetCharges());
+ if (!data.Points.empty())
+ _worldPacket.append(data.Points.data(), data.Points.size());
- uint32 int72 = 0;
- _worldPacket << int72;
+ _worldPacket.WriteBit(data.CastUnit.HasValue);
+ _worldPacket.WriteBit(data.Duration.HasValue);
+ _worldPacket.WriteBit(data.Remaining.HasValue);
- size_t pos = _worldPacket.wpos();
- uint32 count = 0;
- _worldPacket << count;
+ if (data.CastUnit.HasValue)
+ _worldPacket << data.CastUnit.Value;
- //for (int72)
- // float
+ if (data.Duration.HasValue)
+ _worldPacket << uint32(data.Duration.Value);
- if (flags & AFLAG_SCALABLE)
- {
- for (AuraEffect const* effect : aura->GetAuraEffects())
- {
- if (effect && aurApp->HasEffect(effect->GetEffIndex())) // Not all of aura's effects have to be applied on every target
- {
- _worldPacket << float(effect->GetAmount());
- count++;
- }
+ if (data.Remaining.HasValue)
+ _worldPacket << uint32(data.Remaining.Value);
}
- }
-
- _worldPacket.put<uint32>(pos, count);
-
- _worldPacket.ResetBitPos();
-
- _worldPacket.WriteBit(!(flags & AFLAG_NOCASTER));
- _worldPacket.WriteBit(aura->GetDuration());
- _worldPacket.WriteBit(aura->GetMaxDuration());
- if (!(flags & AFLAG_NOCASTER))
- _worldPacket << aura->GetCasterGUID().WriteAsPacked();
-
- if (aura->GetDuration())
- {
- _worldPacket << uint32(aura->GetDuration());
+ _worldPacket.FlushBits();
}
- if (aura->GetMaxDuration())
- {
- _worldPacket << uint32(aura->GetMaxDuration());
- }
+ return &_worldPacket;
}
void WorldPackets::Spells::SpellCastRequest::Read()
diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h
index d131eefc765..8357c470573 100644
--- a/src/server/game/Server/Packets/SpellPackets.h
+++ b/src/server/game/Server/Packets/SpellPackets.h
@@ -112,14 +112,36 @@ namespace WorldPackets
std::vector<SpellLogPowerData> PowerData;
};
- class SendAuraUpdate final : public ServerPacket
+ struct AuraDataInfo
+ {
+ int32 SpellID = 0;
+ uint8 Flags = 0;
+ uint32 ActiveFlags = 0;
+ uint16 CastLevel = 1;
+ uint8 Applications = 1;
+ Optional<ObjectGuid> CastUnit;
+ Optional<int32> Duration;
+ Optional<int32> Remaining;
+ std::vector<float> Points;
+ std::vector<float> EstimatedPoints;
+ };
+
+ struct AuraInfo
+ {
+ uint8 Slot = 0;
+ Optional<AuraDataInfo> AuraData;
+ };
+
+ class AuraUpdate final : public ServerPacket
{
public:
- SendAuraUpdate() : ServerPacket(SMSG_AURA_UPDATE) { }
+ AuraUpdate() : ServerPacket(SMSG_AURA_UPDATE) { }
WorldPacket const* Write() override;
- void Init(bool IsFullUpdate, ObjectGuid Target, uint32 Count);
- void BuildUpdatePacket(AuraApplication* aurApp, bool remove, uint16 level);
+
+ bool UpdateAll = false;
+ ObjectGuid UnitGUID;
+ std::vector<AuraInfo> Auras;
};
class SpellCastRequest final : public ClientPacket