diff options
| author | Shauren <shauren.trinity@gmail.com> | 2015-02-17 01:01:44 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2015-02-17 01:01:44 +0100 |
| commit | 56186319bdd41dd26b6cc14f84e6e41eef5d953b (patch) | |
| tree | 7b531cdf71b59170f9fa65120c09935ce51f3307 /src/server/game/Server | |
| parent | 7829412416c9709991fd686030ab77908c27922b (diff) | |
Core/Spells: Cooldown updates
* Refactored cooldown handling to separate class shared by creatures and players
* Updated and enabled cooldown packets
* Implemented creature school lockouts
* Implemented spell charges
* Fixed AuraUpdate structure
* Fixed aura flag AFLAG_NOCASTER handling
* Implemented spell charge related auras
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 119 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 126 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 20 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 2 |
4 files changed, 252 insertions, 15 deletions
diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index 50251c71c8b..a79ff8d4c96 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -112,15 +112,15 @@ WorldPacket const* WorldPackets::Spells::AuraUpdate::Write() _worldPacket << uint32(data.ActiveFlags); _worldPacket << uint16(data.CastLevel); _worldPacket << uint8(data.Applications); - _worldPacket << uint32(data.EstimatedPoints.size()); _worldPacket << uint32(data.Points.size()); - - if (!data.EstimatedPoints.empty()) - _worldPacket.append(data.EstimatedPoints.data(), data.EstimatedPoints.size()); + _worldPacket << uint32(data.EstimatedPoints.size()); if (!data.Points.empty()) _worldPacket.append(data.Points.data(), data.Points.size()); + if (!data.EstimatedPoints.empty()) + _worldPacket.append(data.EstimatedPoints.data(), data.EstimatedPoints.size()); + _worldPacket.WriteBit(data.CastUnit.HasValue); _worldPacket.WriteBit(data.Duration.HasValue); _worldPacket.WriteBit(data.Remaining.HasValue); @@ -487,3 +487,114 @@ WorldPacket const* WorldPackets::Spells::CooldownEvent::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Spells::ClearCooldowns::Write() +{ + _worldPacket << Guid; + _worldPacket << uint32(SpellID.size()); + if (!SpellID.empty()) + _worldPacket.append(SpellID.data(), SpellID.size()); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::ClearCooldown::Write() +{ + _worldPacket << CasterGUID; + _worldPacket << uint32(SpellID); + _worldPacket.WriteBit(ClearOnHold); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::ModifyCooldown::Write() +{ + _worldPacket << int32(SpellID); + _worldPacket << UnitGUID; + _worldPacket << int32(DeltaTime); + + return &_worldPacket; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCooldownStruct const& cooldown) +{ + data << uint32(cooldown.SrecID); + data << uint32(cooldown.ForcedCooldown); + return data; +} + +WorldPacket const* WorldPackets::Spells::SpellCooldown::Write() +{ + _worldPacket << Caster; + _worldPacket << uint8(Flags); + _worldPacket << uint32(SpellCooldowns.size()); + for (SpellCooldownStruct const& cooldown : SpellCooldowns) + _worldPacket << cooldown; + + return &_worldPacket; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellHistoryEntry const& historyEntry) +{ + data << uint32(historyEntry.SpellID); + data << uint32(historyEntry.ItemID); + data << uint32(historyEntry.Category); + data << int32(historyEntry.RecoveryTime); + data << int32(historyEntry.CategoryRecoveryTime); + data.WriteBit(historyEntry.OnHold); + data.FlushBits(); + + return data; +} + +WorldPacket const* WorldPackets::Spells::SendSpellHistory::Write() +{ + _worldPacket << uint32(Entries.size()); + for (SpellHistoryEntry const& historyEntry : Entries) + _worldPacket << historyEntry; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::ClearAllSpellCharges::Write() +{ + _worldPacket << Unit; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::ClearSpellCharges::Write() +{ + _worldPacket << Unit; + _worldPacket << int32(Category); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::SetSpellCharges::Write() +{ + _worldPacket << int32(Category); + _worldPacket << float(Count); + _worldPacket.WriteBit(IsPet); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellChargeEntry const& chargeEntry) +{ + data << uint32(chargeEntry.Category); + data << uint32(chargeEntry.NextRecoveryTime); + data << uint8(chargeEntry.ConsumedCharges); + return data; +} + +WorldPacket const* WorldPackets::Spells::SendSpellCharges::Write() +{ + _worldPacket << uint32(Entries.size()); + for (SpellChargeEntry const& chargeEntry : Entries) + _worldPacket << chargeEntry; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index ed84885f0a0..da877afbf8d 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -420,6 +420,132 @@ namespace WorldPackets ObjectGuid CasterGUID; int32 SpellID; }; + + class ClearCooldowns final : public ServerPacket + { + public: + ClearCooldowns() : ServerPacket(SMSG_CLEAR_COOLDOWNS, 4 + 16) { } + + WorldPacket const* Write() override; + + std::vector<int32> SpellID; + ObjectGuid Guid; + }; + + class ClearCooldown final : public ServerPacket + { + public: + ClearCooldown() : ServerPacket(SMSG_CLEAR_COOLDOWN, 16 + 4 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid CasterGUID; + int32 SpellID = 0; + bool ClearOnHold = false; + }; + + class ModifyCooldown final : public ServerPacket + { + public: + ModifyCooldown() : ServerPacket(SMSG_MODIFY_COOLDOWN, 16 + 4 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid UnitGUID; + int32 DeltaTime = 0; + int32 SpellID = 0; + }; + + struct SpellCooldownStruct + { + SpellCooldownStruct() { } + SpellCooldownStruct(uint32 spellId, uint32 forcedCooldown) : SrecID(spellId), ForcedCooldown(forcedCooldown) { } + + uint32 SrecID = 0; + uint32 ForcedCooldown = 0; + }; + + class SpellCooldown : public ServerPacket + { + public: + SpellCooldown() : ServerPacket(SMSG_SPELL_COOLDOWN, 4 + 16 + 1) { } + + WorldPacket const* Write() override; + + std::vector<SpellCooldownStruct> SpellCooldowns; + ObjectGuid Caster; + uint8 Flags = 0; + }; + + struct SpellHistoryEntry + { + uint32 SpellID = 0; + uint32 ItemID = 0; + uint32 Category = 0; + int32 RecoveryTime = 0; + int32 CategoryRecoveryTime = 0; + bool OnHold = false; + }; + + class SendSpellHistory final : public ServerPacket + { + public: + SendSpellHistory() : ServerPacket(SMSG_SEND_SPELL_HISTORY, 4) { } + + WorldPacket const* Write() override; + + std::vector<SpellHistoryEntry> Entries; + }; + + class ClearAllSpellCharges final : public ServerPacket + { + public: + ClearAllSpellCharges() : ServerPacket(SMSG_CLEAR_ALL_SPELL_CHARGES, 16) { } + + WorldPacket const* Write() override; + + ObjectGuid Unit; + }; + + class ClearSpellCharges final : public ServerPacket + { + public: + ClearSpellCharges() : ServerPacket(SMSG_CLEAR_SPELL_CHARGES, 20) { } + + WorldPacket const* Write() override; + + ObjectGuid Unit; + int32 Category = 0; + }; + + class SetSpellCharges final : public ServerPacket + { + public: + SetSpellCharges() : ServerPacket(SMSG_SET_SPELL_CHARGES, 1 + 4 + 4) { } + + WorldPacket const* Write() override; + + bool IsPet = false; + float Count = 0.0f; + int32 Category = 0; + }; + + struct SpellChargeEntry + { + uint32 Category = 0; + uint32 NextRecoveryTime = 0; + uint8 ConsumedCharges = 0; + }; + + class SendSpellCharges final : public ServerPacket + { + public: + SendSpellCharges() : ServerPacket(SMSG_SEND_SPELL_CHARGES, 4) { } + + WorldPacket const* Write() override; + + std::vector<SpellChargeEntry> Entries; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 08f008d673c..882e04cbf63 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1119,15 +1119,15 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHEAT_IGNORE_DIMISHING_RETURNS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHECK_FOR_BOTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHECK_WARGAME_ENTRY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_ALL_SPELL_CHARGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_ALL_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_BOSS_EMOTES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWNS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWNS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_FAR_SIGHT_IMMEDIATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_LOSS_OF_CONTROL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_QUEST_COMPLETED_BIT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_QUEST_COMPLETED_BITS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_SPELL_CHARGES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TARGET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLIENTCACHE_VERSION, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLIENT_CONTROL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1153,7 +1153,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTACT_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONVERT_RUNE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_CHEAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_EVENT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_EVENT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_LOCATION, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_RECLAIM_DELAY, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_TRANSPORT_QUERY, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1469,7 +1469,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_COMPONENTED_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_CREATURE_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MISSILE_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MONEY_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOTD, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1758,8 +1758,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_MAIL_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_RAID_TARGET_UPDATE_ALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_RAID_TARGET_UPDATE_SINGLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_CHARGES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_HISTORY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_HISTORY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_UNLEARN_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_FIRST_ACHIEVEMENT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_FIRST_ACHIEVEMENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1795,7 +1795,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROJECTILE_POSITION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_QUEST_COMPLETED_BIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_RAID_DIFFICULTY, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_SPELL_CHARGES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TASK_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TIME_ZONE_INFORMATION, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_VEHICLE_REC_ID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1814,7 +1814,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLSTEALLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_ABSORB_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_CATEGORY_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DAMAGE_SHIELD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DELAYED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DISPEL_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index bb8ae55c0f9..50c2daa05aa 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -1031,7 +1031,7 @@ enum OpcodeServer : uint32 SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x194C, SMSG_CHECK_FOR_BOTS = 0xBADD, SMSG_CHECK_WARGAME_ENTRY = 0x1203, - SMSG_CLEAR_ALL_SPELL_CHARGE = 0x088B, + SMSG_CLEAR_ALL_SPELL_CHARGES = 0x088B, SMSG_CLEAR_BOSS_EMOTES = 0x118B, SMSG_CLEAR_COOLDOWN = 0x0226, SMSG_CLEAR_COOLDOWNS = 0x0BFA, |
