• Страница 1 из 1
  • 1
Модератор форума: Dimitro  
Краш
dimakpro
Центурион
Суть самого краша в том что когда  входят 2 игрока одновременно,то как видно на скрине ниже процесс останавливается,но когда я  заходил поочередно сначала первый учетной записи, а потом  со второй,краша нету,так само и если  захожу с одной учетной записи,то краша нету  . 


Код
void AnnounceLoggingToWorld(Player* player, uint8 type)
{
   std::string pName = player->GetName();
   uint32 acct_id = player->GetSession()->GetAccountId();
   uint8 PlayerLogInVip = VIP::GetPlayerVIP(acct_id);

   SessionMap sessions = sWorld->GetAllSessions(); // GetPlayersInWorld

   for (SessionMap::iterator itr = sessions.begin(); itr != sessions.end(); ++itr)
   {
      if (!itr->second)
         continue;

      uint8 ItrVip = VIP::GetPlayerVIP(itr->second->GetAccountId());

      if (PlayerLogInVip <= ItrVip) // if target is same as or higher. won't announce to lower vip's.
      {
         std::string msg = "[" + green + "VIP" + ConvertNumberToString(PlayerLogInVip) + "|r]:";
         msg = msg + pName + green + " вошел в систему";

         if (type == 0) { msg = msg + " вышел.|r"; };
         if (type == 1) { msg = msg + " вошел.|r"; };

         ChatHandler(itr->second->GetPlayer()->GetSession()).PSendSysMessage(msg.c_str());
      }
   }
};


Продажа сервера wow blood-fire (WoW 3.3.5a + Lua engine) 6500 руб
---->https://vk.com/jimteck<----
Сообщение # 1 отредактировано dimakpro - Суббота, 21.05.2016, 15:09
Pallam
Рыцарь
Что значит "одновременно"?
На один аккаунт?
На одного персонажа?
В одно и то же время? (По сути, невозможно, параллельные процессы же...)

А на скринах много истерики именно от элуны. Обратил бы внимание сначала на все ошибки связанные с ней.
Сообщение # 2 написано 21.05.2016 в 23:37
Ranege
Чемпион
На первый взгляд ничего не скажешь. Я бы посоветовал сделать вывод каких-нибудь числе перед каждым действием, крашится тот, вывод которого после не произошел, конечно лучше линя и gdb.

Ты юзаешь статик метод, а что в нём - догадайся сам, возможно, там что-то интересное есть.

Ещё по коду интересно, зачем ты ставишь ; после фигурных скобок?

Интересная ситуация возникает:
msg = msg + pName + green + " вошел в систему";
if (type == 0) { msg = msg + " вышел.|r"; };

Если type будет равен нулю или единице, то сообщение будет вида: VIP ИГРОК вошел в систему вошел/вышел, для чего такое делать?

if (type == 0) { msg = msg + " вышел.|r"; };
if (type == 1) { msg = msg + " вошел.|r"; }; // вот этот бред можно записать более лучше

if(type)
msg += " вошел.|r";
else
msg += " вышел.|r";

А если ещё красивее, то вот так

Код
msg += type ?  " вошел.|r" : " вышел.|r";

Уж куда более лучше смотрится, не правда ли?
Сообщение # 3 отредактировано Ranege - Воскресенье, 22.05.2016, 01:35
dimakpro
Центурион
Pallam,eluna тут не причем, это с++ ,eluna я поправлю  попожже,когда  разберусь  с  этой ошибкой)

Добавлено (22.05.2016, 08:49)
---------------------------------------------
Ranege, спасибо,учту. +1)

Продажа сервера wow blood-fire (WoW 3.3.5a + Lua engine) 6500 руб
---->https://vk.com/jimteck<----
Сообщение # 4 написано 22.05.2016 в 08:49
Pallam
Рыцарь
Цитата dimakpro ()
Pallam,eluna тут не причем, это с++ ,eluna я поправлю попожже,когда разберусь с этой ошибкой)

На вашем скрине нет ничего связанного с этим кодом.
и вы не ответили на мои вопросы
Сообщение # 5 написано 23.05.2016 в 20:00
dimakpro
Центурион
Pallam, ChatHandler(itr->second->GetPlayer()->GetSession()).PSendSysMessage(msg.c_str()); проблема в нем была)
Продажа сервера wow blood-fire (WoW 3.3.5a + Lua engine) 6500 руб
---->https://vk.com/jimteck<----
Сообщение # 6 написано 27.05.2016 в 19:47
Incorrect
Капрал
Скорее всего нужен мьютекс. Идет обращение к m_sessions с разных потоков

itr->second->GetPlayer()->GetSession() - это вообще лютый вин, зачем так извращаться когда у тебя itr->second это и есть сессия
Сообщение # 7 отредактировано Incorrect - Воскресенье, 29.05.2016, 17:18
  • Страница 1 из 1
  • 1
Поиск: