• Страница 1 из 1
  • 1
Модератор форума: Dimitro  
Дублирование лога Гильдбанка
Stormtrooper
Командир
Привет всем
Обнаружилась проблема:

Заходим в ГБ -> Кладём предмет или голду -> видим лог что предмет или голда положена в ГБ -> OK

Рестартуем сервер

Заходим в ГБ -> Видим 2 одинаковых строки лога вместо одной

В базе строка одна а в игре отображается 2 одинаковых

Эксперементально выяснилось что проблема в void Guild::DisplayGuildBankLogs(WorldSession* session, uint8 TabId)

а точнее:

for (GuildBankEventLog::const_iterator itr = m_GuildBankEventLog_Item[TabId].begin(); itr != m_GuildBankEventLog_Item[TabId].end(); ++itr)
{
            sLog.outError("Load Log 1"); <-------------------- эту строку я внёс дабы увидеть где происходит дублирование
            data << uint8(itr->LogEntry);
            data << uint64(MAKE_NEW_GUID(itr->PlayerGuid, 0, HIGHGUID_PLAYER));
            data << uint32(itr->ItemOrMoney);
            data << uint8(itr->ItemStackCount);
            if (itr->LogEntry == GUILD_BANK_LOG_MOVE_ITEM || itr->LogEntry == GUILD_BANK_LOG_MOVE_ITEM2)
                data << uint8(itr->DestTabId);              // moved tab
            data << uint32(time(NULL) - itr->TimeStamp);
}

Помогите кто-нибудь пожалуйста
Я не могу понять где ошибка
Если помог, ставь плюсик в репу :)

Сообщение # 1 написано 30.05.2017 в 11:17
Ranege
Чемпион
Без дебага так просто не скажу, но как поступить если только..

У тебя  sLog.outError("Load Log 1"); <-------------------- эту строку я внёс дабы увидеть где происходит дублирование

Это крутится и выводит в консоль два раза?(имею в виду если банк чистый был, ты положил туда итем, сделал рестарт и вот потом два раза выведет?)

Если в описанном мною случае выводит два раза, то  логично, стоит обратить внимание на эту строку, ведь в ней идёт загрузка данных в контейнер

Допустим после этой строки, т.е после цикла загрузки добавь свой 

Код
for (GuildBankEventLog::const_iterator itr = m_GuildBankEventLog_Item[TabId].begin(); itr != m_GuildBankEventLog_Item[TabId].end(); ++itr)
       {
sLog.OutError("vivod....");
// vivod 
}


Если у тебя выведет и тут два раза одно и тоже, то обрати внимание на процесс загрузки, что он загружает, сделай тоже выводи свои sLog и будет уже более наглядней
Сообщение # 2 написано 30.05.2017 в 11:35
Stormtrooper
Командир
Так не получится после строки которую ты указал добавить for (GuildBankEventLog::const_iterator itr = m_GuildBankEventLog_Item[TabId].begin(); itr != m_GuildBankEventLog_Item[TabId].end(); ++itr) не получится
Там TabId не определён

Добавлено (30.05.2017, 11:57)
---------------------------------------------
Попробовал сделать так:

if (NewEvent.isMoneyEvent())
m_GuildBankEventLog_Money.push_front(NewEvent);
else
{
sLog.outError("vivod....");
m_GuildBankEventLog_Item[TabId].push_front(NewEvent);
}

}
while (result->NextRow());

Оно туда вообще не попадает при открытии лога ГБ
Видимо эта часть отрабатывает только когда вещь непосредственно кладётся в банк а не когда открывается лог после рестарта

Добавлено (30.05.2017, 12:03)
---------------------------------------------
я провёл эксперимент

положил в ГБ 1 предмет
ядро сделало 2 прохода по циклу после рестарта и открытия лога ГБ

положил в бг 2 предмета
ядро сделало 4 прохода по циклу после рестарта и открытия лога ГБ

положил в бг 3 предмета
ядро сделало 6 проходов по циклу после рестарта и открытия лога ГБ

Если помог, ставь плюсик в репу :)

Сообщение # 3 написано 30.05.2017 в 12:03
Incorrect
Капрал
Skype Infernallz
Сообщение # 4 написано 30.05.2017 в 17:01
Ranege
Чемпион
Цитата Stormtrooper ()
Там TabId не определён

А что мешает его собственно объявить?

Цитата Stormtrooper ()
Оно туда вообще не попадает при открытии лога ГБ

Если у тебя в бд нет ничего, то конечно не попадет, а если есть, то как же оно может не попасть, откуда в контейнере тогда данные есть, если после рестарта ничего не ложить(а положить до рестарта), в логе же что-то будет? Если будет, значит в контейнер попали данные, а значит они в том методе загружаются.(если по каким-то причинам они  у тебя там не загружаются, значит загружаются в другом месте, по контейнеру ищи место загрузки, хотя это именно то место и есть.

Цитата Stormtrooper ()
я провёл эксперимент

Ну понятно, что при каждом перемещении предмета создаются 2 лога, собственно обрати внимание на этот метод, именно здесь, как я понимаю, и идёт логирование( смотрю бегло, поэтому сильно не вникал что там и как).

По типа таких штук в методе:

Код
pGuild->LogBankEvent(GUILD_BANK_LOG_MOVE_ITEM, BankTab,    pl->GetGUIDLow(), pItemSrc->GetEntry(), pItemSrc->GetCount(), BankTabDst);
               pGuild->LogBankEvent(GUILD_BANK_LOG_MOVE_ITEM, BankTabDst, pl->GetGUIDLow(), pItemDst->GetEntry(), pItemDst->GetCount(), BankTab);

Ну и на всё другое. Отслеживай изменение m_GuildBankEventLog_Item при помощи sLog  и найдешь место, где идёт дублирование
Сообщение # 5 написано 31.05.2017 в 01:53
Stormtrooper
Командир
где идёт дублирование я уже показал
я нашёл где ошибка и она ну вообще не там где вы показываете
тему можно закрыть
спасибо за попытку помочь
Если помог, ставь плюсик в репу :)

Сообщение # 6 написано 31.05.2017 в 16:05
Ranege
Чемпион
Для начала было бы не плохо ответить на мои вопросы) 

Вполне вероятно что не то место, но явно это связано с указанным мною контейнером и я также указал на функцию, где идёт логирование предмета, возможно не в самой, а в её вызываемых методах, но не суть, суть была в методе поиска и в исправлении. Без дебага однозначно лично я определить не могу на средний взгляд, а так не за что
Сообщение # 7 написано 31.05.2017 в 21:57
  • Страница 1 из 1
  • 1
Поиск: