diff options
| author | Shauren <shauren.trinity@gmail.com> | 2015-01-02 15:15:59 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2015-01-02 15:15:59 +0100 |
| commit | 97f7ca315486fdd731569e1bdc44e6b06b91d458 (patch) | |
| tree | 3f3c319516869b97c13e46c8fae5ff1b744914fc /src/server/game/Server | |
| parent | 9187e5a5f461245a5494c386a9116bc14d6ad1e6 (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.cpp | 100 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 30 |
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 |
