Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Патчи

Важная информация

Патчи Если кто-то хочет выложить не свой готовый патч - не забудьте указать автора и источник.

Если кто-то хочет задать вопрос по патчу - велкам.

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.07.2010, 01:09   #41
alien
Ученый
 
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
alien На верном пути
По умолчанию

LordJZ, так мороки больше.
Мы храним ВСЕ квесты и все Евенты мы их не вообще базу game_event и базу квестов принадлежащих евенту.
А вот евентманаджер выбирает рандом и заносит этот рандомный квест в mCreatureQuestRelations.
Хотя тут тоже есть проблема. А если свервер упадет или его надо перезапустить.
Тоесть придется сохранять Id выбранного квеста.
UPD:
Во можно посто под -(минус) использовать id текущего выбранного квеста.
тоесть как только евентманаджер выбрал для текущего евента квест то он в holiday пишет -randomQuestID
и если сервер падает то когда его поднимают он оттуда берет выбранный квест.

Последний раз редактировалось alien; 24.07.2010 в 01:17.
alien вне форума   Ответить с цитированием
Старый 24.07.2010, 01:31   #42
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

game_event делает все эти операции за вас
LordJZ вне форума   Ответить с цитированием
Старый 24.07.2010, 01:39   #43
alien
Ученый
 
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
alien На верном пути
По умолчанию

Какие именно? выбор рандомного квеста?
или сохранение рандомного квеста?
а вот добавлять/удялять записи в game_event и в game_event_creature_quest вовремя работы сервера это както хаково притом сильно хаково. так-как сервер по умолчанию не перезагружает эти таблици во время своей работы.
И тогда надо будет добавлять перезагрузку этих таблиц.
Или что тоже как-то хаково править переменные в которых хрянится загруженная инфа из бызы.
alien вне форума   Ответить с цитированием
Старый 24.07.2010, 02:25   #44
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Чем вам мешает сохранение данных в game_event таблицы, тем более что они не перезагружаемые? В вашем случае реализовать половину функций рандом дейликов вообще не получится — те же Image-ы, к примеру.
LordJZ вне форума   Ответить с цитированием
Старый 24.07.2010, 02:36   #45
alien
Ученый
 
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
alien На верном пути
По умолчанию

Это почему еще?
Спокойно реализуется все.
Просто нужно гдето хранить соответствие QuestId-CreatureID для отобржения.
Можно даже в коде прямо хранить Просто масивом из структуры. Благо там не более 10 записей.
--
Ну хорошо давайте над вашим способом подумаем в game_event мы записали некоторый делик а в game_event_creature_quest записали ID нового эвента и квест который должен быть. Дальше то что? как мы заставим сервер подхватить их Он же уже давно это таблицу прогрузил.
alien вне форума   Ответить с цитированием
Старый 24.07.2010, 03:14   #46
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

И вы опять будете писать костыли, спавнить НПС, давать им анимации, еще что-то... Ради чего, скажите мне? Это все можно сделать через game_event.

И почему вы считаете что в рантайме нельзя изменить данные эвента? Очень даже можно.


П.С. Спор бессмысленный, я смотрю, вы так и будете стоять на своем — создание новых таблиц, новых решений и прочего. Больше я вас призывать к использованию существующих возможностей не буду — кодьте, на здоровье!

Последний раз редактировалось LordJZ; 24.07.2010 в 03:16.
LordJZ вне форума   Ответить с цитированием
Старый 24.07.2010, 03:39   #47
alien
Ученый
 
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
alien На верном пути
По умолчанию

Ну я как-бы и использую существующие возможности.
У гейм_евент есть такая таблица game_event_creature
в которую помещаются записи критчеров которые надо показать в мире при запуске евента. притом GameEventMgr сам их заспавнит и сам уберет.

Мне чтобы заработало все как нужно надо только дописать в GameEventMgr пару строчек чтобы он выбирал рандомно квест(ну и критчера к этому рандом квесту если надо).
ВСЕ остальное делает сам GameEventMgr код добавления в sObjectMgr.mCreatureQuestRelations уже в нем есть его надо только под рандомность подогнать удаление из sObjectMgr.mCreatureQuestRelations можно вообще оставить.

В итоге что у нас получается.
1)Заполняем таблицу game_event всеми нужными дейликами/викликами ставя holiday = -1
2) Удаляем из creature_questrelation все записи о тех квестах которые реализуем через game_event
3) Добавляем в game_event_creature_quest наш список квестов и связываем с нужными записями в таблицы game_event.
4) Тоже самое если нужно делаем с game_event_creature
5) Правим GameEventMgr так чтобы он если holiday <0 и время обновить евент выбирал рандомный квест из текущего евента(и получал по этому квестИД если нужно соответствующего критчер) также записываем на место holiday -(CurQuestId)чтобы если сервер упал или перезагрузили то был тот-же квест.
ВСЕ Больще нам делать нечего, все остальное уже есть в GameEventMgr
alien вне форума   Ответить с цитированием
Старый 24.07.2010, 05:51   #48
Energy
Пользователь
 
Регистрация: 04.05.2010
Сообщений: 54
Сказал(а) спасибо: 11
Поблагодарили 13 раз(а) в 11 сообщениях
Energy На верном пути
По умолчанию

А почему бы не сделать вот так?
1) добавляем в таблицу game_event колонку (например ExclusiveGroup по аналогии с quest_template). В ней для всех эвентов, которые должны исключать друг друга, будет стоять идшник первого из них
2) создаем обычные эвенты с обычным ид, но, допустим с -1 HolidayID для викликов и -2 HolydayID для дейликов. start_time, end_time и occurrence по нулям.
3) в коде мы случайным образом выбираем новый эвент с HolydayID -1 и -2 и запускаем его, там где происходит резет дейликов и викликов соответственно.
4) дальше всю работу сделает для нас система эвентов. Мы можем отспавнить другую модельку рядом с квестгивером, или напялить на квестгивера другой DisplayID, либо вообще все что угодно

