diff options
| author | Intel <chemicstry@gmail.com> | 2014-11-19 00:30:31 +0200 |
|---|---|---|
| committer | Intel <chemicstry@gmail.com> | 2014-11-19 20:18:14 +0200 |
| commit | b86bf40f617a480f8e78bbde2e9884dd9edd2ebe (patch) | |
| tree | 74c70848170eced6222df44b812b79a00ea122b8 /src/server/game/Server | |
| parent | 73a7d7c0538b5c791aaa89caae6547c4b330dd80 (diff) | |
Core/Packets: Added the following packets:
CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY
SMSG_QUESTGIVER_STATUS_MULTIPLE
CMSG_QUESTGIVER_STATUS_QUERY
SMSG_QUESTGIVER_STATUS
SMSG_AI_REACTION
SMSG_ATTACKERSTATEUPDATE
SMSG_ATTACKSTART
SMSG_ATTACKSTOP
SMSG_THREAT_UPDATE
SMSG_HIGHEST_THREAT_UPDATE
SMSG_SET_PROFICIENCY
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/Packets/CombatPackets.cpp | 118 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/CombatPackets.h | 123 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 17 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 16 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 25 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 10 |
6 files changed, 295 insertions, 14 deletions
diff --git a/src/server/game/Server/Packets/CombatPackets.cpp b/src/server/game/Server/Packets/CombatPackets.cpp index 17c0599d266..3383435814c 100644 --- a/src/server/game/Server/Packets/CombatPackets.cpp +++ b/src/server/game/Server/Packets/CombatPackets.cpp @@ -16,8 +16,126 @@ */ #include "CombatPackets.h" +#include "SpellPackets.h" void WorldPackets::Combat::AttackSwing::Read() { _worldPacket >> Victim; } + +WorldPacket const* WorldPackets::Combat::AttackStart::Write() +{ + _worldPacket << Attacker; + _worldPacket << Victim; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Combat::SAttackStop::Write() +{ + _worldPacket << Attacker; + _worldPacket << Victim; + _worldPacket.WriteBit(Dead); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Combat::ThreatUpdate::Write() +{ + _worldPacket << UnitGUID; + _worldPacket << int32(ThreatList.size()); + for (WorldPackets::Combat::ThreatInfo const& threatInfo : ThreatList) + { + _worldPacket << threatInfo.UnitGUID; + _worldPacket << threatInfo.Threat; + } + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Combat::HighestThreatUpdate::Write() +{ + _worldPacket << UnitGUID; + _worldPacket << HighestThreatGUID; + _worldPacket << int32(ThreatList.size()); + for (WorldPackets::Combat::ThreatInfo const& threatInfo : ThreatList) + { + _worldPacket << threatInfo.UnitGUID; + _worldPacket << threatInfo.Threat; + } + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Combat::ThreatRemove::Write() +{ + _worldPacket << UnitGUID; + _worldPacket << AboutGUID; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Combat::AIReaction::Write() +{ + _worldPacket << UnitGUID; + _worldPacket << Reaction; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Combat::AttackerStateUpdate::Write() +{ + if (_worldPacket.WriteBit(LogData.HasValue)) + _worldPacket << LogData.value; + + // Placeholder for size which will be calculated at the end based on packet size + // Client uses this size to copy remaining packet to another CDataStore + _worldPacket << int32(0); + size_t pos = _worldPacket.wpos(); + + _worldPacket << HitInfo; + _worldPacket << AttackerGUID; + _worldPacket << VictimGUID; + _worldPacket << Damage; + _worldPacket << OverDamage; + if (_worldPacket.WriteBit(SubDmg.HasValue)) + { + _worldPacket << SubDmg.value.SchoolMask; + _worldPacket << SubDmg.value.FDamage; + _worldPacket << SubDmg.value.Damage; + if (HitInfo & (HITINFO_FULL_ABSORB|HITINFO_PARTIAL_ABSORB)) + _worldPacket << SubDmg.value.Absorbed; + if (HitInfo & (HITINFO_FULL_RESIST|HITINFO_PARTIAL_RESIST)) + _worldPacket << SubDmg.value.Resisted; + } + _worldPacket << VictimState; + _worldPacket << AttackerState; + _worldPacket << MeleeSpellID; + if (HitInfo & HITINFO_BLOCK) + _worldPacket << BlockAmount; + if (HitInfo & HITINFO_RAGE_GAIN) + _worldPacket << RageGained; + if (HitInfo & HITINFO_UNK1) + { + _worldPacket << UnkState.State1; + _worldPacket << UnkState.State2; + _worldPacket << UnkState.State3; + _worldPacket << UnkState.State4; + _worldPacket << UnkState.State5; + _worldPacket << UnkState.State6; + _worldPacket << UnkState.State7; + _worldPacket << UnkState.State8; + _worldPacket << UnkState.State9; + _worldPacket << UnkState.State10; + _worldPacket << UnkState.State11; + _worldPacket << UnkState.State12; + } + if (HitInfo & (HITINFO_BLOCK|HITINFO_UNK12)) + _worldPacket << Unk; + + // Update size placeholder + _worldPacket.put<int32>(pos-sizeof(int32), _worldPacket.wpos()-pos); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/CombatPackets.h b/src/server/game/Server/Packets/CombatPackets.h index 5c6576e68c5..14648297342 100644 --- a/src/server/game/Server/Packets/CombatPackets.h +++ b/src/server/game/Server/Packets/CombatPackets.h @@ -20,6 +20,7 @@ #include "Packet.h" #include "ObjectGuid.h" +#include "SpellPackets.h" namespace WorldPackets { @@ -42,6 +43,128 @@ namespace WorldPackets void Read() override { } }; + + class AttackStart final : public ServerPacket + { + public: + AttackStart() : ServerPacket(SMSG_ATTACKSTART, 16) { } + + WorldPacket const* Write() override; + + ObjectGuid Attacker; + ObjectGuid Victim; + }; + + class SAttackStop final : public ServerPacket + { + public: + SAttackStop() : ServerPacket(SMSG_ATTACKSTOP, 17) { } + + WorldPacket const* Write() override; + + ObjectGuid Attacker; + ObjectGuid Victim; + bool Dead = false; + }; + + struct ThreatInfo + { + ObjectGuid UnitGUID; + int32 Threat = 0; + }; + + class ThreatUpdate final : public ServerPacket + { + public: + ThreatUpdate() : ServerPacket(SMSG_THREAT_UPDATE, 24) { } + + WorldPacket const* Write() override; + + ObjectGuid UnitGUID; + std::vector<ThreatInfo> ThreatList; + }; + + class HighestThreatUpdate final : public ServerPacket + { + public: + HighestThreatUpdate() : ServerPacket(SMSG_HIGHEST_THREAT_UPDATE, 44) { } + + WorldPacket const* Write() override; + + ObjectGuid UnitGUID; + std::vector<ThreatInfo> ThreatList; + ObjectGuid HighestThreatGUID; + }; + + class ThreatRemove final : public ServerPacket + { + public: + ThreatRemove() : ServerPacket(SMSG_THREAT_REMOVE, 16) { } + + WorldPacket const* Write() override; + + ObjectGuid AboutGUID; // Unit to remove threat from (e.g. player, pet, guardian) + ObjectGuid UnitGUID; // Unit being attacked (e.g. creature, boss) + }; + + class AIReaction final : public ServerPacket + { + public: + AIReaction() : ServerPacket(SMSG_AI_REACTION, 12) { } + + WorldPacket const* Write() override; + + ObjectGuid UnitGUID; + uint32 Reaction = 0; + }; + + struct SubDamage + { + int32 SchoolMask = 0; + float FDamage = 0.0f; // Float damage (Most of the time equals to Damage) + int32 Damage = 0; + int32 Absorbed = 0; + int32 Resisted = 0; + }; + + struct UnkAttackerState + { + int32 State1 = 0; + float State2 = 0.0f; + float State3 = 0.0f; + float State4 = 0.0f; + float State5 = 0.0f; + float State6 = 0.0f; + float State7 = 0.0f; + float State8 = 0.0f; + float State9 = 0.0f; + float State10 = 0.0f; + float State11 = 0.0f; + int32 State12 = 0; + }; + + class AttackerStateUpdate final : public ServerPacket + { + public: + AttackerStateUpdate() : ServerPacket(SMSG_ATTACKERSTATEUPDATE, 70) { } + + WorldPacket const* Write() override; + + Optional<WorldPackets::Spell::SpellCastLogData> LogData; + uint32 HitInfo = 0; // Flags + ObjectGuid AttackerGUID; + ObjectGuid VictimGUID; + int32 Damage = 0; + int32 OverDamage = -1; // (damage - health) or -1 if unit is still alive + Optional<SubDamage> SubDmg; + uint8 VictimState = 0; + int32 AttackerState = -1; + int32 MeleeSpellID = 0; + int32 BlockAmount = 0; + int32 RageGained = 0; + UnkAttackerState UnkState; + float Unk = 0.0f; + }; } } diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index 09914b292bb..6ca1012a51c 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -64,3 +64,20 @@ WorldPacket const* WorldPackets::Spell::SendUnlearnSpells::Write() return &_worldPacket; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spell::SpellCastLogData& spellCastLogData) +{ + data << spellCastLogData.Health; + data << spellCastLogData.AttackPower; + data << spellCastLogData.SpellPower; + data << int32(spellCastLogData.PowerData.size()); + for (WorldPackets::Spell::SpellLogPowerData const& powerData : spellCastLogData.PowerData) + { + data << powerData.PowerType; + data << powerData.Amount; + } + data.FlushBits(); + data.WriteBit(false); + // data << float // Unk data if bit is true + data.FlushBits(); +} + diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index c02f5cc2a5f..0bfd979b6ca 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -84,7 +84,23 @@ namespace WorldPackets std::vector<uint32> Spells; }; + + struct SpellLogPowerData + { + int32 PowerType = 0; + int32 Amount = 0; + }; + + struct SpellCastLogData + { + int32 Health = 0; + int32 AttackPower = 0; + int32 SpellPower = 0; + std::vector<SpellLogPowerData> PowerData; + }; } } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spell::SpellCastLogData& spellCastLogData); + #endif // SpellPackets_h__ diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 595e19cd7ef..ab4b768cfd4 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -27,6 +27,7 @@ #include "Packets/MiscPackets.h" #include "Packets/MovementPackets.h" #include "Packets/QueryPackets.h" +#include "Packets/QuestPackets.h" #include "Packets/TalentPackets.h" #include "Packets/TradePackets.h" @@ -524,8 +525,8 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_HELLO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverHelloOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_QUERY_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverQueryQuestOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_REQUEST_REWARD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverRequestRewardOpcode); - DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverStatusMultipleQuery); - DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_STATUS_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleQuestgiverStatusQueryOpcode); + DEFINE_HANDLER(CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverStatusMultipleQuery, &WorldSession::HandleQuestgiverStatusMultipleQuery); + DEFINE_HANDLER(CMSG_QUESTGIVER_STATUS_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Quest::QuestGiverStatusQuery, &WorldSession::HandleQuestgiverStatusQueryOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTLOG_REMOVE_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestLogRemoveQuest ); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_CONFIRM_ACCEPT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestConfirmAccept ); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_NPC_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestNPCQuery ); @@ -701,7 +702,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATETAXIREPLY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADDON_INFO, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_RUNE_POWER, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AI_REACTION, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AI_REACTION, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACHIEVEMENT_DATA, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_SPIRIT_HEALER_TIME, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_MESSAGE, STATUS_UNHANDLED); @@ -715,9 +716,9 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_QUERY_RESPONSE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_ROSTER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_STATS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKERSTATEUPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSTART, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSTOP, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKERSTATEUPDATE, STATUS_NEVER); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSTART, STATUS_NEVER); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSTOP, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_BADFACING, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_CANT_ATTACK, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_DEADTARGET, STATUS_UNHANDLED); @@ -992,7 +993,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_XP, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_XP_GAIN, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_HEALTH_UPDATE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_HIGHEST_THREAT_UPDATE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_HIGHEST_THREAT_UPDATE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_INFO, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_NOTIFY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIALIZE_FACTIONS, STATUS_NEVER); @@ -1210,8 +1211,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_INVALID, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_LIST, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_REQUEST_ITEMS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS_MULTIPLE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS, STATUS_NEVER); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS_MULTIPLE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTLOG_FULL, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_ADD_KILL, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_ADD_PVP_KILL, STATUS_UNHANDLED); @@ -1279,7 +1280,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PHASE_SHIFT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAY_HOVER_ANIM, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROFICIENCY, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROFICIENCY, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROJECTILE_POSITION, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TIME_ZONE_INFORMATION, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOWTAXINODES, STATUS_UNHANDLED); @@ -1357,8 +1358,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_TEST_DROP_RATE_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TEXT_EMOTE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_CLEAR, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_REMOVE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_UPDATE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_REMOVE, STATUS_NEVER); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_UPDATE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TIME_ADJUSTMENT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TIME_SYNC_REQ, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TITLE_EARNED, STATUS_UNHANDLED); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 1b2d6c5762a..c176bf5a3b1 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -154,6 +154,12 @@ namespace WorldPackets class QueryPageText; } + namespace Quest + { + class QuestGiverStatusQuery; + class QuestGiverStatusMultipleQuery; + } + namespace Movement { class ClientPlayerMovement; @@ -833,8 +839,8 @@ class WorldSession void HandleUnlearnSkillOpcode(WorldPacket& recvPacket); void HandleSetSpecializationOpcode(WorldPackets::Talent::SetSpecialization& packet); - void HandleQuestgiverStatusQueryOpcode(WorldPacket& recvPacket); - void HandleQuestgiverStatusMultipleQuery(WorldPacket& recvPacket); + void HandleQuestgiverStatusQueryOpcode(WorldPackets::Quest::QuestGiverStatusQuery& packet); + void HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::QuestGiverStatusMultipleQuery& packet); void HandleQuestgiverHelloOpcode(WorldPacket& recvPacket); void HandleQuestgiverAcceptQuestOpcode(WorldPacket& recvPacket); void HandleQuestgiverQueryQuestOpcode(WorldPacket& recvPacket); |
