[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);
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);

View file

@ -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);

View file

@ -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);
}

View file

@ -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)

View file

@ -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 );

View file

@ -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);

View file

@ -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<uint32>();
ObjectGuid guid;
recv_data >> guid.ReadAsPacked();
recv_data >> Unused<uint32>();
/*
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<uint32>(); // unk
MovementInfo movementInfo(recv_data);
recv_data.read_skip<float>(); // unk2
recv_data >> guid.ReadAsPacked();
recv_data >> Unused<uint32>(); // unk
recv_data >> movementInfo;
recv_data >> Unused<float>(); // 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);
}

View file

@ -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<uint32>(); // 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<uint32>(); // unk
MovementInfo movementInfo(recv_data);
recv_data >> guid.ReadAsPacked();
recv_data >> Unused<uint32>(); // 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<uint32>(); // unk
MovementInfo movementInfo(recv_data);
recv_data.read_skip<uint32>(); // unk2
recv_data >> guid.ReadAsPacked();
recv_data >> Unused<uint32>(); // unk1
recv_data >> movementInfo;
recv_data >> Unused<uint32>(); // 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<uint32>(); // unk
MovementInfo movementInfo(recv_data);
recv_data.read_skip<uint32>(); // unk2
recv_data >> guid.ReadAsPacked();
recv_data >> Unused<uint32>(); // unk1
recv_data >> movementInfo;
recv_data >> Unused<uint32>(); // unk2
}
void WorldSession::HandleSummonResponseOpcode(WorldPacket& recv_data)

View file

@ -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);
}

View file

@ -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;

View file

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

View file

@ -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);

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);
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

View file

@ -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

View file

@ -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);

View file

@ -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,

View file

@ -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);
}

View file

@ -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

View file

@ -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<float>(); // unk1, coords?
recvPacket.read_skip<float>(); // unk1, coords?
uint8 unk1;
recvPacket >> Unused<float>(); // unk1, coords?
recvPacket >> Unused<float>(); // unk1, coords?
recvPacket >> unk1; // >> 1 or 0
if(unk1)
{
recvPacket.read_skip<uint32>(); // >> MSG_MOVE_STOP
uint64 guid; // guid - unused
if(!recvPacket.readPackGUID(guid))
return;
ObjectGuid guid; // guid - unused
MovementInfo movementInfo;
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" );
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<uint32>(); // unk
recv_data >> guid.ReadAsPacked();
recv_data >> movementInfo;
recv_data >> Unused<uint32>(); // unk
// in taxi flight packet received in 2 case:

View file

@ -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);
}

View file

@ -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,

View file

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

View file

@ -45,6 +45,12 @@ class ByteBufferException
size_t size;
};
template<class T>
struct Unused
{
Unused() {}
};
class ByteBuffer
{
public:
@ -233,6 +239,14 @@ class ByteBuffer
return *this;
}
template<class T>
ByteBuffer &operator>>(Unused<T> &)
{
read_skip<T>();
return *this;
}
uint8 operator[](size_t pos) const
{
return read<uint8>(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]; }

View file

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