Перейти к содержанию
Авторизация  
Mizuwokiru

[Awakening] Реализация Кампаний

Рекомендуемые сообщения

В общем, начал делать кампании, но не пойму, как сделать их вызов в определенные дни недели и в определенное время? Также интересует механизм локальных квестов (такие как в Храме Орбиса и Руинах Харнака).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

смотри в том же ребелионе или новелле.

реализация компаний и зональных квестов там конечно не идеальная, но для понимания того что как делать вполне подойдет.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

смотри в том же ребелионе или новелле.

реализация компаний и зональных квестов там конечно не идеальная, но для понимания того что как делать вполне подойдет.

 

В общем то новеллы и были на ребеллионе. Но принцип работы там чуток запутанный.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем то новеллы и были на ребеллионе. Но принцип работы там чуток запутанный.

это еще мягко говоря :)

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

 

типичный динамический квест у меня выглядит так :D

package dynamic_quests;

import l2p.gameserver.model.dynamicquest.DynamicQuest;

public class _0001_DestroyTheDaemonAngma extends DynamicQuest
{
   public _0001_DestroyTheDaemonAngma()
   {
       super(1);
   }
}

проще некуда, если не учитывать нужные для работы квеста данные, типа таких :)

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE list SYSTEM "dynamic_quest.dtd">
<list>
   <quest id="1" name="Destroy the Daemon Angma" min_level="75">
       <start>
           <time pattern="0 11 * * 6" />
           <time pattern="0 22 * * 6" />
       </start>
       <spawns>
           <group name="_0001_DestroyTheDaemonAngma" />
       </spawns>
       <steps>
           <step id="1" duration="30">
               <tasks>
                   <task id="101" points="10000" />
               </tasks>
               <dialogs>
                   <dialog type="header" name="header" />
                   <dialog type="start" name="start" />
                   <dialog type="reject" name="reject" />
                   <dialog type="accept" name="context" />
                   <dialog type="failed" name="failed" />
                   <dialog type="finish" name="finish" />
                   <dialog type="reward" name="reward" />
                   <dialog type="reward_received" name="reward_received" />
               </dialogs>
               <targets>
                   <npc id="19086" points="1" />    <!-- Daemon Angma / Демон Гонца Тьмы -->
                   <npc id="19087" points="2" />    <!-- Daemon Angma Captain / Главный Демон Гонца Тьмы -->
               </targets>
               <rewards>
                   <reward id="33501" count="54" type="rank_1" />    <!-- Mark of the King / Знак Короля -->
                   <reward id="33501" count="18" type="rank_2" />    <!-- Mark of the King / Знак Короля -->
                   <reward id="33500" count="203" type="rank_3" />    <!-- Mark of Lords / Знак Лорда -->
                   <reward id="33500" count="87" type="others" />    <!-- Mark of Lords / Знак Лорда -->
               </rewards>
           </step>
       </steps>
   </quest>
</list>

 

всем у меня рулит общий класс DynamicQuest, которому в большинстве случаев достаточно передать ид квеста, а дальше уже пусть разбирается.

Изменено пользователем Gaikotsu
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В эпизодеоне их повырезали нахрен, так что я так и не успел запилить их норм :D

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а жаль что вырезали - задумка то хорошая была, при достаточном воображении нехило можно развернуться, делая на их основе те же эвенты разнообразные.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это еще мягко говоря :)

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

 

типичный динамический квест у меня выглядит так :D

package dynamic_quests;

import l2p.gameserver.model.dynamicquest.DynamicQuest;

public class _0001_DestroyTheDaemonAngma extends DynamicQuest
{
public _0001_DestroyTheDaemonAngma()
{
super(1);
}
}

