本文整理汇总了C++中WorldPacket::contents方法的典型用法代码示例。如果您正苦于以下问题:C++ WorldPacket::contents方法的具体用法?C++ WorldPacket::contents怎么用?C++ WorldPacket::contents使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类WorldPacket
的用法示例。
在下文中一共展示了WorldPacket::contents方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: AsyncWrite
void WorldSocket::AsyncWrite(WorldPacket const& packet)
{
if (sPacketLog->CanLogPacket())
sPacketLog->LogPacket(packet, SERVER_TO_CLIENT);
TC_LOG_TRACE("network.opcode", "S->C: %s %s", (_worldSession ? _worldSession->GetPlayerInfo() : GetRemoteIpAddress()).c_str(), GetOpcodeNameForLogging(packet.GetOpcode()).c_str());
ServerPktHeader header(packet.size() + 2, packet.GetOpcode());
std::vector<uint8> data(header.getHeaderLength() + packet.size());
std::memcpy(data.data(), header.header, header.getHeaderLength());
if (!packet.empty())
std::memcpy(&data[header.getHeaderLength()], packet.contents(), packet.size());
std::lock_guard<std::mutex> guard(_writeLock);
bool needsWriteStart = _writeQueue.empty();
_authCrypt.EncryptSend(data.data(), header.getHeaderLength());
_writeQueue.push(std::move(data));
if (needsWriteStart)
AsyncWrite(_writeQueue.front());
}
示例2: HandleClearTradeItem
void WorldSession::HandleClearTradeItem(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 1);
if(_player->mTradeTarget == 0)
return;
uint8 TradeSlot = recv_data.contents()[0];
if(TradeSlot > 6)
return;
// clean status
Player * plr = _player->GetTradeTarget();
if ( !plr ) return;
uint32 TradeStatus = TRADE_STATUS_STATE_CHANGED;
#ifdef USING_BIG_ENDIAN
swap32(&TradeStatus);
OutPacket(SMSG_TRADE_STATUS, 4, &TradeStatus);
plr->m_session->OutPacket(SMSG_TRADE_STATUS, 4, &TradeStatus);
swap32(&TradeStatus);
#else
OutPacket(SMSG_TRADE_STATUS, 4, &TradeStatus);
plr->m_session->OutPacket(SMSG_TRADE_STATUS, 4, &TradeStatus);
#endif
plr->mTradeStatus = TradeStatus;
_player->mTradeStatus = TradeStatus;
_player->mTradeItems[TradeSlot] = 0;
_player->SendTradeUpdate();
}
示例3: SendPacket
void WorldSocket::SendPacket(const WorldPacket& pct, bool immediate)
{
if (IsClosed())
return;
// Dump outgoing packet.
//sLog.outWorldPacketDump(uint32(get_handle()), pct.GetOpcode(), pct.GetOpcodeName(), &pct, false);
ServerPktHeader header;
header.cmd = pct.GetOpcode();
EndianConvert(header.cmd);
header.size = static_cast<uint16>(pct.size() + 2);
EndianConvertReverse(header.size);
m_crypt.EncryptSend(reinterpret_cast<uint8 *>(&header), sizeof(header));
Write(reinterpret_cast<const char *>(&header), sizeof(header));
if (!!pct.size())
Write(reinterpret_cast<const char *>(pct.contents()), pct.size());
if (immediate)
ForceFlushOut();
}
示例4: iSendPacket
int WorldSocket::iSendPacket (const WorldPacket& pct)
{
if (m_OutBuffer->space () < pct.size () + sizeof (ServerPktHeader))
{
errno = ENOBUFS;
return -1;
}
ServerPktHeader header;
header.cmd = pct.GetOpcode ();
EndianConvert(header.cmd);
header.size = (uint16) pct.size () + 2;
EndianConvertReverse(header.size);
m_Crypt.EncryptSend ((uint8*) & header, sizeof (header));
if (m_OutBuffer->copy ((char*) & header, sizeof (header)) == -1)
ACE_ASSERT (false);
if (!pct.empty ())
if (m_OutBuffer->copy ((char*) pct.contents (), pct.size ()) == -1)
ACE_ASSERT (false);
return 0;
}
示例5: OnRead
void VoiceChatClientSocket::OnRead()
{
WorldPacket *data;
// uint16 op
// uint16 size
// <data>
for(;;)
{
// no more data
if( GetReadBufferSize() < 4 )
break;
Read(2, (uint8*)&op);
Read(2, (uint8*)&remaining);
if( GetReadBufferSize() < remaining )
break;
data = new WorldPacket(op, remaining);
data->resize(remaining);
Read(remaining, (uint8*)data->contents());
// handle the packet
sVoiceChatHandler.OnRead(data);
delete data;
remaining = op = 0;
}
}
示例6: CompressPacket
uint32 WorldSocket::CompressPacket(uint8* buffer, WorldPacket const& packet)
{
uint32 opcode = packet.GetOpcode();
uint32 bufferSize = deflateBound(_compressionStream, packet.size() + sizeof(opcode));
_compressionStream->next_out = buffer;
_compressionStream->avail_out = bufferSize;
_compressionStream->next_in = (Bytef*)&opcode;
_compressionStream->avail_in = sizeof(uint32);
int32 z_res = deflate(_compressionStream, Z_BLOCK);
if (z_res != Z_OK)
{
TC_LOG_ERROR("network", "Can't compress packet opcode (zlib: deflate) Error code: %i (%s, msg: %s)", z_res, zError(z_res), _compressionStream->msg);
return 0;
}
_compressionStream->next_in = (Bytef*)packet.contents();
_compressionStream->avail_in = packet.size();
z_res = deflate(_compressionStream, Z_SYNC_FLUSH);
if (z_res != Z_OK)
{
TC_LOG_ERROR("network", "Can't compress packet data (zlib: deflate) Error code: %i (%s, msg: %s)", z_res, zError(z_res), _compressionStream->msg);
return 0;
}
return bufferSize - _compressionStream->avail_out;
}
示例7: SendPacket
bool WorldSocket::SendPacket(const WorldPacket& pct)
{
if (IsClosed())
return false;
// Dump outgoing packet.
sLog.outWorldPacketDump(native_handle(), pct.GetOpcode(), pct.GetOpcodeName(), &pct, false);
ServerPktHeader header(pct.size() + 2, pct.GetOpcode());
crypt_.EncryptSend((uint8*) header.header, header.getHeaderLength());
GuardType Guard(out_buffer_lock_);
if (out_buffer_->space() >= pct.size() + header.getHeaderLength())
{
// Put the packet on the buffer.
if (!out_buffer_->Write(header.header, header.getHeaderLength()))
MANGOS_ASSERT(false);
if (!pct.empty() && !out_buffer_->Write(pct.contents(), pct.size()))
MANGOS_ASSERT(false);
}
else
{
// Enqueue the packet.
throw std::exception("network write buffer is too small to accommodate packet");
}
StartAsyncSend();
return true;
}
示例8: LogPacket
void PacketLog::LogPacket(WorldPacket const& packet, Direction direction, boost::asio::ip::address const& addr, uint16 port)
{
std::lock_guard<std::mutex> lock(_logPacketLock);
PacketHeader header;
*reinterpret_cast<uint32*>(header.Direction) = direction == CLIENT_TO_SERVER ? 0x47534d43 : 0x47534d53;
header.ConnectionId = 0;
header.ArrivalTicks = getMSTime();
header.OptionalDataSize = sizeof(header.OptionalData);
memset(header.OptionalData.SocketIPBytes, 0, sizeof(header.OptionalData.SocketIPBytes));
if (addr.is_v4())
{
auto bytes = addr.to_v4().to_bytes();
memcpy(header.OptionalData.SocketIPBytes, bytes.data(), bytes.size());
}
else if (addr.is_v6())
{
auto bytes = addr.to_v6().to_bytes();
memcpy(header.OptionalData.SocketIPBytes, bytes.data(), bytes.size());
}
header.OptionalData.SocketPort = port;
header.Length = packet.size() + sizeof(header.Opcode);
header.Opcode = packet.GetOpcode();
fwrite(&header, sizeof(header), 1, _file);
if (!packet.empty())
fwrite(packet.contents(), 1, packet.size(), _file);
fflush(_file);
}
示例9: HandleGMTicketCreateOpcode
void WorldSession::HandleGMTicketCreateOpcode(WorldPacket& recvData)
{
// Don't accept tickets if the ticket queue is disabled. (Ticket UI is greyed out but not fully dependable)
if (sTicketMgr->GetStatus() == GMTICKET_QUEUE_STATUS_DISABLED)
return;
if (GetPlayer()->getLevel() < sWorld->getIntConfig(CONFIG_TICKET_LEVEL_REQ))
{
SendNotification(GetTrinityString(LANG_TICKET_REQ), sWorld->getIntConfig(CONFIG_TICKET_LEVEL_REQ));
return;
}
GMTicketResponse response = GMTICKET_RESPONSE_CREATE_ERROR;
GmTicket* ticket = sTicketMgr->GetTicketByPlayer(GetPlayer()->GetGUID());
if (ticket && ticket->IsCompleted())
sTicketMgr->CloseTicket(ticket->GetId(), GetPlayer()->GetGUID());
// Player must not have ticket
if (!ticket || ticket->IsClosed())
{
uint32 mapId;
float x, y, z;
std::string message;
uint32 needResponse;
bool needMoreHelp;
uint32 count;
std::list<uint32> times;
uint32 decompressedSize;
std::string chatLog;
recvData >> mapId;
recvData >> x >> y >> z;
recvData >> message;
recvData >> needResponse;
recvData >> needMoreHelp;
recvData >> count;
for (uint32 i = 0; i < count; i++)
{
uint32 time;
recvData >> time;
times.push_back(time);
}
recvData >> decompressedSize;
if (count && decompressedSize && decompressedSize < 0xFFFF)
{
uint32 pos = recvData.rpos();
ByteBuffer dest;
dest.resize(decompressedSize);
uLongf realSize = decompressedSize;
if (uncompress(dest.contents(), &realSize, recvData.contents() + pos, recvData.size() - pos) == Z_OK)
{
dest >> chatLog;
}
示例10: HandleAuthSession
void WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
{
std::shared_ptr<AuthSession> authSession = std::make_shared<AuthSession>();
// Read the content of the packet
recvPacket >> authSession->Build;
recvPacket >> authSession->LoginServerID;
recvPacket >> authSession->Account;
recvPacket >> authSession->LoginServerType;
recvPacket >> authSession->LocalChallenge;
recvPacket >> authSession->RegionID;
recvPacket >> authSession->BattlegroupID;
recvPacket >> authSession->RealmID; // realmId from auth_database.realmlist table
recvPacket >> authSession->DosResponse;
recvPacket.read(authSession->Digest, 20);
authSession->AddonInfo.append(recvPacket.contents() + recvPacket.rpos(), recvPacket.size() - recvPacket.rpos());
// Get the account information from the auth database
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_INFO_BY_NAME);
stmt->setInt32(0, int32(realm.Id.Realm));
stmt->setString(1, authSession->Account);
_queryCallback = std::bind(&WorldSocket::HandleAuthSessionCallback, this, authSession, std::placeholders::_1);
_queryFuture = LoginDatabase.AsyncQuery(stmt);
}
示例11: HandleWardenDataOpcode
void WorldSession::HandleWardenDataOpcode(WorldPacket& recv_data)
{
m_Warden->DecryptData(const_cast<uint8*>(recv_data.contents()), recv_data.size());
uint8 Opcode;
recv_data >> Opcode;
sLog.outDebug("WARDEN: Got packet, opcode %02X, size %u", Opcode, recv_data.size());
recv_data.hexlike();
switch (Opcode)
{
case WARDEN_CMSG_MODULE_MISSING:
m_Warden->SendModuleToClient();
break;
case WARDEN_CMSG_MODULE_OK:
m_Warden->RequestHash();
break;
case WARDEN_CMSG_CHEAT_CHECKS_RESULT:
m_Warden->HandleData(recv_data);
break;
case WARDEN_CMSG_MEM_CHECKS_RESULT:
sLog.outDebug("WARDEN: NYI WARDEN_CMSG_MEM_CHECKS_RESULT received!");
break;
case WARDEN_CMSG_HASH_RESULT:
m_Warden->HandleHashResult(recv_data);
m_Warden->InitializeModule();
break;
case WARDEN_CMSG_MODULE_FAILED:
sLog.outDebug("WARDEN: NYI WARDEN_CMSG_MODULE_FAILED received!");
break;
default:
sLog.outError("Got unknown warden opcode %02X of size %u.", Opcode, recv_data.size() - 1);
break;
}
}
示例12: WorldPacket
WorldPacket * Mailbox::BuildMailboxListingPacket()
{
WorldPacket * data = new WorldPacket(SMSG_MAIL_LIST_RESULT, 500);
MessageMap::iterator itr;
uint32 count = 0;
uint32 t = (uint32)UNIXTIME;
*data << uint8(0); // size placeholder
for(itr = Messages.begin(); itr != Messages.end(); ++itr)
{
if(itr->second.expire_time && t > itr->second.expire_time)
continue; // expired mail -> skip it
if((uint32)UNIXTIME < itr->second.delivery_time)
continue; // undelivered
if(itr->second.AddMessageDataToPacket(*data))
++count;
if(count == 50)
break;
}
const_cast<uint8*>(data->contents())[0] = count;
// do cleanup on request mail
CleanupExpiredMessages();
return data;
}
示例13: HandleWardenDataOpcode
void WorldSession::HandleWardenDataOpcode(WorldPacket& recvData)
{
_warden->DecryptData(const_cast<uint8*>(recvData.contents()), recvData.size());
uint8 opcode;
recvData >> opcode;
sLog->outDebug(LOG_FILTER_WARDEN, "Got packet, opcode %02X, size %u", opcode, uint32(recvData.size()));
recvData.hexlike();
switch (opcode)
{
case WARDEN_CMSG_MODULE_MISSING:
_warden->SendModuleToClient();
break;
case WARDEN_CMSG_MODULE_OK:
_warden->RequestHash();
break;
case WARDEN_CMSG_CHEAT_CHECKS_RESULT:
_warden->HandleData(recvData);
break;
case WARDEN_CMSG_MEM_CHECKS_RESULT:
sLog->outDebug(LOG_FILTER_WARDEN, "NYI WARDEN_CMSG_MEM_CHECKS_RESULT received!");
break;
case WARDEN_CMSG_HASH_RESULT:
_warden->HandleHashResult(recvData);
_warden->InitializeModule();
break;
case WARDEN_CMSG_MODULE_FAILED:
sLog->outDebug(LOG_FILTER_WARDEN, "NYI WARDEN_CMSG_MODULE_FAILED received!");
break;
default:
sLog->outDebug(LOG_FILTER_WARDEN, "Got unknown warden opcode %02X of size %u.", opcode, uint32(recvData.size() - 1));
break;
}
}
示例14: HandleClearTradeItem
void WorldSession::HandleClearTradeItem(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 1);
if(_player->mTradeTarget == 0)
{
return;
}
uint8 TradeSlot = recv_data.contents()[0];
if( TradeSlot >= TRADE_TOTAL_TRADE_SLOTS )
{
return;
}
// clean status
Player * plr = _player->GetTradeTarget();
if ( !plr )
{
return;
}
// packetSMSG_TRADE_STATUS data;
// memset( &data, 0, sizeof( data ) );
// data.trade_status = TRADE_STATUS_STATE_CHANGED;
// OutPacket(SMSG_TRADE_STATUS,sizeof( packetSMSG_TRADE_STATUS ), &data);
// plr->m_session->OutPacket(SMSG_TRADE_STATUS,sizeof( packetSMSG_TRADE_STATUS ), &data);
plr->mTradeStatus = TRADE_STATUS_STATE_CHANGED;
_player->mTradeStatus = TRADE_STATUS_STATE_CHANGED;
_player->mTradeItems[TradeSlot] = 0;
_player->SendTradeUpdate();
}
示例15: HandlePackedPlayerInfo
void ClusterInterface::HandlePackedPlayerInfo(WorldPacket & pck)
{
uint32 real_size;
pck >> real_size;
uLongf rsize = real_size;
ByteBuffer buf(real_size);
buf.resize(real_size);
if(uncompress((uint8*)buf.contents(), &rsize, pck.contents() + 4, (u_long)pck.size() - 4) != Z_OK)
{
printf("Uncompress of player info failed.\n");
return;
}
RPlayerInfo * pi;
uint32 count;
buf >> count;
for(uint32 i = 0; i < count; ++i)
{
pi = new RPlayerInfo;
pi->Unpack(buf);
_onlinePlayers[pi->Guid] = pi;
}
}