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

Квесты На Терлионе

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

Доброго времени суток.

Поставил последнию ревизию терлионы и есть один баг\лаг\ну или я накосячил

Вообщем не работает ни один квест.

Для примера возьмем квест Guardins Of The Holy Grail

Подходим к нпц жмем квест и... и ничего не происходит, окно чата просто закрывается, но в консоли выскочило это:

Bad RequestBypassToServer:
com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key data/scripts/guardians of the holy grail/639_GuardiansOfTheHolyGrail/31350-01.htm.
 at com.google.common.cache.LocalCache$Segment.getAndRecordStats(LocalCache.java:2407)
 at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2375)
 at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2337)
 at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2252)
 at com.google.common.cache.LocalCache.get(LocalCache.java:3990)
 at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3994)
 at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4878)
 at terliona.gameserver.data.cache.HtmCache.getHtm(HtmCache.java:145)
 at terliona.gameserver.engines.quest.Quest.showHtmlFile(Quest.java:1483)
 at terliona.gameserver.engines.quest.Quest.showResult(Quest.java:573)
 at terliona.gameserver.engines.quest.Quest.notifyTalk(Quest.java:347)
 at terliona.gameserver.model.actor.instance.L2NpcInstance.showQuestWindow(L2NpcInstance.java:1426)
 at terliona.gameserver.model.actor.instance.L2NpcInstance.showQuestWindow(L2NpcInstance.java:1499)
 at terliona.gameserver.model.actor.instance.L2NpcInstance.onBypassFeedback(L2NpcInstance.java:998)
 at terliona.gameserver.network.clientpackets.RequestBypassToServer.runImpl(RequestBypassToServer.java:237)
 at terliona.gameserver.network.clientpackets.L2GameClientPacket.run(L2GameClientPacket.java:63)
 at terliona.gameserver.network.L2GameClient.run(L2GameClient.java:987)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
 at java.lang.Thread.run(Thread.java:722)

 

Квест подгружается из дата пака. (С квестами из ядра тоже самое)

 

Я не знаю почему, но они ссылаются не на ту папку которую надо "data/scripts/guardians of the holy grail/639_GuardiansOfTheHolyGrail/31350-01.htm"

должно быть "data/scripts/quests/639_GuardiansOfTheHolyGrail/31350-01.htm"

 

Если добавить папку guardians of the holy grail и засунуть туда папку 639_GuardiansOfTheHolyGrail

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

 

В чем соль: Мне надо узнать почему ядро меняет адреса на htm файлы.

 

Сколько не пытался найти причину, так и не нашел.

Изменено пользователем Myp3uK

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


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

Посмотри файл путей

scripts

Что-то типо такого

 

 

# Quests Section

 

quests/1_LettersOfLove1/__init__.py

quests/2_WhatWomenWant1/__init__.py

quests/3_ReleaseDarkelfElder1/__init__.py

  • Upvote 1

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


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

Пошарил в квестах ядра, нашел такое чудо:

public static void main(String[] args)
{
 new Q241_PossessorOfAPreciousSoul(241, "Q241_PossessorOfAPreciousSoul", "Possessor Of A Precious Soul 1");
}

 

Если Possessor Of A Precious Soul 1 сменить на quests, то квест работает, но в окне чата он будет называться Quests

Но это работает только в квестах которые прописаны в ядре.

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


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

Посмотри файл путей

scripts

Что-то типо такого

 

 

# Quests Section

 

quests/1_LettersOfLove1/__init__.py

quests/2_WhatWomenWant1/__init__.py

quests/3_ReleaseDarkelfElder1/__init__.py

 

Там все путем :)

Если бы там было что-то не так то сервер бы выдал мне при старте типо "Error: Failed to load script papka/papka/papka/__init__.py"

Изменено пользователем Myp3uK

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


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

Пошарил в квестах ядра, нашел такое чудо:

