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

При нажатии на "Задание" НПС говорит "нет квеста у меня"

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

 

Какие байпасы?

У меня у всех НПС содержание HTM такое:

Master Auron:
 
Добро пожаловать в гильдию воинов города Глудин.
 
Я учитель Auron. Чем могу помочь?
 
[npc_%objectId%_SkillList|Изучить умения]
 
[npc_%objectId%_Quest|Квест]

 

[Quest _007_ATripBegins ariel_q0007_0201.htm|"Ответить утвердительно"]

post-14202-0-69235600-1485003875_thumb.png

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


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

Загрузить можно через scripts.cfg

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


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

[Quest _007_ATripBegins ariel_q0007_0201.htm|"Ответить утвердительно"]

Понятно. У меня не работает такая форма. Может я в чем-то туплю. В общем пока что обойдусь формой Link попробую. Если будут проблемы, попробую вернуться к указанной тобой.

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

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


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

Загрузить можно через scripts.cfg

У меня нет такого файла вообще в папке сервера.

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


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

а что-то подобное? QuestMasterHandler.java

Еще во время запуска ГС пишет количество загруженных КВ. Попробуй удалить кв и опять засунуть в сборку. Если количество увеличится, то всё норм.

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


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

а что-то подобное? QuestMasterHandler.java

Еще во время запуска ГС пишет количество загруженных КВ. Попробуй удалить кв и опять засунуть в сборку. Если количество увеличится, то всё норм.

Такого тоже похожего ничего нет. Как я увижу в куче бегущих строк нужную строку с квестами? 

В общем беда. 

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


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

Нет хендлер тебе не нужен тебе нужны  скрипты квестов

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


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

квеста нет, либо у класа имя другое

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


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

Комбо путями дошел до такого:

https://drive.google.com/open?id=0B0nVMbF9bveaenk1TGQxYmpxOTA

Вот тебе программа для скринов заливаешь каждый раз по разному 

 

(НЕ РЕКЛАМА) для удобства

https://app.prntscr.com/ru/

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

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


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

Вот тебе программа для скринов заливаешь каждый раз по разному 

 

(НЕ РЕКЛАМА) для удобства

https://app.prntscr.com/ru/

Ок.

Тут лежит скрипт квеста - http://prntscr.com/dyh7x1

Сам код почти идентичный квесту _157_RecoverSmuggled


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

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


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

Итак. Есть прогресс. Прогресс следующий:
Стандартная форма [npc_%objectId%_Quest|Название квеста.] теперь работает. Причина: правильный код в скрипте квеста, который я кидал по очереди из каждого уже созданного квеста в свой. В моем случае мне помог код:

@@override

