From c8fd454a79965c808b4caa51813cb67016cd3e69 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Mon, 8 Mar 2010 20:19:25 +0300 Subject: [PATCH] [9551] Add and use PackedGuid wrapper. Also * use more wide bytebuff << >> operators for objects * use at read packet faisl alsways exception way instead some time used bool results. --- src/game/AchievementMgr.cpp | 8 +- src/game/CharacterHandler.cpp | 49 ++++++------ src/game/CombatHandler.cpp | 4 +- src/game/GroupHandler.cpp | 4 +- src/game/Level1.cpp | 4 +- src/game/Level3.cpp | 2 +- src/game/MiscHandler.cpp | 40 +++++----- src/game/MovementHandler.cpp | 102 ++++++++++-------------- src/game/Object.cpp | 15 ++-- src/game/Object.h | 4 +- src/game/ObjectGuid.cpp | 13 ++- src/game/ObjectGuid.h | 40 +++++++++- src/game/PetHandler.cpp | 4 +- src/game/Player.cpp | 20 ++--- src/game/QueryHandler.cpp | 2 +- src/game/Spell.cpp | 146 ++++++++++++++-------------------- src/game/Spell.h | 44 +++++++--- src/game/SpellAuras.cpp | 20 ++--- src/game/SpellEffects.cpp | 8 +- src/game/SpellHandler.cpp | 26 +++--- src/game/TaxiHandler.cpp | 11 ++- src/game/Unit.cpp | 72 ++++++----------- src/game/Unit.h | 22 +++-- src/game/debugcmds.cpp | 2 +- src/shared/ByteBuffer.h | 27 ++++--- src/shared/revision_nr.h | 2 +- 26 files changed, 351 insertions(+), 340 deletions(-) diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index 367d68a8d..d682be5ed 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -651,7 +651,7 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) } WorldPacket data(SMSG_ACHIEVEMENT_EARNED, 8+4+8); - data.append(GetPlayer()->GetPackGUID()); + data << GetPlayer()->GetPackGUID(); data << uint32(achievement->ID); data << uint32(secsToTimeBitFields(time(NULL))); data << uint32(0); @@ -666,7 +666,7 @@ void AchievementMgr::SendCriteriaUpdate(uint32 id, CriteriaProgress const* progr // the counter is packed like a packed Guid data.appendPackGUID(progress->counter); - data.append(GetPlayer()->GetPackGUID()); + data << GetPlayer()->GetPackGUID(); data << uint32(0); data << uint32(secsToTimeBitFields(progress->date)); data << uint32(0); // timer 1 @@ -1855,7 +1855,7 @@ void AchievementMgr::SendRespondInspectAchievements(Player* player) { // since we don't know the exact size of the packed GUIDs this is just an approximation WorldPacket data(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, 4+4*2+m_completedAchievements.size()*4*2+m_completedAchievements.size()*7*4); - data.append(GetPlayer()->GetPackGUID()); + data << GetPlayer()->GetPackGUID(); BuildAllDataPacket(&data); player->GetSession()->SendPacket(&data); } @@ -1876,7 +1876,7 @@ void AchievementMgr::BuildAllDataPacket(WorldPacket *data) { *data << uint32(iter->first); data->appendPackGUID(iter->second.counter); - data->append(GetPlayer()->GetPackGUID()); + *data << GetPlayer()->GetPackGUID(); *data << uint32(0); *data << uint32(secsToTimeBitFields(iter->second.date)); *data << uint32(0); diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index 2ae17ec1a..df3312c85 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -1233,43 +1233,41 @@ void WorldSession::HandleEquipmentSetSave(WorldPacket &recv_data) { sLog.outDebug("CMSG_EQUIPMENT_SET_SAVE"); - uint64 setGuid; - if(!recv_data.readPackGUID(setGuid)) - return; - + ObjectGuid setGuid; uint32 index; + std::string name; + std::string iconName; + + recv_data >> setGuid.ReadAsPacked(); recv_data >> index; + recv_data >> name; + recv_data >> iconName; + if(index >= MAX_EQUIPMENT_SET_INDEX) // client set slots amount return; - std::string name; - recv_data >> name; - - std::string iconName; - recv_data >> iconName; - EquipmentSet eqSet; - eqSet.Guid = setGuid; + eqSet.Guid = setGuid.GetRawValue(); eqSet.Name = name; eqSet.IconName = iconName; eqSet.state = EQUIPMENT_SET_NEW; for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) { - uint64 itemGuid; - if(!recv_data.readPackGUID(itemGuid)) - return; + ObjectGuid itemGuid; + + recv_data >> itemGuid.ReadAsPacked(); Item *item = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i); - if(!item && itemGuid) // cheating check 1 + if(!item && !itemGuid.IsEmpty()) // cheating check 1 return; - if(item && item->GetGUID() != itemGuid) // cheating check 2 + if(item && item->GetGUID() != itemGuid.GetRawValue())// cheating check 2 return; - eqSet.Items[i] = GUID_LOPART(itemGuid); + eqSet.Items[i] = itemGuid.GetCounter(); } _player->SetEquipmentSet(index, eqSet); @@ -1279,11 +1277,11 @@ void WorldSession::HandleEquipmentSetDelete(WorldPacket &recv_data) { sLog.outDebug("CMSG_EQUIPMENT_SET_DELETE"); - uint64 setGuid; - if(!recv_data.readPackGUID(setGuid)) - return; + ObjectGuid setGuid; - _player->DeleteEquipmentSet(setGuid); + recv_data >> setGuid.ReadAsPacked(); + + _player->DeleteEquipmentSet(setGuid.GetRawValue()); } void WorldSession::HandleEquipmentSetUse(WorldPacket &recv_data) @@ -1293,16 +1291,15 @@ void WorldSession::HandleEquipmentSetUse(WorldPacket &recv_data) for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) { - uint64 itemGuid; - if(!recv_data.readPackGUID(itemGuid)) - return; - + ObjectGuid itemGuid; uint8 srcbag, srcslot; + + recv_data >> itemGuid.ReadAsPacked(); recv_data >> srcbag >> srcslot; sLog.outDebug("Item " I64FMT ": srcbag %u, srcslot %u", itemGuid, srcbag, srcslot); - Item *item = _player->GetItemByGuid(itemGuid); + Item *item = _player->GetItemByGuid(itemGuid.GetRawValue()); uint16 dstpos = i | (INVENTORY_SLOT_BAG_0 << 8); diff --git a/src/game/CombatHandler.cpp b/src/game/CombatHandler.cpp index 7aef031e1..4daeb2e87 100644 --- a/src/game/CombatHandler.cpp +++ b/src/game/CombatHandler.cpp @@ -89,8 +89,8 @@ void WorldSession::HandleSetSheathedOpcode( WorldPacket & recv_data ) void WorldSession::SendAttackStop(Unit const* enemy) { WorldPacket data( SMSG_ATTACKSTOP, (4+20) ); // we guess size - data.append(GetPlayer()->GetPackGUID()); - data.append(enemy ? enemy->GetPackGUID() : 0); // must be packed guid + data << GetPlayer()->GetPackGUID(); + data << (enemy ? enemy->GetPackGUID() : PackedGuid()); // must be packed guid data << uint32(0); // unk, can be 1 also SendPacket(&data); } diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp index f2509254b..e52a85590 100644 --- a/src/game/GroupHandler.cpp +++ b/src/game/GroupHandler.cpp @@ -635,7 +635,7 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke byteCount += GroupUpdateLength[i]; data->Initialize(SMSG_PARTY_MEMBER_STATS, 8 + 4 + byteCount); - data->append(player->GetPackGUID()); + *data << player->GetPackGUID(); *data << (uint32) mask; if (mask & GROUP_UPDATE_FLAG_STATUS) @@ -798,7 +798,7 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data ) WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 4+2+2+2+1+2*6+8+1+8); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related - data.append(player->GetPackGUID()); + data << player->GetPackGUID(); uint32 mask1 = 0x00040BFF; // common mask, real flags used 0x000040BFF if(pet) diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp index 93f5aeb25..97dd213b5 100644 --- a/src/game/Level1.cpp +++ b/src/game/Level1.cpp @@ -1603,14 +1603,14 @@ bool ChatHandler::HandleModifyMountCommand(const char* args) chr->Mount(mId); WorldPacket data( SMSG_FORCE_RUN_SPEED_CHANGE, (8+4+1+4) ); - data.append(chr->GetPackGUID()); + data << chr->GetPackGUID(); data << (uint32)0; data << (uint8)0; //new 2.1.0 data << float(speed); chr->SendMessageToSet( &data, true ); data.Initialize( SMSG_FORCE_SWIM_SPEED_CHANGE, (8+4+4) ); - data.append(chr->GetPackGUID()); + data << chr->GetPackGUID(); data << (uint32)0; data << float(speed); chr->SendMessageToSet( &data, true ); diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index 61eea2430..e8a3d18c2 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -5429,7 +5429,7 @@ bool ChatHandler::HandleGMFlyCommand(const char* args) SendSysMessage(LANG_USE_BOL); return false; } - data.append(target->GetPackGUID()); + data << target->GetPackGUID(); data << uint32(0); // unknown target->SendMessageToSet(&data, true); PSendSysMessage(LANG_COMMAND_FLYMODE_STATUS, GetNameLink(target).c_str(), args); diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index d037f016e..455891ce1 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -292,7 +292,7 @@ void WorldSession::HandleLogoutRequestOpcode( WorldPacket & /*recv_data*/ ) GetPlayer()->SetStandState(UNIT_STAND_STATE_SIT); WorldPacket data( SMSG_FORCE_MOVE_ROOT, (8+4) ); // guess size - data.append(GetPlayer()->GetPackGUID()); + data << GetPlayer()->GetPackGUID(); data << (uint32)2; SendPacket( &data ); GetPlayer()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); @@ -324,7 +324,7 @@ void WorldSession::HandleLogoutCancelOpcode( WorldPacket & /*recv_data*/ ) { //!we can move again data.Initialize( SMSG_FORCE_MOVE_UNROOT, 8 ); // guess size - data.append(GetPlayer()->GetPackGUID()); + data << GetPlayer()->GetPackGUID(); data << uint32(0); SendPacket( &data ); @@ -1004,13 +1004,11 @@ void WorldSession::HandleMoveTimeSkippedOpcode( WorldPacket & recv_data ) /* WorldSession::Update( getMSTime() );*/ DEBUG_LOG( "WORLD: Time Lag/Synchronization Resent/Update" ); - uint64 guid; - if(!recv_data.readPackGUID(guid)) - { - recv_data.rpos(recv_data.wpos()); - return; - } - recv_data.read_skip(); + ObjectGuid guid; + + recv_data >> guid.ReadAsPacked(); + recv_data >> Unused(); + /* uint64 guid; uint32 time_skipped; @@ -1133,7 +1131,7 @@ void WorldSession::HandleInspectOpcode(WorldPacket& recv_data) return; WorldPacket data(SMSG_INSPECT_TALENT, 50); - data.append(plr->GetPackGUID()); + data << plr->GetPackGUID(); if(sWorld.getConfig(CONFIG_BOOL_TALENTS_INSPECTING) || _player->isGameMaster()) { @@ -1517,15 +1515,13 @@ void WorldSession::HandleMoveSetCanFlyAckOpcode( WorldPacket & recv_data ) sLog.outDebug("WORLD: CMSG_MOVE_SET_CAN_FLY_ACK"); //recv_data.hexlike(); - uint64 guid; // guid - unused - if(!recv_data.readPackGUID(guid)) - return; + ObjectGuid guid; // guid - unused + MovementInfo movementInfo; - recv_data.read_skip(); // unk - - MovementInfo movementInfo(recv_data); - - recv_data.read_skip(); // unk2 + recv_data >> guid.ReadAsPacked(); + recv_data >> Unused(); // unk + recv_data >> movementInfo; + recv_data >> Unused(); // unk2 _player->m_movementInfo.SetMovementFlags(movementInfo.GetMovementFlags()); } @@ -1548,11 +1544,11 @@ void WorldSession::HandleSetTaxiBenchmarkOpcode( WorldPacket & recv_data ) void WorldSession::HandleQueryInspectAchievements( WorldPacket & recv_data ) { - uint64 guid; - if(!recv_data.readPackGUID(guid)) - return; + ObjectGuid guid; - if(Player *player = sObjectMgr.GetPlayer(guid)) + recv_data >> guid.ReadAsPacked(); + + if(Player *player = sObjectMgr.GetPlayer(guid.GetRawValue())) player->GetAchievementMgr().SendRespondInspectAchievements(_player); } diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index df93dde3c..e01acc779 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -171,10 +171,10 @@ void WorldSession::HandleMoveWorldportAckOpcode() void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data) { sLog.outDebug("MSG_MOVE_TELEPORT_ACK"); - uint64 guid; - if(!recv_data.readPackGUID(guid)) - return; + ObjectGuid guid; + + recv_data >> guid.ReadAsPacked(); uint32 flags, time; recv_data >> flags >> time; @@ -187,7 +187,7 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data) if(!plMover || !plMover->IsBeingTeleportedNear()) return; - if(guid != plMover->GetGUID()) + if(guid.GetRawValue() != plMover->GetGUID()) return; plMover->SetSemaphoreTeleportNear(false); @@ -234,12 +234,11 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) } /* extract packet */ - uint64 guid; + ObjectGuid guid; + MovementInfo movementInfo; - if(!recv_data.readPackGUID(guid)) - return; - - MovementInfo movementInfo(recv_data); + recv_data >> guid.ReadAsPacked(); + recv_data >> movementInfo; /*----------------*/ if (!MaNGOS::IsValidMapCoord(movementInfo.GetPos()->x, movementInfo.GetPos()->y, movementInfo.GetPos()->z, movementInfo.GetPos()->o)) @@ -364,26 +363,21 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data) uint32 opcode = recv_data.GetOpcode(); sLog.outDebug("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode); /* extract packet */ - uint64 guid; - uint32 unk1; + ObjectGuid guid; + MovementInfo movementInfo; float newspeed; - if(!recv_data.readPackGUID(guid)) - return; + recv_data >> guid.ReadAsPacked(); + recv_data >> Unused(); // counter or moveEvent + recv_data >> movementInfo; + recv_data >> newspeed; // now can skip not our packet - if(_player->GetGUID() != guid) + if(_player->GetGUID() != guid.GetRawValue()) { recv_data.rpos(recv_data.wpos()); // prevent warnings spam return; } - - // continue parse packet - recv_data >> unk1; // counter or moveEvent - - MovementInfo movementInfo(recv_data); - - recv_data >> newspeed; /*----------------*/ // client ACK send one packet for mounted/run case and need skip all except last from its @@ -455,20 +449,19 @@ void WorldSession::HandleMoveNotActiveMover(WorldPacket &recv_data) sLog.outDebug("WORLD: Recvd CMSG_MOVE_NOT_ACTIVE_MOVER"); recv_data.hexlike(); - uint64 old_mover_guid; + ObjectGuid old_mover_guid; + MovementInfo mi; - if(!recv_data.readPackGUID(old_mover_guid)) - return; + recv_data >> old_mover_guid.ReadAsPacked(); + recv_data >> mi; - if(_player->m_mover->GetGUID() == old_mover_guid) + if(_player->m_mover->GetGUID() == old_mover_guid.GetRawValue()) { sLog.outError("HandleMoveNotActiveMover: incorrect mover guid: mover is " I64FMT " and should be " I64FMT " instead of " UI64FMTD, _player->m_mover->GetGUID(), _player->GetGUID(), old_mover_guid); recv_data.rpos(recv_data.wpos()); // prevent warnings spam return; } - MovementInfo mi(recv_data); - _player->m_movementInfo = mi; } @@ -477,20 +470,16 @@ void WorldSession::HandleDismissControlledVehicle(WorldPacket &recv_data) sLog.outDebug("WORLD: Recvd CMSG_DISMISS_CONTROLLED_VEHICLE"); recv_data.hexlike(); + ObjectGuid guid; + MovementInfo mi; + + recv_data >> guid.ReadAsPacked(); + recv_data >> mi; + uint64 vehicleGUID = _player->GetCharmGUID(); if(!vehicleGUID) // something wrong here... - { - recv_data.rpos(recv_data.wpos()); // prevent warnings spam return; - } - - uint64 guid; - - if(!recv_data.readPackGUID(guid)) - return; - - MovementInfo mi(recv_data); _player->m_movementInfo = mi; @@ -516,43 +505,38 @@ void WorldSession::HandleMoveKnockBackAck( WorldPacket & recv_data ) { sLog.outDebug("CMSG_MOVE_KNOCK_BACK_ACK"); - uint64 guid; // guid - unused - if(!recv_data.readPackGUID(guid)) - return; + ObjectGuid guid; // guid - unused + MovementInfo movementInfo; - recv_data.read_skip(); // unk - - MovementInfo movementInfo(recv_data); + recv_data >> guid.ReadAsPacked(); + recv_data >> Unused(); // unk + recv_data >> movementInfo; } void WorldSession::HandleMoveHoverAck( WorldPacket& recv_data ) { sLog.outDebug("CMSG_MOVE_HOVER_ACK"); - uint64 guid; // guid - unused - if(!recv_data.readPackGUID(guid)) - return; + ObjectGuid guid; // guid - unused + MovementInfo movementInfo; - recv_data.read_skip(); // unk - - MovementInfo movementInfo(recv_data); - - recv_data.read_skip(); // unk2 + recv_data >> guid.ReadAsPacked(); + recv_data >> Unused(); // unk1 + recv_data >> movementInfo; + recv_data >> Unused(); // unk2 } void WorldSession::HandleMoveWaterWalkAck(WorldPacket& recv_data) { sLog.outDebug("CMSG_MOVE_WATER_WALK_ACK"); - uint64 guid; // guid - unused - if(!recv_data.readPackGUID(guid)) - return; + ObjectGuid guid; // guid - unused + MovementInfo movementInfo; - recv_data.read_skip(); // unk - - MovementInfo movementInfo(recv_data); - - recv_data.read_skip(); // unk2 + recv_data >> guid.ReadAsPacked(); + recv_data >> Unused(); // unk1 + recv_data >> movementInfo; + recv_data >> Unused(); // unk2 } void WorldSession::HandleSummonResponseOpcode(WorldPacket& recv_data) diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 53c830943..9ec6a5b7c 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -63,7 +63,7 @@ uint32 GuidHigh2TypeId(uint32 guid_hi) return TYPEID_OBJECT; // unknown } -Object::Object( ) : m_PackGUID(sizeof(uint64)+1) +Object::Object( ) { m_objectTypeId = TYPEID_OBJECT; m_objectType = TYPEMASK_OBJECT; @@ -74,8 +74,6 @@ Object::Object( ) : m_PackGUID(sizeof(uint64)+1) m_inWorld = false; m_objectUpdated = false; - - m_PackGUID.appendPackGUID(0); } Object::~Object( ) @@ -121,8 +119,7 @@ void Object::_Create( uint32 guidlow, uint32 entry, HighGuid guidhigh ) uint64 guid = MAKE_NEW_GUID(guidlow, entry, guidhigh); SetUInt64Value(OBJECT_FIELD_GUID, guid); SetUInt32Value(OBJECT_FIELD_TYPE, m_objectType); - m_PackGUID.wpos(0); - m_PackGUID.appendPackGUID(GetGUID()); + m_PackGUID.Set(guid); } void Object::BuildMovementUpdateBlock(UpdateData * data, uint16 flags ) const @@ -130,7 +127,7 @@ void Object::BuildMovementUpdateBlock(UpdateData * data, uint16 flags ) const ByteBuffer buf(500); buf << uint8(UPDATETYPE_MOVEMENT); - buf.append(GetPackGUID()); + buf << GetPackGUID(); BuildMovementUpdate(&buf, flags); @@ -189,7 +186,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c ByteBuffer buf(500); buf << uint8(updatetype); - buf.append(GetPackGUID()); + buf << GetPackGUID(); buf << uint8(m_objectTypeId); BuildMovementUpdate(&buf, updateFlags); @@ -217,7 +214,7 @@ void Object::BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target) c ByteBuffer buf(500); buf << uint8(UPDATETYPE_VALUES); - buf.append(GetPackGUID()); + buf << GetPackGUID(); UpdateMask updateMask; updateMask.SetCount(m_valuesCount); @@ -510,7 +507,7 @@ void Object::BuildMovementUpdate(ByteBuffer * data, uint16 updateFlags) const if(updateFlags & UPDATEFLAG_HAS_ATTACKING_TARGET) // packed guid (current target guid) { if (((Unit*)this)->getVictim()) - data->append(((Unit*)this)->getVictim()->GetPackGUID()); + *data << ((Unit*)this)->getVictim()->GetPackGUID(); else data->appendPackGUID(0); } diff --git a/src/game/Object.h b/src/game/Object.h index 1fdab34f8..dec9fea8b 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -112,7 +112,7 @@ class MANGOS_DLL_SPEC Object uint32 GetGUIDLow() const { return GUID_LOPART(GetUInt64Value(0)); } uint32 GetGUIDMid() const { return GUID_ENPART(GetUInt64Value(0)); } uint32 GetGUIDHigh() const { return GUID_HIPART(GetUInt64Value(0)); } - const ByteBuffer& GetPackGUID() const { return m_PackGUID; } + PackedGuid const& GetPackGUID() const { return m_PackGUID; } uint32 GetEntry() const { return GetUInt32Value(OBJECT_FIELD_ENTRY); } void SetEntry(uint32 entry) { SetUInt32Value(OBJECT_FIELD_ENTRY, entry); } @@ -312,7 +312,7 @@ class MANGOS_DLL_SPEC Object private: bool m_inWorld; - ByteBuffer m_PackGUID; + PackedGuid m_PackGUID; // for output helpfull error messages from asserts bool PrintIndexError(uint32 index, bool set) const; diff --git a/src/game/ObjectGuid.cpp b/src/game/ObjectGuid.cpp index a6d7d993c..c6b97c560 100644 --- a/src/game/ObjectGuid.cpp +++ b/src/game/ObjectGuid.cpp @@ -17,7 +17,6 @@ */ #include "ObjectGuid.h" -#include "ByteBuffer.h" #include char const* ObjectGuid::GetTypeName() const @@ -60,3 +59,15 @@ ByteBuffer &operator>>(ByteBuffer& buf, ObjectGuid& guid) guid.Set(buf.read()); return buf; } + +ByteBuffer& operator<< (ByteBuffer& buf, PackedGuid const& guid) +{ + buf.append(guid.m_packedGuid); + return buf; +} + +ByteBuffer &operator>>(ByteBuffer& buf, PackedGuidReader& guid) +{ + guid.m_guidRef.Set(buf.readPackGUID()); + return buf; +} diff --git a/src/game/ObjectGuid.h b/src/game/ObjectGuid.h index 2971019d3..37bcb06b0 100644 --- a/src/game/ObjectGuid.h +++ b/src/game/ObjectGuid.h @@ -20,8 +20,7 @@ #define MANGOS_OBJECT_GUID_H #include "Common.h" - -class ByteBuffer; +#include "ByteBuffer.h" enum TypeID { @@ -114,6 +113,14 @@ inline bool IsGuidHaveEnPart(uint64 const& guid) #define GUID_LOPART(x) (IsGuidHaveEnPart(x) ? _GUID_LOPART_3(x) : _GUID_LOPART_2(x)) //*** Must be replaced by ObjectGuid use END *** +class ObjectGuid; +class PackedGuid; + +struct PackedGuidReader +{ + explicit PackedGuidReader(ObjectGuid& guid) : m_guidRef(guid) {} + ObjectGuid& m_guidRef; +}; class ObjectGuid { @@ -123,6 +130,8 @@ class ObjectGuid ObjectGuid(HighGuid hi, uint32 entry, uint32 counter) : m_guid(uint64(counter) | (uint64(entry) << 24) | (uint64(hi) << 48)) {} public: // modifiers + PackedGuidReader ReadAsPacked() { return PackedGuidReader(*this); } + void Set(uint64 const& guid) { m_guid = guid; } // Possible removed in future for more strict control type conversions @@ -170,6 +179,8 @@ class ObjectGuid default: return TYPEID_OBJECT; } } + + PackedGuid WriteAsPacked() const; public: // accessors - for debug char const* GetTypeName() const; std::string GetString() const; @@ -198,7 +209,32 @@ class ObjectGuid uint64 m_guid; }; +class PackedGuid +{ + friend ByteBuffer& operator<< (ByteBuffer& buf, PackedGuid const& guid); + + public: // constructors + explicit PackedGuid() { m_packedGuid.appendPackGUID(0); } + explicit PackedGuid(uint64 const& guid) { m_packedGuid.appendPackGUID(guid); } + explicit PackedGuid(ObjectGuid const& guid) { m_packedGuid.appendPackGUID(guid.GetRawValue()); } + + public: // modifiers + void Set(uint64 const& guid) { m_packedGuid.wpos(0); m_packedGuid.appendPackGUID(guid); } + void Set(ObjectGuid const& guid) { m_packedGuid.wpos(0); m_packedGuid.appendPackGUID(guid.GetRawValue()); } + + public: // accessors + size_t size() const { return m_packedGuid.size(); } + + private: // fields + ByteBuffer m_packedGuid; +}; + ByteBuffer& operator<< (ByteBuffer& buf, ObjectGuid const& guid); ByteBuffer& operator>> (ByteBuffer& buf, ObjectGuid& guid); +ByteBuffer& operator<< (ByteBuffer& buf, PackedGuid const& guid); +ByteBuffer& operator>> (ByteBuffer& buf, PackedGuidReader& guid); + +inline PackedGuid ObjectGuid::WriteAsPacked() const { return PackedGuid(*this); } + #endif diff --git a/src/game/PetHandler.cpp b/src/game/PetHandler.cpp index 82e010c44..9ae70b7ec 100644 --- a/src/game/PetHandler.cpp +++ b/src/game/PetHandler.cpp @@ -630,8 +630,8 @@ void WorldSession::HandlePetCastSpellOpcode( WorldPacket& recvPacket ) return; SpellCastTargets targets; - if (!targets.read(&recvPacket,pet)) - return; + + recvPacket >> targets.ReadForCaster(pet); pet->clearUnitState(UNIT_STAT_MOVING); diff --git a/src/game/Player.cpp b/src/game/Player.cpp index bbd4a53e7..994d66939 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -4134,7 +4134,7 @@ void Player::SetMovement(PlayerMovementType pType) sLog.outError("Player::SetMovement: Unsupported move type (%d), data not sent to client.",pType); return; } - data.append(GetPackGUID()); + data << GetPackGUID(); data << uint32(0); GetSession()->SendPacket( &data ); } @@ -4146,7 +4146,7 @@ void Player::SetMovement(PlayerMovementType pType) void Player::BuildPlayerRepop() { WorldPacket data(SMSG_PRE_RESURRECT, GetPackGUID().size()); - data.append(GetPackGUID()); + data << GetPackGUID(); GetSession()->SendPacket(&data); if(getRace() == RACE_NIGHTELF) @@ -16961,7 +16961,7 @@ void Player::SendAttackSwingBadFacingAttack() void Player::SendAutoRepeatCancel(Unit *target) { WorldPacket data(SMSG_CANCEL_AUTO_REPEAT, target->GetPackGUID().size()); - data.append(target->GetPackGUID()); // may be it's target guid + data << target->GetPackGUID(); // may be it's target guid GetSession()->SendPacket( &data ); } @@ -18936,7 +18936,7 @@ void Player::SendComboPoints() if (combotarget) { WorldPacket data(SMSG_UPDATE_COMBO_POINTS, combotarget->GetPackGUID().size()+1); - data.append(combotarget->GetPackGUID()); + data << combotarget->GetPackGUID(); data << uint8(m_comboPoints); GetSession()->SendPacket(&data); } @@ -19096,7 +19096,7 @@ void Player::SendInitialPacketsAfterAddToMap() if(HasAuraType(SPELL_AURA_MOD_ROOT)) { WorldPacket data2(SMSG_FORCE_MOVE_ROOT, 10); - data2.append(GetPackGUID()); + data2 << GetPackGUID(); data2 << (uint32)2; SendMessageToSet(&data2,true); } @@ -19340,7 +19340,7 @@ void Player::SendAurasForTarget(Unit *target) return; WorldPacket data(SMSG_AURA_UPDATE_ALL); - data.append(target->GetPackGUID()); + data << target->GetPackGUID(); Unit::VisibleAuraMap const *visibleAuras = target->GetVisibleAuras(); for(Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr) @@ -19983,7 +19983,7 @@ void Player::ResurectUsingRequestData() void Player::SetClientControl(Unit* target, uint8 allowMove) { WorldPacket data(SMSG_CLIENT_CONTROL_UPDATE, target->GetPackGUID().size()+1); - data.append(target->GetPackGUID()); + data << target->GetPackGUID(); data << uint8(allowMove); GetSession()->SendPacket(&data); } @@ -20379,7 +20379,7 @@ void Player::EnterVehicle(Vehicle *vehicle) GetSession()->SendPacket(&data); data.Initialize(MSG_MOVE_TELEPORT_ACK, 30); - data.append(GetPackGUID()); + data << GetPackGUID(); data << uint32(0); // counter? data << uint32(MOVEFLAG_ONTRANSPORT); // transport data << uint16(0); // special flags @@ -20428,7 +20428,7 @@ void Player::ExitVehicle(Vehicle *vehicle) SetMover(NULL); WorldPacket data(MSG_MOVE_TELEPORT_ACK, 30); - data.append(GetPackGUID()); + data << GetPackGUID(); data << uint32(0); // counter? data << uint32(MOVEFLAG_ROOT); // fly unk data << uint16(MOVEFLAG2_UNK4); // special flags @@ -21586,7 +21586,7 @@ void Player::SendClearCooldown( uint32 spell_id, Unit* target ) void Player::BuildTeleportAckMsg( WorldPacket *data, float x, float y, float z, float ang ) const { data->Initialize(MSG_MOVE_TELEPORT_ACK, 41); - data->append(GetPackGUID()); + *data << GetPackGUID(); *data << uint32(0); // this value increments every time *data << uint32(m_movementInfo.GetMovementFlags()); // movement flags *data << uint16(0); // 2.3.0 diff --git a/src/game/QueryHandler.cpp b/src/game/QueryHandler.cpp index 333ebac0c..5e3f8c850 100644 --- a/src/game/QueryHandler.cpp +++ b/src/game/QueryHandler.cpp @@ -39,7 +39,7 @@ void WorldSession::SendNameQueryOpcode(Player *p) return; // guess size WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+1+1+1+1+10) ); - data.append(p->GetPackGUID()); // player guid + data << p->GetPackGUID(); // player guid data << uint8(0); // added in 3.1; if > 1, then end of packet data << p->GetName(); // played name data << uint8(0); // realm name for cross realm BG usage diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index a4a47b5e9..037a6fa90 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -183,33 +183,30 @@ void SpellCastTargets::setCorpseTarget(Corpse* corpse) void SpellCastTargets::Update(Unit* caster) { - m_GOTarget = m_GOTargetGUID ? caster->GetMap()->GetGameObject(m_GOTargetGUID) : NULL; - m_unitTarget = m_unitTargetGUID ? - ( m_unitTargetGUID == caster->GetGUID() ? caster : ObjectAccessor::GetUnit(*caster, m_unitTargetGUID) ) : + m_GOTarget = !m_GOTargetGUID.IsEmpty() ? caster->GetMap()->GetGameObject(m_GOTargetGUID.GetRawValue()) : NULL; + m_unitTarget = !m_unitTargetGUID.IsEmpty() ? + ( m_unitTargetGUID.GetRawValue() == caster->GetGUID() ? caster : ObjectAccessor::GetUnit(*caster, m_unitTargetGUID.GetRawValue()) ) : NULL; m_itemTarget = NULL; if(caster->GetTypeId() == TYPEID_PLAYER) { if(m_targetMask & TARGET_FLAG_ITEM) - m_itemTarget = ((Player*)caster)->GetItemByGuid(m_itemTargetGUID); + m_itemTarget = ((Player*)caster)->GetItemByGuid(m_itemTargetGUID.GetRawValue()); else if(m_targetMask & TARGET_FLAG_TRADE_ITEM) { Player* pTrader = ((Player*)caster)->GetTrader(); - if(pTrader && m_itemTargetGUID < TRADE_SLOT_COUNT) - m_itemTarget = pTrader->GetItemByPos(pTrader->GetItemPosByTradeSlot(uint32(m_itemTargetGUID))); + if(pTrader && m_itemTargetGUID.GetRawValue() < TRADE_SLOT_COUNT) + m_itemTarget = pTrader->GetItemByPos(pTrader->GetItemPosByTradeSlot(uint32(m_itemTargetGUID.GetRawValue()))); } if(m_itemTarget) m_itemTargetEntry = m_itemTarget->GetEntry(); } } -bool SpellCastTargets::read ( WorldPacket * data, Unit *caster ) +void SpellCastTargets::read( ByteBuffer& data, Unit *caster ) { - if(data->rpos() + 4 > data->size()) - return false; - - *data >> m_targetMask; + data >> m_targetMask; if(m_targetMask == TARGET_FLAG_SELF) { @@ -218,121 +215,101 @@ bool SpellCastTargets::read ( WorldPacket * data, Unit *caster ) m_destZ = caster->GetPositionZ(); m_unitTarget = caster; m_unitTargetGUID = caster->GetGUID(); - return true; + return; } // TARGET_FLAG_UNK2 is used for non-combat pets, maybe other? if( m_targetMask & ( TARGET_FLAG_UNIT | TARGET_FLAG_UNK2 )) - if(!data->readPackGUID(m_unitTargetGUID)) - return false; + data >> m_unitTargetGUID.ReadAsPacked(); if( m_targetMask & ( TARGET_FLAG_OBJECT )) - if(!data->readPackGUID(m_GOTargetGUID)) - return false; + data >> m_GOTargetGUID.ReadAsPacked(); if(( m_targetMask & ( TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM )) && caster->GetTypeId() == TYPEID_PLAYER) - if(!data->readPackGUID(m_itemTargetGUID)) - return false; + data >> m_itemTargetGUID.ReadAsPacked(); if( m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE ) ) - if(!data->readPackGUID(m_CorpseTargetGUID)) - return false; + data >> m_CorpseTargetGUID.ReadAsPacked(); if( m_targetMask & TARGET_FLAG_SOURCE_LOCATION ) { - if(data->rpos() + 1 + 4 + 4 + 4 > data->size()) - return false; - - if(!data->readPackGUID(m_unitTargetGUID)) - return false; - - *data >> m_srcX >> m_srcY >> m_srcZ; + data >> m_unitTargetGUID.ReadAsPacked(); + data >> m_srcX >> m_srcY >> m_srcZ; if(!MaNGOS::IsValidMapCoord(m_srcX, m_srcY, m_srcZ)) - return false; + throw ByteBufferException(false, data.rpos(), 0, data.size()); } if( m_targetMask & TARGET_FLAG_DEST_LOCATION ) { - if(data->rpos() + 1 + 4 + 4 + 4 > data->size()) - return false; - - if(!data->readPackGUID(m_unitTargetGUID)) - return false; - - *data >> m_destX >> m_destY >> m_destZ; + data >> m_unitTargetGUID.ReadAsPacked(); + data >> m_destX >> m_destY >> m_destZ; if(!MaNGOS::IsValidMapCoord(m_destX, m_destY, m_destZ)) - return false; + throw ByteBufferException(false, data.rpos(), 0, data.size()); } if( m_targetMask & TARGET_FLAG_STRING ) - { - if(data->rpos() + 1 > data->size()) - return false; - - *data >> m_strTarget; - } + data >> m_strTarget; // find real units/GOs Update(caster); - return true; } -void SpellCastTargets::write ( WorldPacket * data ) +void SpellCastTargets::write( ByteBuffer& data ) const { - *data << uint32(m_targetMask); + data << uint32(m_targetMask); if( m_targetMask & ( TARGET_FLAG_UNIT | TARGET_FLAG_PVP_CORPSE | TARGET_FLAG_OBJECT | TARGET_FLAG_CORPSE | TARGET_FLAG_UNK2 ) ) { if(m_targetMask & TARGET_FLAG_UNIT) { if(m_unitTarget) - data->append(m_unitTarget->GetPackGUID()); + data << m_unitTarget->GetPackGUID(); else - *data << uint8(0); + data << uint8(0); } else if( m_targetMask & TARGET_FLAG_OBJECT ) { if(m_GOTarget) - data->append(m_GOTarget->GetPackGUID()); + data << m_GOTarget->GetPackGUID(); else - *data << uint8(0); + data << uint8(0); } else if( m_targetMask & ( TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE ) ) - data->appendPackGUID(m_CorpseTargetGUID); + data << m_CorpseTargetGUID.WriteAsPacked(); else - *data << uint8(0); + data << uint8(0); } if( m_targetMask & ( TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM ) ) { if(m_itemTarget) - data->append(m_itemTarget->GetPackGUID()); + data << m_itemTarget->GetPackGUID(); else - *data << uint8(0); + data << uint8(0); } if( m_targetMask & TARGET_FLAG_SOURCE_LOCATION ) { if(m_unitTarget) - data->append(m_unitTarget->GetPackGUID()); + data << m_unitTarget->GetPackGUID(); else - *data << uint8(0); + data << uint8(0); - *data << m_srcX << m_srcY << m_srcZ; + data << m_srcX << m_srcY << m_srcZ; } if( m_targetMask & TARGET_FLAG_DEST_LOCATION ) { if(m_unitTarget) - data->append(m_unitTarget->GetPackGUID()); + data << m_unitTarget->GetPackGUID(); else - *data << uint8(0); + data << uint8(0); - *data << m_destX << m_destY << m_destZ; + data << m_destX << m_destY << m_destZ; } if( m_targetMask & TARGET_FLAG_STRING ) - *data << m_strTarget; + data << m_strTarget; } Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 originalCasterGUID, Spell** triggeringContainer ) @@ -3188,17 +3165,16 @@ void Spell::SendSpellStart() WorldPacket data(SMSG_SPELL_START, (8+8+4+4+2)); if (m_CastItem) - data.append(m_CastItem->GetPackGUID()); + data << m_CastItem->GetPackGUID(); else - data.append(m_caster->GetPackGUID()); + data << m_caster->GetPackGUID(); - data.append(m_caster->GetPackGUID()); + data << m_caster->GetPackGUID(); data << uint8(m_cast_count); // pending spell cast? data << uint32(m_spellInfo->Id); // spellId data << uint32(castFlags); // cast flags data << uint32(m_timer); // delay? - - m_targets.write(&data); + data << m_targets; if ( castFlags & CAST_FLAG_UNKNOWN6 ) // predicted power? data << uint32(0); @@ -3252,11 +3228,11 @@ void Spell::SendSpellGo() WorldPacket data(SMSG_SPELL_GO, 50); // guess size if(m_CastItem) - data.append(m_CastItem->GetPackGUID()); + data << m_CastItem->GetPackGUID(); else - data.append(m_caster->GetPackGUID()); + data << m_caster->GetPackGUID(); - data.append(m_caster->GetPackGUID()); + data << m_caster->GetPackGUID(); data << uint8(m_cast_count); // pending spell cast? data << uint32(m_spellInfo->Id); // spellId data << uint32(castFlags); // cast flags @@ -3264,7 +3240,7 @@ void Spell::SendSpellGo() WriteSpellGoTargets(&data); - m_targets.write(&data); + data << m_targets; if ( castFlags & CAST_FLAG_UNKNOWN6 ) // unknown wotlk, predicted power? data << uint32(0); @@ -3435,9 +3411,9 @@ void Spell::SendLogExecute() WorldPacket data(SMSG_SPELLLOGEXECUTE, (8+4+4+4+4+8)); if(m_caster->GetTypeId() == TYPEID_PLAYER) - data.append(m_caster->GetPackGUID()); + data << m_caster->GetPackGUID(); else - data.append(target->GetPackGUID()); + data << target->GetPackGUID(); data << uint32(m_spellInfo->Id); uint32 count1 = 1; @@ -3453,7 +3429,7 @@ void Spell::SendLogExecute() { case SPELL_EFFECT_POWER_DRAIN: if(Unit *unit = m_targets.getUnitTarget()) - data.append(unit->GetPackGUID()); + data << unit->GetPackGUID(); else data << uint8(0); data << uint32(0); @@ -3462,21 +3438,21 @@ void Spell::SendLogExecute() break; case SPELL_EFFECT_ADD_EXTRA_ATTACKS: if(Unit *unit = m_targets.getUnitTarget()) - data.append(unit->GetPackGUID()); + data << unit->GetPackGUID(); else data << uint8(0); data << uint32(0); // count? break; case SPELL_EFFECT_INTERRUPT_CAST: if(Unit *unit = m_targets.getUnitTarget()) - data.append(unit->GetPackGUID()); + data << unit->GetPackGUID(); else data << uint8(0); data << uint32(0); // spellid break; case SPELL_EFFECT_DURABILITY_DAMAGE: if(Unit *unit = m_targets.getUnitTarget()) - data.append(unit->GetPackGUID()); + data << unit->GetPackGUID(); else data << uint8(0); data << uint32(0); @@ -3484,7 +3460,7 @@ void Spell::SendLogExecute() break; case SPELL_EFFECT_OPEN_LOCK: if(Item *item = m_targets.getItemTarget()) - data.append(item->GetPackGUID()); + data << item->GetPackGUID(); else data << uint8(0); break; @@ -3503,11 +3479,11 @@ void Spell::SendLogExecute() case SPELL_EFFECT_SUMMON_OBJECT_SLOT3: case SPELL_EFFECT_SUMMON_OBJECT_SLOT4: if(Unit *unit = m_targets.getUnitTarget()) - data.append(unit->GetPackGUID()); + data << unit->GetPackGUID(); else if(m_targets.getItemTargetGUID()) data.appendPackGUID(m_targets.getItemTargetGUID()); else if(GameObject *go = m_targets.getGOTarget()) - data.append(go->GetPackGUID()); + data << go->GetPackGUID(); else data << uint8(0); // guid break; @@ -3516,14 +3492,14 @@ void Spell::SendLogExecute() break; case SPELL_EFFECT_DISMISS_PET: if(Unit *unit = m_targets.getUnitTarget()) - data.append(unit->GetPackGUID()); + data << unit->GetPackGUID(); else data << uint8(0); break; case SPELL_EFFECT_RESURRECT: case SPELL_EFFECT_RESURRECT_NEW: if(Unit *unit = m_targets.getUnitTarget()) - data.append(unit->GetPackGUID()); + data << unit->GetPackGUID(); else data << uint8(0); break; @@ -3539,14 +3515,14 @@ void Spell::SendLogExecute() void Spell::SendInterrupted(uint8 result) { WorldPacket data(SMSG_SPELL_FAILURE, (8+4+1)); - data.append(m_caster->GetPackGUID()); + data << m_caster->GetPackGUID(); data << uint8(m_cast_count); data << uint32(m_spellInfo->Id); data << uint8(result); m_caster->SendMessageToSet(&data, true); data.Initialize(SMSG_SPELL_FAILED_OTHER, (8+4)); - data.append(m_caster->GetPackGUID()); + data << m_caster->GetPackGUID(); data << uint8(m_cast_count); data << uint32(m_spellInfo->Id); data << uint8(result); @@ -3569,7 +3545,7 @@ void Spell::SendChannelUpdate(uint32 time) } WorldPacket data( MSG_CHANNEL_UPDATE, 8+4 ); - data.append(m_caster->GetPackGUID()); + data << m_caster->GetPackGUID(); data << uint32(time); m_caster->SendMessageToSet(&data, true); } @@ -3603,7 +3579,7 @@ void Spell::SendChannelStart(uint32 duration) } WorldPacket data( MSG_CHANNEL_START, (8+4+4) ); - data.append(m_caster->GetPackGUID()); + data << m_caster->GetPackGUID(); data << uint32(m_spellInfo->Id); data << uint32(duration); m_caster->SendMessageToSet(&data, true); @@ -5902,7 +5878,7 @@ void Spell::Delayed() sLog.outDetail("Spell %u partially interrupted for (%d) ms at damage", m_spellInfo->Id, delaytime); WorldPacket data(SMSG_SPELL_DELAYED, 8+4); - data.append(m_caster->GetPackGUID()); + data << m_caster->GetPackGUID(); data << uint32(delaytime); m_caster->SendMessageToSet(&data, true); diff --git a/src/game/Spell.h b/src/game/Spell.h index e290e7c06..9d85933bc 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -102,14 +102,24 @@ namespace MaNGOS struct SpellNotifierCreatureAndPlayer; } +struct SpellCastTargetsReader +{ + explicit SpellCastTargetsReader(SpellCastTargets& _targets, Unit* _caster) : targets(_targets), caster(_caster) {} + + SpellCastTargets& targets; + Unit* caster; +}; + class SpellCastTargets { public: SpellCastTargets(); ~SpellCastTargets(); - bool read ( WorldPacket * data, Unit *caster ); - void write ( WorldPacket * data ); + void read( ByteBuffer& data, Unit *caster ); + void write( ByteBuffer& data ) const; + + SpellCastTargetsReader ReadForCaster(Unit* caster) { return SpellCastTargetsReader(*this,caster); } SpellCastTargets& operator=(const SpellCastTargets &target) { @@ -139,19 +149,19 @@ class SpellCastTargets return *this; } - uint64 getUnitTargetGUID() const { return m_unitTargetGUID; } + uint64 getUnitTargetGUID() const { return m_unitTargetGUID.GetRawValue(); } Unit *getUnitTarget() const { return m_unitTarget; } void setUnitTarget(Unit *target); void setDestination(float x, float y, float z); void setSource(float x, float y, float z); - uint64 getGOTargetGUID() const { return m_GOTargetGUID; } + uint64 getGOTargetGUID() const { return m_GOTargetGUID.GetRawValue(); } GameObject *getGOTarget() const { return m_GOTarget; } void setGOTarget(GameObject *target); - uint64 getCorpseTargetGUID() const { return m_CorpseTargetGUID; } + uint64 getCorpseTargetGUID() const { return m_CorpseTargetGUID.GetRawValue(); } void setCorpseTarget(Corpse* corpse); - uint64 getItemTargetGUID() const { return m_itemTargetGUID; } + uint64 getItemTargetGUID() const { return m_itemTargetGUID.GetRawValue(); } Item* getItemTarget() const { return m_itemTarget; } uint32 getItemTargetEntry() const { return m_itemTargetEntry; } void setItemTarget(Item* item); @@ -164,7 +174,7 @@ class SpellCastTargets } } - bool IsEmpty() const { return m_GOTargetGUID==0 && m_unitTargetGUID==0 && m_itemTarget==0 && m_CorpseTargetGUID==0; } + bool IsEmpty() const { return m_GOTargetGUID.IsEmpty() && m_unitTargetGUID.IsEmpty() && m_itemTarget==NULL && m_CorpseTargetGUID.IsEmpty(); } void Update(Unit* caster); @@ -180,13 +190,25 @@ class SpellCastTargets Item *m_itemTarget; // object GUID/etc, can be used always - uint64 m_unitTargetGUID; - uint64 m_GOTargetGUID; - uint64 m_CorpseTargetGUID; - uint64 m_itemTargetGUID; + ObjectGuid m_unitTargetGUID; + ObjectGuid m_GOTargetGUID; + ObjectGuid m_CorpseTargetGUID; + ObjectGuid m_itemTargetGUID; uint32 m_itemTargetEntry; }; +inline ByteBuffer& operator<< (ByteBuffer& buf, SpellCastTargets const& targets) +{ + targets.write(buf); + return buf; +} + +inline ByteBuffer& operator>> (ByteBuffer& buf, SpellCastTargetsReader const& targets) +{ + targets.targets.read(buf,targets.caster); + return buf; +} + enum SpellState { SPELL_STATE_NULL = 0, diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 3b18a72d1..75b07c0c3 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -1232,7 +1232,7 @@ bool Aura::_RemoveAura() void Aura::SendAuraUpdate(bool remove) { WorldPacket data(SMSG_AURA_UPDATE); - data.append(m_target->GetPackGUID()); + data << m_target->GetPackGUID(); data << uint8(GetAuraSlot()); data << uint32(remove ? 0 : GetId()); @@ -2975,7 +2975,7 @@ void Aura::HandleAuraWaterWalk(bool apply, bool Real) data.Initialize(SMSG_MOVE_WATER_WALK, 8+4); else data.Initialize(SMSG_MOVE_LAND_WALK, 8+4); - data.append(m_target->GetPackGUID()); + data << m_target->GetPackGUID(); data << uint32(0); m_target->SendMessageToSet(&data, true); } @@ -2991,7 +2991,7 @@ void Aura::HandleAuraFeatherFall(bool apply, bool Real) data.Initialize(SMSG_MOVE_FEATHER_FALL, 8+4); else data.Initialize(SMSG_MOVE_NORMAL_FALL, 8+4); - data.append(m_target->GetPackGUID()); + data << m_target->GetPackGUID(); data << uint32(0); m_target->SendMessageToSet(&data, true); @@ -3011,7 +3011,7 @@ void Aura::HandleAuraHover(bool apply, bool Real) data.Initialize(SMSG_MOVE_SET_HOVER, 8+4); else data.Initialize(SMSG_MOVE_UNSET_HOVER, 8+4); - data.append(m_target->GetPackGUID()); + data << m_target->GetPackGUID(); data << uint32(0); m_target->SendMessageToSet(&data, true); } @@ -3914,7 +3914,7 @@ void Aura::HandleAuraModStun(bool apply, bool Real) } WorldPacket data(SMSG_FORCE_MOVE_ROOT, 8); - data.append(m_target->GetPackGUID()); + data << m_target->GetPackGUID(); data << uint32(0); m_target->SendMessageToSet(&data, true); @@ -3972,7 +3972,7 @@ void Aura::HandleAuraModStun(bool apply, bool Real) m_target->SetTargetGUID(m_target->getVictim()->GetGUID()); WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 8+4); - data.append(m_target->GetPackGUID()); + data << m_target->GetPackGUID(); data << uint32(0); m_target->SendMessageToSet(&data, true); } @@ -4182,7 +4182,7 @@ void Aura::HandleAuraModRoot(bool apply, bool Real) if(m_target->GetTypeId() == TYPEID_PLAYER) { WorldPacket data(SMSG_FORCE_MOVE_ROOT, 10); - data.append(m_target->GetPackGUID()); + data << m_target->GetPackGUID(); data << (uint32)2; m_target->SendMessageToSet(&data, true); @@ -4231,7 +4231,7 @@ void Aura::HandleAuraModRoot(bool apply, bool Real) if(m_target->GetTypeId() == TYPEID_PLAYER) { WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 10); - data.append(m_target->GetPackGUID()); + data << m_target->GetPackGUID(); data << (uint32)2; m_target->SendMessageToSet(&data, true); } @@ -4386,7 +4386,7 @@ void Aura::HandleAuraModIncreaseFlightSpeed(bool apply, bool Real) data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12); else data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12); - data.append(m_target->GetPackGUID()); + data << m_target->GetPackGUID(); data << uint32(0); // unknown m_target->SendMessageToSet(&data, true); @@ -6649,7 +6649,7 @@ void Aura::HandleAuraAllowFlight(bool apply, bool Real) data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12); else data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12); - data.append(m_target->GetPackGUID()); + data << m_target->GetPackGUID(); data << uint32(0); // unk m_target->SendMessageToSet(&data, true); } diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index b786e434a..9b7f52c9c 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -4019,8 +4019,8 @@ void Spell::EffectDispel(SpellEffectIndex eff_idx) { int32 count = success_list.size(); WorldPacket data(SMSG_SPELLDISPELLOG, 8+8+4+1+4+count*5); - data.append(unitTarget->GetPackGUID()); // Victim GUID - data.append(m_caster->GetPackGUID()); // Caster GUID + data << unitTarget->GetPackGUID(); // Victim GUID + data << m_caster->GetPackGUID(); // Caster GUID data << uint32(m_spellInfo->Id); // Dispel spell id data << uint8(0); // not used data << uint32(count); // count @@ -7326,8 +7326,8 @@ void Spell::EffectStealBeneficialBuff(SpellEffectIndex eff_idx) { int32 count = success_list.size(); WorldPacket data(SMSG_SPELLSTEALLOG, 8+8+4+1+4+count*5); - data.append(unitTarget->GetPackGUID()); // Victim GUID - data.append(m_caster->GetPackGUID()); // Caster GUID + data << unitTarget->GetPackGUID(); // Victim GUID + data << m_caster->GetPackGUID(); // Caster GUID data << uint32(m_spellInfo->Id); // Dispell spell id data << uint8(0); // not used data << uint32(count); // count diff --git a/src/game/SpellHandler.cpp b/src/game/SpellHandler.cpp index 6819c0b48..2d8c2e1a3 100644 --- a/src/game/SpellHandler.cpp +++ b/src/game/SpellHandler.cpp @@ -125,8 +125,8 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket) } SpellCastTargets targets; - if (!targets.read(&recvPacket, pUser)) - return; + + recvPacket >> targets.ReadForCaster(pUser); targets.Update(pUser); @@ -334,27 +334,25 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) // client provided targets SpellCastTargets targets; - if(!targets.read(&recvPacket,mover)) - { - recvPacket.rpos(recvPacket.wpos()); // prevent spam at ignore packet - return; - } + + recvPacket >> targets.ReadForCaster(mover); // some spell cast packet including more data (for projectiles?) if (unk_flags & 0x02) { - recvPacket.read_skip(); // unk1, coords? - recvPacket.read_skip(); // unk1, coords? uint8 unk1; + + recvPacket >> Unused(); // unk1, coords? + recvPacket >> Unused(); // unk1, coords? recvPacket >> unk1; // >> 1 or 0 if(unk1) { - recvPacket.read_skip(); // >> MSG_MOVE_STOP - uint64 guid; // guid - unused - if(!recvPacket.readPackGUID(guid)) - return; + ObjectGuid guid; // guid - unused + MovementInfo movementInfo; - MovementInfo movementInfo(recvPacket); + recvPacket >> Unused(); // >> MSG_MOVE_STOP + recvPacket >> guid.ReadAsPacked(); + recvPacket >> movementInfo; } } diff --git a/src/game/TaxiHandler.cpp b/src/game/TaxiHandler.cpp index a50903f32..7906f591d 100644 --- a/src/game/TaxiHandler.cpp +++ b/src/game/TaxiHandler.cpp @@ -186,13 +186,12 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPacket& recv_data) { sLog.outDebug( "WORLD: Received CMSG_MOVE_SPLINE_DONE" ); - uint64 guid; // used only for proper packet read - if(!recv_data.readPackGUID(guid)) - return; + ObjectGuid guid; // used only for proper packet read + MovementInfo movementInfo; // used only for proper packet read - MovementInfo movementInfo(recv_data); // used only for proper packet read - - recv_data.read_skip(); // unk + recv_data >> guid.ReadAsPacked(); + recv_data >> movementInfo; + recv_data >> Unused(); // unk // in taxi flight packet received in 2 case: diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 6072c4c8f..b6dce1e68 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -73,25 +73,6 @@ static bool isNonTriggerAura[TOTAL_AURAS]; // Prepare lists static bool procPrepared = InitTriggerAuraData(); -MovementInfo::MovementInfo(WorldPacket &data) -{ - // Init fields - moveFlags = MOVEFLAG_NONE; - moveFlags2 = MOVEFLAG2_NONE; - time = 0; - t_guid = 0; - t_time = 0; - t_seat = -1; - t_time2 = 0; - s_pitch = 0.0f; - fallTime = 0; - j_velocity = j_sinAngle = j_cosAngle = j_xyspeed = 0.0f; - u_unk1 = 0.0f; - - // Read actual data - Read(data); -} - void MovementInfo::Read(ByteBuffer &data) { data >> moveFlags; @@ -104,9 +85,7 @@ void MovementInfo::Read(ByteBuffer &data) if(HasMovementFlag(MOVEFLAG_ONTRANSPORT)) { - if(!data.readPackGUID(t_guid)) - return; - + data >> t_guid.ReadAsPacked(); data >> t_pos.x; data >> t_pos.y; data >> t_pos.z; @@ -139,7 +118,7 @@ void MovementInfo::Read(ByteBuffer &data) } } -void MovementInfo::Write(ByteBuffer &data) +void MovementInfo::Write(ByteBuffer &data) const { data << moveFlags; data << moveFlags2; @@ -151,8 +130,7 @@ void MovementInfo::Write(ByteBuffer &data) if(HasMovementFlag(MOVEFLAG_ONTRANSPORT)) { - data.appendPackGUID(t_guid); - + data << t_guid.WriteAsPacked(); data << t_pos.x; data << t_pos.y; data << t_pos.z; @@ -370,7 +348,7 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, SplineTy float moveTime = (float)Time; WorldPacket data( SMSG_MONSTER_MOVE, (41 + GetPackGUID().size()) ); - data.append(GetPackGUID()); + data << GetPackGUID(); data << uint8(0); // new in 3.1 data << GetPositionX() << GetPositionY() << GetPositionZ(); data << uint32(getMSTime()); @@ -418,7 +396,7 @@ void Unit::SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, Spl uint32 pathSize = end - start; WorldPacket data( SMSG_MONSTER_MOVE, (GetPackGUID().size()+1+4+4+4+4+1+4+4+4+pathSize*4*3) ); - data.append(GetPackGUID()); + data << GetPackGUID(); data << uint8(0); data << GetPositionX(); data << GetPositionY(); @@ -459,7 +437,7 @@ void Unit::BuildHeartBeatMsg(WorldPacket *data) const : MOVEFLAG_NONE; data->Initialize(MSG_MOVE_HEARTBEAT, 32); - data->append(GetPackGUID()); + *data << GetPackGUID(); *data << uint32(move_flags); // movement flags *data << uint16(0); // 2.3.0 *data << uint32(getMSTime()); // time @@ -2651,8 +2629,8 @@ void Unit::SendMeleeAttackStop(Unit* victim) return; WorldPacket data( SMSG_ATTACKSTOP, (4+16) ); // we guess size - data.append(GetPackGUID()); - data.append(victim->GetPackGUID()); // can be 0x00... + data << GetPackGUID(); + data << victim->GetPackGUID(); // can be 0x00... data << uint32(0); // can be 0x1 SendMessageToSet(&data, true); sLog.outDetail("%s %u stopped attacking %s %u", (GetTypeId()==TYPEID_PLAYER ? "player" : "creature"), GetGUIDLow(), (victim->GetTypeId()==TYPEID_PLAYER ? "player" : "creature"),victim->GetGUIDLow()); @@ -4772,8 +4750,8 @@ void Unit::RemoveAllGameObjects() void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log) { WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16+4+4+4+1+4+4+1+1+4+4+1)); // we guess size - data.append(log->target->GetPackGUID()); - data.append(log->attacker->GetPackGUID()); + data << log->target->GetPackGUID(); + data << log->attacker->GetPackGUID(); data << uint32(log->SpellID); data << uint32(log->damage); // damage amount data << uint32(log->overkill); // overkill @@ -4808,7 +4786,7 @@ void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo *pInfo) Modifier *mod = aura->GetModifier(); WorldPacket data(SMSG_PERIODICAURALOG, 30); - data.append(aura->GetTarget()->GetPackGUID()); + data << aura->GetTarget()->GetPackGUID(); data.appendPackGUID(aura->GetCasterGUID()); data << uint32(aura->GetId()); // spellId data << uint32(1); // count @@ -4880,8 +4858,8 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo *damageInfo) uint32 count = 1; WorldPacket data(SMSG_ATTACKERSTATEUPDATE, 16 + 45); // we guess size data << uint32(damageInfo->HitInfo); - data.append(damageInfo->attacker->GetPackGUID()); - data.append(damageInfo->target->GetPackGUID()); + data << damageInfo->attacker->GetPackGUID(); + data << damageInfo->target->GetPackGUID(); data << uint32(damageInfo->damage); // Full damage data << uint32(0); // overkill value data << uint8(count); // Sub damage count @@ -8830,8 +8808,8 @@ void Unit::SendHealSpellLog(Unit *pVictim, uint32 SpellID, uint32 Damage, uint32 { // we guess size WorldPacket data(SMSG_SPELLHEALLOG, (8+8+4+4+1)); - data.append(pVictim->GetPackGUID()); - data.append(GetPackGUID()); + data << pVictim->GetPackGUID(); + data << GetPackGUID(); data << uint32(SpellID); data << uint32(Damage); data << uint32(OverHeal); @@ -8843,8 +8821,8 @@ void Unit::SendHealSpellLog(Unit *pVictim, uint32 SpellID, uint32 Damage, uint32 void Unit::SendEnergizeSpellLog(Unit *pVictim, uint32 SpellID, uint32 Damage, Powers powertype) { WorldPacket data(SMSG_SPELLENERGIZELOG, (8+8+4+4+4+1)); - data.append(pVictim->GetPackGUID()); - data.append(GetPackGUID()); + data << pVictim->GetPackGUID(); + data << GetPackGUID(); data << uint32(SpellID); data << uint32(powertype); data << uint32(Damage); @@ -10920,7 +10898,7 @@ void Unit::SetSpeedRate(UnitMoveType mtype, float rate, bool forced) return; } - data.append(GetPackGUID()); + data << GetPackGUID(); data << uint32(0); // movement flags data << uint16(0); // unk flags data << uint32(getMSTime()); @@ -10974,7 +10952,7 @@ void Unit::SetSpeedRate(UnitMoveType mtype, float rate, bool forced) sLog.outError("Unit::SetSpeedRate: Unsupported move type (%d), data not sent to client.",mtype); return; } - data.append(GetPackGUID()); + data << GetPackGUID(); data << (uint32)0; // moveEvent, NUM_PMOVE_EVTS = 0x39 if (mtype == MOVE_RUN) data << uint8(0); // new 2.1.0 @@ -11765,7 +11743,7 @@ void Unit::SetPower(Powers power, uint32 val) SetStatInt32Value(UNIT_FIELD_POWER1 + power, val); WorldPacket data(SMSG_POWER_UPDATE); - data.append(GetPackGUID()); + data << GetPackGUID(); data << uint8(power); data << uint32(val); SendMessageToSet(&data, GetTypeId() == TYPEID_PLAYER ? true : false); @@ -13515,7 +13493,7 @@ void Unit::KnockBackFrom(Unit* target, float horizontalSpeed, float verticalSpee if(GetTypeId()==TYPEID_PLAYER) { WorldPacket data(SMSG_MOVE_KNOCK_BACK, 8+4+4+4+4+4); - data.append(GetPackGUID()); + data << GetPackGUID(); data << uint32(0); // Sequence data << float(vcos); // x direction data << float(vsin); // y direction @@ -13580,7 +13558,7 @@ void Unit::SendThreatUpdate() { sLog.outDebug( "WORLD: Send SMSG_THREAT_UPDATE Message" ); WorldPacket data(SMSG_THREAT_UPDATE, 8 + count * 8); - data.append(GetPackGUID()); + data << GetPackGUID(); data << uint32(count); for (ThreatList::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr) { @@ -13598,7 +13576,7 @@ void Unit::SendHighestThreatUpdate(HostileReference* pHostilReference) { sLog.outDebug( "WORLD: Send SMSG_HIGHEST_THREAT_UPDATE Message" ); WorldPacket data(SMSG_HIGHEST_THREAT_UPDATE, 8 + 8 + count * 8); - data.append(GetPackGUID()); + data << GetPackGUID(); data.appendPackGUID(pHostilReference->getUnitGuid()); data << uint32(count); for (ThreatList::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr) @@ -13614,7 +13592,7 @@ void Unit::SendThreatClear() { sLog.outDebug( "WORLD: Send SMSG_THREAT_CLEAR Message" ); WorldPacket data(SMSG_THREAT_CLEAR, 8); - data.append(GetPackGUID()); + data << GetPackGUID(); SendMessageToSet(&data, false); } @@ -13622,7 +13600,7 @@ void Unit::SendThreatRemove(HostileReference* pHostileReference) { sLog.outDebug( "WORLD: Send SMSG_THREAT_REMOVE Message" ); WorldPacket data(SMSG_THREAT_REMOVE, 8 + 8); - data.append(GetPackGUID()); + data << GetPackGUID(); data.appendPackGUID(pHostileReference->getUnitGuid()); SendMessageToSet(&data, false); } diff --git a/src/game/Unit.h b/src/game/Unit.h index 545510b5f..23acdb589 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -745,15 +745,13 @@ struct Position class MovementInfo { public: - MovementInfo() : moveFlags(MOVEFLAG_NONE), moveFlags2(MOVEFLAG2_NONE), time(0), t_guid(0), + MovementInfo() : moveFlags(MOVEFLAG_NONE), moveFlags2(MOVEFLAG2_NONE), time(0), t_time(0), t_seat(-1), t_time2(0), s_pitch(0.0f), fallTime(0), j_velocity(0.0f), j_sinAngle(0.0f), j_cosAngle(0.0f), j_xyspeed(0.0f), u_unk1(0.0f) {} - MovementInfo(WorldPacket &data); - // Read/Write methods void Read(ByteBuffer &data); - void Write(ByteBuffer &data); + void Write(ByteBuffer &data) const; // Movement flags manipulations void AddMovementFlag(MovementFlags f) { moveFlags |= f; } @@ -775,7 +773,7 @@ class MovementInfo t_time = time; t_seat = seat; } - uint64 GetTransportGuid() const { return t_guid; } + uint64 GetTransportGuid() const { return t_guid.GetRawValue(); } Position const *GetTransportPos() const { return &t_pos; } int8 GetTransportSeat() const { return t_seat; } uint32 GetTransportTime() const { return t_time; } @@ -790,7 +788,7 @@ class MovementInfo uint32 time; Position pos; // transport - uint64 t_guid; + ObjectGuid t_guid; Position t_pos; uint32 t_time; int8 t_seat; @@ -805,6 +803,18 @@ class MovementInfo float u_unk1; }; +inline ByteBuffer& operator<< (ByteBuffer& buf, MovementInfo const& mi) +{ + mi.Write(buf); + return buf; +} + +inline ByteBuffer& operator>> (ByteBuffer& buf, MovementInfo& mi) +{ + mi.Read(buf); + return buf; +} + enum DiminishingLevels { DIMINISHING_LEVEL_1 = 0, diff --git a/src/game/debugcmds.cpp b/src/game/debugcmds.cpp index 7c2c9efd8..ae04a623f 100644 --- a/src/game/debugcmds.cpp +++ b/src/game/debugcmds.cpp @@ -183,7 +183,7 @@ bool ChatHandler::HandleDebugSendOpcodeCommand(const char* /*args*/) } else if(type == "pguid") { - data.append(unit->GetPackGUID()); + data << unit->GetPackGUID(); } else { diff --git a/src/shared/ByteBuffer.h b/src/shared/ByteBuffer.h index f44cfb729..b7601f08d 100644 --- a/src/shared/ByteBuffer.h +++ b/src/shared/ByteBuffer.h @@ -45,6 +45,12 @@ class ByteBufferException size_t size; }; +template +struct Unused +{ + Unused() {} +}; + class ByteBuffer { public: @@ -233,6 +239,14 @@ class ByteBuffer return *this; } + template + ByteBuffer &operator>>(Unused &) + { + read_skip(); + return *this; + } + + uint8 operator[](size_t pos) const { return read(pos); @@ -288,13 +302,9 @@ class ByteBuffer _rpos += len; } - bool readPackGUID(uint64& guid) + uint64 readPackGUID() { - if(rpos() + 1 > size()) - return false; - - guid = 0; - + uint64 guid = 0; uint8 guidmark = 0; (*this) >> guidmark; @@ -302,16 +312,13 @@ class ByteBuffer { if(guidmark & (uint8(1) << i)) { - if(rpos() + 1 > size()) - return false; - uint8 bit; (*this) >> bit; guid |= (uint64(bit) << (i * 8)); } } - return true; + return guid; } const uint8 *contents() const { return &_storage[0]; } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 170d7e0e3..ccbfcf27e 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9550" + #define REVISION_NR "9551" #endif // __REVISION_NR_H__