Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Принятые патчи (http://mangos.ytdb.ru/forumdisplay.php?f=5)
-   -   [9686][patch] Weekly quests (http://mangos.ytdb.ru/showthread.php?t=116)

GriffonHeart 08.03.2010 07:30

[9686][patch] Weekly quests
 
Искал реализацию викликов на getmangos.com, но не нашёл. Если подобный патч уже есть, дайте ссылку.
----------------------------------------------------
Данный же патч реализует работу еженедельных квестов по очень простому принципу. Виклики - теже дейлики, только с недельным КД. Добавляем в базу колонку с типом дэйликов (1 - дэйли, 2 - викли) и сбрасываем виклики не каждый день, а раз в неделю вместе с начислением Арена-поинтов.

ADDED 20.03.2010
Патч переделан:
1) Список квестов хранится в std:set
2) Таймер сброса в save_variable
3) Отдельная таблица для хранения викликов

ADDED 22.03.2010
Оптимизация работы с std:set (special thx to zhenya)
DOWNLOAD NOW!

Fedia22 08.03.2010 12:48

на официалке если не изменяет память, виклик обновляется во вторник, а арена-поинты начисляются по средам =)

Vladimir 08.03.2010 13:44

Цитата:

+ if(uint32 id = GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_d aily_idx))
?

Насколько я знаю weekly квесты не имеют лимита по количеству и не помещаются в список daily квестов.... млм я не прав?

GriffonHeart 08.03.2010 13:51

Надо поинтересоваться у людей на оффе, меня тоже смутило это, но это был самый быстрый способ реализации :)

Цитата:

Сообщение от Fedia22 (Сообщение 582)
на официалке если не изменяет память, виклик обновляется во вторник, а арена-поинты начисляются по средам =)

Вообще моё предложение - избавиться от time в character_queststatus_daily, а в saved_variables добавить две колонки с датой обновления дэйликов и датой обновления викликов.

Vladimir 08.03.2010 14:10

Возможно, всеравно это время при сохранении одинаковое.

Fedia22 08.03.2010 14:18

Цитата:

Сообщение от GriffonHeart (Сообщение 602)
Надо поинтересоваться у людей на оффе, меня тоже смутило это, но это был самый быстрый способ реализации :)

что именно?
Цитата:

Сообщение от Vladimir (Сообщение 596)
?

Насколько я знаю weekly квесты не имеют лимита по количеству и не помещаются в список daily квестов.... млм я не прав?

не понял эту фразу, в МаНГОСе или на оффе? =)

Vladimir 08.03.2010 14:24

В поле даты для дайли-квестов зановится одно и тоже время на момент сохранений - время выполения последнего дейли-квеста.

GriffonHeart 08.03.2010 14:27

Цитата:

Сообщение от Fedia22 (Сообщение 613)
что именно?

Связаны ли виклики и дэйлики. Если допустим у тебя макс. 25 дэйликов в день, то исходя из моего патча получится, что выполнив виклик, всю неделю у тебя будет 24 дэйлика в день, пока не сбросятся виклики. Не знаю, правильно ли это...

Fedia22 08.03.2010 14:29

:) не влияет

но точно не помню

Vladimir 08.03.2010 14:32

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

Fedia22 08.03.2010 14:36

уточнил у оффициальщиков :) виклик идёт как квестом, и ни на что не влияет :)

Mr.Grom 08.03.2010 14:58

Цитата:

Сообщение от Vladimir (Сообщение 617)
В поле даты для дайли-квестов зановится одно и тоже время на момент сохранений - время выполения последнего дейли-квеста.

А если поменять на время и дату когда квест станет доступен снова, то можно все упростить? Неделю, месяц.

timmit 08.03.2010 15:09

Викли да, во вторник в 8 утра постоянно, не зависимо, когда ты его сделал.

GriffonHeart 08.03.2010 17:26

Цитата:

Сообщение от Vladimir (Сообщение 624)
Там кстати один месячный есть - когда сбрасывается не знаю...

А в QuestDef.h для него есть описаннный флаг?

Vladimir 08.03.2010 23:57

http://www.wowwiki.com/Monthly_quest я тут только читал

GriffonHeart 09.03.2010 12:19

Цитата:

Сообщение от Vladimir (Сообщение 747)
http://www.wowwiki.com/Monthly_quest я тут только читал

http://ru.wowhead.com/?quest=9886 имеет флаг: QUEST_FLAGS_TBC | QUEST_FLAGS_SHARABLE. Может быть месячные квесты были убраны близардами?

Vladimir 14.03.2010 00:21

может быть или он спец. образом сбрасывается.

Fedia22 15.03.2010 07:05

Цитата:

Сообщение от GriffonHeart (Сообщение 847)
http://ru.wowhead.com/?quest=9886 имеет флаг: QUEST_FLAGS_TBC | QUEST_FLAGS_SHARABLE. Может быть месячные квесты были убраны близардами?

Этот квест если я не ошибаюсь висит с вопросительным синим знаком :) там какие то кристаллы нада принести!
PS убежал проверять)

add: квест по принципу пришёл и сдал, ничего сдавать не нужно... возможно действительно еженедельный или ежемесячный! послежу за ним

Vladimir 15.03.2010 12:57

Для ясности текущего стояния:
Патч не может быть принят в предложенном виде так как использует поля daily квестов для хранения weekly-квестов что неверно...

GriffonHeart 15.03.2010 17:36

Цитата:

Сообщение от Vladimir (Сообщение 2115)
Для ясности текущего стояния:
Патч не может быть принят в предложенном виде так как использует поля daily квестов для хранения weekly-квестов что неверно...

Я уже занялся переписыванием патча.
Список квестов планирую хранить в std:set
Таймер сброса добавить в save_variable
Виклики хранить в другой таблице, а не вместе с дайликами.

TOM_RUS 15.03.2010 18:57

Цитата:

Сообщение от GriffonHeart (Сообщение 2146)
Виклики хранить в другой таблице, а не вместе с дайликами.

А зачем еще одна таблица? Что мешает все хранить в одной, и потом разбирать что за квест по его типу?

GriffonHeart 20.03.2010 08:55

ADDED 20.03.2010
Патч переделан:
1) Список квестов хранится в std:set
2) Таймер сброса в save_variable
3) Отдельная таблица для хранения викликов
DOWNLOAD NOW!

zhenya 20.03.2010 11:41

Цитата:

Сообщение от GriffonHeart (Сообщение 2701)
ADDED 20.03.2010
Патч переделан:
1) Список квестов хранится в std:set
2) Таймер сброса в save_variable
3) Отдельная таблица для хранения викликов
DOWNLOAD NOW!

отписал в аське :) все же лучше :)
Код:

bool Player::SatisfyQuestWeek( Quest const* qInfo, bool msg )
{
    if(!qInfo->IsWeekly() || m_weeklyquests.empty())
        return true;

    std::set<uint32>::iterator iter = m_weeklyquests.find(qInfo->GetQuestId());
    if (iter != m_weeklyquests.end())
        return false;

    return true;
}

и
Код:

void Player::_LoadWeeklyQuestStatus(QueryResult *result)
{
    //QueryResult *result = CharacterDatabase.PQuery("SELECT quest FROM character_queststatus_weekly WHERE guid = '%u'", GetGUIDLow());

    if(result)
....

опять же
Код:

void Player::ResetWeeklyQuestStatus()
{
    if (m_weeklyquests.empty())
        return;

    m_weeklyquests.clear();
    // DB data deleted in caller
    m_WeeklyQuestChanged = false;
}

ну и
Код:

void Player::_SaveWeeklyQuestStatus()
{
    if(!m_WeeklyQuestChanged || m_weeklyquests.empty())
        return;

    // we don't need transactions here.
    CharacterDatabase.PExecute("DELETE FROM character_queststatus_weekly WHERE guid = '%u'",GetGUIDLow());

    std::set<uint32>::iterator iter = m_weeklyquests.begin();
    for (; iter != m_weeklyquests.end(); ++iter)
    {
        uint32 quest_id  = *iter;

        if(Quest const* pQuest = sObjectMgr.GetQuestTemplate(quest_id))
            CharacterDatabase.PExecute("INSERT INTO character_queststatus_weekly (guid,quest) VALUES ('%u', '%u')", GetGUIDLow(), quest_id);
    }
    m_WeeklyQuestChanged = false;
}


GriffonHeart 21.03.2010 19:24

ADDED 22.03.2010
Оптимизация работы с std:set (special thx to zhenya)
DOWNLOAD NOW!

zhenya 22.03.2010 08:00

Цитата:

Сообщение от GriffonHeart (Сообщение 2825)
ADDED 22.03.2010
Оптимизация работы с std:set (special thx to zhenya)
DOWNLOAD NOW!

Код:

+void Player::_LoadWeeklyQuestStatus(QueryResult *result)
+{
+    m_weeklyquests.clear(); // зачем?) помоему оно и так чистое :)
...


GriffonHeart 22.03.2010 10:05

На всякий случай :)

rodionov12 31.03.2010 08:36

с сегодняшнего дня недельники обновляются не во вторник а в среду.

взял с http://forums.wow-europe.com/thread....022978&sid=5#1

LordJZ 31.03.2010 08:45

Цитата:

Сообщение от rodionov12 (Сообщение 3493)
с сегодняшнего дня недельники обновляются не во вторник а в среду.

взял с http://forums.wow-europe.com/thread....022978&sid=5#1

Это с патчем 3.3.3, а не "с сегодняшнего дня".

GriffonHeart 05.04.2010 04:53

В таблице save_variables с этим патчем вы можете установить хоть вторник, хоть среду, хоть любой другой день.

Vladimir 07.04.2010 03:18

О! Давно не заглядавал в ветку, а зря... :)

Цитата:

Сообщение от TOM_RUS (Сообщение 2153)
А зачем еще одна таблица? Что мешает все хранить в одной, и потом разбирать что за квест по его типу?

Сохранять данные проблематичнее, так как это 2 струкутрыи, да и выполнять половину запростов на добавление при изменениях быстрее ^^

Vladimir 07.04.2010 03:26

Патч в [9686]. Спасибо :)

В [9687] добавлены опции в конфиг для точного задания времени сброса для daily и weekly квестов
и переписан код выбора времени при загрузке сервера с приведением к этим значениям текущего запланированного
сброса.


Текущее время: 04:27. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS