diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index b45384424..1da70f1cc 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -545,10 +545,12 @@ void WorldSession::HandleTogglePvP( WorldPacket & recv_data ) bool newPvPStatus; recv_data >> newPvPStatus; GetPlayer()->ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP, newPvPStatus); + GetPlayer()->ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_PVP, newPvPStatus); } else { GetPlayer()->ToggleFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); + GetPlayer()->ToggleFlag(PLAYER_FLAGS, PLAYER_FLAGS_PVP); } if(GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP)) @@ -1071,8 +1073,8 @@ void WorldSession::HandleUpdateAccountData(WorldPacket &recv_data) sLog.outDetail("WORLD: Received CMSG_UPDATE_ACCOUNT_DATA"); recv_data.hexlike(); - uint32 id1, id2, decompressedSize; - recv_data >> id1 >> id2 >> decompressedSize; + uint32 id1, timestamp, decompressedSize; + recv_data >> id1 >> timestamp >> decompressedSize; if(decompressedSize == 0) return; @@ -1089,12 +1091,29 @@ void WorldSession::HandleUpdateAccountData(WorldPacket &recv_data) { sLog.outError("UAD: Failed to decompress packet"); } + + WorldPacket data(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, 4+4); + data << uint32(id1); + data << uint32(0); + SendPacket(&data); } void WorldSession::HandleRequestAccountData(WorldPacket& recv_data) { sLog.outDetail("WORLD: Received CMSG_REQUEST_ACCOUNT_DATA"); recv_data.hexlike(); + + CHECK_PACKET_SIZE(recv_data, 4); + + uint32 id; + recv_data >> id; + + WorldPacket data (SMSG_UPDATE_ACCOUNT_DATA, 8+4+4+4); + data << uint64(_player->GetGUID()); + data << uint32(id); + data << uint32(time(NULL)); + data << uint32(0); // decompressed length + // data << account_data(data_len); } void WorldSession::HandleSetActionButtonOpcode(WorldPacket& recv_data) diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 8ee2f39cd..67b5d7782 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -955,6 +955,56 @@ void Object::RemoveFlag( uint16 index, uint32 oldFlag ) } } +void Object::SetByteFlag( uint16 index, uint8 offset, uint8 newFlag ) +{ + ASSERT( index < m_valuesCount || PrintIndexError( index , true ) ); + + if(offset > 4) + { + sLog.outError("Object::SetByteFlag: wrong offset %u", offset); + return; + } + + if(!(uint8(m_uint32Values[ index ] >> (offset * 8)) & newFlag)) + { + m_uint32Values[ index ] |= uint32(uint32(newFlag) << (offset * 8)); + + if(m_inWorld) + { + if(!m_objectUpdated) + { + ObjectAccessor::Instance().AddUpdateObject(this); + m_objectUpdated = true; + } + } + } +} + +void Object::RemoveByteFlag( uint16 index, uint8 offset, uint8 oldFlag ) +{ + ASSERT( index < m_valuesCount || PrintIndexError( index , true ) ); + + if(offset > 4) + { + sLog.outError("Object::RemoveByteFlag: wrong offset %u", offset); + return; + } + + if(uint8(m_uint32Values[ index ] >> (offset * 8)) & oldFlag) + { + m_uint32Values[ index ] &= ~uint32(uint32(oldFlag) << (offset * 8)); + + if(m_inWorld) + { + if(!m_objectUpdated) + { + ObjectAccessor::Instance().AddUpdateObject(this); + m_objectUpdated = true; + } + } + } +} + bool Object::PrintIndexError(uint32 index, bool set) const { sLog.outError("ERROR: Attempt %s non-existed value field: %u (count: %u) for object typeid: %u type mask: %u",(set ? "set value to" : "get value from"),index,m_valuesCount,GetTypeId(),m_objectType); diff --git a/src/game/Object.h b/src/game/Object.h index 127205401..9358996fe 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -227,6 +227,24 @@ class MANGOS_DLL_SPEC Object return (m_uint32Values[ index ] & flag) != 0; } + void SetByteFlag( uint16 index, uint8 offset, uint8 newFlag ); + void RemoveByteFlag( uint16 index, uint8 offset, uint8 newFlag ); + + void ToggleFlag( uint16 index, uint8 offset, uint8 flag ) + { + if(HasByteFlag(index, offset, flag)) + RemoveByteFlag(index, offset, flag); + else + SetByteFlag(index, offset, flag); + } + + bool HasByteFlag( uint16 index, uint8 offset, uint8 flag ) const + { + ASSERT( index < m_valuesCount || PrintIndexError( index , false ) ); + ASSERT( offset < 4 ); + return (((uint8*)m_uint32Values[index])[offset] & flag) != 0; + } + void ApplyModFlag( uint16 index, uint32 flag, bool apply) { if(apply) SetFlag(index,flag); else RemoveFlag(index,flag); diff --git a/src/game/Player.h b/src/game/Player.h index 6b8db076a..4d6c883e0 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -389,7 +389,7 @@ enum PlayerFlags PLAYER_FLAGS_UNK3 = 0x00008000, // strange visual effect (2.0.1), looks like PLAYER_FLAGS_GHOST flag PLAYER_FLAGS_SANCTUARY = 0x00010000, // player entered sanctuary PLAYER_FLAGS_UNK4 = 0x00020000, // taxi benchmark mode (on/off) (2.0.1) - PLAYER_UNK = 0x00040000, // 2.0.8... + PLAYER_FLAGS_PVP = 0x00040000, // 3.0.2... }; // used for PLAYER__FIELD_KNOWN_TITLES field (uint64), (1<