public static void main(String[] args)
{
new Q241_PossessorOfAPreciousSoul([color=#ff0000]241[/color], "[color=#00ff00]Q241_PossessorOfAPreciousSoul[/color]", "[color=#0000ff]Possessor Of A Precious Soul 1[/color]");
}

 

Если Possessor Of A Precious Soul 1 сменить на quests, то квест работает, но в окне чата он будет называться Quests

Но это работает только в квестах которые прописаны в ядре.

Это создаёт объект класса Q241_PossessorOfAPreciousSoul в качестве параметров ему передаются ид квеста, его навание, и его описание, которое является его названием в клиенте.

Путь к html файлам квеста вычисляется в методе

public String showHtmlFile(L2PcInstance player, String fileName) класса terliona.gameserver.engines.quest.Quest

Вот код в чем ошибка думаю сами догадаетесь

public String showHtmlFile(L2PcInstance player, String fileName)
{
 String questId = getName();

 String directory = getDescr().toLowerCase();
 String content = HtmCache.getInstance().getHtm("data/scripts/" + directory + "/" + questId + "/" + fileName);

 if (content == null)
 {
  content = HtmCache.getInstance().getHtmForce("data/scripts/quests/" + questId + "/" + fileName);
 }

 if (player != null)
 {
  if (player.getTarget() != null)
  {
   content = content.replaceAll("%objectId%", String.valueOf(player.getTarget().getObjectId()));
  }

  if (content != null)
  {
   NpcHtmlMessage npcReply = new NpcHtmlMessage(5);
   npcReply.setHtml(content);
   npcReply.replace("%playername%", player.getName());
   player.sendPacket(npcReply);
  }
 }
 return content;
}

  • Upvote 1

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


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

String content = HtmCache.getInstance().getHtm("data/scripts/" + directory + "/" + questId + "/" + fileName);

if (content == null)
{
content = HtmCache.getInstance().getHtmForce("data/scripts/quests/" + questId + "/" + fileName);
}

 

По коду же видно если папка "data/scripts/" + directory + "/" + questId + "/" + fileName" пустая, то он перенаправляет на "data/scripts/quests/" + questId + "/" + fileName"

Вопрос: Почему он этого не хочет делать? :(

 

Ладно не суть. Спасибо большое.

 

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

Изменено пользователем Myp3uK

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


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

String content = HtmCache.getInstance().getHtm("data/scripts/" + directory + "/" + questId + "/" + fileName);

if (content == null)
{
content = HtmCache.getInstance().getHtmForce("data/scripts/quests/" + questId + "/" + fileName);
}

 

По коду же видно если папка "data/scripts/" + directory + "/" + questId + "/" + fileName" пустая, то он перенаправляет на "data/scripts/quests/" + questId + "/" + fileName"

Вопрос: Почему он этого не хочет делать? :(

 

Ладно не суть. Спасибо большое.

 

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

Думаю он этого не делает потому что метод getHtm из класса HtmCache в случае отсутствия файла возвращает пустую строку "", а не null.

public String getHtm(final String path)
{
 if (Strings.isNullOrEmpty(path))
 {
  return ""; // avoid possible NPE
 }

 String content = "";
 try
 {
  content = cache.get(path);
 }
 catch (ExecutionException e)
 {
  _log.warn(e.getLocalizedMessage(), e);
 }

 return content;
}

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

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

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


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

Кстати рекомендую всё-же метод showHtmlFile не трогать, а поправить метод getHtm в HtmCache если не хотите что-бы потом возникли проблемы.

  • Upvote 1

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


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

Кстати рекомендую всё-же метод showHtmlFile не трогать, а поправить метод getHtm в HtmCache если не хотите что-бы потом возникли проблемы.

 

Ну я так и сделал :)

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


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

В общем для всех кто столкнулся с данной проблемой решение

public String getHtm(final String path)
{
 if (Strings.isNullOrEmpty(path))
 {
  return null; // avoid possible NPE
 }

 String content = null;
 try
 {
  content = cache.get(path);
 }
 catch (Exception e)
 {
 }

 return content;
}

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


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

Квесты были все рабочие (если используете последний исходный код), значить ваш косяк, и как главный разработчик, советую бросить код (так. как с ним работы очень много, сейчас работаем с silentium, реализация + стабильность, в 100 млн, раз происходит терлиону (т.к терлиона (фрозены)), а силентиум aCis

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


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

Квесты были все рабочие (если используете последний исходный код), значить ваш косяк, и как главный разработчик, советую бросить код (так. как с ним работы очень много, сейчас работаем с silentium, реализация + стабильность, в 100 млн, раз происходит терлиону (т.к терлиона (фрозены)), а силентиум aCis

Там у него был трабл в том, что гугловская либа, использующаяся для кеширывания, выбивала не обработанное исключение в результате чего функция прерывалась не вернув нужного значения, как итог ГС не мог найти пути до html квестов.

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


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

Квесты были все рабочие (если используете последний исходный код), значить ваш косяк, и как главный разработчик, советую бросить код (так. как с ним работы очень много, сейчас работаем с silentium, реализация + стабильность, в 100 млн, раз происходит терлиону (т.к терлиона (фрозены)), а силентиум aCis

 

Было б здорово перейти на силентиум, но есть одно но:

Исходный код доступен ограниченному числу лиц :(

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


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

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

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

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

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

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

Войти

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

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

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

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

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