проще некуда, если не учитывать нужные для работы квеста данные, типа таких :)

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE list SYSTEM "dynamic_quest.dtd">
<list>
<quest id="1" name="Destroy the Daemon Angma" min_level="75">
<start>
<time pattern="0 11 * * 6" />
<time pattern="0 22 * * 6" />
</start>
<spawns>
<group name="_0001_DestroyTheDaemonAngma" />
</spawns>
<steps>
<step id="1" duration="30">
<tasks>
<task id="101" points="10000" />
</tasks>
<dialogs>
<dialog type="header" name="header" />
<dialog type="start" name="start" />
<dialog type="reject" name="reject" />
<dialog type="accept" name="context" />
<dialog type="failed" name="failed" />
<dialog type="finish" name="finish" />
<dialog type="reward" name="reward" />
<dialog type="reward_received" name="reward_received" />
</dialogs>
<targets>
<npc id="19086" points="1" /> <!-- Daemon Angma / Демон Гонца Тьмы -->
<npc id="19087" points="2" /> <!-- Daemon Angma Captain / Главный Демон Гонца Тьмы -->
</targets>
<rewards>
<reward id="33501" count="54" type="rank_1" /> <!-- Mark of the King / Знак Короля -->
<reward id="33501" count="18" type="rank_2" /> <!-- Mark of the King / Знак Короля -->
<reward id="33500" count="203" type="rank_3" /> <!-- Mark of Lords / Знак Лорда -->
<reward id="33500" count="87" type="others" /> <!-- Mark of Lords / Знак Лорда -->
</rewards>
</step>
</steps>
</quest>
</list>

 

всем у меня рулит общий класс DynamicQuest, которому в большинстве случаев достаточно передать ид квеста, а дальше уже пусть разбирается.

 

 

ну а я у себя так делал:

public void init()
{
	_log.info("Initializing Dynamic Quest Manager");
	for(DynamicQuestTemplate template : DynamicQuestHolder.getInstance().getAllDynamicQuests())
	{
		Class<?> clazz = Scripts.getInstance().getClasses().get("dynamic." + template.getQuestPath());
		if(clazz != null)
		{
			try
			{
				Constructor<?> constructor = clazz.getConstructor(DynamicQuestTemplate.class);
				if(constructor != null)
				{
					addQuest((DynamicQuest)constructor.newInstance(template));
					continue;
				}
			}
			catch (Exception e) {}
		}
		addQuest(new DynamicQuest(template));
	}
}

Изменено пользователем Mifesto
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо. В общем решил начать с квеста в орбисе, но тут глянул:

2    u,Храм Орбиса - локальный квест\0    1    u,Уничтожение героев Храма - 1\0    u,Уничтожьте Проклятых Древних Героев в Храме Орбиса.\\n\\nМонстры для охоты – Жертва Орбиса, Страж Орбиса, Метатель Орбиса\\n\0    1    0    0    1    201    u,Уничтожение Проклятых Древних Героев\0                    0                                                                        
2    u,Храм Орбиса - локальный квест\0    2    u,Уничтожение героев Храма - 2\0    u,Проклятые Древние Герои начали наблюдение за Вами. Сейчас они, сплотившись вокруг Древнего Героя Орбиса, нападают на Вас.\\n\\nМонстры для охоты – Жертва Орбиса, Страж Орбиса, Метатель Орбиса и Древний Герой Орбиса\\n\0    1    0    0    1    202    u,Уничтожение Проклятых Древних Героев\0                    0                                                                        
2    u,Храм Орбиса - локальный квест\0    3    u,Уничтожение героев Храма - 3\0    u,Если отразить нападение Проклятых Древних Героев Орбиса, появится их Полководец.\\n\\nМонстры для охоты – Жертва Орбиса, Страж Орбиса, Метатель Орбиса и Древний Герой Орбиса\\n\0    1    0    0    1    203    u,Уничтожение Проклятых Древних Героев\0                    0                                                                        
2    u,Храм Орбиса - локальный квест\0    4    u,Уничтожение героев Храма - 4\0    u,Уничтожьте Проклятых Древних Героев в Храме Орбиса.\\n\\nМонстры для охоты – Ученый Орбиса, Страж Орбиса, Метатель Орбиса\\n\0    1    0    0    1    204    u,Уничтожение Проклятых Древних Героев\0                    0                                                                        
2    u,Храм Орбиса - локальный квест\0    5    u,Уничтожение героев Храма - 5\0    u,Проклятые Древние Герои начали наблюдение за Вами. Сейчас они, сплотившись вокруг Старшего Ученого Орбиса, нападают на Вас.\\n\\nМонстры для охоты – Ученый Орбиса, Страж Орбиса, Метатель Орбиса и Проклятый Старший Ученый Орбиса\\n\0    1    0    0    1    205    u,Уничтожение Проклятых Древних Героев\0                    0                                                                        
2    u,Храм Орбиса - локальный квест\0    6    u,Уничтожение героев Храма\0    u,Если отразить нападение Проклятых Древних Героев Орбиса, появится их Полководец.\\n\\nМонстры для охоты – Ученый Орбиса, Страж Орбиса, Метатель Орбиса, Древний Герой Орбиса и Проклятый Старший Ученый Орбиса\\n\0    1    0    0    1    206    u,Уничтожение Проклятых Древних Героев\0                    0                                                                      

