[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.
This commit is contained in:
VladimirMangos 2010-03-08 20:19:25 +03:00
parent ad9243ebd0
commit c8fd454a79
26 changed files with 351 additions and 340 deletions

View file

@ -651,7 +651,7 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement)
} }
WorldPacket data(SMSG_ACHIEVEMENT_EARNED, 8+4+8); WorldPacket data(SMSG_ACHIEVEMENT_EARNED, 8+4+8);
data.append(GetPlayer()->GetPackGUID()); data << GetPlayer()->GetPackGUID();
data << uint32(achievement->ID); data << uint32(achievement->ID);
data << uint32(secsToTimeBitFields(time(NULL))); data << uint32(secsToTimeBitFields(time(NULL)));
data << uint32(0); data << uint32(0);
@ -666,7 +666,7 @@ void AchievementMgr::SendCriteriaUpdate(uint32 id, CriteriaProgress const* progr
// the counter is packed like a packed Guid // the counter is packed like a packed Guid
data.appendPackGUID(progress->counter); data.appendPackGUID(progress->counter);
data.append(GetPlayer()->GetPackGUID()); data << GetPlayer()->GetPackGUID();
data << uint32(0); data << uint32(0);
data << uint32(secsToTimeBitFields(progress->date)); data << uint32(secsToTimeBitFields(progress->date));
data << uint32(0); // timer 1 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 // 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); 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); BuildAllDataPacket(&data);
player->GetSession()->SendPacket(&data); player->GetSession()->SendPacket(&data);
} }
@ -1876,7 +1876,7 @@ void AchievementMgr::BuildAllDataPacket(WorldPacket *data)
{ {
*data << uint32(iter->first); *data << uint32(iter->first);
data->appendPackGUID(iter->second.counter); data->appendPackGUID(iter->second.counter);
data->append(GetPlayer()->GetPackGUID()); *data << GetPlayer()->GetPackGUID();
*data << uint32(0); *data << uint32(0);
*data << uint32(secsToTimeBitFields(iter->second.date)); *data << uint32(secsToTimeBitFields(iter->second.date));
*data << uint32(0); *data << uint32(0);

View file

@ -1233,43 +1233,41 @@ void WorldSession::HandleEquipmentSetSave(WorldPacket &recv_data)
{ {
sLog.outDebug("CMSG_EQUIPMENT_SET_SAVE"); sLog.outDebug("CMSG_EQUIPMENT_SET_SAVE");
uint64 setGuid; ObjectGuid setGuid;
if(!recv_data.readPackGUID(setGuid))
return;
uint32 index; uint32 index;
std::string name;
std::string iconName;
recv_data >> setGuid.ReadAsPacked();
recv_data >> index; recv_data >> index;
recv_data >> name;
recv_data >> iconName;
if(index >= MAX_EQUIPMENT_SET_INDEX) // client set slots amount if(index >= MAX_EQUIPMENT_SET_INDEX) // client set slots amount
return; return;
std::string name;
recv_data >> name;
std::string iconName;
recv_data >> iconName;
EquipmentSet eqSet; EquipmentSet eqSet;
eqSet.Guid = setGuid; eqSet.Guid = setGuid.GetRawValue();
eqSet.Name = name; eqSet.Name = name;
eqSet.IconName = iconName; eqSet.IconName = iconName;
eqSet.state = EQUIPMENT_SET_NEW; eqSet.state = EQUIPMENT_SET_NEW;
for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
{ {
uint64 itemGuid; ObjectGuid itemGuid;
if(!recv_data.readPackGUID(itemGuid))
return; recv_data >> itemGuid.ReadAsPacked();
Item *item = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i); Item *item = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);
if(!item && itemGuid) // cheating check 1 if(!item && !itemGuid.IsEmpty()) // cheating check 1
return; return;
if(item && item->GetGUID() != itemGuid) // cheating check 2 if(item && item->GetGUID() != itemGuid.GetRawValue())// cheating check 2
return; return;
eqSet.Items[i] = GUID_LOPART(itemGuid); eqSet.Items[i] = itemGuid.GetCounter();
} }
_player->SetEquipmentSet(index, eqSet); _player->SetEquipmentSet(index, eqSet);
@ -1279,11 +1277,11 @@ void WorldSession::HandleEquipmentSetDelete(WorldPacket &recv_data)
{ {
sLog.outDebug("CMSG_EQUIPMENT_SET_DELETE"); sLog.outDebug("CMSG_EQUIPMENT_SET_DELETE");
uint64 setGuid; ObjectGuid setGuid;
if(!recv_data.readPackGUID(setGuid))
return;
_player->DeleteEquipmentSet(setGuid); recv_data >> setGuid.ReadAsPacked();
_player->DeleteEquipmentSet(setGuid.GetRawValue());
} }
void WorldSession::HandleEquipmentSetUse(WorldPacket &recv_data) 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) for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
{ {
uint64 itemGuid; ObjectGuid itemGuid;
if(!recv_data.readPackGUID(itemGuid))
return;
uint8 srcbag, srcslot; uint8 srcbag, srcslot;
recv_data >> itemGuid.ReadAsPacked();
recv_data >> srcbag >> srcslot; recv_data >> srcbag >> srcslot;
sLog.outDebug("Item " I64FMT ": srcbag %u, srcslot %u", itemGuid, 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); uint16 dstpos = i | (INVENTORY_SLOT_BAG_0 << 8);

View file

@ -89,8 +89,8 @@ void WorldSession::HandleSetSheathedOpcode( WorldPacket & recv_data )
void WorldSession::SendAttackStop(Unit const* enemy) void WorldSession::SendAttackStop(Unit const* enemy)
{ {
WorldPacket data( SMSG_ATTACKSTOP, (4+20) ); // we guess size WorldPacket data( SMSG_ATTACKSTOP, (4+20) ); // we guess size
data.append(GetPlayer()->GetPackGUID()); data << GetPlayer()->GetPackGUID();
data.append(enemy ? enemy->GetPackGUID() : 0); // must be packed guid data << (enemy ? enemy->GetPackGUID() : PackedGuid()); // must be packed guid
data << uint32(0); // unk, can be 1 also data << uint32(0); // unk, can be 1 also
SendPacket(&data); SendPacket(&data);
} }

View file

@ -635,7 +635,7 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke
byteCount += GroupUpdateLength[i]; byteCount += GroupUpdateLength[i];
data->Initialize(SMSG_PARTY_MEMBER_STATS, 8 + 4 + byteCount); data->Initialize(SMSG_PARTY_MEMBER_STATS, 8 + 4 + byteCount);
data->append(player->GetPackGUID()); *data << player->GetPackGUID();
*data << (uint32) mask; *data << (uint32) mask;
if (mask & GROUP_UPDATE_FLAG_STATUS) 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); 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 << 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 uint32 mask1 = 0x00040BFF; // common mask, real flags used 0x000040BFF
if(pet) if(pet)

View file

@ -1603,14 +1603,14 @@ bool ChatHandler::HandleModifyMountCommand(const char* args)
chr->Mount(mId); chr->Mount(mId);
WorldPacket data( SMSG_FORCE_RUN_SPEED_CHANGE, (8+4+1+4) ); WorldPacket data( SMSG_FORCE_RUN_SPEED_CHANGE, (8+4+1+4) );
data.append(chr->GetPackGUID()); data << chr->GetPackGUID();
data << (uint32)0; data << (uint32)0;
data << (uint8)0; //new 2.1.0 data << (uint8)0; //new 2.1.0
data << float(speed); data << float(speed);
chr->SendMessageToSet( &data, true ); chr->SendMessageToSet( &data, true );
data.Initialize( SMSG_FORCE_SWIM_SPEED_CHANGE, (8+4+4) ); data.Initialize( SMSG_FORCE_SWIM_SPEED_CHANGE, (8+4+4) );
data.append(chr->GetPackGUID()); data << chr->GetPackGUID();
data << (uint32)0; data << (uint32)0;
data << float(speed); data << float(speed);
chr->SendMessageToSet( &data, true ); chr->SendMessageToSet( &data, true );

View file

@ -5429,7 +5429,7 @@ bool ChatHandler::HandleGMFlyCommand(const char* args)
SendSysMessage(LANG_USE_BOL); SendSysMessage(LANG_USE_BOL);
return false; return false;
} }
data.append(target->GetPackGUID()); data << target->GetPackGUID();
data << uint32(0); // unknown data << uint32(0); // unknown
target->SendMessageToSet(&data, true); target->SendMessageToSet(&data, true);
PSendSysMessage(LANG_COMMAND_FLYMODE_STATUS, GetNameLink(target).c_str(), args); PSendSysMessage(LANG_COMMAND_FLYMODE_STATUS, GetNameLink(target).c_str(), args);

View file

@ -292,7 +292,7 @@ void WorldSession::HandleLogoutRequestOpcode( WorldPacket & /*recv_data*/ )
GetPlayer()->SetStandState(UNIT_STAND_STATE_SIT); GetPlayer()->SetStandState(UNIT_STAND_STATE_SIT);
WorldPacket data( SMSG_FORCE_MOVE_ROOT, (8+4) ); // guess size WorldPacket data( SMSG_FORCE_MOVE_ROOT, (8+4) ); // guess size
data.append(GetPlayer()->GetPackGUID()); data << GetPlayer()->GetPackGUID();
data << (uint32)2; data << (uint32)2;
SendPacket( &data ); SendPacket( &data );
GetPlayer()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); GetPlayer()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
@ -324,7 +324,7 @@ void WorldSession::HandleLogoutCancelOpcode( WorldPacket & /*recv_data*/ )
{ {
//!we can move again //!we can move again
data.Initialize( SMSG_FORCE_MOVE_UNROOT, 8 ); // guess size data.Initialize( SMSG_FORCE_MOVE_UNROOT, 8 ); // guess size
data.append(GetPlayer()->GetPackGUID()); data << GetPlayer()->GetPackGUID();
data << uint32(0); data << uint32(0);
SendPacket( &data ); SendPacket( &data );
@ -1004,13 +1004,11 @@ void WorldSession::HandleMoveTimeSkippedOpcode( WorldPacket & recv_data )
/* WorldSession::Update( getMSTime() );*/ /* WorldSession::Update( getMSTime() );*/
DEBUG_LOG( "WORLD: Time Lag/Synchronization Resent/Update" ); DEBUG_LOG( "WORLD: Time Lag/Synchronization Resent/Update" );
uint64 guid; ObjectGuid guid;
if(!recv_data.readPackGUID(guid))
{ recv_data >> guid.ReadAsPacked();
recv_data.rpos(recv_data.wpos()); recv_data >> Unused<uint32>();
return;
}
recv_data.read_skip<uint32>();
/* /*
uint64 guid; uint64 guid;
uint32 time_skipped; uint32 time_skipped;
@ -1133,7 +1131,7 @@ void WorldSession::HandleInspectOpcode(WorldPacket& recv_data)
return; return;
WorldPacket data(SMSG_INSPECT_TALENT, 50); WorldPacket data(SMSG_INSPECT_TALENT, 50);
data.append(plr->GetPackGUID()); data << plr->GetPackGUID();
if(sWorld.getConfig(CONFIG_BOOL_TALENTS_INSPECTING) || _player->isGameMaster()) 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"); sLog.outDebug("WORLD: CMSG_MOVE_SET_CAN_FLY_ACK");
//recv_data.hexlike(); //recv_data.hexlike();
uint64 guid; // guid - unused ObjectGuid guid; // guid - unused
if(!recv_data.readPackGUID(guid)) MovementInfo movementInfo;
return;
recv_data.read_skip<uint32>(); // unk recv_data >> guid.ReadAsPacked();
recv_data >> Unused<uint32>(); // unk
MovementInfo movementInfo(recv_data); recv_data >> movementInfo;
recv_data >> Unused<float>(); // unk2
recv_data.read_skip<float>(); // unk2
_player->m_movementInfo.SetMovementFlags(movementInfo.GetMovementFlags()); _player->m_movementInfo.SetMovementFlags(movementInfo.GetMovementFlags());
} }
@ -1548,11 +1544,11 @@ void WorldSession::HandleSetTaxiBenchmarkOpcode( WorldPacket & recv_data )
void WorldSession::HandleQueryInspectAchievements( WorldPacket & recv_data ) void WorldSession::HandleQueryInspectAchievements( WorldPacket & recv_data )
{ {
uint64 guid; ObjectGuid guid;
if(!recv_data.readPackGUID(guid))
return;
if(Player *player = sObjectMgr.GetPlayer(guid)) recv_data >> guid.ReadAsPacked();
if(Player *player = sObjectMgr.GetPlayer(guid.GetRawValue()))
player->GetAchievementMgr().SendRespondInspectAchievements(_player); player->GetAchievementMgr().SendRespondInspectAchievements(_player);
} }

View file

@ -171,10 +171,10 @@ void WorldSession::HandleMoveWorldportAckOpcode()
void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data) void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data)
{ {
sLog.outDebug("MSG_MOVE_TELEPORT_ACK"); sLog.outDebug("MSG_MOVE_TELEPORT_ACK");
uint64 guid;
if(!recv_data.readPackGUID(guid)) ObjectGuid guid;
return;
recv_data >> guid.ReadAsPacked();
uint32 flags, time; uint32 flags, time;
recv_data >> flags >> time; recv_data >> flags >> time;
@ -187,7 +187,7 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data)
if(!plMover || !plMover->IsBeingTeleportedNear()) if(!plMover || !plMover->IsBeingTeleportedNear())
return; return;
if(guid != plMover->GetGUID()) if(guid.GetRawValue() != plMover->GetGUID())
return; return;
plMover->SetSemaphoreTeleportNear(false); plMover->SetSemaphoreTeleportNear(false);
@ -234,12 +234,11 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
} }
/* extract packet */ /* extract packet */
uint64 guid; ObjectGuid guid;
MovementInfo movementInfo;
if(!recv_data.readPackGUID(guid)) recv_data >> guid.ReadAsPacked();
return; recv_data >> movementInfo;
MovementInfo movementInfo(recv_data);
/*----------------*/ /*----------------*/
if (!MaNGOS::IsValidMapCoord(movementInfo.GetPos()->x, movementInfo.GetPos()->y, movementInfo.GetPos()->z, movementInfo.GetPos()->o)) 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(); uint32 opcode = recv_data.GetOpcode();
sLog.outDebug("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode); sLog.outDebug("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode);
/* extract packet */ /* extract packet */
uint64 guid; ObjectGuid guid;
uint32 unk1; MovementInfo movementInfo;
float newspeed; float newspeed;
if(!recv_data.readPackGUID(guid)) recv_data >> guid.ReadAsPacked();
return; recv_data >> Unused<uint32>(); // counter or moveEvent
recv_data >> movementInfo;
recv_data >> newspeed;
// now can skip not our packet // now can skip not our packet
if(_player->GetGUID() != guid) if(_player->GetGUID() != guid.GetRawValue())
{ {
recv_data.rpos(recv_data.wpos()); // prevent warnings spam recv_data.rpos(recv_data.wpos()); // prevent warnings spam
return; 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 // 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"); sLog.outDebug("WORLD: Recvd CMSG_MOVE_NOT_ACTIVE_MOVER");
recv_data.hexlike(); recv_data.hexlike();
uint64 old_mover_guid; ObjectGuid old_mover_guid;
MovementInfo mi;
if(!recv_data.readPackGUID(old_mover_guid)) recv_data >> old_mover_guid.ReadAsPacked();
return; 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); 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 recv_data.rpos(recv_data.wpos()); // prevent warnings spam
return; return;
} }
MovementInfo mi(recv_data);
_player->m_movementInfo = mi; _player->m_movementInfo = mi;
} }
@ -477,20 +470,16 @@ void WorldSession::HandleDismissControlledVehicle(WorldPacket &recv_data)
sLog.outDebug("WORLD: Recvd CMSG_DISMISS_CONTROLLED_VEHICLE"); sLog.outDebug("WORLD: Recvd CMSG_DISMISS_CONTROLLED_VEHICLE");
recv_data.hexlike(); recv_data.hexlike();
ObjectGuid guid;
MovementInfo mi;
recv_data >> guid.ReadAsPacked();
recv_data >> mi;
uint64 vehicleGUID = _player->GetCharmGUID(); uint64 vehicleGUID = _player->GetCharmGUID();
if(!vehicleGUID) // something wrong here... if(!vehicleGUID) // something wrong here...
{
recv_data.rpos(recv_data.wpos()); // prevent warnings spam
return; return;
}
uint64 guid;
if(!recv_data.readPackGUID(guid))
return;
MovementInfo mi(recv_data);
_player->m_movementInfo = mi; _player->m_movementInfo = mi;
@ -516,43 +505,38 @@ void WorldSession::HandleMoveKnockBackAck( WorldPacket & recv_data )
{ {
sLog.outDebug("CMSG_MOVE_KNOCK_BACK_ACK"); sLog.outDebug("CMSG_MOVE_KNOCK_BACK_ACK");
uint64 guid; // guid - unused ObjectGuid guid; // guid - unused
if(!recv_data.readPackGUID(guid)) MovementInfo movementInfo;
return;
recv_data.read_skip<uint32>(); // unk recv_data >> guid.ReadAsPacked();
recv_data >> Unused<uint32>(); // unk
MovementInfo movementInfo(recv_data); recv_data >> movementInfo;
} }
void WorldSession::HandleMoveHoverAck( WorldPacket& recv_data ) void WorldSession::HandleMoveHoverAck( WorldPacket& recv_data )
{ {
sLog.outDebug("CMSG_MOVE_HOVER_ACK"); sLog.outDebug("CMSG_MOVE_HOVER_ACK");
uint64 guid; // guid - unused ObjectGuid guid; // guid - unused
if(!recv_data.readPackGUID(guid)) MovementInfo movementInfo;
return;
recv_data.read_skip<uint32>(); // unk recv_data >> guid.ReadAsPacked();
recv_data >> Unused<uint32>(); // unk1
MovementInfo movementInfo(recv_data); recv_data >> movementInfo;
recv_data >> Unused<uint32>(); // unk2
recv_data.read_skip<uint32>(); // unk2
} }
void WorldSession::HandleMoveWaterWalkAck(WorldPacket& recv_data) void WorldSession::HandleMoveWaterWalkAck(WorldPacket& recv_data)
{ {
sLog.outDebug("CMSG_MOVE_WATER_WALK_ACK"); sLog.outDebug("CMSG_MOVE_WATER_WALK_ACK");
uint64 guid; // guid - unused ObjectGuid guid; // guid - unused
if(!recv_data.readPackGUID(guid)) MovementInfo movementInfo;
return;
recv_data.read_skip<uint32>(); // unk recv_data >> guid.ReadAsPacked();
recv_data >> Unused<uint32>(); // unk1
MovementInfo movementInfo(recv_data); recv_data >> movementInfo;
recv_data >> Unused<uint32>(); // unk2
recv_data.read_skip<uint32>(); // unk2
} }
void WorldSession::HandleSummonResponseOpcode(WorldPacket& recv_data) void WorldSession::HandleSummonResponseOpcode(WorldPacket& recv_data)

View file

@ -63,7 +63,7 @@ uint32 GuidHigh2TypeId(uint32 guid_hi)
return TYPEID_OBJECT; // unknown return TYPEID_OBJECT; // unknown
} }
Object::Object( ) : m_PackGUID(sizeof(uint64)+1) Object::Object( )
{ {
m_objectTypeId = TYPEID_OBJECT; m_objectTypeId = TYPEID_OBJECT;
m_objectType = TYPEMASK_OBJECT; m_objectType = TYPEMASK_OBJECT;
@ -74,8 +74,6 @@ Object::Object( ) : m_PackGUID(sizeof(uint64)+1)
m_inWorld = false; m_inWorld = false;
m_objectUpdated = false; m_objectUpdated = false;
m_PackGUID.appendPackGUID(0);
} }
Object::~Object( ) Object::~Object( )
@ -121,8 +119,7 @@ void Object::_Create( uint32 guidlow, uint32 entry, HighGuid guidhigh )
uint64 guid = MAKE_NEW_GUID(guidlow, entry, guidhigh); uint64 guid = MAKE_NEW_GUID(guidlow, entry, guidhigh);
SetUInt64Value(OBJECT_FIELD_GUID, guid); SetUInt64Value(OBJECT_FIELD_GUID, guid);
SetUInt32Value(OBJECT_FIELD_TYPE, m_objectType); SetUInt32Value(OBJECT_FIELD_TYPE, m_objectType);
m_PackGUID.wpos(0); m_PackGUID.Set(guid);
m_PackGUID.appendPackGUID(GetGUID());
} }
void Object::BuildMovementUpdateBlock(UpdateData * data, uint16 flags ) const void Object::BuildMovementUpdateBlock(UpdateData * data, uint16 flags ) const
@ -130,7 +127,7 @@ void Object::BuildMovementUpdateBlock(UpdateData * data, uint16 flags ) const
ByteBuffer buf(500); ByteBuffer buf(500);
buf << uint8(UPDATETYPE_MOVEMENT); buf << uint8(UPDATETYPE_MOVEMENT);
buf.append(GetPackGUID()); buf << GetPackGUID();
BuildMovementUpdate(&buf, flags); BuildMovementUpdate(&buf, flags);
@ -189,7 +186,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c
ByteBuffer buf(500); ByteBuffer buf(500);
buf << uint8(updatetype); buf << uint8(updatetype);
buf.append(GetPackGUID()); buf << GetPackGUID();
buf << uint8(m_objectTypeId); buf << uint8(m_objectTypeId);
BuildMovementUpdate(&buf, updateFlags); BuildMovementUpdate(&buf, updateFlags);
@ -217,7 +214,7 @@ void Object::BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target) c
ByteBuffer buf(500); ByteBuffer buf(500);
buf << uint8(UPDATETYPE_VALUES); buf << uint8(UPDATETYPE_VALUES);
buf.append(GetPackGUID()); buf << GetPackGUID();
UpdateMask updateMask; UpdateMask updateMask;
updateMask.SetCount(m_valuesCount); 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(updateFlags & UPDATEFLAG_HAS_ATTACKING_TARGET) // packed guid (current target guid)
{ {
if (((Unit*)this)->getVictim()) if (((Unit*)this)->getVictim())
data->append(((Unit*)this)->getVictim()->GetPackGUID()); *data << ((Unit*)this)->getVictim()->GetPackGUID();
else else
data->appendPackGUID(0); data->appendPackGUID(0);
} }

View file

@ -112,7 +112,7 @@ class MANGOS_DLL_SPEC Object
uint32 GetGUIDLow() const { return GUID_LOPART(GetUInt64Value(0)); } uint32 GetGUIDLow() const { return GUID_LOPART(GetUInt64Value(0)); }
uint32 GetGUIDMid() const { return GUID_ENPART(GetUInt64Value(0)); } uint32 GetGUIDMid() const { return GUID_ENPART(GetUInt64Value(0)); }
uint32 GetGUIDHigh() const { return GUID_HIPART(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); } uint32 GetEntry() const { return GetUInt32Value(OBJECT_FIELD_ENTRY); }
void SetEntry(uint32 entry) { SetUInt32Value(OBJECT_FIELD_ENTRY, entry); } void SetEntry(uint32 entry) { SetUInt32Value(OBJECT_FIELD_ENTRY, entry); }
@ -312,7 +312,7 @@ class MANGOS_DLL_SPEC Object
private: private:
bool m_inWorld; bool m_inWorld;
ByteBuffer m_PackGUID; PackedGuid m_PackGUID;
// for output helpfull error messages from asserts // for output helpfull error messages from asserts
bool PrintIndexError(uint32 index, bool set) const; bool PrintIndexError(uint32 index, bool set) const;

View file

@ -17,7 +17,6 @@
*/ */
#include "ObjectGuid.h" #include "ObjectGuid.h"
#include "ByteBuffer.h"
#include <sstream> #include <sstream>
char const* ObjectGuid::GetTypeName() const char const* ObjectGuid::GetTypeName() const
@ -60,3 +59,15 @@ ByteBuffer &operator>>(ByteBuffer& buf, ObjectGuid& guid)
guid.Set(buf.read<uint64>()); guid.Set(buf.read<uint64>());
return buf; 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;
}

View file

@ -20,8 +20,7 @@
#define MANGOS_OBJECT_GUID_H #define MANGOS_OBJECT_GUID_H
#include "Common.h" #include "Common.h"
#include "ByteBuffer.h"
class ByteBuffer;
enum TypeID 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)) #define GUID_LOPART(x) (IsGuidHaveEnPart(x) ? _GUID_LOPART_3(x) : _GUID_LOPART_2(x))
//*** Must be replaced by ObjectGuid use END *** //*** 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 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)) {} ObjectGuid(HighGuid hi, uint32 entry, uint32 counter) : m_guid(uint64(counter) | (uint64(entry) << 24) | (uint64(hi) << 48)) {}
public: // modifiers public: // modifiers
PackedGuidReader ReadAsPacked() { return PackedGuidReader(*this); }
void Set(uint64 const& guid) { m_guid = guid; } void Set(uint64 const& guid) { m_guid = guid; }
// Possible removed in future for more strict control type conversions // Possible removed in future for more strict control type conversions
@ -170,6 +179,8 @@ class ObjectGuid
default: return TYPEID_OBJECT; default: return TYPEID_OBJECT;
} }
} }
PackedGuid WriteAsPacked() const;
public: // accessors - for debug public: // accessors - for debug
char const* GetTypeName() const; char const* GetTypeName() const;
std::string GetString() const; std::string GetString() const;
@ -198,7 +209,32 @@ class ObjectGuid
uint64 m_guid; 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 const& guid);
ByteBuffer& operator>> (ByteBuffer& buf, ObjectGuid& 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 #endif

View file

@ -630,8 +630,8 @@ void WorldSession::HandlePetCastSpellOpcode( WorldPacket& recvPacket )
return; return;
SpellCastTargets targets; SpellCastTargets targets;
if (!targets.read(&recvPacket,pet))
return; recvPacket >> targets.ReadForCaster(pet);
pet->clearUnitState(UNIT_STAT_MOVING); pet->clearUnitState(UNIT_STAT_MOVING);

View file

@ -4134,7 +4134,7 @@ void Player::SetMovement(PlayerMovementType pType)
sLog.outError("Player::SetMovement: Unsupported move type (%d), data not sent to client.",pType); sLog.outError("Player::SetMovement: Unsupported move type (%d), data not sent to client.",pType);
return; return;
} }
data.append(GetPackGUID()); data << GetPackGUID();
data << uint32(0); data << uint32(0);
GetSession()->SendPacket( &data ); GetSession()->SendPacket( &data );
} }
@ -4146,7 +4146,7 @@ void Player::SetMovement(PlayerMovementType pType)
void Player::BuildPlayerRepop() void Player::BuildPlayerRepop()
{ {
WorldPacket data(SMSG_PRE_RESURRECT, GetPackGUID().size()); WorldPacket data(SMSG_PRE_RESURRECT, GetPackGUID().size());
data.append(GetPackGUID()); data << GetPackGUID();
GetSession()->SendPacket(&data); GetSession()->SendPacket(&data);
if(getRace() == RACE_NIGHTELF) if(getRace() == RACE_NIGHTELF)
@ -16961,7 +16961,7 @@ void Player::SendAttackSwingBadFacingAttack()
void Player::SendAutoRepeatCancel(Unit *target) void Player::SendAutoRepeatCancel(Unit *target)
{ {
WorldPacket data(SMSG_CANCEL_AUTO_REPEAT, target->GetPackGUID().size()); 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 ); GetSession()->SendPacket( &data );
} }
@ -18936,7 +18936,7 @@ void Player::SendComboPoints()
if (combotarget) if (combotarget)
{ {
WorldPacket data(SMSG_UPDATE_COMBO_POINTS, combotarget->GetPackGUID().size()+1); WorldPacket data(SMSG_UPDATE_COMBO_POINTS, combotarget->GetPackGUID().size()+1);
data.append(combotarget->GetPackGUID()); data << combotarget->GetPackGUID();
data << uint8(m_comboPoints); data << uint8(m_comboPoints);
GetSession()->SendPacket(&data); GetSession()->SendPacket(&data);
} }
@ -19096,7 +19096,7 @@ void Player::SendInitialPacketsAfterAddToMap()
if(HasAuraType(SPELL_AURA_MOD_ROOT)) if(HasAuraType(SPELL_AURA_MOD_ROOT))
{ {
WorldPacket data2(SMSG_FORCE_MOVE_ROOT, 10); WorldPacket data2(SMSG_FORCE_MOVE_ROOT, 10);
data2.append(GetPackGUID()); data2 << GetPackGUID();
data2 << (uint32)2; data2 << (uint32)2;
SendMessageToSet(&data2,true); SendMessageToSet(&data2,true);
} }
@ -19340,7 +19340,7 @@ void Player::SendAurasForTarget(Unit *target)
return; return;
WorldPacket data(SMSG_AURA_UPDATE_ALL); WorldPacket data(SMSG_AURA_UPDATE_ALL);
data.append(target->GetPackGUID()); data << target->GetPackGUID();
Unit::VisibleAuraMap const *visibleAuras = target->GetVisibleAuras(); Unit::VisibleAuraMap const *visibleAuras = target->GetVisibleAuras();
for(Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr) 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) void Player::SetClientControl(Unit* target, uint8 allowMove)
{ {
WorldPacket data(SMSG_CLIENT_CONTROL_UPDATE, target->GetPackGUID().size()+1); WorldPacket data(SMSG_CLIENT_CONTROL_UPDATE, target->GetPackGUID().size()+1);
data.append(target->GetPackGUID()); data << target->GetPackGUID();
data << uint8(allowMove); data << uint8(allowMove);
GetSession()->SendPacket(&data); GetSession()->SendPacket(&data);
} }
@ -20379,7 +20379,7 @@ void Player::EnterVehicle(Vehicle *vehicle)
GetSession()->SendPacket(&data); GetSession()->SendPacket(&data);
data.Initialize(MSG_MOVE_TELEPORT_ACK, 30); data.Initialize(MSG_MOVE_TELEPORT_ACK, 30);
data.append(GetPackGUID()); data << GetPackGUID();
data << uint32(0); // counter? data << uint32(0); // counter?
data << uint32(MOVEFLAG_ONTRANSPORT); // transport data << uint32(MOVEFLAG_ONTRANSPORT); // transport
data << uint16(0); // special flags data << uint16(0); // special flags
@ -20428,7 +20428,7 @@ void Player::ExitVehicle(Vehicle *vehicle)
SetMover(NULL); SetMover(NULL);
WorldPacket data(MSG_MOVE_TELEPORT_ACK, 30); WorldPacket data(MSG_MOVE_TELEPORT_ACK, 30);
data.append(GetPackGUID()); data << GetPackGUID();
data << uint32(0); // counter? data << uint32(0); // counter?
data << uint32(MOVEFLAG_ROOT); // fly unk data << uint32(MOVEFLAG_ROOT); // fly unk
data << uint16(MOVEFLAG2_UNK4); // special flags 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 void Player::BuildTeleportAckMsg( WorldPacket *data, float x, float y, float z, float ang ) const
{ {
data->Initialize(MSG_MOVE_TELEPORT_ACK, 41); data->Initialize(MSG_MOVE_TELEPORT_ACK, 41);
data->append(GetPackGUID()); *data << GetPackGUID();
*data << uint32(0); // this value increments every time *data << uint32(0); // this value increments every time
*data << uint32(m_movementInfo.GetMovementFlags()); // movement flags *data << uint32(m_movementInfo.GetMovementFlags()); // movement flags
*data << uint16(0); // 2.3.0 *data << uint16(0); // 2.3.0

View file

@ -39,7 +39,7 @@ void WorldSession::SendNameQueryOpcode(Player *p)
return; return;
// guess size // guess size
WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+1+1+1+1+10) ); 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 << uint8(0); // added in 3.1; if > 1, then end of packet
data << p->GetName(); // played name data << p->GetName(); // played name
data << uint8(0); // realm name for cross realm BG usage data << uint8(0); // realm name for cross realm BG usage

View file

@ -183,33 +183,30 @@ void SpellCastTargets::setCorpseTarget(Corpse* corpse)
void SpellCastTargets::Update(Unit* caster) void SpellCastTargets::Update(Unit* caster)
{ {
m_GOTarget = m_GOTargetGUID ? caster->GetMap()->GetGameObject(m_GOTargetGUID) : NULL; m_GOTarget = !m_GOTargetGUID.IsEmpty() ? caster->GetMap()->GetGameObject(m_GOTargetGUID.GetRawValue()) : NULL;
m_unitTarget = m_unitTargetGUID ? m_unitTarget = !m_unitTargetGUID.IsEmpty() ?
( m_unitTargetGUID == caster->GetGUID() ? caster : ObjectAccessor::GetUnit(*caster, m_unitTargetGUID) ) : ( m_unitTargetGUID.GetRawValue() == caster->GetGUID() ? caster : ObjectAccessor::GetUnit(*caster, m_unitTargetGUID.GetRawValue()) ) :
NULL; NULL;
m_itemTarget = NULL; m_itemTarget = NULL;
if(caster->GetTypeId() == TYPEID_PLAYER) if(caster->GetTypeId() == TYPEID_PLAYER)
{ {
if(m_targetMask & TARGET_FLAG_ITEM) 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) else if(m_targetMask & TARGET_FLAG_TRADE_ITEM)
{ {
Player* pTrader = ((Player*)caster)->GetTrader(); Player* pTrader = ((Player*)caster)->GetTrader();
if(pTrader && m_itemTargetGUID < TRADE_SLOT_COUNT) if(pTrader && m_itemTargetGUID.GetRawValue() < TRADE_SLOT_COUNT)
m_itemTarget = pTrader->GetItemByPos(pTrader->GetItemPosByTradeSlot(uint32(m_itemTargetGUID))); m_itemTarget = pTrader->GetItemByPos(pTrader->GetItemPosByTradeSlot(uint32(m_itemTargetGUID.GetRawValue())));
} }
if(m_itemTarget) if(m_itemTarget)
m_itemTargetEntry = m_itemTarget->GetEntry(); 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()) data >> m_targetMask;
return false;
*data >> m_targetMask;
if(m_targetMask == TARGET_FLAG_SELF) if(m_targetMask == TARGET_FLAG_SELF)
{ {
@ -218,121 +215,101 @@ bool SpellCastTargets::read ( WorldPacket * data, Unit *caster )
m_destZ = caster->GetPositionZ(); m_destZ = caster->GetPositionZ();
m_unitTarget = caster; m_unitTarget = caster;
m_unitTargetGUID = caster->GetGUID(); m_unitTargetGUID = caster->GetGUID();
return true; return;
} }
// TARGET_FLAG_UNK2 is used for non-combat pets, maybe other? // TARGET_FLAG_UNK2 is used for non-combat pets, maybe other?
if( m_targetMask & ( TARGET_FLAG_UNIT | TARGET_FLAG_UNK2 )) if( m_targetMask & ( TARGET_FLAG_UNIT | TARGET_FLAG_UNK2 ))
if(!data->readPackGUID(m_unitTargetGUID)) data >> m_unitTargetGUID.ReadAsPacked();
return false;
if( m_targetMask & ( TARGET_FLAG_OBJECT )) if( m_targetMask & ( TARGET_FLAG_OBJECT ))
if(!data->readPackGUID(m_GOTargetGUID)) data >> m_GOTargetGUID.ReadAsPacked();
return false;
if(( m_targetMask & ( TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM )) && caster->GetTypeId() == TYPEID_PLAYER) if(( m_targetMask & ( TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM )) && caster->GetTypeId() == TYPEID_PLAYER)
if(!data->readPackGUID(m_itemTargetGUID)) data >> m_itemTargetGUID.ReadAsPacked();
return false;
if( m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE ) ) if( m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE ) )
if(!data->readPackGUID(m_CorpseTargetGUID)) data >> m_CorpseTargetGUID.ReadAsPacked();
return false;
if( m_targetMask & TARGET_FLAG_SOURCE_LOCATION ) if( m_targetMask & TARGET_FLAG_SOURCE_LOCATION )
{ {
if(data->rpos() + 1 + 4 + 4 + 4 > data->size()) data >> m_unitTargetGUID.ReadAsPacked();
return false; data >> m_srcX >> m_srcY >> m_srcZ;
if(!data->readPackGUID(m_unitTargetGUID))
return false;
*data >> m_srcX >> m_srcY >> m_srcZ;
if(!MaNGOS::IsValidMapCoord(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( m_targetMask & TARGET_FLAG_DEST_LOCATION )
{ {
if(data->rpos() + 1 + 4 + 4 + 4 > data->size()) data >> m_unitTargetGUID.ReadAsPacked();
return false; data >> m_destX >> m_destY >> m_destZ;
if(!data->readPackGUID(m_unitTargetGUID))
return false;
*data >> m_destX >> m_destY >> m_destZ;
if(!MaNGOS::IsValidMapCoord(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( m_targetMask & TARGET_FLAG_STRING )
{ data >> m_strTarget;
if(data->rpos() + 1 > data->size())
return false;
*data >> m_strTarget;
}
// find real units/GOs // find real units/GOs
Update(caster); 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 | TARGET_FLAG_PVP_CORPSE | TARGET_FLAG_OBJECT | TARGET_FLAG_CORPSE | TARGET_FLAG_UNK2 ) )
{ {
if(m_targetMask & TARGET_FLAG_UNIT) if(m_targetMask & TARGET_FLAG_UNIT)
{ {
if(m_unitTarget) if(m_unitTarget)
data->append(m_unitTarget->GetPackGUID()); data << m_unitTarget->GetPackGUID();
else else
*data << uint8(0); data << uint8(0);
} }
else if( m_targetMask & TARGET_FLAG_OBJECT ) else if( m_targetMask & TARGET_FLAG_OBJECT )
{ {
if(m_GOTarget) if(m_GOTarget)
data->append(m_GOTarget->GetPackGUID()); data << m_GOTarget->GetPackGUID();
else else
*data << uint8(0); data << uint8(0);
} }
else if( m_targetMask & ( TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE ) ) else if( m_targetMask & ( TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE ) )
data->appendPackGUID(m_CorpseTargetGUID); data << m_CorpseTargetGUID.WriteAsPacked();
else else
*data << uint8(0); data << uint8(0);
} }
if( m_targetMask & ( TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM ) ) if( m_targetMask & ( TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM ) )
{ {
if(m_itemTarget) if(m_itemTarget)
data->append(m_itemTarget->GetPackGUID()); data << m_itemTarget->GetPackGUID();
else else
*data << uint8(0); data << uint8(0);
} }
if( m_targetMask & TARGET_FLAG_SOURCE_LOCATION ) if( m_targetMask & TARGET_FLAG_SOURCE_LOCATION )
{ {
if(m_unitTarget) if(m_unitTarget)
data->append(m_unitTarget->GetPackGUID()); data << m_unitTarget->GetPackGUID();
else 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_targetMask & TARGET_FLAG_DEST_LOCATION )
{ {
if(m_unitTarget) if(m_unitTarget)
data->append(m_unitTarget->GetPackGUID()); data << m_unitTarget->GetPackGUID();
else 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 ) 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 ) 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)); WorldPacket data(SMSG_SPELL_START, (8+8+4+4+2));
if (m_CastItem) if (m_CastItem)
data.append(m_CastItem->GetPackGUID()); data << m_CastItem->GetPackGUID();
else 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 << uint8(m_cast_count); // pending spell cast?
data << uint32(m_spellInfo->Id); // spellId data << uint32(m_spellInfo->Id); // spellId
data << uint32(castFlags); // cast flags data << uint32(castFlags); // cast flags
data << uint32(m_timer); // delay? data << uint32(m_timer); // delay?
data << m_targets;
m_targets.write(&data);
if ( castFlags & CAST_FLAG_UNKNOWN6 ) // predicted power? if ( castFlags & CAST_FLAG_UNKNOWN6 ) // predicted power?
data << uint32(0); data << uint32(0);
@ -3252,11 +3228,11 @@ void Spell::SendSpellGo()
WorldPacket data(SMSG_SPELL_GO, 50); // guess size WorldPacket data(SMSG_SPELL_GO, 50); // guess size
if(m_CastItem) if(m_CastItem)
data.append(m_CastItem->GetPackGUID()); data << m_CastItem->GetPackGUID();
else 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 << uint8(m_cast_count); // pending spell cast?
data << uint32(m_spellInfo->Id); // spellId data << uint32(m_spellInfo->Id); // spellId
data << uint32(castFlags); // cast flags data << uint32(castFlags); // cast flags
@ -3264,7 +3240,7 @@ void Spell::SendSpellGo()
WriteSpellGoTargets(&data); WriteSpellGoTargets(&data);
m_targets.write(&data); data << m_targets;
if ( castFlags & CAST_FLAG_UNKNOWN6 ) // unknown wotlk, predicted power? if ( castFlags & CAST_FLAG_UNKNOWN6 ) // unknown wotlk, predicted power?
data << uint32(0); data << uint32(0);
@ -3435,9 +3411,9 @@ void Spell::SendLogExecute()
WorldPacket data(SMSG_SPELLLOGEXECUTE, (8+4+4+4+4+8)); WorldPacket data(SMSG_SPELLLOGEXECUTE, (8+4+4+4+4+8));
if(m_caster->GetTypeId() == TYPEID_PLAYER) if(m_caster->GetTypeId() == TYPEID_PLAYER)
data.append(m_caster->GetPackGUID()); data << m_caster->GetPackGUID();
else else
data.append(target->GetPackGUID()); data << target->GetPackGUID();
data << uint32(m_spellInfo->Id); data << uint32(m_spellInfo->Id);
uint32 count1 = 1; uint32 count1 = 1;
@ -3453,7 +3429,7 @@ void Spell::SendLogExecute()
{ {
case SPELL_EFFECT_POWER_DRAIN: case SPELL_EFFECT_POWER_DRAIN:
if(Unit *unit = m_targets.getUnitTarget()) if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID()); data << unit->GetPackGUID();
else else
data << uint8(0); data << uint8(0);
data << uint32(0); data << uint32(0);
@ -3462,21 +3438,21 @@ void Spell::SendLogExecute()
break; break;
case SPELL_EFFECT_ADD_EXTRA_ATTACKS: case SPELL_EFFECT_ADD_EXTRA_ATTACKS:
if(Unit *unit = m_targets.getUnitTarget()) if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID()); data << unit->GetPackGUID();
else else
data << uint8(0); data << uint8(0);
data << uint32(0); // count? data << uint32(0); // count?
break; break;
case SPELL_EFFECT_INTERRUPT_CAST: case SPELL_EFFECT_INTERRUPT_CAST:
if(Unit *unit = m_targets.getUnitTarget()) if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID()); data << unit->GetPackGUID();
else else
data << uint8(0); data << uint8(0);
data << uint32(0); // spellid data << uint32(0); // spellid
break; break;
case SPELL_EFFECT_DURABILITY_DAMAGE: case SPELL_EFFECT_DURABILITY_DAMAGE:
if(Unit *unit = m_targets.getUnitTarget()) if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID()); data << unit->GetPackGUID();
else else
data << uint8(0); data << uint8(0);
data << uint32(0); data << uint32(0);
@ -3484,7 +3460,7 @@ void Spell::SendLogExecute()
break; break;
case SPELL_EFFECT_OPEN_LOCK: case SPELL_EFFECT_OPEN_LOCK:
if(Item *item = m_targets.getItemTarget()) if(Item *item = m_targets.getItemTarget())
data.append(item->GetPackGUID()); data << item->GetPackGUID();
else else
data << uint8(0); data << uint8(0);
break; break;
@ -3503,11 +3479,11 @@ void Spell::SendLogExecute()
case SPELL_EFFECT_SUMMON_OBJECT_SLOT3: case SPELL_EFFECT_SUMMON_OBJECT_SLOT3:
case SPELL_EFFECT_SUMMON_OBJECT_SLOT4: case SPELL_EFFECT_SUMMON_OBJECT_SLOT4:
if(Unit *unit = m_targets.getUnitTarget()) if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID()); data << unit->GetPackGUID();
else if(m_targets.getItemTargetGUID()) else if(m_targets.getItemTargetGUID())
data.appendPackGUID(m_targets.getItemTargetGUID()); data.appendPackGUID(m_targets.getItemTargetGUID());
else if(GameObject *go = m_targets.getGOTarget()) else if(GameObject *go = m_targets.getGOTarget())
data.append(go->GetPackGUID()); data << go->GetPackGUID();
else else
data << uint8(0); // guid data << uint8(0); // guid
break; break;
@ -3516,14 +3492,14 @@ void Spell::SendLogExecute()
break; break;
case SPELL_EFFECT_DISMISS_PET: case SPELL_EFFECT_DISMISS_PET:
if(Unit *unit = m_targets.getUnitTarget()) if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID()); data << unit->GetPackGUID();
else else
data << uint8(0); data << uint8(0);
break; break;
case SPELL_EFFECT_RESURRECT: case SPELL_EFFECT_RESURRECT:
case SPELL_EFFECT_RESURRECT_NEW: case SPELL_EFFECT_RESURRECT_NEW:
if(Unit *unit = m_targets.getUnitTarget()) if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID()); data << unit->GetPackGUID();
else else
data << uint8(0); data << uint8(0);
break; break;
@ -3539,14 +3515,14 @@ void Spell::SendLogExecute()
void Spell::SendInterrupted(uint8 result) void Spell::SendInterrupted(uint8 result)
{ {
WorldPacket data(SMSG_SPELL_FAILURE, (8+4+1)); WorldPacket data(SMSG_SPELL_FAILURE, (8+4+1));
data.append(m_caster->GetPackGUID()); data << m_caster->GetPackGUID();
data << uint8(m_cast_count); data << uint8(m_cast_count);
data << uint32(m_spellInfo->Id); data << uint32(m_spellInfo->Id);
data << uint8(result); data << uint8(result);
m_caster->SendMessageToSet(&data, true); m_caster->SendMessageToSet(&data, true);
data.Initialize(SMSG_SPELL_FAILED_OTHER, (8+4)); data.Initialize(SMSG_SPELL_FAILED_OTHER, (8+4));
data.append(m_caster->GetPackGUID()); data << m_caster->GetPackGUID();
data << uint8(m_cast_count); data << uint8(m_cast_count);
data << uint32(m_spellInfo->Id); data << uint32(m_spellInfo->Id);
data << uint8(result); data << uint8(result);
@ -3569,7 +3545,7 @@ void Spell::SendChannelUpdate(uint32 time)
} }
WorldPacket data( MSG_CHANNEL_UPDATE, 8+4 ); WorldPacket data( MSG_CHANNEL_UPDATE, 8+4 );
data.append(m_caster->GetPackGUID()); data << m_caster->GetPackGUID();
data << uint32(time); data << uint32(time);
m_caster->SendMessageToSet(&data, true); m_caster->SendMessageToSet(&data, true);
} }
@ -3603,7 +3579,7 @@ void Spell::SendChannelStart(uint32 duration)
} }
WorldPacket data( MSG_CHANNEL_START, (8+4+4) ); WorldPacket data( MSG_CHANNEL_START, (8+4+4) );
data.append(m_caster->GetPackGUID()); data << m_caster->GetPackGUID();
data << uint32(m_spellInfo->Id); data << uint32(m_spellInfo->Id);
data << uint32(duration); data << uint32(duration);
m_caster->SendMessageToSet(&data, true); 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); sLog.outDetail("Spell %u partially interrupted for (%d) ms at damage", m_spellInfo->Id, delaytime);
WorldPacket data(SMSG_SPELL_DELAYED, 8+4); WorldPacket data(SMSG_SPELL_DELAYED, 8+4);
data.append(m_caster->GetPackGUID()); data << m_caster->GetPackGUID();
data << uint32(delaytime); data << uint32(delaytime);
m_caster->SendMessageToSet(&data, true); m_caster->SendMessageToSet(&data, true);

