|
Патчи Если кто-то хочет выложить не свой готовый патч - не забудьте указать автора и источник.
Если кто-то хочет задать вопрос по патчу - велкам. |
|
Опции темы | Поиск в этой теме | Опции просмотра |
23.07.2010, 01:17 | #1 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
[patch/dev] Рандомные Виклики/Дейлики
В общем решил написать патч на поддержку рандомных деликов и викликов.
Чтобы сразу понятно было вот вам скриншоты Собственно патч Есть небольшой баг. если дейлик/виклик одной группы но разные задания находятся у разных НПЦ то у того НПС которому не повезло с квестом значек над головой остается. Щас этим займусь. Может придется переписать немного( В общем сейчас загрузка и сохранение рандомных квестов есть и также их сброс. Последний раз редактировалось alien; 23.07.2010 в 20:54. |
23.07.2010, 04:24 | #2 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 85
Сказал(а) спасибо: 5
Поблагодарили 42 раз(а) в 17 сообщениях
|
quest_curent_weekly и quest_curent_daily для хранения списков текущих дейликов и викликов.
можно добавить флаг в базу и использовать 1 таблицу. типа flag == 0x00 daily, flag == 0x01 weekly. |
23.07.2010, 08:58 | #3 |
Администратор
|
Выполняемые игроком дейли и викли квесты итак хранятся в базе.
Есди не ошибаюсь, то при взятии квеста с одним значением ExclusiveGroup остальные исчезают из списка. Что именно планируется загружать из базы? |
23.07.2010, 10:44 | #4 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
virusav,
вот именно что исчезают из списка только после взятия. а у нас сразу в списке должен быть только один. неужели по скрину непонятно? zhenya, просто если посмотреть на то как реализовано запоминание дейликов и викликов которые выполнил игрок то там тоже две таблицы видимо чтобы было удобней таблицу очищать. |
23.07.2010, 10:59 | #5 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
У меня была мысль показывать 1 квест в зависимости от даты, чтобы в базе ничего не хранить... А на оффе они совершенно случайно выбираются?
|
23.07.2010, 11:11 | #6 |
Гость
Сообщений: n/a
|
|
23.07.2010, 11:12 | #7 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
Да.
Может подряд несколько недель быть один и тотже. Тоесть обычный рандом. |
23.07.2010, 11:17 | #8 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Имхо, проще делать через game_event
|
23.07.2010, 11:36 | #9 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
И какимже образом через гем_евент реализовать эту туеву кучу викликов и дейликов? ведь это не 1 и не 2 гивера. их около 100 наверно в игре кто дает рандомные квесты.
|
23.07.2010, 12:04 | #10 | |
Администратор
|
Цитата:
Если да, то выводим его. Если нет, то запускаем твой код и выбираем случайным образом один квест из группы. Таким образом игроку будет показан один случайный квест из группы. |
|
23.07.2010, 12:24 | #11 | |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
Цитата:
А вот если на руках нету ни одного квеста из квест группы то тогда выбираем рандомный квест запоминаем его, записываем в базу и всем остальным просто предлагаем этот квест. |
|
23.07.2010, 13:03 | #12 |
Администратор
|
Зачем? Разве случайный квест выпадает всем игрокам один и тот же?
Мне кажется, что надо делать выбор случайного квеста для каждого игрока заново при открытии списка квестов нпц или го. Тут уже нужна инфа с офа, как там. |
23.07.2010, 13:41 | #13 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
Да случный квест для всех 1(если дейлик в течении дня, если виклик в течении недели)
|
23.07.2010, 14:24 | #14 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Можно выделить какой-то отдельный номер в game_event и туда сохранять. И никаких дополнительных таблиц или имплементаций в ядре ненужно. Вероятно, правда, каким-то флагом или еще как-то обозначить те ExclusiveGroup, какие должны быть рандомными.
|
23.07.2010, 14:43 | #15 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
И зачем такая морока? То есть добавили близы новый список дейликов/викликов и заносить в game_event.
Да и в game_event это сохронять не логично.(темболее не представляю даже как там это реализовать.) |
23.07.2010, 14:50 | #16 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Нет, ничего не придется заносить, это делать будет сервер (или вы собрались каждый день дейлики туда заносить?). При появлении новых дейликов вам, как и в вашем-же способе, придется как-то их обозначить. Только в моем случае не нужно никаких дополнительных изобретений и таблиц.
|
23.07.2010, 15:00 | #17 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
Ну хорошо тогда как вы представляете реализацию через game_event.
Я что-то не догоняю как это можно реализовать. |
23.07.2010, 15:01 | #18 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
При сбросе дейликов пересчитывать новые, рандомные, и добавлять их в game_event (на случай отключения сервера) под определенным номером.
|
23.07.2010, 15:13 | #19 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
Тоесть сервер при сбросе будет пробегать по всем квестам, выбирать рандомный из группы и заносить в гем-евент?
Последний раз редактировалось alien; 23.07.2010 в 15:18. |
23.07.2010, 15:53 | #21 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
А нафига лишним сервер нагружать при старте?
Просто в моем случае квесты выбираются по мере надобности(или просто подгружается уже составленный список из базы) А так придется при первом старте пробегатся по ВСЕМ квестам(или хранить список всех груп квестов которые являются дейликами/викликами в какойто таблици или еще гдето.) да и вот еще что-то не представляю как в самом гем-евенте хранить запись о выбранном виклике/дейлике? |
23.07.2010, 15:59 | #22 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Не при старте, а раз в день, при сбросе дейликов. Квестов достаточно мало — всего около 9000, с ExclusiveGroup != 0 всего 630. Проверка по всем квестам пройдет за считанные миллисекунды.
У вас же при каждом обращении к любому квестеру идет поиск в загруженной таблице, т.п. Система написана, документация есть, все работает без ошибок — зачем вам знать, как она работает? И зачем создавать аналоги? |
Пользователь сказал cпасибо: | Foks (25.07.2010) |
23.07.2010, 16:28 | #23 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
Вобщето идет проверка только если квест дейлик/виклик. и не по таблици а по map'у
и вот только если нету в мапе записи об этой ExclusiveGroup то тогда запускаем генерацию рандом квеста. Так а теперь глобальный вопрос приведите пример как вы видите запись в game_event? Я например не вижу оптимального пути использования game_event даже если убрать поиск и выбор квестов. Тоесть возьмем пример на этой недели у нас у NPC 20735 квест 24586. Это значит нам надо создать запись в game_event текущей даты а потом в Game_event_creature_quest добавить запись с ID из game_event и ID НПС и квеста и так для каждого НПС. Потом когда будет другой квест нам придется править все ID квестов . И еще сервер не перезагружает game_event при своей работе тоесть придется делать чтобы перезагружал. А это совершенно неверно. В общем я не вижу ни одного + в пользу game_event а только сплошные - Последний раз редактировалось alien; 23.07.2010 в 16:36. |
23.07.2010, 20:40 | #24 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Для каждого квеста заводится event c единсвенным элементом game_event_creature_quest - ну возможно с негативными для остальных в группе
на время когда он будет показываться. Вы уверены что они случайные а не идут просто по цеочке...
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
23.07.2010, 20:44 | #25 |
Пользователь
Регистрация: 04.05.2010
Сообщений: 54
Сказал(а) спасибо: 11
Поблагодарили 13 раз(а) в 11 сообщениях
|
Случайные. Реализовать, действительно, логичнее с помощью системы эвентов. Просто доработаеть ее чтобы была возможность запуска рандомного эвента из группы
|
23.07.2010, 20:55 | #26 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
возможно если quest из exclusive group - а имеено галвный в ней - то интерпретировать это как бырать случайный из?
Так как странно в нормальном случае иметь в event quest exclusive c квестами не в event... ? Можно ограничить повторяемыми
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
23.07.2010, 21:00 | #27 | ||
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
Цитата:
и немного не понял что вы тут хотели сказать. Цитата:
Последний раз редактировалось alien; 23.07.2010 в 21:08. |
||
23.07.2010, 21:20 | #28 |
Пользователь
Регистрация: 04.05.2010
Сообщений: 54
Сказал(а) спасибо: 11
Поблагодарили 13 раз(а) в 11 сообщениях
|
Советую обратить внимание на квестгивера, дающего викли на боссов в вотлк рейдах.
Возле него за стенкой вращается моделька босса, которого необходимо кокнуть по текущему виклику, соответственно это стопудово система эвентов. Просто нужно реализовать группировку эвентов, либо предусмотреть вообще тип эвента - случайный викли или случайный дейли, которые будут меняться одновременно с резетом дейликов/викликов |
Пользователь сказал cпасибо: | alien (23.07.2010) |
23.07.2010, 21:35 | #29 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
А зачем создавать для каждого квеста свой id?.. Пусть они хранятся в каком-нибудь -1 или -2 (викли/дейли). Просто придется удалить лишнюю сотнб записей из creature_questrelation.
|
23.07.2010, 21:53 | #30 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Я про свой говорил пока не написал про exсlude group
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
23.07.2010, 23:42 | #31 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
Такая идея реализации.
game_event.holiday разрешить отрицательные значения(типа эвенты которых нету в Holidays.dbc но которые надо как-то обработать по своему), дальше для каждой рандомной группы вручную создаем запись. Также заполняем game_event_creature_quest всеми квестами из этой группы и просто в GameEventMgr::UpdateEventQuests(uint16 event_id, bool Activate) обрабатываем по своему запись с отрицательным числом(например для -1 это будет выдать только рандом) и собственно if (Activate) // Add the pair(id,quest) to the multimap CreatureQuestMap.insert(QuestRelations::value_type (entry, randomQuest)); -2 можно будет сделать для обработки мобов за http://ru.wowhead.com/npc=20735 там может и -3 подтянется )) |
23.07.2010, 23:54 | #32 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Скажите, ну вот скажите, ну вот зачем эти holiday, -3, Верховный маг Лан'далок?
Почему бы просто не создать эвенты -1 (дейлики) и -2 (виклики), и туда складывать и мобов-призраков, и дополнительные квестовые НПС (Ристалище), и сами записи из game_event_creature_quests (или как она там называется)? |
24.07.2010, 00:01 | #33 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
Тогда и -2 не нужне.
так с точки зрения события они отличаются только длительностью а длительность задается в start_time,end_time,occurence |
24.07.2010, 00:04 | #34 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Да, можно сделать один и на виклики, и на дейлики. Но тогда вам придется очищать game_event таблицы с id=-1 вручную, проверяя каждый квест на виклик, это в 100 раз замедлит работу и в 10 раз увеличит количество кода.
|
24.07.2010, 00:18 | #35 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
Подождите а зачем что-то удалять из game_event?
Просто делаем записи так. Что у евента длительность 23 часа а повторять каждые 24 часа. Виклики соответственно 6д и 23ч длительность а повторение каждые 7 дней Вот и все. И ничего удалять не придется или я неправ? |
24.07.2010, 00:20 | #36 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Удалять придется, чтобы сменить текущие дейлики. Это делается во время их сброса.
|
24.07.2010, 00:26 | #37 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
Подождите зачем?
вот стандартный код из геймевентманаджера. Код:
QuestRelations &CreatureQuestMap = sObjectMgr.mCreatureQuestRelations; if (Activate) // Add the pair(id,quest) to the multimap CreatureQuestMap.insert(QuestRelations::value_type(itr->first, itr->second)); else { // Remove the pair(id,quest) from the multimap QuestRelations::iterator qitr = CreatureQuestMap.find(itr->first); if (qitr == CreatureQuestMap.end()) continue; QuestRelations::iterator lastElement = CreatureQuestMap.upper_bound(itr->first); for ( ;qitr != lastElement;++qitr) { if (qitr->second == itr->second) { CreatureQuestMap.erase(qitr); // iterator is now no more valid break; // but we can exit loop since the element is found } } } Тоесть когда евент у нас останавливается у нас просто из sObjectMgr.mCreatureQuestRelations удаляется все квесты которые были в game_event_creature_quest а как только стартует то в mCreatureQuestRelations заносится. Дак вот в нашем случае надо не все квесты заносить в а 1 рандомный из списка который хранится под этим евентом. |
24.07.2010, 00:50 | #38 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Под этим эвентом хранится УЖЕ срандомленный, один на группы, единственный-избранный квест. И его надо будет удалить ИЗ БАЗЫ.
Всего вам нужно написать: — удаление данных из базы — добавление данных в базу Все остальное уже написано. Причем делать это можно, если вам очень хочется, даже не сервером! |
24.07.2010, 00:58 | #39 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Зачем удалять из базы если планируется в коде выбор случайного для активации из статичесокго набора....
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
24.07.2010, 01:04 | #40 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Я имею ввиду удалять из базы старые квесты, когда из групп выбираются новые.
|