Собственно вопрос. При текущей реализации системы эвентов, квесты перестают сдаваться после окончания эвента, или просто перестают выдаваться? Например, если человек взял и сделал дейлик сегодня, а сдать он его решит, например, завтра(когда фактически уже будет активен другой эвент). у него это получится?

Можно так же доработать саму систему эвентов, и полноценно реализовать поддержку эксклюзивных эвентов. Например так:

есть эвент с данными о начале, продолжительности, и т. д. у него допустим ид 3000. в поле ExclusiveGroup тоже 3000. есть еще эвенты с 3001 по 3010, у которых пропущены данные о продолжительности, но в поле ExclusiveGroup тоже стоит число 3000. Когда приходит время старта эвента с номером 3000, выбирается случайным образом один из эвентов с полем ExclusiveGroup 3000, и запускается.

С помощью эксклюзивных эвентов так же можно будет реализовать живность в городах, вроде гуляющих именных мобов в Даларане.


Правда для корректной работы данной фишки нужно реализовать так же и возможность сохранения таких данных, как то, какой из вручную (т.е. при резете квестов) запущенных эвентов был активен на момент последнего сейва сервера. И вообще помнится был патч на систему эвентов, позволяющий сохранять ворлдстейты, и реализовывать многоступенчатые эвенты вроде открытия санвелла или AQ War Effort

Последний раз редактировалось Energy; 24.07.2010 в 06:06.
Energy вне форума   Ответить с цитированием
Старый 24.07.2010, 11:53   #49
alien
Ученый
 
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
alien На верном пути
По умолчанию

Цитата:
Собственно вопрос. При текущей реализации системы эвентов, квесты перестают сдаваться после окончания эвента, или просто перестают выдаваться?
просто перестают выдаваться.
так-как за прием квеста отвечает другая таблица которая в гем_евент не участвует.
alien вне форума   Ответить с цитированием
Старый 24.07.2010, 12:21   #50
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

сдать неполучиться только если с event окончанием удаляется и сам npc.
Но в данном случае речь об этом не идет.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Старый 20.09.2010, 18:06   #51
alien
Ученый
 
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
alien На верном пути
По умолчанию

Возвращаемся к нашим баранам...
1) Самым проблемным для реализации через game_event является виклики у
http://ru.wowhead.com/npc=20735
Тут либо надо хардкодить связь Creature которые находятся сзади с выбираемым квестом, либо создавать еще одну таблицу в которой хранить эту связь. Но и тут не так все просто так-как вначале надо выбирать не квест а Creature так-как вначале отрабатываются то какие Creature будут заспавнены, а только потом квесты.
Да и если в
void GameEventMgr::UpdateEventQuests(uint16 event_id, bool Activate)
легко добавить выбор рандомного квеста и пропуск остальных. то вот в void GameEventMgr::GameEventSpawn(int16 event_id) и void GameEventMgr::GameEventUnspawn(int16 event_id) не так то и просто добавить спавн одного и унспавн других NPC.
Кто нибудь, что нибудь подскажет по этому поводу?

2) Дальше следующая проблема.
Как организовать перезапуск евента?
а)
например можно сделать вот так.
Длительность эвента 1339 минут а стартует каждые 1440.
В итоге у нас будет минута в течении которой квесты будет недоступен.
б)
Добавить в гайм_евент функцию
void GameEventMgr::ResetEvent(uint16 event_id)
{
StopEvent(event_id);
StartEvent(event_id);
}
И соответственно в void World::ResetDailyQuests() вызывать эту функцию с нужными ID
Мне кажется что так правильнее.
Или просто в void World::ResetDailyQuests() вызыв последовательность StopEvent(event_id);
StartEvent(event_id);
Тут есть огромный + мы можем очистить в game_event поле(СМ п 3.б)
и все довольно удобно.

3)
Как хранить(и где) состояние выбранного рандомного виклика дейлика?
а) Добавить еще одну таблицу в которой хранится креатуре которому принадлежит квест и квест id.
б) В game_event добавить еще одно поле которое будет просто хранить рандомный номер(тоесть номер записи в mGameEventQuests[event_id])
Выбор квеста например сейчас выглядит так
mGameEvent[event_id].RandQuest=mGameEventQuests[event_id][urand(0,mGameEventQuests[event_id].size()-1)];
В базу можно например сохранять просто результат
urand(0,mGameEventQuests[event_id].size()-1).

Если бы не надобность выбирать для http://ru.wowhead.com/npc=20735 то все делалось довольно тривиально, а так приходится извращаться немного
=============================
В общем у кого какие идеи?
alien вне форума   Ответить с цитированием
Старый 20.09.2010, 18:13   #52
Lordronn
Умный
 
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
Lordronn Скоро придёт к известности
По умолчанию

На тринити это уже сделали, нужные данные хранят в базе чарактерс, там только квест Иды вроде. Попробую откопать коммит
Lordronn вне форума   Ответить с цитированием
Старый 20.09.2010, 18:53   #53
alien
Ученый
 
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
alien На верном пути
По умолчанию

Хмм... что-то просмотрев код тринити по диагонали не заметил куда они это запихнули. в Гейм_евенте нету.

UPD:
Может ты про обычные виклики и дейлик?
Там да просто сохраняется ID выполненного квеста.

Последний раз редактировалось alien; 20.09.2010 в 19:42.
alien вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



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


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot