Myp3uK 8 Опубликовано 2 мая, 2013 (изменено) Доброго времени суток. Поставил последнию ревизию терлионы и есть один баг\лаг\ну или я накосячил Вообщем не работает ни один квест. Для примера возьмем квест 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 файлы. Сколько не пытался найти причину, так и не нашел. Изменено 2 мая, 2013 пользователем Myp3uK Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Demoncool 1110 Опубликовано 2 мая, 2013 Посмотри файл путей scripts Что-то типо такого # Quests Section quests/1_LettersOfLove1/__init__.py quests/2_WhatWomenWant1/__init__.py quests/3_ReleaseDarkelfElder1/__init__.py 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Myp3uK 8 Опубликовано 2 мая, 2013 Пошарил в квестах ядра, нашел такое чудо: 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 Но это работает только в квестах которые прописаны в ядре. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Myp3uK 8 Опубликовано 2 мая, 2013 (изменено) Посмотри файл путей 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" Изменено 2 мая, 2013 пользователем Myp3uK Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
xuser 122 Опубликовано 2 мая, 2013 Пошарил в квестах ядра, нашел такое чудо: 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; } 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Myp3uK 8 Опубликовано 2 мая, 2013 (изменено) 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" Вопрос: Почему он этого не хочет делать? Ладно не суть. Спасибо большое. Еще маленький вопрос, как будет лучше. Квесты в ядре или же отдельно из датапака? Изменено 2 мая, 2013 пользователем Myp3uK Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
xuser 122 Опубликовано 2 мая, 2013 (изменено) 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; } По поводу того что лучше, то думаю лучше хранить квесты в ядре. Изменено 2 мая, 2013 пользователем LeKToR 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
xuser 122 Опубликовано 2 мая, 2013 Кстати рекомендую всё-же метод showHtmlFile не трогать, а поправить метод getHtm в HtmCache если не хотите что-бы потом возникли проблемы. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Myp3uK 8 Опубликовано 2 мая, 2013 Кстати рекомендую всё-же метод showHtmlFile не трогать, а поправить метод getHtm в HtmCache если не хотите что-бы потом возникли проблемы. Ну я так и сделал Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
xuser 122 Опубликовано 2 мая, 2013 В общем для всех кто столкнулся с данной проблемой решение 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; } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Execution! 50 Опубликовано 2 мая, 2013 оО нашу сборку ещё юзают? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DeveloperS_TerlionA 182 Опубликовано 2 мая, 2013 Квесты были все рабочие (если используете последний исходный код), значить ваш косяк, и как главный разработчик, советую бросить код (так. как с ним работы очень много, сейчас работаем с silentium, реализация + стабильность, в 100 млн, раз происходит терлиону (т.к терлиона (фрозены)), а силентиум aCis Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
xuser 122 Опубликовано 2 мая, 2013 Квесты были все рабочие (если используете последний исходный код), значить ваш косяк, и как главный разработчик, советую бросить код (так. как с ним работы очень много, сейчас работаем с silentium, реализация + стабильность, в 100 млн, раз происходит терлиону (т.к терлиона (фрозены)), а силентиум aCis Там у него был трабл в том, что гугловская либа, использующаяся для кеширывания, выбивала не обработанное исключение в результате чего функция прерывалась не вернув нужного значения, как итог ГС не мог найти пути до html квестов. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Myp3uK 8 Опубликовано 3 мая, 2013 Квесты были все рабочие (если используете последний исходный код), значить ваш косяк, и как главный разработчик, советую бросить код (так. как с ним работы очень много, сейчас работаем с silentium, реализация + стабильность, в 100 млн, раз происходит терлиону (т.к терлиона (фрозены)), а силентиум aCis Было б здорово перейти на силентиум, но есть одно но: Исходный код доступен ограниченному числу лиц Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DeveloperS_TerlionA 182 Опубликовано 3 мая, 2013 Исходный код, доступен всем пользователям, которые пишут багрепорты. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты