/* * Copyright (C) 2008-2015 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "ObjectAccessor.h" #include "ObjectMgr.h" #include "Opcodes.h" #include "Player.h" #include "WorldPacket.h" #include "WorldSession.h" #include "Object.h" #include "Battlefield.h" #include "BattlefieldMgr.h" /** * @fn void WorldSession::SendBfInvitePlayerToWar(ObjectGuid guid, uint32 zoneId, uint32 acceptTime) * * @brief This send to player windows for invite player to join the war. * * @param guid The guid of Bf * @param zoneId The zone where the battle is (4197 for wg) * @param acceptTime Time in second that the player have for accept */ void WorldSession::SendBfInvitePlayerToWar(ObjectGuid guid, uint32 zoneId, uint32 acceptTime) { WorldPacket data(SMSG_BATTLEFIELD_MGR_ENTRY_INVITE, 16); data.WriteBit(guid[5]); data.WriteBit(guid[3]); data.WriteBit(guid[7]); data.WriteBit(guid[2]); data.WriteBit(guid[6]); data.WriteBit(guid[4]); data.WriteBit(guid[1]); data.WriteBit(guid[0]); data.WriteByteSeq(guid[6]); data << uint32(zoneId); // Zone Id data.WriteByteSeq(guid[1]); data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[4]); data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[0]); data << uint32(time(NULL) + acceptTime); // Invite lasts until data.WriteByteSeq(guid[7]); data.WriteByteSeq(guid[5]); SendPacket(&data); } /** * @fn void WorldSession::SendBfInvitePlayerToQueue(ObjectGuid guid) * * @brief This send invitation to player to join the queue. * * @param guid The guid of Bf */ void WorldSession::SendBfInvitePlayerToQueue(ObjectGuid guid) { WorldPacket data(SMSG_BATTLEFIELD_MGR_QUEUE_INVITE, 5); data.WriteBit(1); // unk data.WriteBit(0); // Has Warmup data.WriteBit(1); // unk data.WriteBit(guid[0]); data.WriteBit(1); // unk data.WriteBit(guid[2]); data.WriteBit(guid[6]); data.WriteBit(guid[3]); data.WriteBit(1); // unk data.WriteBit(0); // unk data.WriteBit(guid[1]); data.WriteBit(guid[5]); data.WriteBit(guid[4]); data.WriteBit(1); // unk data.WriteBit(guid[7]); data.FlushBits(); data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[6]); data << uint8(1); // Warmup data.WriteByteSeq(guid[5]); data.WriteByteSeq(guid[0]); data.WriteByteSeq(guid[4]); data.WriteByteSeq(guid[1]); data.WriteByteSeq(guid[7]); SendPacket(&data); } /** * @fn void WorldSession::SendBfQueueInviteResponse(ObjectGuid guid, uint32 zoneId, bool canQueue, bool full) * * @brief This send packet for inform player that he join queue. * * @param guid The guid of Bf * @param zoneId The zone where the battle is (4197 for wg) * @param canQueue if able to queue * @param full on log in is full */ void WorldSession::SendBfQueueInviteResponse(ObjectGuid guid, uint32 zoneId, bool canQueue, bool full) { const bool hasSecondGuid = false; const bool warmup = true; WorldPacket data(SMSG_BATTLEFIELD_MGR_QUEUE_REQUEST_RESPONSE, 16); data.WriteBit(guid[1]); data.WriteBit(guid[6]); data.WriteBit(guid[5]); data.WriteBit(guid[7]); data.WriteBit(full); // Logging In, VERIFYME data.WriteBit(guid[0]); data.WriteBit(!hasSecondGuid); data.WriteBit(guid[4]); // if (hasSecondGuid) 7 3 0 4 2 6 1 5 data.WriteBit(guid[3]); data.WriteBit(guid[2]); // if (hasSecondGuid) 2 5 3 0 4 6 1 7 data.FlushBits(); data << uint8(canQueue); // Accepted data.WriteByteSeq(guid[1]); data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[6]); data.WriteByteSeq(guid[7]); data.WriteByteSeq(guid[0]); data << uint8(warmup); data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[4]); data.WriteByteSeq(guid[5]); data << uint32(zoneId); SendPacket(&data); } /** * @fn void WorldSession::SendBfEntered(ObjectGuid guid) * * @brief This is call when player accept to join war. * * @param guid The guid of Bf */ void WorldSession::SendBfEntered(ObjectGuid guid) { uint8 isAFK = _player->isAFK() ? 1 : 0; WorldPacket data(SMSG_BATTLEFIELD_MGR_ENTERING, 11); data.WriteBit(0); // unk data.WriteBit(isAFK); // Clear AFK data.WriteBit(guid[1]); data.WriteBit(guid[4]); data.WriteBit(guid[5]); data.WriteBit(guid[0]); data.WriteBit(guid[3]); data.WriteBit(0); // unk data.WriteBit(guid[6]); data.WriteBit(guid[7]); data.WriteBit(guid[2]); data.FlushBits(); data.WriteByteSeq(guid[5]); data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[0]); data.WriteByteSeq(guid[4]); data.WriteByteSeq(guid[1]); data.WriteByteSeq(guid[7]); data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[6]); SendPacket(&data); } /** * @fn void WorldSession::SendBfLeaveMessage(ObjectGuid guid, BFLeaveReason reason) * * @brief This is call when player leave battlefield zone. * * @param guid The guid of Bf * @param reason Reason why player left battlefield */ void WorldSession::SendBfLeaveMessage(ObjectGuid guid, BFLeaveReason reason /*= BF_LEAVE_REASON_EXITED*/) { WorldPacket data(SMSG_BATTLEFIELD_MGR_EJECTED, 11); data.WriteBit(guid[2]); data.WriteBit(guid[5]); data.WriteBit(guid[1]); data.WriteBit(guid[0]); data.WriteBit(guid[3]); data.WriteBit(guid[6]); data.WriteBit(0); // Relocated data.WriteBit(guid[7]); data.WriteBit(guid[4]); data.FlushBits(); data << uint8(2); // BattleStatus data.WriteByteSeq(guid[1]); data.WriteByteSeq(guid[7]); data.WriteByteSeq(guid[4]); data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[3]); data << uint8(reason); // Reason data.WriteByteSeq(guid[6]); data.WriteByteSeq(guid[0]); data.WriteByteSeq(guid[5]); SendPacket(&data); } /** * @fn void WorldSession::HandleBfQueueInviteResponse(WorldPacket& recvData) * * @brief Send by client when he click on accept for queue. */ void WorldSession::HandleBfQueueInviteResponse(WorldPacket& recvData) { uint8 accepted; ObjectGuid guid; guid[2] = recvData.ReadBit(); guid[0] = recvData.ReadBit(); guid[4] = recvData.ReadBit(); guid[3] = recvData.ReadBit(); guid[5] = recvData.ReadBit(); guid[7] = recvData.ReadBit(); accepted = recvData.ReadBit(); guid[1] = recvData.ReadBit(); guid[6] = recvData.ReadBit(); recvData.ReadByteSeq(guid[1]); recvData.ReadByteSeq(guid[3]); recvData.ReadByteSeq(guid[2]); recvData.ReadByteSeq(guid[4]); recvData.ReadByteSeq(guid[6]); recvData.ReadByteSeq(guid[7]); recvData.ReadByteSeq(guid[0]); recvData.ReadByteSeq(guid[5]); TC_LOG_ERROR("misc", "HandleQueueInviteResponse: %s, accepted: %u", guid.ToString().c_str(), accepted); Battlefield* bf = sBattlefieldMgr->GetBattlefieldByGUID(guid); if (!bf) return; if (accepted) bf->PlayerAcceptInviteToQueue(_player); } /** * @fn void WorldSession::HandleBfEntryInviteResponse(WorldPacket& recvData) * * @brief Send by client on clicking in accept or refuse of invitation windows for join game. */ void WorldSession::HandleBfEntryInviteResponse(WorldPacket& recvData) { uint8 accepted; ObjectGuid guid; guid[6] = recvData.ReadBit(); guid[1] = recvData.ReadBit(); accepted = recvData.ReadBit(); guid[5] = recvData.ReadBit(); guid[3] = recvData.ReadBit(); guid[2] = recvData.ReadBit(); guid[0] = recvData.ReadBit(); guid[7] = recvData.ReadBit(); guid[4] = recvData.ReadBit(); recvData.ReadByteSeq(guid[0]); recvData.ReadByteSeq(guid[3]); recvData.ReadByteSeq(guid[4]); recvData.ReadByteSeq(guid[2]); recvData.ReadByteSeq(guid[1]); recvData.ReadByteSeq(guid[6]); recvData.ReadByteSeq(guid[7]); recvData.ReadByteSeq(guid[5]); TC_LOG_ERROR("misc", "HandleBattlefieldInviteResponse: GUID: %s, accepted: %u", guid.ToString().c_str(), accepted); Battlefield* bf = sBattlefieldMgr->GetBattlefieldByGUID(guid); if (!bf) return; // If player accept invitation if (accepted) { bf->PlayerAcceptInviteToWar(_player); } else { if (_player->GetZoneId() == bf->GetZoneId()) bf->KickPlayerFromBattlefield(_player->GetGUID()); } } /** * @fn void WorldSession::HandleBfExitRequest(WorldPacket& recvData) * * @brief Send by client when exited battlefield */ void WorldSession::HandleBfExitRequest(WorldPacket& recvData) { ObjectGuid guid; guid[2] = recvData.ReadBit(); guid[0] = recvData.ReadBit(); guid[3] = recvData.ReadBit(); guid[7] = recvData.ReadBit(); guid[4] = recvData.ReadBit(); guid[5] = recvData.ReadBit(); guid[6] = recvData.ReadBit(); guid[1] = recvData.ReadBit(); recvData.ReadByteSeq(guid[5]); recvData.ReadByteSeq(guid[2]); recvData.ReadByteSeq(guid[0]); recvData.ReadByteSeq(guid[1]); recvData.ReadByteSeq(guid[4]); recvData.ReadByteSeq(guid[3]); recvData.ReadByteSeq(guid[7]); recvData.ReadByteSeq(guid[6]); TC_LOG_ERROR("misc", "HandleBfExitRequest: GUID: %s", guid.ToString().c_str()); Battlefield* bf = sBattlefieldMgr->GetBattlefieldByGUID(guid); if (!bf) return; bf->AskToLeaveQueue(_player); }