Дата: Суббота, 01.05.2010, 20:28 | Сообщение # 1
VIP Статус:
Группа: Администратор
Сообщений: 3088
Давно копились мысли на тему того как улучшить данный аспект сервера, и вот сегодня выкроил чутка времени на первую часть. Для начала я попытался объединить две нитки ChannelMgr от разных фракций в одну, и использовать ее для обеих фракций. Это позволит например гейммастерам читать и говорить одновременно в общие каналы обеих фракций. Так же теоретически это должно слегка снизить потребление памяти на густонаселенных серверах(ведь для одной и той же локации не создается две копии дженерал чата). Вот что у меня получилось наклепать на скорую руку(есть во вложении в виде файла):
Code
diff --git a/src/game/Channel.cpp b/src/game/Channel.cpp index e0fca88..cef1551 100644 --- a/src/game/Channel.cpp +++ b/src/game/Channel.cpp @@ -456,7 +456,8 @@ void Channel::List(Player* player) // PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters // MODERATOR, GAME MASTER, ADMINISTRATOR can see all if (plr && (player->GetSession()->GetSecurity() > SEC_PLAYER || plr->GetSession()->GetSecurity() <= gmLevelInWhoList) && - plr->IsVisibleGloballyFor(player)) + plr->IsVisibleGloballyFor(player) && + (player->GetSession()->GetSecurity() > SEC_PLAYER || player->GetTeam() == plr->GetTeam() || sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL))) { data << uint64(i->first); data << uint8(i->second.flags); // flags seems to be changed... @@ -663,26 +664,25 @@ void Channel::SetOwner(uint64 guid, bool exclaim) void Channel::SendToAll(WorldPacket *data, uint64 p) { + Player *player = objmgr.GetPlayer(GUID_LOPART(p)); for(PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) { Player *plr = objmgr.GetPlayer(i->first); - if(plr) - { - if(!p || !plr->GetSocial()->HasIgnore(GUID_LOPART(p))) - plr->GetSession()->SendPacket(data); - } + if(plr && player && (sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL) || player->isGameMaster() || plr->isGameMaster() || player->GetTeam() == plr->GetTeam()) && !plr->GetSocial()->HasIgnore(GUID_LOPART(p))) + plr->GetSession()->SendPacket(data); } } -void Channel::SendToAllButOne(WorldPacket *data, uint64 who) +void Channel::SendToAllButOne(WorldPacket *data, uint64 who, uint64 p) { + Player *player = objmgr.GetPlayer(GUID_LOPART(p)); for(PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) { if(i->first != who) { Player *plr = objmgr.GetPlayer(i->first); - if(plr) - plr->GetSession()->SendPacket(data); + if(plr && player && (sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL) || player->isGameMaster() || plr->isGameMaster() || player->GetTeam() == plr->GetTeam())) + plr->GetSession()->SendPacket(data); } } } diff --git a/src/game/Channel.h b/src/game/Channel.h index 6e2fab2..8444e11 100644 --- a/src/game/Channel.h +++ b/src/game/Channel.h @@ -198,7 +198,7 @@ class Channel void MakeVoiceOff(WorldPacket *data, uint64 guid); //+ 0x23 void SendToAll(WorldPacket *data, uint64 p = 0); - void SendToAllButOne(WorldPacket *data, uint64 who); + void SendToAllButOne(WorldPacket *data, uint64 who, uint64 p = 0); void SendToOne(WorldPacket *data, uint64 who); bool IsOn(uint64 who) const { return players.find(who) != players.end(); } diff --git a/src/game/ChannelHandler.cpp b/src/game/ChannelHandler.cpp index a2d28f2..82cc1cb 100644 --- a/src/game/ChannelHandler.cpp +++ b/src/game/ChannelHandler.cpp @@ -34,7 +34,7 @@ void WorldSession::HandleJoinChannel(WorldPacket& recvPacket) return; recvPacket >> pass; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetJoinChannel(channelname, channel_id)) chn->Join(_player->GetGUID(), pass.c_str()); } @@ -52,7 +52,7 @@ void WorldSession::HandleLeaveChannel(WorldPacket& recvPacket) if(channelname.empty()) return; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) { if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->Leave(_player->GetGUID(), true); @@ -67,7 +67,7 @@ void WorldSession::HandleChannelList(WorldPacket& recvPacket) std::string channelname; recvPacket >> channelname; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->List(_player); } @@ -81,7 +81,7 @@ void WorldSession::HandleChannelPassword(WorldPacket& recvPacket) recvPacket >> pass; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->Password(_player->GetGUID(), pass.c_str()); } @@ -98,7 +98,7 @@ void WorldSession::HandleChannelSetOwner(WorldPacket& recvPacket) if(!normalizePlayerName(newp)) return; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->SetOwner(_player->GetGUID(), newp.c_str()); } @@ -109,7 +109,7 @@ void WorldSession::HandleChannelOwner(WorldPacket& recvPacket) //recvPacket.hexlike(); std::string channelname; recvPacket >> channelname; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->SendWhoOwner(_player->GetGUID()); } @@ -126,7 +126,7 @@ void WorldSession::HandleChannelModerator(WorldPacket& recvPacket) if(!normalizePlayerName(otp)) return; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->SetModerator(_player->GetGUID(), otp.c_str()); } @@ -143,7 +143,7 @@ void WorldSession::HandleChannelUnmoderator(WorldPacket& recvPacket) if(!normalizePlayerName(otp)) return; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->UnsetModerator(_player->GetGUID(), otp.c_str()); } @@ -160,7 +160,7 @@ void WorldSession::HandleChannelMute(WorldPacket& recvPacket) if(!normalizePlayerName(otp)) return; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->SetMute(_player->GetGUID(), otp.c_str()); } @@ -178,7 +178,7 @@ void WorldSession::HandleChannelUnmute(WorldPacket& recvPacket) if(!normalizePlayerName(otp)) return; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->UnsetMute(_player->GetGUID(), otp.c_str()); } @@ -195,7 +195,7 @@ void WorldSession::HandleChannelInvite(WorldPacket& recvPacket) if(!normalizePlayerName(otp)) return; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->Invite(_player->GetGUID(), otp.c_str()); } @@ -211,7 +211,7 @@ void WorldSession::HandleChannelKick(WorldPacket& recvPacket) if(!normalizePlayerName(otp)) return; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->Kick(_player->GetGUID(), otp.c_str()); } @@ -228,7 +228,7 @@ void WorldSession::HandleChannelBan(WorldPacket& recvPacket) if(!normalizePlayerName(otp)) return; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->Ban(_player->GetGUID(), otp.c_str()); } @@ -246,7 +246,7 @@ void WorldSession::HandleChannelUnban(WorldPacket& recvPacket) if(!normalizePlayerName(otp)) return; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->UnBan(_player->GetGUID(), otp.c_str()); } @@ -257,7 +257,7 @@ void WorldSession::HandleChannelAnnouncements(WorldPacket& recvPacket) //recvPacket.hexlike(); std::string channelname; recvPacket >> channelname; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->Announce(_player->GetGUID()); } @@ -268,7 +268,7 @@ void WorldSession::HandleChannelModerate(WorldPacket& recvPacket) //recvPacket.hexlike(); std::string channelname; recvPacket >> channelname; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->Moderate(_player->GetGUID()); } @@ -279,7 +279,7 @@ void WorldSession::HandleChannelDisplayListQuery(WorldPacket &recvPacket) //recvPacket.hexlike(); std::string channelname; recvPacket >> channelname; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->List(_player); } @@ -290,7 +290,7 @@ void WorldSession::HandleGetChannelMemberCount(WorldPacket &recvPacket) //recvPacket.hexlike(); std::string channelname; recvPacket >> channelname; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) { if(Channel *chn = cMgr->GetChannel(channelname, _player)) { @@ -309,7 +309,7 @@ void WorldSession::HandleSetChannelWatch(WorldPacket &recvPacket) //recvPacket.hexlike(); std::string channelname; recvPacket >> channelname; - /*if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + /*if(ChannelMgr* cMgr = channelMgr()) if(Channel *chn = cMgr->GetChannel(channelname, _player)) chn->JoinNotify(_player->GetGUID());*/ } diff --git a/src/game/ChannelMgr.cpp b/src/game/ChannelMgr.cpp index e3b54d3..7aaddd5 100644 --- a/src/game/ChannelMgr.cpp +++ b/src/game/ChannelMgr.cpp @@ -20,20 +20,11 @@ #include "Policies/SingletonImp.h" #include "World.h" -INSTANTIATE_SINGLETON_1( AllianceChannelMgr ); -INSTANTIATE_SINGLETON_1( HordeChannelMgr ); +INSTANTIATE_SINGLETON_1( CommonChannelMgr ); -ChannelMgr* channelMgr(uint32 team) +ChannelMgr* channelMgr() { - if (sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL)) - return &MaNGOS::Singleton<AllianceChannelMgr>::Instance(); // cross-faction - - if(team == ALLIANCE) - return &MaNGOS::Singleton<AllianceChannelMgr>::Instance(); - if(team == HORDE) - return &MaNGOS::Singleton<HordeChannelMgr>::Instance(); - - return NULL; + return &MaNGOS::Singleton<CommonChannelMgr>::Instance(); } ChannelMgr::~ChannelMgr() @@ -61,13 +52,6 @@ Channel *ChannelMgr::GetChannel(std::string name, Player *p, bool pkt) if(i == channels.end()) { - if(pkt) - { - WorldPacket data; - MakeNotOnPacket(&data,name); - p->GetSession()->SendPacket(&data); - } - return NULL; } else @@ -89,9 +73,3 @@ void ChannelMgr::LeftChannel(std::string name) delete channel; } } - -void ChannelMgr::MakeNotOnPacket(WorldPacket *data, std::string name) -{ - data->Initialize(SMSG_CHANNEL_NOTIFY, (1+10)); // we guess size - (*data) << (uint8)0x05 << name; -} diff --git a/src/game/ChannelMgr.h b/src/game/ChannelMgr.h index 27c3dca..da70ad8 100644 --- a/src/game/ChannelMgr.h +++ b/src/game/ChannelMgr.h @@ -40,9 +40,8 @@ class ChannelMgr void MakeNotOnPacket(WorldPacket *data, std::string name); }; -class AllianceChannelMgr : public ChannelMgr {}; -class HordeChannelMgr : public ChannelMgr {}; +class CommonChannelMgr : public ChannelMgr {}; -ChannelMgr* channelMgr(uint32 team); +ChannelMgr* channelMgr(); #endif diff --git a/src/game/ChatHandler.cpp b/src/game/ChatHandler.cpp index edd647e..2b285f5 100644 --- a/src/game/ChatHandler.cpp +++ b/src/game/ChatHandler.cpp @@ -441,7 +441,7 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data ) if(msg.empty()) break; - if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(ChannelMgr* cMgr = channelMgr()) { if(Channel *chn = cMgr->GetChannel(channel,_player)) chn->Say(_player->GetGUID(),msg.c_str(),lang); diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 63f6a34..c0b5910 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -4554,7 +4554,7 @@ void Player::CleanupChannels() Channel* ch = *m_channels.begin(); m_channels.erase(m_channels.begin()); // remove from player's channel list ch->Leave(GetGUID(), false); // not send to client, not remove from player's channel list - if (ChannelMgr* cMgr = channelMgr(GetTeam())) + if (ChannelMgr* cMgr = channelMgr()) cMgr->LeftChannel(ch->GetName()); // deleted channel if empty } @@ -4570,7 +4570,7 @@ void Player::UpdateLocalChannels(uint32 newZone ) if(!current_zone) return; - ChannelMgr* cMgr = channelMgr(GetTeam()); + ChannelMgr* cMgr = channelMgr(); if(!cMgr) return;
Прошу потестить, и отписаться о результатах, а я пока пострадаю быдлокодерством в сторону решения следующих проблем: 1. отдельные базовые каналы(т.е. те, которые есть в ChatChannels.DBC) для клиентов с разными локалями 2. некорректная отработка флагов базовых каналов(поможет реализовать близзлайк трейд, скорректирует работу остальных каналов)