Вход для пользователей

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
MaNGOS Chat system
Дата: Суббота, 01.05.2010, 20:28 | Сообщение # 1
Аватар

VIP Статус:
Группа: Администратор
Сообщений: 3088
Награды: 48
Репутация: 215  
 
Давно копились мысли на тему того как улучшить данный аспект сервера, и вот сегодня выкроил чутка времени на первую часть.
Для начала я попытался объединить две нитки 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. некорректная отработка флагов базовых каналов(поможет реализовать близзлайк трейд, скорректирует работу остальных каналов)

 
  • Страница 1 из 1
  • 1
Поиск:
Статистика Форума

  • [05:43 Готовый сервер 4.0.6 ... 11.12.2023]

  • [23:30 Arcanum Core (3.3.5а)... 16.11.2023]

  • [12:37 delete 02.03.2020]

  • [12:37 Ищу пост ГМ-а 02.03.2020]

  • [12:37 RastaWoW 3.3.5a (Набо... 02.03.2020]

  • [12:37 Набор команды 02.03.2020]

  • [00:34 AMD FUN SERVER - Worl... 03.07.2019]

  • [00:34 Продам private сборку... 03.07.2019]

  • [00:34 НПС для покупки опыта... 03.07.2019]

  • [00:34 WoW-TRONE 03.07.2019]

  • [12:21 Набор спидхаков (spee... 12.10.2018]

  • [21:00 [Продам] Фуловые чары... 13.03.2015]

  • [18:47 Продам приват сборку ... 04.03.2015]

  • [20:54 ВСЕ приват сборки от ... 01.03.2015]

  • [20:52 QuantumCore Server 3.... 04.02.2015]

  • [21:07 GAMESV STUDIO | ... 02.01.2015]

  • [16:36 Готовый сервер wow 4.... 04.10.2014]

  • [16:51 Скупаю чаров! 30.08.2014]

  • [19:18 Готовый сервер 4.0.6 17.08.2013]

  • [18:47 [HELP]Квесты 16.08.2013]


  • Карта Сайта ||||| Карта Форума|||