void Channel::List(PlayerPointer player) { ObjectGuid p = player->GetObjectGuid(); MasterPlayer* masterPlayer = player->ToMasterPlayer(); Player* asPlayer = player->ToPlayer(); if (!IsOn(p)) { WorldPacket data; MakeNotMember(&data); SendToOne(&data, p); } else { WorldPacket data(SMSG_CHANNEL_LIST, 1 + (GetName().size() + 1) + 1 + 4 + m_players.size() * (8 + 1)); data << uint8(1); // channel type? data << GetName(); // channel name data << uint8(GetFlags()); // channel flags? size_t pos = data.wpos(); data << uint32(0); // size of list, placeholder AccountTypes gmLevelInWhoList = (AccountTypes)sWorld.getConfig(CONFIG_UINT32_GM_LEVEL_IN_WHO_LIST); uint32 count = 0; for (PlayerList::const_iterator i = m_players.begin(); i != m_players.end(); ++i) { if (masterPlayer) { MasterPlayer* plr = sObjectAccessor.FindMasterPlayer(i->first); // PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters // MODERATOR, GAME MASTER, ADMINISTRATOR can see all if (plr && (masterPlayer->GetSession()->GetSecurity() > SEC_PLAYER || plr->GetSession()->GetSecurity() <= gmLevelInWhoList) && plr->IsVisibleGloballyFor(masterPlayer)) { data << ObjectGuid(i->first); data << uint8(i->second.flags); // flags seems to be changed... ++count; } } else { Player *plr = sObjectMgr.GetPlayer(i->first); // PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters // MODERATOR, GAME MASTER, ADMINISTRATOR can see all if (plr && (asPlayer->GetSession()->GetSecurity() > SEC_PLAYER || plr->GetSession()->GetSecurity() <= gmLevelInWhoList) && plr->IsVisibleGloballyFor(asPlayer)) { data << ObjectGuid(i->first); data << uint8(i->second.flags); // flags seems to be changed... ++count; } } } data.put<uint32>(pos, count); SendToOne(&data, p); } }