public String onTalk(NpcInstance npc, QuestState st)
{
String htmltext = "noquest";
int cond = st.getCond();
if(cond == 0)
{
if(st.getPlayer().getLevel() >= 5)
{
htmltext = "333333_02.htm";
return htmltext;

}

Здесь описано действие, выполняемое при выборе пункта [npc_%objectId%_Quest|Название квеста.] в стандартном диалоге НПС.
А также условия (уровень, раса персонажа) тоже описаваются тут. И как видно, указано название htm страницы диалога, которая продолжает квест.

Да, именно скрипт квеста активирует переход между HTM страницами диалога квеста. В каком порядке указано тоже в скрипте. 
Затем активируется квест нажатием на надпись "Согласиться" в HTM диалоге, но только в том случае, если стоит правильная ссылка в странице _№квеста_02.htm на страницу _№квеста_03.htm. Иначе квест не активируется, потому что в коде скрипта прописана активация квеста при активации HTM страницы _№квеста_03.htm.

Выглядит этот кусок кода следующим образом:

public String onEvent(String event, QuestState st, NpcInstance npc)
{
String htmltext = event;
if(event.intern().equalsIgnoreCase("333333_03.htm"))
{
st.setCond(1);
st.setState(STARTED);
st.playSound(SOUND_ACCEPT);
}
return htmltext;
}
При этом статус квеста из состояния 0 переходит в состояние 1 с помощью команды st.setCond(1);
 

А вот дальше еще разбираюсь. Не падает квест итем из моба и в меню квеста пустая форма без текста, хотя в клиенте в questname-e.dat вроде заполнил.
По идее по коду:

public String onKill(NpcInstance npc, QuestState st)
{
long count = st.getQuestItemsCount(CRYSTALL);
if(count < 1 && st.getCond() == 1)
{
st.giveItems(CRYSTALL, 1);
if(count == 0)
{
st.playSound(SOUND_MIDDLE);
st.setCond(2);
}
else
st.playSound(SOUND_ITEMGET);
}
return null;
}

При убийстве квестового моба должен выпать итем и состояние квеста смениться с 1 на 2. Но ни того, ни другого не происходит пока что.

Кстати, на мысли о необходимости поменять именно код в скрипте меня навел просмотр кода файла Quest.java из нескомпилированных файлов сервера. Потому как мне напророчили необходимость создания квеста еще на этапе предкомпиляции и я уже начал разбираться с компиляцией сервера и даже разобрался и уже потом, читая этот файлик, трохец разобрался. :db:

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

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


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

Кто в курсе, как убрать WARN ItemHandler: Duplicate handler for item: 8659(Coffer, Coffer)?

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


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

Ошибка из - за того, что значения одинаковые. (дублируются).

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


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

Ошибка из - за того, что значения одинаковые. (дублируются).

Чел, я спросил как убрать. Что это я понял. А для того, что бы убрать, надо еще и понять, где значения дублируются.

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

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


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

Не понятно. То ли сборка глючит, то ли писать код надо иначе.
Если 1 квест висит на НПС. То он не подхватывает его с начальной страницы диалога ни в какую.

http://prntscr.com/dywweh

Если 2 или больше, то только после перезапуска скриптов через меню админа в игре. И то вместо название квестов показывается "[]". Это не дело.

http://prntscr.com/dywwo7

А дальше уже более менее.

http://prntscr.com/dywwv0

 

 

Такое ощущение, что при обычном запуске gameserver эти скрипты вообще не загружаются.

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

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


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

Ты бы хоть код квеста привел своего чтоб понятней было.

Хотя даже так могу сказать вероятную причину - ты или нужных нпс в нем не зарегал как стартовых или же в onTalk не обрабатываешь нужный стейт/кондишн.

 

а по [] вместо названий - это потому-что туда должны подставляться определенные строки из NpcString-e.dat/NpcString-ru.dat клиента, вместо спецкода вставленного сервером в это место диалога.

а т.к. на стороне клиента этих строк нет - подставляются пустые строки.

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

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


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

Там же черным по белому написанно что и где дублируеться. И вообще не вижу смысла вам помогать. Удаляюсь с темы.

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

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


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

Ты бы хоть код квеста привел своего чтоб понятней было.

Хотя даже так могу сказать вероятную причину - ты или нужных нпс в нем не зарегал как стартовых или же в onTalk не обрабатываешь нужный стейт/кондишн.

 

а по [] вместо названий - это потому-что туда должны подставляться определенные строки из NpcString-e.dat/NpcString-ru.dat клиента, вместо спецкода вставленного сервером в это место диалога.

а т.к. на стороне клиента этих строк нет - подставляются пустые строки.

Код квеста минимальный и простой как пробка. Пожалуйста, код ниже. НПС стартовый есть в OnTalk все стоит, иначе как я указал выше, никакое количество рестартов script-ов не заставило бы квест работать. Это же логика.

package quests;
 
import l2ft.commons.util.Rnd;
import l2ft.gameserver.model.instances.NpcInstance;
import l2ft.gameserver.model.quest.Quest;
import l2ft.gameserver.model.quest.QuestState;
import l2ft.gameserver.scripts.ScriptFile;
 
public class _333331_GuildMageEntry extends Quest implements ScriptFile
{
 
 
 
 
 
public void onLoad()
{
}
 
public void onReload()
{
}
 
public void onShutdown()
{
}
 
public _333331_GuildMageEntry()
{
super(false);
 
addStartNpc(90096);
addKillId(80001);
 
 
 
}
 
public String onEvent(String event, QuestState st, NpcInstance npc)
{
String htmltext = event;
if(event.intern().equalsIgnoreCase("333331_03.htm"))
{
st.setCond(1);
st.setState(STARTED);
st.playSound(SOUND_ACCEPT);
}
return htmltext;
}
 
public String onTalk(NpcInstance npc, QuestState st)
{
String htmltext = "noquest";
int cond = st.getCond();
if(cond == 0)
{
if(st.getPlayer().getLevel() >= 5)
{
htmltext = "333331_02.htm";
return htmltext;
}
htmltext = "333331_01.htm";
st.exitCurrentQuest(true);
}
else if(cond == 1)
htmltext = "333331_05.htm";
else if(cond == 2)
{
 
st.giveItems(1048, 1);
 
htmltext = "333331_06.htm";
st.playSound(SOUND_FINISH);
st.exitCurrentQuest(true);
}
return htmltext;
}
 
public String onKill(NpcInstance npc, QuestState st)
{
int npcId = npc.getNpcId();
 
if(npcId == 80001  &&  st.getCond() == 1 )
{
 
st.playSound(SOUND_JACKPOT);
st.setCond(2);
}
return null;
}
}

 

Из квеста убрал даже простой набор итемов с квестового моба, потому что начинается вообще бардак. Вместо указанного итема, например ID = 1024 Руда из квеста 5-го уровня на Жаб в Talking Island падает хрень какая-то левая, никак в коде не указанная...

 

 

 

Еще сразу вопрос по теме. Где указывается, что квест одноразовый/многоразовый не понял. В скрипте не заметил ничего такого.

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

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


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

Там же черным по белому написанно что и где дублируеться. И вообще не вижу смысла вам помогать. Удаляюсь с темы.

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

Друг мой. Пока это всего лишь тренировочный полигон, а не проект. Думать самому java+sql+еще неизвестно что, не имея никакого опыта и никаких мануалов в интернете...если все так будут думать, то никто ничего не сделает. Я на ходу не имея опыта и знаний по java и так далее делаю вещи, которые нигде до меня, возможно не были описаны на форумах, потому что все знают, но молчат, такие как вы. И ваша фраза "удаляюсь из темы" бред собачий. Вы ни одного сообщения с полезной информацией не написали тут. 

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

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


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

Все. Бог мне помог. Интуитивно не имея никаких оснований, что так прокатит, изменил начальный HTM НПС таким образом:
[npc_%objectId%_Quest _название_ява_файла_квеста1|Задание 1]

[npc_%objectId%_Quest _название_ява_файла_квеста2|Задание 2]

[npc_%objectId%_Quest _название_ява_файла_квеста3|Задание 3]
Между "npc_%objectId%_Quest" и "_название_ява_файла_квеста№" пробел должен стоять. Тут плохо видно просто.
И хер у какого НПС такая форма есть!

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

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


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

но вобще-то это неправильно.

 

сам сервер на ссылку

 

[npc_%objectId%_Quest|Квест]

 

должен был отправить в onTalk на:

1. в случае когда квест не взят в ветку if(cond == 0)

2. если квест взят то на другие варианты, в зависимости от текущего cond

 

а ссылки типа [npc_%objectId%_Quest имя квеста параметры|бла-бла] отправляют в onEvent, а не в onTalk

 

З.Ы. за поаторяемость квеста отвечает параметр метода exitCurrentQuest - если в нем задавать true, то все записи о квесте стирает при окончании квеста и значит квест типа можно снова повторить, если false, то по завершении все стирает но после оставляет одну запись с состоянием квеста, в котором выставляет статус "завершено". есть еще один вариант, но тебе он в данный момент не нужен - я про квесты делающиеся раз в сутки.

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

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


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

но вобще-то это неправильно.

 

сам сервер на ссылку

 

[npc_%objectId%_Quest|Квест]

 

должен был отправить в onTalk на:

1. в случае когда квест не взят в ветку if(cond == 0)

2. если квест взят то на другие варианты, в зависимости от текущего cond

 

а ссылки типа [npc_%objectId%_Quest имя квеста параметры|бла-бла] отправляют в onEvent, а не в onTalk

 

З.Ы. за поаторяемость квеста отвечает параметр метода exitCurrentQuest - если в нем задавать true, то все записи о квесте стирает при окончании квеста и значит квест типа можно снова повторить, если false, то по завершении все стирает но после оставляет одну запись с состоянием квеста, в котором выставляет статус "завершено". есть еще один вариант, но тебе он в данный момент не нужен - я про квесты делающиеся раз в сутки.

Спасибо!) 

Кстати, пока еще актуальна проблема:

при запуске gameserver по умолчанию не подхватываются никакие созданные мной квесты до перезапуска скриптов из панели ГМа.

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

Даже консоль gameserver в конце пишет: "Не найден квест №1", "Не найден квест №2" и так далее.

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


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

Классный квест  !

!!! серверная часть HF, структура у серваков может отличатся !!!

Пример:
1) тупо копипастим в те же директории те же файлы/папки, и те же квест_строки:
   \GameServer\data\scripts\quests\_624_TheFinestIngredientsPart1.java
   переименовываем в 
   \GameServer\data\scripts\quests\_16000_SkillOfBooks.java (в моём случае)
   
   \GameServer\data\html-ru\quests\_624_TheFinestIngredientsPart1\
   переименовываем папку в 
   \GameServer\data\html-ru\quests\_16000_SkillOfBooks\
   (копируем со всеми файлами, файлы в папке не переименовываем, вообще пока не трогаем)
   
   в папке system клиента редактируем QuestName-ru.dat, тупо копируем все строки нужного 
   нам квеста. В моём случае это квест 624, вставляем их в самый конец и меняем:
   ID квеста с 624 на 16000, 
   расположение НПС который будет выдовать квест,
   ID стартового НПС (в моём случае НПС_32169),
   ну можно для шика и флажки, квестовой локи и НПС выставить.   

 

 

