• Страница 1 из 1
  • 1
Модератор форума: Dimitro  
Удаление спелов после входа в игру.
Portugales
Скаут
На сервере была прописана команда reset all spells, из-за чего каждый персонаж который входит в игру теряет все спелы, включая маунтов и профессии.
Как можно это остановить?
Просто есть еще очень много персонажей которые не заходили в игру, и хотелось бы их сохранить.
Сообщение # 1 отредактировано Portugales - Суббота, 02.06.2018, 23:23
Infernales
Сержант
Если перед этим не было дампа базы данных с персонажами, то уже никак.
Сообщение # 2 написано 03.06.2018 в 00:27
Portugales
Скаут
Цитата Infernales ()
дампа базы данных
Залил дамп таблицы characters, это действительно помогло.
Спасибо.
Сообщение # 3 отредактировано Portugales - Воскресенье, 03.06.2018, 00:49
Ranege
Чемпион
Цитата Infernales ()
Если перед этим не было дампа базы данных с персонажами, то уже никак.

Что за бред?)
Сообщение # 4 написано 03.06.2018 в 11:03
Infernales
Сержант
Цитата Ranege ()
Что за бред?)

На сколько я знаю, то команда ".reset all spells" очищает таблицы с навыками и заклинаниями в базе персонажей, так что восстановить эти данные можно только с бэкапа.
Могу конечно ошибаться, но если я говорю бред, то пожалуйста аргументируй хотя бы это, а не просто пустозвонь.
Сообщение # 5 написано 03.06.2018 в 17:21
p620
Маршал
Цитата Infernales ()
Если перед этим не было дампа базы данных с персонажами, то уже никак.

Цитата Infernales ()
На сколько я знаю, то команда ".reset all spells" очищает таблицы с навыками и заклинаниями в базе персонажей, так что восстановить эти данные можно только с бэкапа.
Могу конечно ошибаться, но если я говорю бред, то пожалуйста аргументируй хотя бы это, а не просто пустозвонь.

Если просите от собеседника аргументировать утверждения, то будьте и сами готовы следовать этому принципу.

"На пальцах": При "разучивании" способностей клиент отображает список потерь. Откуда он его узнает, если данные были очищены без его участия и в его отсутствие?
Из кода:
1) Фрагмент обработчика подкоманды "spells" команды "reset":
Код
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG);
stmt->setUInt16(0, uint16(AT_LOGIN_RESET_SPELLS));
stmt->setUInt64(1, targetGuid.GetCounter());
CharacterDatabase.Execute(stmt);

handler->PSendSysMessage(LANG_RESET_SPELLS_OFFLINE, targetName.c_str());

2) Подготавливаемый запрос:
Код
PrepareStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG, "UPDATE characters SET at_login = at_login | ? WHERE guid = ?", CONNECTION_ASYNC);

3а) Определение перечисления `AtLoginFlags`, откуда можно получить значение члена 'AT_LOGIN_RESET_SPELLS':
Код
enum AtLoginFlags
{
    AT_LOGIN_NONE              = 0x000,
    AT_LOGIN_RENAME            = 0x001,
    AT_LOGIN_RESET_SPELLS      = 0x002,
    AT_LOGIN_RESET_TALENTS     = 0x004,
    AT_LOGIN_CUSTOMIZE         = 0x008,
    AT_LOGIN_RESET_PET_TALENTS = 0x010,
    AT_LOGIN_FIRST             = 0x020,
    AT_LOGIN_CHANGE_FACTION    = 0x040,
    AT_LOGIN_CHANGE_RACE       = 0x080,
    AT_LOGIN_RESURRECT         = 0x100,
};

3б) Фрагмент void WorldSession::HandlePlayerLogin(LoginQueryHolder*):
Код
// Apply at_login requests
    if (pCurrChar->HasAtLoginFlag(AT_LOGIN_RESET_SPELLS))
    {
        pCurrChar->ResetSpells();
        SendNotification(LANG_RESET_SPELLS);
    }

Настоящее пятиминутное расследование позволяет однозначно заключить наличие возможности "спасения" всех необработанных персонажей удалением соответствующего флага из маски, которую содержит их запись в таблице `characters.characters`:
Код
UPDATE `characters` SET `at_login` = 'at_login' & ~2;

(исполнять в базу `characters`)

P.S: Все сниппеты предоставлены из последней на момент составления сообщения ревизии ветки 'master' (Legion 7.3.5) официального репозитория.
Сообщение # 6 отредактировано p620 - Воскресенье, 03.06.2018, 23:57
Infernales
Сержант
p620, а вот этого действительно не знал, что данная фича реализована в виде флага AtLogin. Признаю, что был не прав и спасибо за объяснение.
Сообщение # 7 написано 04.06.2018 в 14:31
Ranege
Чемпион
Я бы, конечно, предоставил аргументы, но, по моему мнению, изначально лучше узнать мнение собеседника, особенно когда оно ошибочное, а лиишь только после этого объяснить. Если же объяснять сразу, то так не интересно smile мнее эффективнее чтоле или получится некий монолог, а так все красиво smile
Сообщение # 8 написано 04.06.2018 в 19:04
  • Страница 1 из 1
  • 1
Поиск: