int32 WorldSocket::SendPacket(const WorldPacket &sendPacket) { if (!m_pSHSocket || m_pSHSocket->disconnected()) return -1; try { m_pSendHeader->Reset(sendPacket.Size(), sendPacket.getMsgCode()); size_t len = m_pSendHeader->size() + sendPacket.Size(); m_sendDataHolder.resize(len); memset(&m_sendDataHolder[0], 0, len); memcpy(&m_sendDataHolder[0], m_pSendHeader->header(), m_pSendHeader->size()); memcpy(&m_sendDataHolder[m_pSendHeader->size()], sendPacket.Contents(), sendPacket.Size()); m_pSHSocket->Send(&m_sendDataHolder[0], len); m_sendDataHolder.clear(); return 1; } catch (SHException e) { cout << e.what() << endl; return 0; } }
void WorldSession::HandleChatMessage(WorldPacket &recvPacket) { cout << "Handle " << LookupMsgCodeName(recvPacket.getMsgCode()) << ", size: " << recvPacket.Size() << endl; string s = recvPacket.ReadString(); sWorld.SendWorldMessage(s, m_pPlayer->getID()); }
void WorldSession::HandleMoveStateChanged(WorldPacket &recvPacket) { cout << "Handle " << LookupMsgCodeName(recvPacket.getMsgCode()) << ", size: " << recvPacket.Size() << endl; uint32 id = recvPacket.ReadUInt32(); WorldPacket data(SMSG_MOVESTATE_CHANGED, 4); data << id; sWorld.SendGlobalWorldPacket(data); }
void WorldSession::HandleMovementInfo(WorldPacket &recvPacket) { cout << "Handle " << LookupMsgCodeName(recvPacket.getMsgCode()) << ", size: " << recvPacket.Size() << endl; uint32 id = recvPacket.ReadUInt32(); WorldPacket data(SMSG_MOVEMENT_INFO, 4); data << id; sWorld.SendGlobalWorldPacket(data); }
void WorldSession::HandleMoveStartBackward(WorldPacket &recvPacket) { cout << "Handle " << LookupMsgCodeName(recvPacket.getMsgCode()) << ", size: " << recvPacket.Size() << endl; uint32 id = recvPacket.ReadUInt32(); WorldPacket data(SMSG_PLAYER_MOVE, 4); data << id; sWorld.SendGlobalWorldPacket(data); }
void WorldSession::HandleEnumCharacters(WorldPacket &recvPacket) { cout << "Handle " << LookupMsgCodeName(recvPacket.getMsgCode()) << ", size: " << recvPacket.Size() << endl; WorldPacket data(SMSG_ENUM_CHARACTERS, sizeof(PlayerInfo)); data << playerInfo[m_accountID].name << playerInfo[m_accountID].guid << playerInfo[m_accountID].id << playerInfo[m_accountID].level << playerInfo[m_accountID].race << playerInfo[m_accountID].classs << playerInfo[m_accountID].health << playerInfo[m_accountID].mana << playerInfo[m_accountID].speed; SendPacket(&data); }
void WorldSession::HandlePlayerInfo(WorldPacket &recvPacket) { cout << "Handle " << LookupMsgCodeName(recvPacket.getMsgCode()) << ", size: " << recvPacket.Size() << endl; uint32 id; recvPacket >> id; if (id < 10) { WorldPacket data(SMSG_PLAYER_INFO, sizeof(PlayerInfo)); data << playerInfo[id].name << playerInfo[id].guid << playerInfo[id].id << playerInfo[id].level << playerInfo[id].race << playerInfo[id].classs << playerInfo[id].health << playerInfo[id].mana << playerInfo[id].speed; SendPacket(&data); } }
void WorldSession::HandlePlayerLogin(WorldPacket &recvPacket) { cout << "Handle " << LookupMsgCodeName(recvPacket.getMsgCode()) << ", size: " << recvPacket.Size() << endl; uint32 id = recvPacket.ReadUInt32(); Player *pPlayer = new Player(this); pPlayer->Create(playerInfo[m_accountID].name, playerInfo[m_accountID].guid, playerInfo[m_accountID].id, playerInfo[m_accountID].level, playerInfo[m_accountID].race, playerInfo[m_accountID].classs, playerInfo[m_accountID].health, playerInfo[m_accountID].mana, playerInfo[m_accountID].speed); pPlayer->setPosition(id * 103.5f, id * 25.3f, 0); setPlayer(pPlayer); WorldPacket data(SMSG_HELLO); string msg = "欢迎登陆蘑菇王子服务器!@~~"; data << m_accountID; data << sWorld.GetActivedSessionCount(); data << msg; SendPacket(&data); sMapManager.LoadMap(pPlayer->getMapID())->Add(pPlayer); msg = "有玩家登陆啦~!@@@"; data.Initialize(SMSG_PLAYER_LOGIN, sizeof(uint32) + msg.size() + m_pPlayer->getName().size()); data << id; data << m_pPlayer->getName(); data << msg; sWorld.SendGlobalWorldPacket(data); }
void WorldSession::HandleTest(WorldPacket &recvPacket) { cout << "Handle " << LookupMsgCodeName(recvPacket.getMsgCode()) << ", size: " << recvPacket.Size() << endl; }
void WorldSession::HandleServerSide(WorldPacket &recvPacket) { cout << "ERROR: Handler ServerSide MsgCode " << recvPacket.getMsgCode() << "(" << LookupMsgCodeName(recvPacket.getMsgCode()) << ")" << endl; }
void WorldSession::HandleEarlyProccess(WorldPacket &recvPacket) { cout << "ERROR: Handle EarlyProccess MsgCode " << recvPacket.getMsgCode() << "(" << LookupMsgCodeName(recvPacket.getMsgCode()) << ")" << endl; }
void ParsePacket() { try { bool locked = false; while (!disconnect) { Sleep(1); if (locked || packetQueueIn.empty()) continue; else locked = true; WorldPacket data = packetQueueIn.front(); packetItr itr = packetQueueIn.begin(); packetQueueIn.erase(itr); uint32 msgCode = data.getMsgCode(); switch (msgCode) { case MSG_CONNECTION: { string msg; data >> msg; cout << "[System]: Chanllenge OK: " << msg << endl; challengeOK = true; break; } case SMSG_AUTH_CHALLENGE: { if (challengeOK) { WorldPacket data(CMSG_AUTH_SESSION); data << username; data << password; SendPacket(data); } else cout << "[System]: Client not prepared!" << endl; break; } case SMSG_AUTH_RESPONSE: { string msg; data >> authed; data >> msg; cout << "[System]: " << msg << endl; WorldPacket sData; if (!authed) { cin >> username >> password; sData.Initialize(CMSG_AUTH_SESSION); sData << username; sData << password; SendPacket(sData); } else { sData.Initialize(CMSG_ENUM_CHARACTERS); sData << uint8(0); SendPacket(sData); } break; } case SMSG_HELLO: { uint32 onLinePlayer; string msg; data >> accountID; data >> onLinePlayer; data >> msg; cout << "[System]: " << "AccountID: " << accountID << ", Name: " << player.name << ", Online Players: " << onLinePlayer << "\n[System]: " << msg << endl; break; } case SMSG_ENUM_CHARACTERS: { data >> player.name >> player.guid >> player.id >> player.level >> player.race >> player.classs >> player.health >> player.mana >> player.speed; uint32 id; while (true) { cout << "[System]: Choose your character: " << player.id << endl; cin >> id; if (id == player.id) break; cout << "[System]: You don't have that character!" << endl; } playerMap[player.id] = player.name; loggedIn = true; WorldPacket sData(CMSG_PLAYER_LOGIN); sData << player.id; SendPacket(sData); break; } case SMSG_PLAYER_LOGIN: { uint32 id; string name; string msg; data >> id; data >> name; data >> msg; if (id != accountID) { cout << "[System]: " << msg << ", ID: " << id << ", Name: " << name << endl; playerMap[id] = name; } break; } case SMSG_PLAYER_INFO: { PlayerInfo *info = new PlayerInfo(); data >> info->name >> info->guid >> info->id >> info->level >> info->race >> info->classs >> info->health >> info->mana >> info->speed; cout << "Player:[Name:" << info->name << ", GUID:" << info->guid << ", ID:" << info->id << ", LV:" << uint32(info->level) << ", R:" << uint32(info->race) << ", C:" << uint32(info->classs) << ", HP:" << info->health << ", MP:" << info->mana << ", S:" << info->speed << "]" << endl; if (playerMap[info->id] == "") playerMap[info->id] = info->name; SAFE_DELETE(info); break; } case SMSG_CHATMESSAGE: { int32 sender; string msg; data >> sender; data >> msg; if (sender < 0) cout << "[System]: " << msg << endl; else { if (playerMap[sender] == "") { WorldPacket sData(CMSG_PLAYER_INFO); sData << sender; SendPacket(sData); break; } if (sender == player.id) SetInputPos(inputPosX, inputPosY); cout << "[" << playerMap[sender] << "]: " << msg << endl; } break; } case SMSG_PLAYER_LOGOUT: { uint32 id = data.ReadUInt32(); if (playerMap[id] != "") cout << "[System]: Player [" << playerMap[id] << "] Logged out!" << endl; break; } default: cout << "[System]: Get UnHandled MsgCode: " << msgCode << endl; } GetInputPos(&inputPosX, &inputPosY); locked = false; }