Оказывается у данного квеста 6 "стадий". Подскажет кто, как это реализовать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А тут реализуется по принципу остальных, только у всех кампаний шлется ID и степень квеста == 1, а в орбисе степень квеста меняется с 1 на 6, на момент исполнения задачи.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо. В общем решил начать с квеста в орбисе, но тут глянул:

 

...

 

Оказывается у данного квеста 6 "стадий". Подскажет кто, как это реализовать?

начал бы с более простых - в которых всего по 1 этапу.

 

Ну и AwakenDev правильно сказал - просто придется еще и учитывать текущий этап и соответственно ему переключать на следующий или первый, при выполнении задания или истечения времени.

 

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

Изменено пользователем Gaikotsu
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это еще мягко говоря :)

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

 

типичный динамический квест у меня выглядит так :D

package dynamic_quests;

import l2p.gameserver.model.dynamicquest.DynamicQuest;

public class _0001_DestroyTheDaemonAngma extends DynamicQuest
{
public _0001_DestroyTheDaemonAngma()
{
super(1);
}
}

проще некуда, если не учитывать нужные для работы квеста данные, типа таких :)

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE list SYSTEM "dynamic_quest.dtd">
<list>
<quest id="1" name="Destroy the Daemon Angma" min_level="75">
<start>
<time pattern="0 11 * * 6" />
<time pattern="0 22 * * 6" />
</start>
<spawns>
<group name="_0001_DestroyTheDaemonAngma" />
</spawns>
<steps>
<step id="1" duration="30">
<tasks>
<task id="101" points="10000" />
</tasks>
<dialogs>
<dialog type="header" name="header" />
<dialog type="start" name="start" />
<dialog type="reject" name="reject" />
<dialog type="accept" name="context" />
<dialog type="failed" name="failed" />
<dialog type="finish" name="finish" />
<dialog type="reward" name="reward" />
<dialog type="reward_received" name="reward_received" />
</dialogs>
<targets>
<npc id="19086" points="1" /> <!-- Daemon Angma / Демон Гонца Тьмы -->
<npc id="19087" points="2" /> <!-- Daemon Angma Captain / Главный Демон Гонца Тьмы -->
</targets>
<rewards>
<reward id="33501" count="54" type="rank_1" /> <!-- Mark of the King / Знак Короля -->
<reward id="33501" count="18" type="rank_2" /> <!-- Mark of the King / Знак Короля -->
<reward id="33500" count="203" type="rank_3" /> <!-- Mark of Lords / Знак Лорда -->
<reward id="33500" count="87" type="others" /> <!-- Mark of Lords / Знак Лорда -->
</rewards>
</step>
</steps>
</quest>
</list>

 

всем у меня рулит общий класс DynamicQuest, которому в большинстве случаев достаточно передать ид квеста, а дальше уже пусть разбирается.

гениально и просто!)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...