View file

@ -102,14 +102,24 @@ namespace MaNGOS
struct SpellNotifierCreatureAndPlayer; struct SpellNotifierCreatureAndPlayer;
} }
struct SpellCastTargetsReader
{
explicit SpellCastTargetsReader(SpellCastTargets& _targets, Unit* _caster) : targets(_targets), caster(_caster) {}
SpellCastTargets& targets;
Unit* caster;
};
class SpellCastTargets class SpellCastTargets
{ {
public: public:
SpellCastTargets(); SpellCastTargets();
~SpellCastTargets(); ~SpellCastTargets();
bool read ( WorldPacket * data, Unit *caster ); void read( ByteBuffer& data, Unit *caster );
void write ( WorldPacket * data ); void write( ByteBuffer& data ) const;
SpellCastTargetsReader ReadForCaster(Unit* caster) { return SpellCastTargetsReader(*this,caster); }
SpellCastTargets& operator=(const SpellCastTargets &target) SpellCastTargets& operator=(const SpellCastTargets &target)
{ {
@ -139,19 +149,19 @@ class SpellCastTargets
return *this; return *this;
} }
uint64 getUnitTargetGUID() const { return m_unitTargetGUID; } uint64 getUnitTargetGUID() const { return m_unitTargetGUID.GetRawValue(); }
Unit *getUnitTarget() const { return m_unitTarget; } Unit *getUnitTarget() const { return m_unitTarget; }
void setUnitTarget(Unit *target); void setUnitTarget(Unit *target);
void setDestination(float x, float y, float z); void setDestination(float x, float y, float z);
void setSource(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; } GameObject *getGOTarget() const { return m_GOTarget; }
void setGOTarget(GameObject *target); void setGOTarget(GameObject *target);
uint64 getCorpseTargetGUID() const { return m_CorpseTargetGUID; } uint64 getCorpseTargetGUID() const { return m_CorpseTargetGUID.GetRawValue(); }
void setCorpseTarget(Corpse* corpse); void setCorpseTarget(Corpse* corpse);
uint64 getItemTargetGUID() const { return m_itemTargetGUID; } uint64 getItemTargetGUID() const { return m_itemTargetGUID.GetRawValue(); }
Item* getItemTarget() const { return m_itemTarget; } Item* getItemTarget() const { return m_itemTarget; }
uint32 getItemTargetEntry() const { return m_itemTargetEntry; } uint32 getItemTargetEntry() const { return m_itemTargetEntry; }
void setItemTarget(Item* item); 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); void Update(Unit* caster);
@ -180,13 +190,25 @@ class SpellCastTargets
Item *m_itemTarget; Item *m_itemTarget;
// object GUID/etc, can be used always // object GUID/etc, can be used always
uint64 m_unitTargetGUID; ObjectGuid m_unitTargetGUID;
uint64 m_GOTargetGUID; ObjectGuid m_GOTargetGUID;
uint64 m_CorpseTargetGUID; ObjectGuid m_CorpseTargetGUID;
uint64 m_itemTargetGUID; ObjectGuid m_itemTargetGUID;
uint32 m_itemTargetEntry; 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 enum SpellState
{ {
SPELL_STATE_NULL = 0, SPELL_STATE_NULL = 0,

View file

@ -1232,7 +1232,7 @@ bool Aura::_RemoveAura()
void Aura::SendAuraUpdate(bool remove) void Aura::SendAuraUpdate(bool remove)
{ {
WorldPacket data(SMSG_AURA_UPDATE); WorldPacket data(SMSG_AURA_UPDATE);
data.append(m_target->GetPackGUID()); data << m_target->GetPackGUID();
data << uint8(GetAuraSlot()); data << uint8(GetAuraSlot());
data << uint32(remove ? 0 : GetId()); data << uint32(remove ? 0 : GetId());
@ -2975,7 +2975,7 @@ void Aura::HandleAuraWaterWalk(bool apply, bool Real)
data.Initialize(SMSG_MOVE_WATER_WALK, 8+4); data.Initialize(SMSG_MOVE_WATER_WALK, 8+4);
else else
data.Initialize(SMSG_MOVE_LAND_WALK, 8+4); data.Initialize(SMSG_MOVE_LAND_WALK, 8+4);
data.append(m_target->GetPackGUID()); data << m_target->GetPackGUID();
data << uint32(0); data << uint32(0);
m_target->SendMessageToSet(&data, true); m_target->SendMessageToSet(&data, true);
} }
@ -2991,7 +2991,7 @@ void Aura::HandleAuraFeatherFall(bool apply, bool Real)
data.Initialize(SMSG_MOVE_FEATHER_FALL, 8+4); data.Initialize(SMSG_MOVE_FEATHER_FALL, 8+4);
else else
data.Initialize(SMSG_MOVE_NORMAL_FALL, 8+4); data.Initialize(SMSG_MOVE_NORMAL_FALL, 8+4);
data.append(m_target->GetPackGUID()); data << m_target->GetPackGUID();
data << uint32(0); data << uint32(0);
m_target->SendMessageToSet(&data, true); m_target->SendMessageToSet(&data, true);
@ -3011,7 +3011,7 @@ void Aura::HandleAuraHover(bool apply, bool Real)
data.Initialize(SMSG_MOVE_SET_HOVER, 8+4); data.Initialize(SMSG_MOVE_SET_HOVER, 8+4);
else else
data.Initialize(SMSG_MOVE_UNSET_HOVER, 8+4); data.Initialize(SMSG_MOVE_UNSET_HOVER, 8+4);
data.append(m_target->GetPackGUID()); data << m_target->GetPackGUID();
data << uint32(0); data << uint32(0);
m_target->SendMessageToSet(&data, true); m_target->SendMessageToSet(&data, true);
} }
@ -3914,7 +3914,7 @@ void Aura::HandleAuraModStun(bool apply, bool Real)
} }
WorldPacket data(SMSG_FORCE_MOVE_ROOT, 8); WorldPacket data(SMSG_FORCE_MOVE_ROOT, 8);
data.append(m_target->GetPackGUID()); data << m_target->GetPackGUID();
data << uint32(0); data << uint32(0);
m_target->SendMessageToSet(&data, true); m_target->SendMessageToSet(&data, true);
@ -3972,7 +3972,7 @@ void Aura::HandleAuraModStun(bool apply, bool Real)
m_target->SetTargetGUID(m_target->getVictim()->GetGUID()); m_target->SetTargetGUID(m_target->getVictim()->GetGUID());
WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 8+4); WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 8+4);
data.append(m_target->GetPackGUID()); data << m_target->GetPackGUID();
data << uint32(0); data << uint32(0);
m_target->SendMessageToSet(&data, true); m_target->SendMessageToSet(&data, true);
} }
@ -4182,7 +4182,7 @@ void Aura::HandleAuraModRoot(bool apply, bool Real)
if(m_target->GetTypeId() == TYPEID_PLAYER) if(m_target->GetTypeId() == TYPEID_PLAYER)
{ {
WorldPacket data(SMSG_FORCE_MOVE_ROOT, 10); WorldPacket data(SMSG_FORCE_MOVE_ROOT, 10);
data.append(m_target->GetPackGUID()); data << m_target->GetPackGUID();
data << (uint32)2; data << (uint32)2;
m_target->SendMessageToSet(&data, true); m_target->SendMessageToSet(&data, true);
@ -4231,7 +4231,7 @@ void Aura::HandleAuraModRoot(bool apply, bool Real)
if(m_target->GetTypeId() == TYPEID_PLAYER) if(m_target->GetTypeId() == TYPEID_PLAYER)
{ {
WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 10); WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 10);
data.append(m_target->GetPackGUID()); data << m_target->GetPackGUID();
data << (uint32)2; data << (uint32)2;
m_target->SendMessageToSet(&data, true); m_target->SendMessageToSet(&data, true);
} }
@ -4386,7 +4386,7 @@ void Aura::HandleAuraModIncreaseFlightSpeed(bool apply, bool Real)
data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12); data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12);
else else
data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12); data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12);
data.append(m_target->GetPackGUID()); data << m_target->GetPackGUID();
data << uint32(0); // unknown data << uint32(0); // unknown
m_target->SendMessageToSet(&data, true); m_target->SendMessageToSet(&data, true);
@ -6649,7 +6649,7 @@ void Aura::HandleAuraAllowFlight(bool apply, bool Real)
data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12); data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12);
else else
data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12); data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12);
data.append(m_target->GetPackGUID()); data << m_target->GetPackGUID();
data << uint32(0); // unk data << uint32(0); // unk
m_target->SendMessageToSet(&data, true); m_target->SendMessageToSet(&data, true);
} }