2) открываем файл _16000_SkillOfBooks.java и редактируем четыре строчки:
   с public class _624_TheFinestIngredientsPart1 extends Quest implements ScriptFile {
   на public class _16000_SkillOfBooks extends Quest implements ScriptFile {
   
   с private static int JEREMY = 31521;
   на private static int Mila = 32169;
   
   с public _624_TheFinestIngredientsPart1() {
   на public _16000_SkillOfBooks() {
   
   с addStartNpc(JEREMY);
   на addStartNpc(Mila);

 

 

3) Важно !!! перед манипуляциями с серверными библиотеками, с начало их за бекапить.
   Открываем scripts.jar архиватором, из папки quests вытаскиваем:
   _624_TheFinestIngredientsPart1.class 
   и сразу переименовываем в
   _16000_SkillOfBooks.class

Рис.3  

 

4) Открываем _16000_SkillOfBooks.class, меняем константу пути к папке нашего квеста,
   для шика и имя НПСа
   !!! не путать со ссылками на константу, все ссылки на константу заменятся сами !!!

Рис.4  

 

На вкладке Methods меняем ID стартового НПСа (формат числа: HEX), у которого
будем брать/сдавать квест.

Рис.5  

Сохраняем изменения в _16000_SkillOfBooks.class.
Запихиваем обратно в ту же папку тем же архиватором.

 

5) Теперь идём в папку \GameServer\data\html-ru\quests\_16000_SkillOfBooks\
   и меняем линки в диалогах с НПС:
   с [Quest _624_TheFinestIngredientsPart1 jeremy_q0624_0104.htm|Сказать, что Вы поможете.]
   на [Quest _16000_SkillOfBooks jeremy_q0624_0104.htm|Сказать, что Вы поможете.]
   
   с [Quest _624_TheFinestIngredientsPart1 jeremy_q0624_0201.htm|"Вот, пожалуйста."]
   на [Quest _16000_SkillOfBooks jeremy_q0624_0201.htm|"Вот, пожалуйста."]

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

 

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

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


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

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

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

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

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

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

Войти

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

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

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

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

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