void WorldSession::HandleLfgSetRolesOpcode(WorldPacket& recv_data) { uint8 roles; recv_data >> roles; // Player Group Roles uint64 guid = GetPlayer()->GetGUID(); Group* grp = GetPlayer()->GetGroup(); if (!grp) { sLog->outDebug("CMSG_LFG_SET_ROLES [" UI64FMTD "] Not in group", guid); return; } uint64 gguid = grp->GetGUID(); sLog->outDebug("CMSG_LFG_SET_ROLES: Group [" UI64FMTD "], Player [" UI64FMTD "], Roles: %u", gguid, guid, roles); sLFGMgr->UpdateRoleCheck(gguid, guid, roles); }
void WorldSession::HandleLfgSetRolesOpcode(WorldPacket& recv_data) { Log.Debug("LfgHandler", "CMSG_LFG_SET_ROLES"); uint8 roles; recv_data >> roles; // Player Group Roles uint64 guid = GetPlayer()->GetGUID(); Group* grp = GetPlayer()->GetGroup(); if (!grp) { Log.Debug("LfgHandler", "CMSG_LFG_SET_ROLES %u Not in group", guid); return; } uint64 gguid = grp->GetGUID();// NEED TO ADD Bind group to guids Log.Debug("LfgHandler", "CMSG_LFG_SET_ROLES: Group %u, Player %u, Roles: %u", gguid, guid, roles); sLfgMgr.UpdateRoleCheck(gguid, guid, roles); }
void WorldSession::HandleLfgSetRolesOpcode(WorldPacket& recvData) { uint8 roles; recvData >> roles; // Player Group Roles uint64 guid = GetPlayer()->GetGUID(); Group* grp = GetPlayer()->GetGroup(); if (!grp) { sLog->outDebug(LOG_FILTER_LFG, "CMSG_LFG_SET_ROLES %s Not in group", GetPlayerInfo().c_str()); return; } uint64 gguid = grp->GetGUID(); sLog->outDebug(LOG_FILTER_LFG, "CMSG_LFG_SET_ROLES: Group %u, Player %s, Roles: %u", GUID_LOPART(gguid), GetPlayerInfo().c_str(), roles); sLFGMgr->UpdateRoleCheck(gguid, guid, roles); }
void WorldSession::HandleLfgSetRolesOpcode(WorldPacket& recvData) { uint8 roles; recvData >> roles; // Player Group Roles ObjectGuid guid = GetPlayer()->GetGUID(); Group* group = GetPlayer()->GetGroup(); if (!group) { TC_LOG_DEBUG("lfg", "CMSG_LFG_SET_ROLES %s Not in group", GetPlayerInfo().c_str()); return; } ObjectGuid gguid = group->GetGUID(); TC_LOG_DEBUG("lfg", "CMSG_LFG_SET_ROLES: Group %s, Player %s, Roles: %u", gguid.ToString().c_str(), GetPlayerInfo().c_str(), roles); sLFGMgr->UpdateRoleCheck(gguid, guid, roles); }
void WorldSession::HandleLfgLeaveOpcode(WorldPacket& recvData) { ObjectGuid leaveGuid; Group* group = GetPlayer()->GetGroup(); ObjectGuid RequesterGuid = GetPlayer()->GetGUID128(); uint64 gguid = group ? group->GetGUID() : RequesterGuid; uint32 ClientInstanceId, QueueId, joinTime; sLFGMgr->ReadRideTicket(recvData, RequesterGuid, ClientInstanceId, QueueId, joinTime); recvData >> leaveGuid; TC_LOG_DEBUG("lfg", "CMSG_LFG_LEAVE %s in group: %u sent guid " UI64FMTD ".", GetPlayerInfo().c_str(), group ? 1 : 0, uint64(leaveGuid)); // Check cheating - only leader can leave the queue if (!group || group->GetLeaderGUID() == RequesterGuid) sLFGMgr->LeaveLfg(gguid); }
void WorldSession::HandleLfgSetRolesOpcode(WorldPacket& recvData) { uint8 roles; recvData >> roles; // Player Group Roles uint64 guid = GetPlayer()->GetGUID(); Group* group = GetPlayer()->GetGroup(); if (!group) { #if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_LFG_SET_ROLES [" UI64FMTD "] Not in group", guid); #endif return; } uint64 gguid = group->GetGUID(); #if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_LFG_SET_ROLES: Group [" UI64FMTD "], Player [" UI64FMTD "], Roles: %u", gguid, guid, roles); #endif sLFGMgr->UpdateRoleCheck(gguid, guid, roles); }
void LFGPlayerScript::OnMapChanged(Player* player) { Map const* map = player->GetMap(); if (sLFGMgr->inLfgDungeonMap(player->GetGUID(), map->GetId(), map->GetDifficultyID())) { Group* group = player->GetGroup(); // This function is also called when players log in // if for some reason the LFG system recognises the player as being in a LFG dungeon, // but the player was loaded without a valid group, we'll teleport to homebind to prevent // crashes or other undefined behaviour if (!group) { sLFGMgr->LeaveLfg(player->GetGUID()); player->RemoveAurasDueToSpell(LFG_SPELL_LUCK_OF_THE_DRAW); player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, 0.0f); TC_LOG_ERROR("lfg", "LFGPlayerScript::OnMapChanged, Player %s (%s) is in LFG dungeon map but does not have a valid group! " "Teleporting to homebind.", player->GetName().c_str(), player->GetGUID().ToString().c_str()); return; } for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) if (Player* member = itr->GetSource()) player->GetSession()->SendNameQueryOpcode(member->GetGUID()); if (sLFGMgr->selectedRandomLfgDungeon(player->GetGUID())) player->CastSpell(player, LFG_SPELL_LUCK_OF_THE_DRAW, true); } else { Group* group = player->GetGroup(); if (group && group->GetMembersCount() == 1) { sLFGMgr->LeaveLfg(group->GetGUID()); group->Disband(); TC_LOG_DEBUG("lfg", "LFGPlayerScript::OnMapChanged, Player %s(%s) is last in the lfggroup so we disband the group.", player->GetName().c_str(), player->GetGUID().ToString().c_str()); } player->RemoveAurasDueToSpell(LFG_SPELL_LUCK_OF_THE_DRAW); } }
void WorldSession::HandleLfgLeaveOpcode(WorldPacket& recvData) { ObjectGuid leaveGuid; Group* group = GetPlayer()->GetGroup(); uint64 guid = GetPlayer()->GetGUID(); uint64 gguid = group ? group->GetGUID() : guid; recvData.read_skip<uint32>(); // Always 8 recvData.read_skip<uint32>(); // Join date recvData.read_skip<uint32>(); // Always 3 recvData.read_skip<uint32>(); // Queue Id recvData.ReadGuidMask(leaveGuid, 0, 1, 6, 7, 3, 5, 2, 4); recvData.ReadGuidBytes(leaveGuid, 1, 5, 6, 7, 4, 2, 3, 0); TC_LOG_DEBUG("lfg", "CMSG_LFG_LEAVE %s in group: %u sent guid " UI64FMTD ".", GetPlayerInfo().c_str(), group ? 1 : 0, uint64(leaveGuid)); // Check cheating - only leader can leave the queue if (!group || group->GetLeaderGUID() == guid) sLFGMgr->LeaveLfg(gguid); }
void WorldSession::HandleLfgLeaveOpcode(WorldPacket& recvData) { ObjectGuid leaveGuid; Group* group = GetPlayer()->GetGroup(); ObjectGuid guid = GetPlayer()->GetGUID(); ObjectGuid gguid = group ? group->GetGUID() : guid; recvData.read_skip<uint32>(); // Always 8 recvData.read_skip<uint32>(); // Join date recvData.read_skip<uint32>(); // Always 3 recvData.read_skip<uint32>(); // Queue Id leaveGuid[4] = recvData.ReadBit(); leaveGuid[5] = recvData.ReadBit(); leaveGuid[0] = recvData.ReadBit(); leaveGuid[6] = recvData.ReadBit(); leaveGuid[2] = recvData.ReadBit(); leaveGuid[7] = recvData.ReadBit(); leaveGuid[1] = recvData.ReadBit(); leaveGuid[3] = recvData.ReadBit(); recvData.ReadByteSeq(leaveGuid[7]); recvData.ReadByteSeq(leaveGuid[4]); recvData.ReadByteSeq(leaveGuid[3]); recvData.ReadByteSeq(leaveGuid[2]); recvData.ReadByteSeq(leaveGuid[6]); recvData.ReadByteSeq(leaveGuid[0]); recvData.ReadByteSeq(leaveGuid[1]); recvData.ReadByteSeq(leaveGuid[5]); TC_LOG_DEBUG("lfg", "CMSG_LFG_LEAVE %s in group: %u sent guid " UI64FMTD ".", GetPlayerInfo().c_str(), group ? 1 : 0, uint64(leaveGuid)); // Check cheating - only leader can leave the queue if (!group || group->GetLeaderGUID() == guid) sLFGMgr->LeaveLfg(gguid); }
void WorldSession::HandleGroupSetRoles(WorldPacket &recv_data) { uint32 roles; uint64 guid = GetPlayer()->GetGUID(); recv_data >> roles; // Player Group Roles recv_data >> guid; Player * plr = sObjectMgr->GetPlayer(guid); if (!plr) { sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_GROUP_SET_ROLES [" UI64FMTD "] Player not found", guid); return; } Group* grp = plr->GetGroup(); if (!grp) { sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_GROUP_SET_ROLES [" UI64FMTD "] Not in group", plr->GetGUID()); return; } else if (grp != GetPlayer()->GetGroup()) { sLog->outDebug( LOG_FILTER_NETWORKIO, "CMSG_GROUP_SET_ROLES [" UI64FMTD "] and [" UI64FMTD "] Not in group same group", plr->GetGUID(), GetPlayer()->GetGUID()); return; } else sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_GROUP_SET_ROLES [" UI64FMTD "] Roles: %u", plr->GetGUID(), roles); plr->SetRoles(roles); if (grp->isLFGGroup()) { uint64 gguid = grp->GetGUID(); sLFGMgr->UpdateRoleCheck(gguid, guid, roles); } }
static bool HandleLfgGroupInfoCommand(ChatHandler* handler, char const* args) { Player* target = NULL; std::string playerName; if (!handler->extractPlayerTarget((char*)args, &target, NULL, &playerName)) return false; Group* grp = target->GetGroup(); if (!grp) { handler->PSendSysMessage(LANG_LFG_NOT_IN_GROUP, playerName.c_str()); return true; } uint64 guid = grp->GetGUID(); std::string const& state = lfg::GetStateString(sLFGMgr->GetState(guid)); handler->PSendSysMessage(LANG_LFG_GROUP_INFO, grp->isLFGGroup(), state.c_str(), sLFGMgr->GetDungeon(guid)); for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) GetPlayerInfo(handler, itr->GetSource()); return true; }
void WorldSession::HandleRaidReadyCheckOpcode(WorldPacket& /*recvData*/) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_RAID_READY_CHECK"); Group* group = GetPlayer()->GetGroup(); if (!group) return; ObjectGuid playerGuid = GetPlayer()->GetGUID(); /** error handling **/ if (!group->IsLeader(playerGuid) && !group->IsAssistant(playerGuid)) return; // check is also done client side if (group->ReadyCheckInProgress()) return; /********************/ uint32 readyCheckDuration = 35000; ObjectGuid groupGuid = group->GetGUID(); // everything's fine, do it WorldPacket data(SMSG_RAID_READY_CHECK, 1 + 8 + 1 + 8 + 1 + 4); data.WriteBit(groupGuid[4]); data.WriteBit(groupGuid[2]); data.WriteBit(playerGuid[4]); data.WriteBit(groupGuid[3]); data.WriteBit(groupGuid[7]); data.WriteBit(groupGuid[1]); data.WriteBit(groupGuid[0]); data.WriteBit(playerGuid[6]); data.WriteBit(playerGuid[5]); data.WriteBit(groupGuid[6]); data.WriteBit(groupGuid[5]); data.WriteBit(playerGuid[0]); data.WriteBit(playerGuid[1]); data.WriteBit(playerGuid[2]); data.WriteBit(playerGuid[7]); data.WriteBit(playerGuid[3]); data << uint32(readyCheckDuration); data.WriteByteSeq(groupGuid[2]); data.WriteByteSeq(groupGuid[7]); data.WriteByteSeq(groupGuid[3]); data.WriteByteSeq(playerGuid[4]); data.WriteByteSeq(groupGuid[1]); data.WriteByteSeq(groupGuid[0]); data.WriteByteSeq(playerGuid[1]); data.WriteByteSeq(playerGuid[2]); data.WriteByteSeq(playerGuid[6]); data.WriteByteSeq(playerGuid[5]); data.WriteByteSeq(groupGuid[6]); data.WriteByteSeq(playerGuid[0]); data << uint8(0); // unknown data.WriteByteSeq(playerGuid[7]); data.WriteByteSeq(groupGuid[4]); data.WriteByteSeq(playerGuid[3]); data.WriteByteSeq(groupGuid[5]); group->BroadcastPacket(&data, false); group->ReadyCheck(true); group->ReadyCheckMemberHasResponded(playerGuid); group->OfflineReadyCheck(); // leader keeps track of ready check timer GetPlayer()->SetReadyCheckTimer(readyCheckDuration); }
void WorldSession::HandleRaidLeaderReadyCheck(WorldPacket& recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_RAID_LEADER_READY_CHECK"); recvData.read_skip<uint8>(); // unk, 0x00 Group* group = GetPlayer()->GetGroup(); if (!group) return; if (!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID()) && !(group->GetGroupType() & GROUPTYPE_EVERYONE_IS_ASSISTANT)) return; ObjectGuid groupGuid = group->GetGUID(); ObjectGuid playerGuid = GetPlayer()->GetGUID(); // For the initiator being ready. group->SetReadyCheckCount(1); // Everything's fine, do it. WorldPacket data(SMSG_RAID_READY_CHECK_STARTED, 1 + 8 + 1 + 8 + 1 + 4); data.WriteBit(playerGuid[4]); data.WriteBit(groupGuid[1]); data.WriteBit(groupGuid[4]); data.WriteBit(playerGuid[6]); data.WriteBit(groupGuid[7]); data.WriteBit(groupGuid[6]); data.WriteBit(playerGuid[2]); data.WriteBit(playerGuid[0]); data.WriteBit(playerGuid[7]); data.WriteBit(groupGuid[0]); data.WriteBit(groupGuid[3]); data.WriteBit(groupGuid[5]); data.WriteBit(playerGuid[5]); data.WriteBit(playerGuid[3]); data.WriteBit(playerGuid[1]); data.WriteBit(groupGuid[2]); data.FlushBits(); data.WriteByteSeq(groupGuid[6]); data.WriteByteSeq(groupGuid[0]); data.WriteByteSeq(playerGuid[4]); data.WriteByteSeq(playerGuid[7]); data.WriteByteSeq(groupGuid[5]); data.WriteByteSeq(groupGuid[7]); data.WriteByteSeq(playerGuid[6]); data.WriteByteSeq(playerGuid[3]); data << uint8(0); // Unknown data.WriteByteSeq(groupGuid[1]); data.WriteByteSeq(playerGuid[2]); data.WriteByteSeq(groupGuid[3]); data.WriteByteSeq(playerGuid[5]); data.WriteByteSeq(groupGuid[4]); data.WriteByteSeq(groupGuid[2]); data << uint32(35000); // Ready check duration (35 sec) data.WriteByteSeq(playerGuid[1]); data.WriteByteSeq(playerGuid[0]); group->BroadcastPacket(&data, false, -1); group->OfflineReadyCheck(); }
void WorldSession::SendLfgUpdateProposal(uint32 proposalId, const LfgProposal* pProp) { if (!pProp) return; uint64 guid = GetPlayer()->GetGUID(); LfgProposalPlayerMap::const_iterator itPlayer = pProp->players.find(guid); if (itPlayer == pProp->players.end()) // Player MUST be in the proposal return; LfgProposalPlayer* ppPlayer = itPlayer->second; uint32 pLowGroupGuid = ppPlayer->groupLowGuid; uint32 dLowGuid = pProp->groupLowGuid; uint32 dungeonId = pProp->dungeonId; bool isSameDungeon = false; bool isContinue = false; Group* group = dLowGuid ? sGroupMgr->GetGroupByGUID(dLowGuid) : NULL; uint32 completedEncounters = 0; if (group) { uint64 gguid = group->GetGUID(); isContinue = group->isLFGGroup() && sLFGMgr->GetState(gguid) != LFG_STATE_FINISHED_DUNGEON; isSameDungeon = GetPlayer()->GetGroup() == group && isContinue; } sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_LFG_PROPOSAL_UPDATE [" UI64FMTD "] state: %u", GetPlayer()->GetGUID(), pProp->state); WorldPacket data(SMSG_LFG_PROPOSAL_UPDATE, 4 + 1 + 4 + 4 + 1 + 1 + pProp->players.size() * (4 + 1 + 1 + 1 + 1 +1)); if (!isContinue) // Only show proposal dungeon if it's continue { LfgDungeonSet playerDungeons = sLFGMgr->GetSelectedDungeons(guid); if (playerDungeons.size() == 1) dungeonId = (*playerDungeons.begin()); } if (LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(dungeonId)) { dungeonId = dungeon->Entry(); // Select a player inside to be get completed encounters from if (group) { for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player* groupMember = itr->getSource(); if (groupMember && groupMember->GetMapId() == uint32(dungeon->map)) { if (InstanceScript* instance = groupMember->GetInstanceScript()) completedEncounters = instance->GetCompletedEncounterMask(); break; } } } } data << uint32(dungeonId); // Dungeon data << uint8(pProp->state); // Result state data << uint32(proposalId); // Internal Proposal ID data << uint32(completedEncounters); // Bosses killed data << uint8(isSameDungeon); // Silent (show client window) data << uint8(pProp->players.size()); // Group size for (itPlayer = pProp->players.begin(); itPlayer != pProp->players.end(); ++itPlayer) { ppPlayer = itPlayer->second; data << uint32(ppPlayer->role); // Role data << uint8(itPlayer->first == guid); // Self player if (!ppPlayer->groupLowGuid) // Player not it a group { data << uint8(0); // Not in dungeon data << uint8(0); // Not same group } else { data << uint8(ppPlayer->groupLowGuid == dLowGuid); // In dungeon (silent) data << uint8(ppPlayer->groupLowGuid == pLowGroupGuid); // Same Group than player } data << uint8(ppPlayer->accept != LFG_ANSWER_PENDING); // Answered data << uint8(ppPlayer->accept == LFG_ANSWER_AGREE); // Accepted } SendPacket(&data); }
void WorldSession::HandleRaidConfirmReadyCheck(WorldPacket& recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_RAID_CONFIRM_READY_CHECK"); Group* group = GetPlayer()->GetGroup(); if (!group) return; recvData.read_skip<uint8>(); // unk, 0x00 bool ready = recvData.ReadBit(); // ========== Unknown guid reading here - probably for group guid ? ======== ObjectGuid unknownGuid; unknownGuid[0] = recvData.ReadBit(); unknownGuid[6] = recvData.ReadBit(); unknownGuid[5] = recvData.ReadBit(); unknownGuid[2] = recvData.ReadBit(); unknownGuid[4] = recvData.ReadBit(); unknownGuid[7] = recvData.ReadBit(); unknownGuid[3] = recvData.ReadBit(); unknownGuid[1] = recvData.ReadBit(); recvData.FlushBits(); recvData.ReadByteSeq(unknownGuid[2]); recvData.ReadByteSeq(unknownGuid[0]); recvData.ReadByteSeq(unknownGuid[7]); recvData.ReadByteSeq(unknownGuid[6]); recvData.ReadByteSeq(unknownGuid[5]); recvData.ReadByteSeq(unknownGuid[3]); recvData.ReadByteSeq(unknownGuid[1]); recvData.ReadByteSeq(unknownGuid[4]); // ========================================================================= ObjectGuid playerGuid = GetPlayer()->GetGUID(); ObjectGuid groupGuid = group->GetGUID(); // Confirmed the check, increase the count. group->SetReadyCheckCount(group->GetReadyCheckCount() + 1); WorldPacket data(SMSG_RAID_READY_CHECK_RESPONSE, 1 + 1 + 8 + 1 + 8); data.WriteBit(groupGuid[0]); data.WriteBit(groupGuid[2]); data.WriteBit(ready); data.WriteBit(playerGuid[7]); data.WriteBit(playerGuid[6]); data.WriteBit(playerGuid[2]); data.WriteBit(groupGuid[4]); data.WriteBit(groupGuid[3]); data.WriteBit(groupGuid[5]); data.WriteBit(playerGuid[3]); data.WriteBit(groupGuid[7]); data.WriteBit(playerGuid[5]); data.WriteBit(groupGuid[6]); data.WriteBit(groupGuid[1]); data.WriteBit(playerGuid[0]); data.WriteBit(playerGuid[1]); data.WriteBit(playerGuid[4]); data.FlushBits(); data.WriteByteSeq(playerGuid[1]); data.WriteByteSeq(groupGuid[5]); data.WriteByteSeq(playerGuid[2]); data.WriteByteSeq(groupGuid[7]); data.WriteByteSeq(groupGuid[0]); data.WriteByteSeq(playerGuid[4]); data.WriteByteSeq(playerGuid[3]); data.WriteByteSeq(groupGuid[4]); data.WriteByteSeq(playerGuid[7]); data.WriteByteSeq(groupGuid[6]); data.WriteByteSeq(playerGuid[5]); data.WriteByteSeq(groupGuid[2]); data.WriteByteSeq(groupGuid[1]); data.WriteByteSeq(groupGuid[3]); data.WriteByteSeq(playerGuid[0]); data.WriteByteSeq(playerGuid[6]); group->BroadcastReadyCheck(&data); // BroadcastPacket(&data, true); // Send SMSG_RAID_READY_CHECK_COMPLETED if needed. if (group->GetReadyCheckCount() >= group->GetMembersCount()) { ObjectGuid grpGUID = group->GetGUID(); bool checkCompleted = true; data.Initialize(SMSG_RAID_READY_CHECK_COMPLETED); uint8 bitOrder[8] = { 1, 5, 6, 3, 2, 7, 0, 4 }; data.WriteBitInOrder(grpGUID, bitOrder); data.FlushBits(); data.WriteByteSeq(grpGUID[4]); data.WriteByteSeq(grpGUID[7]); data << uint8(checkCompleted); data.WriteByteSeq(grpGUID[0]); data.WriteByteSeq(grpGUID[3]); data.WriteByteSeq(grpGUID[6]); data.WriteByteSeq(grpGUID[5]); data.WriteByteSeq(grpGUID[2]); data.WriteByteSeq(grpGUID[1]); group->BroadcastPacket(&data, true); } }
bool ChatHandler::HandlePlayerbotMainTankCommand(const char *args) { uint64 guid = 0; uint64 pGuid = 0; char *charname ; Group *group = m_session->GetPlayer()->GetGroup(); if (group == NULL) { PSendSysMessage("Must be in a group to set a main tank."); SetSentErrorMessage(true); return false; } QueryResult result = CharacterDatabase.PQuery("SELECT memberGuid FROM group_member WHERE memberFlags='%u' AND guid = '%u'",MEMBER_FLAG_MAINTANK, group->GetGUID()); if(result) { pGuid = MAKE_NEW_GUID(result->Fetch()->GetInt32(),0,HIGHGUID_PLAYER); } // if no arguments are passed in, just say who the current main tank is if(!*args) { if (pGuid>0) { Player *pPlayer = sObjectMgr->GetPlayer(pGuid); if (pPlayer && pPlayer->isAlive()){ PSendSysMessage("Main tank is %s.", pPlayer->GetName()); return true; } } PSendSysMessage("Currently there is no main tank. "); return true; } else { charname = strtok ((char*)args, " "); std::string charnameStr = charname; guid = sObjectMgr->GetPlayerGUIDByName(charnameStr.c_str()); // clear if same player if (pGuid==guid) { group->SetGroupMemberFlag(guid, false, MEMBER_FLAG_MAINTANK); PSendSysMessage("Main tank has been cleared. "); return true; } if (m_session->GetPlayer()->GetGroup()->IsMember(guid)) { group->SetGroupMemberFlag(pGuid,false, MEMBER_FLAG_MAINTANK); // clear old one group->SetGroupMemberFlag(guid, true, MEMBER_FLAG_MAINTANK); // set new one Player *pPlayer = sObjectMgr->GetPlayer(guid); if (pPlayer->IsInWorld()) PSendSysMessage("Main tank is %s.", pPlayer->GetName()); else PSendSysMessage("Player is not online."); } else { PSendSysMessage("Player is not in your group."); } } return true; }
bool MapManager::CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck) { MapEntry const* entry = sMapStore.LookupEntry(mapid); if (!entry) return false; if (!entry->IsDungeon()) return true; InstanceTemplate const* instance = sObjectMgr->GetInstanceTemplate(mapid); if (!instance) return false; Difficulty targetDifficulty, requestedDifficulty; targetDifficulty = requestedDifficulty = player->GetDifficulty(entry->IsRaid()); // Get the highest available difficulty if current setting is higher than the instance allows MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(entry->MapID, targetDifficulty); if (!mapDiff) { player->SendTransferAborted(mapid, TRANSFER_ABORT_DIFFICULTY, requestedDifficulty); return false; } //Bypass checks for GMs if (player->IsGameMaster()) return true; char const* mapName = entry->name[player->GetSession()->GetSessionDbcLocale()]; Group* group = player->GetGroup(); if (entry->IsRaid()) { // can only enter in a raid group if ((!group || !group->isRaidGroup()) && !sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_RAID)) { // probably there must be special opcode, because client has this string constant in GlobalStrings.lua // TODO: this is not a good place to send the message player->GetSession()->SendAreaTriggerMessage(player->GetSession()->GetTrinityString(LANG_INSTANCE_RAID_GROUP_ONLY), mapName); ;//sLog->outDebug(LOG_FILTER_MAPS, "MAP: Player '%s' must be in a raid group to enter instance '%s'", player->GetName().c_str(), mapName); return false; } } // xinef: dont allow LFG Group to enter other instance that is selected if (group) if (group->isLFGGroup()) if (!sLFGMgr->inLfgDungeonMap(group->GetGUID(), mapid, targetDifficulty)) { player->SendTransferAborted(mapid, TRANSFER_ABORT_MAP_NOT_ALLOWED); return false; } if (!player->IsAlive()) { if (Corpse* corpse = player->GetCorpse()) { // let enter in ghost mode in instance that connected to inner instance with corpse uint32 corpseMap = corpse->GetMapId(); do { if (corpseMap == mapid) break; InstanceTemplate const* corpseInstance = sObjectMgr->GetInstanceTemplate(corpseMap); corpseMap = corpseInstance ? corpseInstance->Parent : 0; } while (corpseMap); if (!corpseMap) { WorldPacket data(SMSG_CORPSE_NOT_IN_INSTANCE, 0); player->GetSession()->SendPacket(&data); ;//sLog->outDebug(LOG_FILTER_MAPS, "MAP: Player '%s' does not have a corpse in instance '%s' and cannot enter.", player->GetName().c_str(), mapName); return false; } ;//sLog->outDebug(LOG_FILTER_MAPS, "MAP: Player '%s' has corpse in instance '%s' and can enter.", player->GetName().c_str(), mapName); player->ResurrectPlayer(0.5f, false); player->SpawnCorpseBones(); } else ;//sLog->outDebug(LOG_FILTER_MAPS, "Map::CanPlayerEnter - player '%s' is dead but does not have a corpse!", player->GetName().c_str()); } // if map exists - check for being full, etc. if (!loginCheck) // for login this is done by the calling function { uint32 destInstId = sInstanceSaveMgr->PlayerGetDestinationInstanceId(player, mapid, targetDifficulty); if (destInstId) if (Map* boundMap = sMapMgr->FindMap(mapid, destInstId)) if (!boundMap->CanEnter(player, loginCheck)) return false; } // players are only allowed to enter 5 instances per hour if (entry->IsDungeon() && (!group || !group->isLFGGroup() || !group->IsLfgRandomInstance())) { uint32 instaceIdToCheck = 0; if (InstanceSave* save = sInstanceSaveMgr->PlayerGetInstanceSave(player->GetGUIDLow(), mapid, player->GetDifficulty(entry->IsRaid()))) instaceIdToCheck = save->GetInstanceId(); // instaceIdToCheck can be 0 if save not found - means no bind so the instance is new if (!player->CheckInstanceCount(instaceIdToCheck) && !player->isDead()) { player->SendTransferAborted(mapid, TRANSFER_ABORT_TOO_MANY_INSTANCES); return false; } } //Other requirements return player->Satisfy(sObjectMgr->GetAccessRequirement(mapid, targetDifficulty), mapid, true); }
void WorldSession::SendLfgUpdateProposal(uint32 proposalId, const LfgProposal* pProp) { if (!pProp) return; uint64 guid = GetPlayer()->GetGUID(); LfgProposalPlayerMap::const_iterator itPlayer = pProp->players.find(guid); if (itPlayer == pProp->players.end()) // Player MUST be in the proposal return; LfgProposalPlayer* ppPlayer = itPlayer->second; uint32 pLowGroupGuid = ppPlayer->groupLowGuid; uint32 dLowGuid = pProp->groupLowGuid; uint32 dungeonId = pProp->dungeonId; bool isSameDungeon = false; bool isContinue = false; Group* grp = dLowGuid ? objmgr.GetGroupById(dLowGuid) : NULL; ///fiiiix uint32 completedEncounters = 0; if (grp) { uint64 gguid = grp->GetGUID(); isContinue = grp->isLFGGroup() && sLfgMgr.GetState(gguid) != LFG_STATE_FINISHED_DUNGEON; isSameDungeon = GetPlayer()->GetGroup() == grp && isContinue; } Log.Debug("LfgHandler", "SMSG_LFG_PROPOSAL_UPDATE %u state: %u", GetPlayer()->GetGUID(), pProp->state); WorldPacket data(SMSG_LFG_PROPOSAL_UPDATE, 4 + 1 + 4 + 4 + 1 + 1 + pProp->players.size() * (4 + 1 + 1 + 1 + 1 + 1)); if (!isContinue) // Only show proposal dungeon if it's continue { LfgDungeonSet playerDungeons = sLfgMgr.GetSelectedDungeons(guid); if (playerDungeons.size() == 1) dungeonId = (*playerDungeons.begin()); } if (DBC::Structures::LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(dungeonId)) { dungeonId = dungeon->Entry(); // Select a player inside to be get completed encounters from if (grp) { GroupMembersSet::iterator itx; for (itx = grp->GetSubGroup(0)->GetGroupMembersBegin(); itx != grp->GetSubGroup(0)->GetGroupMembersEnd(); ++itx) { Player* groupMember = (*itx)->m_loggedInPlayer; if (groupMember && groupMember->GetMapId() == uint32(dungeon->map)) { /* fiiiix if (InstanceScript* instance = groupMember->GetInstanceScript()) completedEncounters = instance->GetCompletedEncounterMask(); */ break; } } } } data << uint32(dungeonId); // Dungeon data << uint8(pProp->state); // Result state data << uint32(proposalId); // Internal Proposal ID data << uint32(completedEncounters); // Bosses killed data << uint8(isSameDungeon); // Silent (show client window) data << uint8(pProp->players.size()); // Group size for (itPlayer = pProp->players.begin(); itPlayer != pProp->players.end(); ++itPlayer) { ppPlayer = itPlayer->second; data << uint32(ppPlayer->role); // Role data << uint8(itPlayer->first == guid); // Self player if (!ppPlayer->groupLowGuid) // Player not it a group { data << uint8(0); // Not in dungeon data << uint8(0); // Not same group } else { data << uint8(ppPlayer->groupLowGuid == dLowGuid); // In dungeon (silent) data << uint8(ppPlayer->groupLowGuid == pLowGroupGuid); // Same Group than player } data << uint8(ppPlayer->accept != LFG_ANSWER_PENDING); // Answered data << uint8(ppPlayer->accept == LFG_ANSWER_AGREE); // Accepted } SendPacket(&data); }
void WorldSession::HandleRaidConfirmReadyCheck(WorldPacket& recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_RAID_CONFIRM_READY_CHECK"); ObjectGuid guid; // currently unused Group* group = GetPlayer()->GetGroup(); if (!group) return; recvData.read_skip<uint8>(); guid[2] = recvData.ReadBit(); guid[1] = recvData.ReadBit(); guid[0] = recvData.ReadBit(); guid[3] = recvData.ReadBit(); guid[6] = recvData.ReadBit(); bool status = recvData.ReadBit(); guid[7] = recvData.ReadBit(); guid[4] = recvData.ReadBit(); guid[5] = recvData.ReadBit(); recvData.ReadByteSeq(guid[1]); recvData.ReadByteSeq(guid[0]); recvData.ReadByteSeq(guid[3]); recvData.ReadByteSeq(guid[2]); recvData.ReadByteSeq(guid[4]); recvData.ReadByteSeq(guid[5]); recvData.ReadByteSeq(guid[7]); recvData.ReadByteSeq(guid[6]); ObjectGuid playerGuid = GetPlayer()->GetGUID(); ObjectGuid groupGuid = group->GetGUID(); group->SetReadyCheckCount(group->GetReadyCheckCount() + 1); WorldPacket data(SMSG_RAID_READY_CHECK_CONFIRM, 1 + 1 + 8 + 1 + 8); data.WriteBit(groupGuid[4]); data.WriteBit(playerGuid[5]); data.WriteBit(playerGuid[3]); data.WriteBit(status); data.WriteBit(groupGuid[2]); data.WriteBit(playerGuid[6]); data.WriteBit(groupGuid[3]); data.WriteBit(playerGuid[0]); data.WriteBit(playerGuid[1]); data.WriteBit(groupGuid[1]); data.WriteBit(groupGuid[5]); data.WriteBit(playerGuid[7]); data.WriteBit(playerGuid[4]); data.WriteBit(groupGuid[6]); data.WriteBit(playerGuid[2]); data.WriteBit(groupGuid[0]); data.WriteBit(groupGuid[7]); data.FlushBits(); data.WriteByteSeq(playerGuid[4]); data.WriteByteSeq(playerGuid[2]); data.WriteByteSeq(playerGuid[1]); data.WriteByteSeq(groupGuid[4]); data.WriteByteSeq(groupGuid[2]); data.WriteByteSeq(playerGuid[0]); data.WriteByteSeq(groupGuid[5]); data.WriteByteSeq(groupGuid[3]); data.WriteByteSeq(playerGuid[7]); data.WriteByteSeq(groupGuid[6]); data.WriteByteSeq(groupGuid[1]); data.WriteByteSeq(playerGuid[6]); data.WriteByteSeq(playerGuid[3]); data.WriteByteSeq(playerGuid[5]); data.WriteByteSeq(groupGuid[0]); data.WriteByteSeq(groupGuid[7]); group->BroadcastPacket(&data, true); // Send SMSG_RAID_READY_CHECK_COMPLETED if (group->GetReadyCheckCount() >= group->GetMembersCount()) { ObjectGuid grpGUID = group->GetGUID(); data.Initialize(SMSG_RAID_READY_CHECK_COMPLETED, 1 + 8 + 1); uint8 bitOrder[8] = { 4, 2, 5, 7, 1, 0, 3, 6 }; data.WriteBitInOrder(grpGUID, bitOrder); data.WriteByteSeq(grpGUID[6]); data.WriteByteSeq(grpGUID[0]); data.WriteByteSeq(grpGUID[3]); data.WriteByteSeq(grpGUID[1]); data.WriteByteSeq(grpGUID[5]); data << uint8(1); // or 0 data.WriteByteSeq(grpGUID[7]); data.WriteByteSeq(grpGUID[2]); data.WriteByteSeq(grpGUID[4]); group->BroadcastPacket(&data, true); } }
void WorldSession::SendLfgUpdateProposal(uint32 proposalId, const LfgProposal* pProp) { if (!pProp) return; uint64 guid = GetPlayer()->GetGUID(); LfgProposalPlayerMap::const_iterator itPlayer = pProp->players.find(guid); if (itPlayer == pProp->players.end()) // Player MUST be in the proposal return; LfgProposalPlayer* ppPlayer = itPlayer->second; uint32 pLowGroupGuid = ppPlayer->groupLowGuid; uint32 dLowGuid = pProp->groupLowGuid; uint32 dungeonId = pProp->dungeonId; bool isSameDungeon = false; bool isContinue = false; Group* grp = dLowGuid ? sGroupMgr->GetGroupByGUID(dLowGuid) : NULL; uint32 completedEncounters = 0; if (grp) { uint64 gguid = grp->GetGUID(); isContinue = grp->isLFGGroup() && sLFGMgr->GetState(gguid) != LFG_STATE_FINISHED_DUNGEON; isSameDungeon = GetPlayer()->GetGroup() == grp && isContinue; } sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_LFG_PROPOSAL_UPDATE [" UI64FMTD "] state: %u", GetPlayer()->GetGUID(), pProp->state); WorldPacket data(SMSG_LFG_PROPOSAL_UPDATE, 4 + 1 + 4 + 4 + 1 + 1 + pProp->players.size() * (4 + 1 + 1 + 1 + 1 +1)); if (!isContinue) // Only show proposal dungeon if it's continue { LfgDungeonSet playerDungeons = sLFGMgr->GetSelectedDungeons(guid); if (playerDungeons.size() == 1) dungeonId = (*playerDungeons.begin()); } if (LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(dungeonId)) { dungeonId = dungeon->Entry(); // Select a player inside to be get completed encounters from if (grp) { for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) { Player* groupMember = itr->getSource(); if (groupMember && groupMember->GetMapId() == uint32(dungeon->map)) { if (InstanceScript* instance = groupMember->GetInstanceScript()) completedEncounters = instance->GetCompletedEncounterMask(); break; } } } } ObjectGuid playerGUID = guid; ObjectGuid InstanceSaveGUID = MAKE_NEW_GUID(dungeonId, 0, HIGHGUID_INSTANCE_SAVE); data << uint32(0); data << uint32(dungeonId); data << uint32(completedEncounters); data << uint32(0x03); data << uint32(proposalId); data << uint32(getMSTime()); data << uint8(pProp->state); data.WriteBit(playerGUID[4]); data.WriteBit(isSameDungeon); data.WriteBit(playerGUID[2]); data.WriteBit(playerGUID[0]); data.WriteBits(pProp->players.size(), 21); for (itPlayer = pProp->players.begin(); itPlayer != pProp->players.end(); ++itPlayer) { bool inDungeon = false; bool inSameGroup = false; if (itPlayer->second->groupLowGuid) { inDungeon = itPlayer->second->groupLowGuid == dLowGuid; inSameGroup = itPlayer->second->groupLowGuid == pLowGroupGuid; } data.WriteBit(itPlayer->first == guid); // Self player data.WriteBit(itPlayer->second->accept != LFG_ANSWER_PENDING); // Answered data.WriteBit(inDungeon); // In dungeon (silent) data.WriteBit(inSameGroup); // Same Group than player data.WriteBit(itPlayer->second->accept == LFG_ANSWER_AGREE); // Accepted } data.WriteBit(playerGUID[5]); data.WriteBit(InstanceSaveGUID[7]); data.WriteBit(InstanceSaveGUID[4]); data.WriteBit(playerGUID[1]); data.WriteBit(InstanceSaveGUID[6]); data.WriteBit(InstanceSaveGUID[0]); data.WriteBit(InstanceSaveGUID[1]); data.WriteBit(playerGUID[6]); data.WriteBit(playerGUID[3]); data.WriteBit(InstanceSaveGUID[3]); data.WriteBit(InstanceSaveGUID[2]); data.WriteBit(isContinue); data.WriteBit(playerGUID[7]); data.WriteBit(InstanceSaveGUID[5]); data.FlushBits(); data.WriteByteSeq(InstanceSaveGUID[3]); data.WriteByteSeq(InstanceSaveGUID[0]); data.WriteByteSeq(playerGUID[2]); data.WriteByteSeq(playerGUID[3]); data.WriteByteSeq(playerGUID[1]); data.WriteByteSeq(playerGUID[4]); data.WriteByteSeq(InstanceSaveGUID[6]); data.WriteByteSeq(InstanceSaveGUID[4]); data.WriteByteSeq(InstanceSaveGUID[1]); data.WriteByteSeq(InstanceSaveGUID[5]); data.WriteByteSeq(playerGUID[6]); for (itPlayer = pProp->players.begin(); itPlayer != pProp->players.end(); ++itPlayer) data << uint32(itPlayer->second->role); data.WriteByteSeq(InstanceSaveGUID[2]); data.WriteByteSeq(playerGUID[7]); data.WriteByteSeq(playerGUID[0]); data.WriteByteSeq(InstanceSaveGUID[7]); data.WriteByteSeq(playerGUID[5]); SendPacket(&data); }
// is Resource heavy, do not spam or use heavily in loop Unit *PlayerbotClassAI::FindMainTankInRaid(Player *gPlayer) { // check if original main tank is still alive. No point regetting main // tank b/c chances are slim that it will not get reset in the middle of a fight. // But if main tank dies, try to find next best canidate if (mainTank!=NULL && mainTank->isAlive()) { return mainTank; } if (!gPlayer) return NULL; Group *pGroup = gPlayer->GetGroup(); if (!pGroup) return NULL; uint64 pLeaderGuid = pGroup->GetLeaderGUID(); Unit *pPlayer = NULL; // Check if set in raid if (pGroup->isRaidGroup()) { QueryResult result = CharacterDatabase.PQuery("SELECT memberGuid FROM group_member WHERE memberFlags='%u' AND guid = '%u'",MEMBER_FLAG_MAINTANK, pGroup->GetGUID()); if(result) { uint64 pGuid = MAKE_NEW_GUID(result->Fetch()->GetInt32(),0,HIGHGUID_PLAYER); pPlayer = sObjectMgr->GetPlayer(pGuid); if (pPlayer && pGroup->IsMember(pGuid) && pPlayer->isAlive()){ mainTank = pPlayer; return pPlayer; } } } // if could not find tank try assuming // Assume the one with highest health is the main tank uint32 maxhpfound=0; std::list<Unit*> unitList; gPlayer->GetRaidMember(unitList,30); if (!unitList.empty()){ for (std::list<Unit*>::iterator itr = unitList.begin() ; itr!=unitList.end();++itr) { //Player *tPlayer = GetPlayerBot()->GetObjPlayer((*itr)->GetGUID()); Unit *tPlayer = sObjectMgr->GetPlayer((*itr)->GetGUID()); if (tPlayer == NULL) continue; if (tPlayer->isDead()) continue; if (GetPlayerBot()->GetAreaId() != tPlayer->GetAreaId()) continue; //if(tPlayer->GetGUID() == GetPlayerBot()->GetGUID()) continue; if (GetPlayerBot()->GetDistance(tPlayer) > 50) continue; if (tPlayer->GetMaxHealth() > maxhpfound) { maxhpfound = tPlayer->GetMaxHealth(); pPlayer=tPlayer; } // Also check pets if ( (tPlayer->getClass() == (uint8) CLASS_HUNTER || tPlayer->getClass() == (uint8) CLASS_WARLOCK) && IS_PET_GUID(tPlayer->GetPetGUID()) ) { Pet* tpet = ObjectAccessor::GetPet(*tPlayer, tPlayer->GetPetGUID()); if (!tpet || !tpet->IsInWorld() || !tpet->isDead()) continue; if (tpet->GetArmor() > tPlayer->GetArmor()) //Probably a tanking capable pet.. { if (tpet->GetMaxHealth() > maxhpfound) { maxhpfound = tpet->GetMaxHealth(); pPlayer=tpet; } else if (tPlayer->GetGUID() == pPlayer->GetGUID()) {pPlayer = tpet;} //set pet as tank instead of owner } } } } mainTank = pPlayer; return pPlayer; }
void WorldSession::HandleRaidReadyCheckConfirmOpcode(WorldPacket& recvData) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_RAID_READY_CHECK_CONFIRM"); ObjectGuid unknownGuid; Group* group = GetPlayer()->GetGroup(); if (!group) return; recvData.read_skip<uint8>(); bool status = recvData.ReadBit(); unknownGuid[0] = recvData.ReadBit(); unknownGuid[6] = recvData.ReadBit(); unknownGuid[5] = recvData.ReadBit(); unknownGuid[2] = recvData.ReadBit(); unknownGuid[4] = recvData.ReadBit(); unknownGuid[7] = recvData.ReadBit(); unknownGuid[3] = recvData.ReadBit(); unknownGuid[1] = recvData.ReadBit(); recvData.ReadByteSeq(unknownGuid[2]); recvData.ReadByteSeq(unknownGuid[0]); recvData.ReadByteSeq(unknownGuid[7]); recvData.ReadByteSeq(unknownGuid[6]); recvData.ReadByteSeq(unknownGuid[5]); recvData.ReadByteSeq(unknownGuid[3]); recvData.ReadByteSeq(unknownGuid[1]); recvData.ReadByteSeq(unknownGuid[4]); ObjectGuid groupGuid = group->GetGUID(); ObjectGuid playerGuid = GetPlayer()->GetGUID(); WorldPacket data(SMSG_RAID_READY_CHECK_CONFIRM, 1 + 1 + 8 + 1 + 8); data.WriteBit(groupGuid[0]); data.WriteBit(groupGuid[2]); data.WriteBit(status); data.WriteBit(playerGuid[7]); data.WriteBit(playerGuid[6]); data.WriteBit(playerGuid[2]); data.WriteBit(groupGuid[4]); data.WriteBit(groupGuid[3]); data.WriteBit(groupGuid[5]); data.WriteBit(playerGuid[3]); data.WriteBit(groupGuid[7]); data.WriteBit(playerGuid[5]); data.WriteBit(groupGuid[6]); data.WriteBit(groupGuid[1]); data.WriteBit(playerGuid[0]); data.WriteBit(playerGuid[1]); data.WriteBit(playerGuid[4]); data.FlushBits(); data.WriteByteSeq(playerGuid[1]); data.WriteByteSeq(groupGuid[5]); data.WriteByteSeq(playerGuid[2]); data.WriteByteSeq(groupGuid[7]); data.WriteByteSeq(groupGuid[0]); data.WriteByteSeq(playerGuid[4]); data.WriteByteSeq(playerGuid[3]); data.WriteByteSeq(groupGuid[4]); data.WriteByteSeq(playerGuid[7]); data.WriteByteSeq(groupGuid[6]); data.WriteByteSeq(playerGuid[5]); data.WriteByteSeq(groupGuid[2]); data.WriteByteSeq(groupGuid[1]); data.WriteByteSeq(groupGuid[3]); data.WriteByteSeq(playerGuid[0]); data.WriteByteSeq(playerGuid[6]); group->BroadcastPacket(&data, false, -1); }
Unit *PlayerbotClassAI::FindMainAssistInRaid(Player *gPlayer) { if (!gPlayer) return NULL; Group *pGroup = gPlayer->GetGroup(); if (!pGroup) return NULL; uint64 pLeaderGuid = pGroup->GetLeaderGUID(); Unit *pPlayer = NULL; // Check if set in raid if (pGroup->isRaidGroup()) { QueryResult result = CharacterDatabase.PQuery("SELECT memberGuid FROM group_member WHERE memberFlags='%u' AND guid = '%u'",MEMBER_FLAG_MAINASSIST, pGroup->GetGUID()); if(result) { uint64 pGuid = MAKE_NEW_GUID(result->Fetch()->GetInt32(),0,HIGHGUID_PLAYER); pPlayer = sObjectMgr->GetPlayer(pGuid); if (pPlayer && pGroup->IsMember(pGuid) && pPlayer->isAlive()){ return pPlayer; } } } // default to main tank return FindMainTankInRaid(gPlayer); }
void WorldSession::HandleRaidReadyCheckConfirmOpcode(WorldPacket& recvData) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_RAID_READY_CHECK_CONFIRM"); ObjectGuid guid; // currently unused Group* group = GetPlayer()->GetGroup(); if (!group) return; if (!group->ReadyCheckInProgress()) return; recvData.read_skip<uint8>(); guid[2] = recvData.ReadBit(); guid[1] = recvData.ReadBit(); guid[0] = recvData.ReadBit(); guid[3] = recvData.ReadBit(); guid[6] = recvData.ReadBit(); bool status = recvData.ReadBit(); guid[7] = recvData.ReadBit(); guid[4] = recvData.ReadBit(); guid[5] = recvData.ReadBit(); recvData.ReadByteSeq(guid[1]); recvData.ReadByteSeq(guid[0]); recvData.ReadByteSeq(guid[3]); recvData.ReadByteSeq(guid[2]); recvData.ReadByteSeq(guid[4]); recvData.ReadByteSeq(guid[5]); recvData.ReadByteSeq(guid[7]); recvData.ReadByteSeq(guid[6]); ObjectGuid groupGuid = group->GetGUID(); ObjectGuid playerGuid = GetPlayer()->GetGUID(); WorldPacket data(SMSG_RAID_READY_CHECK_CONFIRM, 1 + 1 + 8 + 1 + 8); data.WriteBit(groupGuid[4]); data.WriteBit(playerGuid[5]); data.WriteBit(playerGuid[3]); data.WriteBit(status); data.WriteBit(groupGuid[2]); data.WriteBit(playerGuid[6]); data.WriteBit(groupGuid[3]); data.WriteBit(playerGuid[0]); data.WriteBit(playerGuid[1]); data.WriteBit(groupGuid[1]); data.WriteBit(groupGuid[5]); data.WriteBit(playerGuid[7]); data.WriteBit(playerGuid[4]); data.WriteBit(groupGuid[6]); data.WriteBit(playerGuid[2]); data.WriteBit(groupGuid[0]); data.WriteBit(groupGuid[7]); data.FlushBits(); data.WriteByteSeq(playerGuid[4]); data.WriteByteSeq(playerGuid[2]); data.WriteByteSeq(playerGuid[1]); data.WriteByteSeq(groupGuid[4]); data.WriteByteSeq(groupGuid[2]); data.WriteByteSeq(playerGuid[0]); data.WriteByteSeq(groupGuid[5]); data.WriteByteSeq(groupGuid[3]); data.WriteByteSeq(playerGuid[7]); data.WriteByteSeq(groupGuid[6]); data.WriteByteSeq(groupGuid[1]); data.WriteByteSeq(playerGuid[6]); data.WriteByteSeq(playerGuid[3]); data.WriteByteSeq(playerGuid[5]); data.WriteByteSeq(groupGuid[0]); data.WriteByteSeq(groupGuid[7]); group->BroadcastPacket(&data, false); group->ReadyCheckMemberHasResponded(playerGuid); if (group->ReadyCheckAllResponded()) { Player* leader = ObjectAccessor::FindPlayer(group->GetLeaderGUID()); if (leader) leader->SetReadyCheckTimer(0); group->ReadyCheck(false); group->ReadyCheckResetResponded(); group->SendReadyCheckCompleted(); } }