View file

@ -4019,8 +4019,8 @@ void Spell::EffectDispel(SpellEffectIndex eff_idx)
{ {
int32 count = success_list.size(); int32 count = success_list.size();
WorldPacket data(SMSG_SPELLDISPELLOG, 8+8+4+1+4+count*5); WorldPacket data(SMSG_SPELLDISPELLOG, 8+8+4+1+4+count*5);
data.append(unitTarget->GetPackGUID()); // Victim GUID data << unitTarget->GetPackGUID(); // Victim GUID
data.append(m_caster->GetPackGUID()); // Caster GUID data << m_caster->GetPackGUID(); // Caster GUID
data << uint32(m_spellInfo->Id); // Dispel spell id data << uint32(m_spellInfo->Id); // Dispel spell id
data << uint8(0); // not used data << uint8(0); // not used
data << uint32(count); // count data << uint32(count); // count
@ -7326,8 +7326,8 @@ void Spell::EffectStealBeneficialBuff(SpellEffectIndex eff_idx)
{ {
int32 count = success_list.size(); int32 count = success_list.size();
WorldPacket data(SMSG_SPELLSTEALLOG, 8+8+4+1+4+count*5); WorldPacket data(SMSG_SPELLSTEALLOG, 8+8+4+1+4+count*5);
data.append(unitTarget->GetPackGUID()); // Victim GUID data << unitTarget->GetPackGUID(); // Victim GUID
data.append(m_caster->GetPackGUID()); // Caster GUID data << m_caster->GetPackGUID(); // Caster GUID
data << uint32(m_spellInfo->Id); // Dispell spell id data << uint32(m_spellInfo->Id); // Dispell spell id
data << uint8(0); // not used data << uint8(0); // not used
data << uint32(count); // count data << uint32(count); // count

View file

@ -125,8 +125,8 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket)
} }
SpellCastTargets targets; SpellCastTargets targets;
if (!targets.read(&recvPacket, pUser))
return; recvPacket >> targets.ReadForCaster(pUser);
targets.Update(pUser); targets.Update(pUser);
@ -334,27 +334,25 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
// client provided targets // client provided targets
SpellCastTargets targets; SpellCastTargets targets;
if(!targets.read(&recvPacket,mover))
{ recvPacket >> targets.ReadForCaster(mover);
recvPacket.rpos(recvPacket.wpos()); // prevent spam at ignore packet
return;
}
// some spell cast packet including more data (for projectiles?) // some spell cast packet including more data (for projectiles?)
if (unk_flags & 0x02) if (unk_flags & 0x02)
{ {
recvPacket.read_skip<float>(); // unk1, coords?
recvPacket.read_skip<float>(); // unk1, coords?
uint8 unk1; uint8 unk1;
recvPacket >> Unused<float>(); // unk1, coords?
recvPacket >> Unused<float>(); // unk1, coords?
recvPacket >> unk1; // >> 1 or 0 recvPacket >> unk1; // >> 1 or 0
if(unk1) if(unk1)
{ {
recvPacket.read_skip<uint32>(); // >> MSG_MOVE_STOP ObjectGuid guid; // guid - unused
uint64 guid; // guid - unused MovementInfo movementInfo;
if(!recvPacket.readPackGUID(guid))
return;
MovementInfo movementInfo(recvPacket); recvPacket >> Unused<uint32>(); // >> MSG_MOVE_STOP
recvPacket >> guid.ReadAsPacked();
recvPacket >> movementInfo;
} }
} }

View file

@ -186,13 +186,12 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPacket& recv_data)
{ {
sLog.outDebug( "WORLD: Received CMSG_MOVE_SPLINE_DONE" ); sLog.outDebug( "WORLD: Received CMSG_MOVE_SPLINE_DONE" );
uint64 guid; // used only for proper packet read ObjectGuid guid; // used only for proper packet read
if(!recv_data.readPackGUID(guid)) MovementInfo movementInfo; // used only for proper packet read
return;
MovementInfo movementInfo(recv_data); // used only for proper packet read recv_data >> guid.ReadAsPacked();
recv_data >> movementInfo;
recv_data.read_skip<uint32>(); // unk recv_data >> Unused<uint32>(); // unk
// in taxi flight packet received in 2 case: // in taxi flight packet received in 2 case:

View file

@ -73,25 +73,6 @@ static bool isNonTriggerAura[TOTAL_AURAS];
// Prepare lists // Prepare lists
static bool procPrepared = InitTriggerAuraData(); 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) void MovementInfo::Read(ByteBuffer &data)
{ {
data >> moveFlags; data >> moveFlags;
@ -104,9 +85,7 @@ void MovementInfo::Read(ByteBuffer &data)
if(HasMovementFlag(MOVEFLAG_ONTRANSPORT)) if(HasMovementFlag(MOVEFLAG_ONTRANSPORT))
{ {
if(!data.readPackGUID(t_guid)) data >> t_guid.ReadAsPacked();
return;
data >> t_pos.x; data >> t_pos.x;
data >> t_pos.y; data >> t_pos.y;
data >> t_pos.z; 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 << moveFlags;
data << moveFlags2; data << moveFlags2;
@ -151,8 +130,7 @@ void MovementInfo::Write(ByteBuffer &data)
if(HasMovementFlag(MOVEFLAG_ONTRANSPORT)) if(HasMovementFlag(MOVEFLAG_ONTRANSPORT))
{ {
data.appendPackGUID(t_guid); data << t_guid.WriteAsPacked();
data << t_pos.x; data << t_pos.x;
data << t_pos.y; data << t_pos.y;
data << t_pos.z; data << t_pos.z;
@ -370,7 +348,7 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, SplineTy
float moveTime = (float)Time; float moveTime = (float)Time;
WorldPacket data( SMSG_MONSTER_MOVE, (41 + GetPackGUID().size()) ); WorldPacket data( SMSG_MONSTER_MOVE, (41 + GetPackGUID().size()) );
data.append(GetPackGUID()); data << GetPackGUID();
data << uint8(0); // new in 3.1 data << uint8(0); // new in 3.1
data << GetPositionX() << GetPositionY() << GetPositionZ(); data << GetPositionX() << GetPositionY() << GetPositionZ();
data << uint32(getMSTime()); data << uint32(getMSTime());
@ -418,7 +396,7 @@ void Unit::SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, Spl
uint32 pathSize = end - start; uint32 pathSize = end - start;
WorldPacket data( SMSG_MONSTER_MOVE, (GetPackGUID().size()+1+4+4+4+4+1+4+4+4+pathSize*4*3) ); 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 << uint8(0);
data << GetPositionX(); data << GetPositionX();
data << GetPositionY(); data << GetPositionY();
@ -459,7 +437,7 @@ void Unit::BuildHeartBeatMsg(WorldPacket *data) const
: MOVEFLAG_NONE; : MOVEFLAG_NONE;
data->Initialize(MSG_MOVE_HEARTBEAT, 32); data->Initialize(MSG_MOVE_HEARTBEAT, 32);
data->append(GetPackGUID()); *data << GetPackGUID();
*data << uint32(move_flags); // movement flags *data << uint32(move_flags); // movement flags
*data << uint16(0); // 2.3.0 *data << uint16(0); // 2.3.0
*data << uint32(getMSTime()); // time *data << uint32(getMSTime()); // time
@ -2651,8 +2629,8 @@ void Unit::SendMeleeAttackStop(Unit* victim)
return; return;
WorldPacket data( SMSG_ATTACKSTOP, (4+16) ); // we guess size WorldPacket data( SMSG_ATTACKSTOP, (4+16) ); // we guess size
data.append(GetPackGUID()); data << GetPackGUID();
data.append(victim->GetPackGUID()); // can be 0x00... data << victim->GetPackGUID(); // can be 0x00...
data << uint32(0); // can be 0x1 data << uint32(0); // can be 0x1
SendMessageToSet(&data, true); 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()); 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) void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log)
{ {
WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16+4+4+4+1+4+4+1+1+4+4+1)); // we guess size 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 << log->target->GetPackGUID();
data.append(log->attacker->GetPackGUID()); data << log->attacker->GetPackGUID();
data << uint32(log->SpellID); data << uint32(log->SpellID);
data << uint32(log->damage); // damage amount data << uint32(log->damage); // damage amount
data << uint32(log->overkill); // overkill data << uint32(log->overkill); // overkill
@ -4808,7 +4786,7 @@ void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo *pInfo)
Modifier *mod = aura->GetModifier(); Modifier *mod = aura->GetModifier();
WorldPacket data(SMSG_PERIODICAURALOG, 30); WorldPacket data(SMSG_PERIODICAURALOG, 30);
data.append(aura->GetTarget()->GetPackGUID()); data << aura->GetTarget()->GetPackGUID();
data.appendPackGUID(aura->GetCasterGUID()); data.appendPackGUID(aura->GetCasterGUID());
data << uint32(aura->GetId()); // spellId data << uint32(aura->GetId()); // spellId
data << uint32(1); // count data << uint32(1); // count
@ -4880,8 +4858,8 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo *damageInfo)
uint32 count = 1; uint32 count = 1;
WorldPacket data(SMSG_ATTACKERSTATEUPDATE, 16 + 45); // we guess size WorldPacket data(SMSG_ATTACKERSTATEUPDATE, 16 + 45); // we guess size
data << uint32(damageInfo->HitInfo); data << uint32(damageInfo->HitInfo);
data.append(damageInfo->attacker->GetPackGUID()); data << damageInfo->attacker->GetPackGUID();
data.append(damageInfo->target->GetPackGUID()); data << damageInfo->target->GetPackGUID();
data << uint32(damageInfo->damage); // Full damage data << uint32(damageInfo->damage); // Full damage
data << uint32(0); // overkill value data << uint32(0); // overkill value
data << uint8(count); // Sub damage count data << uint8(count); // Sub damage count
@ -8830,8 +8808,8 @@ void Unit::SendHealSpellLog(Unit *pVictim, uint32 SpellID, uint32 Damage, uint32
{ {
// we guess size // we guess size
WorldPacket data(SMSG_SPELLHEALLOG, (8+8+4+4+1)); WorldPacket data(SMSG_SPELLHEALLOG, (8+8+4+4+1));
data.append(pVictim->GetPackGUID()); data << pVictim->GetPackGUID();
data.append(GetPackGUID()); data << GetPackGUID();
data << uint32(SpellID); data << uint32(SpellID);
data << uint32(Damage); data << uint32(Damage);
data << uint32(OverHeal); 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) void Unit::SendEnergizeSpellLog(Unit *pVictim, uint32 SpellID, uint32 Damage, Powers powertype)
{ {
WorldPacket data(SMSG_SPELLENERGIZELOG, (8+8+4+4+4+1)); WorldPacket data(SMSG_SPELLENERGIZELOG, (8+8+4+4+4+1));
data.append(pVictim->GetPackGUID()); data << pVictim->GetPackGUID();
data.append(GetPackGUID()); data << GetPackGUID();
data << uint32(SpellID); data << uint32(SpellID);
data << uint32(powertype); data << uint32(powertype);
data << uint32(Damage); data << uint32(Damage);
@ -10920,7 +10898,7 @@ void Unit::SetSpeedRate(UnitMoveType mtype, float rate, bool forced)
return; return;
} }
data.append(GetPackGUID()); data << GetPackGUID();
data << uint32(0); // movement flags data << uint32(0); // movement flags
data << uint16(0); // unk flags data << uint16(0); // unk flags
data << uint32(getMSTime()); 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); sLog.outError("Unit::SetSpeedRate: Unsupported move type (%d), data not sent to client.",mtype);
return; return;
} }
data.append(GetPackGUID()); data << GetPackGUID();
data << (uint32)0; // moveEvent, NUM_PMOVE_EVTS = 0x39 data << (uint32)0; // moveEvent, NUM_PMOVE_EVTS = 0x39
if (mtype == MOVE_RUN) if (mtype == MOVE_RUN)
data << uint8(0); // new 2.1.0 data << uint8(0); // new 2.1.0
@ -11765,7 +11743,7 @@ void Unit::SetPower(Powers power, uint32 val)
SetStatInt32Value(UNIT_FIELD_POWER1 + power, val); SetStatInt32Value(UNIT_FIELD_POWER1 + power, val);
WorldPacket data(SMSG_POWER_UPDATE); WorldPacket data(SMSG_POWER_UPDATE);
data.append(GetPackGUID()); data << GetPackGUID();
data << uint8(power); data << uint8(power);
data << uint32(val); data << uint32(val);
SendMessageToSet(&data, GetTypeId() == TYPEID_PLAYER ? true : false); SendMessageToSet(&data, GetTypeId() == TYPEID_PLAYER ? true : false);
@ -13515,7 +13493,7 @@ void Unit::KnockBackFrom(Unit* target, float horizontalSpeed, float verticalSpee
if(GetTypeId()==TYPEID_PLAYER) if(GetTypeId()==TYPEID_PLAYER)
{ {
WorldPacket data(SMSG_MOVE_KNOCK_BACK, 8+4+4+4+4+4); WorldPacket data(SMSG_MOVE_KNOCK_BACK, 8+4+4+4+4+4);
data.append(GetPackGUID()); data << GetPackGUID();
data << uint32(0); // Sequence data << uint32(0); // Sequence
data << float(vcos); // x direction data << float(vcos); // x direction
data << float(vsin); // y direction data << float(vsin); // y direction
@ -13580,7 +13558,7 @@ void Unit::SendThreatUpdate()
{ {
sLog.outDebug( "WORLD: Send SMSG_THREAT_UPDATE Message" ); sLog.outDebug( "WORLD: Send SMSG_THREAT_UPDATE Message" );
WorldPacket data(SMSG_THREAT_UPDATE, 8 + count * 8); WorldPacket data(SMSG_THREAT_UPDATE, 8 + count * 8);
data.append(GetPackGUID()); data << GetPackGUID();
data << uint32(count); data << uint32(count);
for (ThreatList::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr) 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" ); sLog.outDebug( "WORLD: Send SMSG_HIGHEST_THREAT_UPDATE Message" );
WorldPacket data(SMSG_HIGHEST_THREAT_UPDATE, 8 + 8 + count * 8); WorldPacket data(SMSG_HIGHEST_THREAT_UPDATE, 8 + 8 + count * 8);
data.append(GetPackGUID()); data << GetPackGUID();
data.appendPackGUID(pHostilReference->getUnitGuid()); data.appendPackGUID(pHostilReference->getUnitGuid());
data << uint32(count); data << uint32(count);
for (ThreatList::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr) 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" ); sLog.outDebug( "WORLD: Send SMSG_THREAT_CLEAR Message" );
WorldPacket data(SMSG_THREAT_CLEAR, 8); WorldPacket data(SMSG_THREAT_CLEAR, 8);
data.append(GetPackGUID()); data << GetPackGUID();
SendMessageToSet(&data, false); SendMessageToSet(&data, false);
} }
@ -13622,7 +13600,7 @@ void Unit::SendThreatRemove(HostileReference* pHostileReference)
{ {
sLog.outDebug( "WORLD: Send SMSG_THREAT_REMOVE Message" ); sLog.outDebug( "WORLD: Send SMSG_THREAT_REMOVE Message" );
WorldPacket data(SMSG_THREAT_REMOVE, 8 + 8); WorldPacket data(SMSG_THREAT_REMOVE, 8 + 8);
data.append(GetPackGUID()); data << GetPackGUID();
data.appendPackGUID(pHostileReference->getUnitGuid()); data.appendPackGUID(pHostileReference->getUnitGuid());
SendMessageToSet(&data, false); SendMessageToSet(&data, false);
} }

View file

@ -745,15 +745,13 @@ struct Position
class MovementInfo class MovementInfo
{ {
public: 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), 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) {} j_cosAngle(0.0f), j_xyspeed(0.0f), u_unk1(0.0f) {}
MovementInfo(WorldPacket &data);
// Read/Write methods // Read/Write methods
void Read(ByteBuffer &data); void Read(ByteBuffer &data);
void Write(ByteBuffer &data); void Write(ByteBuffer &data) const;
// Movement flags manipulations // Movement flags manipulations
void AddMovementFlag(MovementFlags f) { moveFlags |= f; } void AddMovementFlag(MovementFlags f) { moveFlags |= f; }
@ -775,7 +773,7 @@ class MovementInfo
t_time = time; t_time = time;
t_seat = seat; t_seat = seat;
} }
uint64 GetTransportGuid() const { return t_guid; } uint64 GetTransportGuid() const { return t_guid.GetRawValue(); }
Position const *GetTransportPos() const { return &t_pos; } Position const *GetTransportPos() const { return &t_pos; }
int8 GetTransportSeat() const { return t_seat; } int8 GetTransportSeat() const { return t_seat; }
uint32 GetTransportTime() const { return t_time; } uint32 GetTransportTime() const { return t_time; }
@ -790,7 +788,7 @@ class MovementInfo
uint32 time; uint32 time;
Position pos; Position pos;
// transport // transport
uint64 t_guid; ObjectGuid t_guid;
Position t_pos; Position t_pos;
uint32 t_time; uint32 t_time;
int8 t_seat; int8 t_seat;
@ -805,6 +803,18 @@ class MovementInfo
float u_unk1; 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 enum DiminishingLevels
{ {
DIMINISHING_LEVEL_1 = 0, DIMINISHING_LEVEL_1 = 0,

View file

@ -183,7 +183,7 @@ bool ChatHandler::HandleDebugSendOpcodeCommand(const char* /*args*/)
} }
else if(type == "pguid") else if(type == "pguid")
{ {
data.append(unit->GetPackGUID()); data << unit->GetPackGUID();
} }
else else
{ {

View file

@ -45,6 +45,12 @@ class ByteBufferException
size_t size; size_t size;
}; };
template<class T>
struct Unused
{
Unused() {}
};
class ByteBuffer class ByteBuffer
{ {
public: public:
@ -233,6 +239,14 @@ class ByteBuffer
return *this; return *this;
} }
template<class T>
ByteBuffer &operator>>(Unused<T> &)
{
read_skip<T>();
return *this;
}
uint8 operator[](size_t pos) const uint8 operator[](size_t pos) const
{ {
return read<uint8>(pos); return read<uint8>(pos);
@ -288,13 +302,9 @@ class ByteBuffer
_rpos += len; _rpos += len;
} }
bool readPackGUID(uint64& guid) uint64 readPackGUID()
{ {
if(rpos() + 1 > size()) uint64 guid = 0;
return false;
guid = 0;
uint8 guidmark = 0; uint8 guidmark = 0;
(*this) >> guidmark; (*this) >> guidmark;
@ -302,16 +312,13 @@ class ByteBuffer
{ {
if(guidmark & (uint8(1) << i)) if(guidmark & (uint8(1) << i))
{ {
if(rpos() + 1 > size())
return false;
uint8 bit; uint8 bit;
(*this) >> bit; (*this) >> bit;
guid |= (uint64(bit) << (i * 8)); guid |= (uint64(bit) << (i * 8));
} }
} }
return true; return guid;
} }
const uint8 *contents() const { return &_storage[0]; } const uint8 *contents() const { return &_storage[0]; }

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "9550" #define REVISION_NR "9551"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__