bool LFGPlayerState::IsSingleRole() { if ( LFGRoleMask(rolesMask & ~LFG_ROLE_MASK_TANK & ~LFG_ROLE_MASK_LEADER) == LFG_ROLE_MASK_NONE || LFGRoleMask(rolesMask & ~LFG_ROLE_MASK_HEALER & ~LFG_ROLE_MASK_LEADER) == LFG_ROLE_MASK_NONE || LFGRoleMask(rolesMask & ~LFG_ROLE_MASK_TANK & ~LFG_ROLE_MASK_LEADER) == LFG_ROLE_MASK_NONE) return true; return false; }
LFGRoleMask LFGPlayerState::GetRoles() { if (Group* group = m_player->GetGroup()) { if (group->GetLeaderGuid() == m_player->GetObjectGuid()) rolesMask = LFGRoleMask(rolesMask | LFG_ROLE_MASK_LEADER); else rolesMask = LFGRoleMask(rolesMask & ~LFG_ROLE_MASK_LEADER); } else rolesMask = LFGRoleMask(rolesMask & ~LFG_ROLE_MASK_LEADER); return rolesMask; };
void LFGPlayerState::SetRoles(uint8 roles) { rolesMask = LFGRoleMask(roles); if (Group* group = m_player->GetGroup()) { if (group->GetLeaderGuid() == m_player->GetObjectGuid()) rolesMask = LFGRoleMask(rolesMask | LFG_ROLE_MASK_LEADER); else rolesMask = LFGRoleMask(rolesMask & ~LFG_ROLE_MASK_LEADER); } else rolesMask = LFGRoleMask(rolesMask & ~LFG_ROLE_MASK_LEADER); rolesMask != LFG_ROLE_MASK_NONE ? AddFlags(LFG_MEMBER_FLAG_ROLES) : RemoveFlags(LFG_MEMBER_FLAG_ROLES); };
void WorldSession::HandleLfgJoinOpcode(WorldPacket& recv_data) { if (!GetPlayer()) return; if (!sWorld.getConfig(CONFIG_BOOL_LFG_ENABLE) && !sWorld.getConfig(CONFIG_BOOL_LFR_ENABLE)) { recv_data.rfinish(); // prevent additional spam at rejected packet DEBUG_LOG("CMSG_LFG_JOIN %u failed - Dungeon finder disabled", GetPlayer()->GetObjectGuid().GetCounter()); return; } else DEBUG_LOG("CMSG_LFG_JOIN %u processing...", GetPlayer()->GetObjectGuid().GetCounter()); uint8 numDungeons; uint32 dungeonID; uint32 roles; std::string comment; LFGDungeonSet newDungeons; newDungeons.clear(); recv_data >> roles; // lfg roles recv_data >> Unused<uint8>(); // unk1 (unused?) recv_data >> Unused<uint8>(); // unk2 (unused?) recv_data >> numDungeons; if (!numDungeons) { DEBUG_LOG("CMSG_LFG_JOIN %u no dungeons selected", GetPlayer()->GetObjectGuid().GetCounter()); recv_data.rfinish(); // prevent additional spam at rejected packet return; } for (int8 i = 0 ; i < numDungeons; ++i) { recv_data >> dungeonID; LFGDungeonEntry const* dungeon = sLFGMgr.GetDungeon(dungeonID & 0x00FFFFFF); // remove the type from the dungeon entry if (dungeon) newDungeons.insert(dungeon); } uint8 counter2; // unk - always 3 recv_data >> counter2; for (uint8 i = 0; i < counter2; i++) recv_data >> Unused<uint8>(); // unk (unused?) recv_data >> comment; // lfg comment sLFGMgr.GetLFGPlayerState(GetPlayer()->GetObjectGuid())->SetDungeons(newDungeons); if (GetPlayer()->GetGroup()) if (GetPlayer()->GetObjectGuid() == GetPlayer()->GetGroup()->GetLeaderGuid()) sLFGMgr.GetLFGGroupState(GetPlayer()->GetGroup()->GetObjectGuid())->SetDungeons(newDungeons); sLFGMgr.GetLFGPlayerState(GetPlayer()->GetObjectGuid())->SetRoles(LFGRoleMask(roles)); sLFGMgr.GetLFGPlayerState(GetPlayer()->GetObjectGuid())->SetComment(comment); DEBUG_LOG("CMSG_LFG_JOIN %u as group: %u Dungeons: %u", GetPlayer()->GetObjectGuid().GetCounter(), GetPlayer()->GetGroup() ? 1 : 0, uint8(newDungeons.size())); sLFGMgr.Join(GetPlayer()); }
void WorldSession::HandleLfgSetRolesOpcode(WorldPacket &recv_data) { uint8 roles; recv_data >> roles; Group* group = GetPlayer()->GetGroup(); if (group) { bool isChanged = sLFGMgr.RoleChanged(GetPlayer(), LFGRoleMask(roles)); DEBUG_LOG("CMSG_LFG_SET_ROLES: Group %u, Player %u, Roles: %u %s", group->GetObjectGuid().GetCounter(), GetPlayer()->GetObjectGuid().GetCounter(), roles, isChanged ? "changed" : "not changed"); sLFGMgr.UpdateRoleCheck(group); } else { sLFGMgr.GetLFGPlayerState(GetPlayer()->GetObjectGuid())->SetRoles(LFGRoleMask(roles)); DEBUG_LOG("CMSG_LFG_SET_ROLES (not in group) Player %u roles %u", GetPlayer()->GetObjectGuid().GetCounter(), roles); } }
void LFGPlayerState::SetRoles(uint8 roles) { rolesMask = LFGRoleMask(roles); if (rolesMask != LFG_ROLE_MASK_NONE) m_flags |= LFG_MEMBER_FLAG_ROLES; else m_flags &= ~LFG_MEMBER_FLAG_ROLES; };