Система такая - 1 НПС = 1 Квест. При желании можно сделать как и в WoW ( 1 НПС = Много поочерёдных квестов ). Так что будем считать это системой для начинания.
Скрипт самой системы ( Диалог для новых клиентов, те кто на 2.0.3. переделайте ) :
Код
[EVENTS e_Quester]
On=@Click
if (<src.Tag0.Quest_<eval <Tag0.Quest>>_Complete> == 1)
message @0489,1,1 <Name>
return 1
endif
if (<src.Tag0.Quest_<eval <Tag0.Quest>>>)
message @0489,1,1 [?] <Name>
return 1
elseif (<src.Quest_<eval <Tag0.Quest>>_CanAccept>)
message @0489,1,1 [!] <Name>
return 1
endif
On=@DClick
if (<src.flags> & statf_dead)
return 1
endif
if (<Distance> > 3)
src.sysmessage <def.Sysmessage_Color> Для разговора с <sex ним/ней> подойдите ближе.
return 1
endif
if (<src.Quest_<eval <Tag0.Quest>>_CanAccept>)
if (<src.Tag0.Quest_<eval <Tag0.Quest>>_Complete> == 1)
return 1
else
dialog d_New_Quest
return 1
endif
endif
[DIALOG d_New_Quest]
10,30
nomove
resizepic 0 0 5054 340 400
gumppictiled 10 10 320 380 2624
checkertrans 10 10 320 380
if (<src.Tag0.Quest_<eval <Tag0.Quest>>>)
dhtmlgump 15 35 315 330 0 1 <def.BFONT_YELLOW><def.H6><Quest_<eval <Tag0.Quest>>_Waiting><def.H6E><def.BFONTE>
else
dhtmlgump 15 35 315 330 0 1 <def.BFONT_YELLOW><def.H6><Quest_<eval <Tag0.Quest>>_Description><Quest_<eval <Tag0.Quest>>_Award><def.H6E><def.BFONTE>
endif
if (<src.Tag0.Quest_<eval <Tag0.Quest>>>)
button 10 370 4005 4007 1 0 3
dtext 45 370 07fe Выполнено
else
button 10 370 4005 4007 1 0 1
dtext 45 370 07fe Отказаться
button 230 370 4005 4007 1 0 2
dtext 265 370 07fe Принять
endif
[DIALOG d_New_Quest Button]
ON=1 // Отказаться
ON=2 // Принять
if (<src.flags> & statf_dead)
return 1
endif
if (<Distance> > 3)
src.sysmessage <def.Sysmessage_Color> Подойдите ближе.
return 1
endif
if !(<src.Tag0.Quest_<eval <Tag0.Quest>>>)
if (<src.Tag0.QuestSlot> < 15)
Try src.Tag0.Quest_<eval <Tag0.Quest>> = 1
Try src.Quest_<eval <Tag0.Quest>>_Accept <uid>
Try src.Tag0.QuestSlot = <src.Tag0.QuestSlot> + 1
src.sysmessage <def.Sysmessage_Color> Журнал Заданий обновлён.
else
src.sysmessage <def.Sysmessage_Color> Журнал Заданий полон!
endif
else
src.sysmessage <def.Sysmessage_Color> У Вас уже есть это задание!
endif
ON=3 // Выполнено
if (<Distance> > 3)
src.sysmessage <def.Sysmessage_Color> Подойдите ближе.
return 1
endif
if (<src.flags> & statf_dead)
return 1
endif
if (<src.Tag0.Quest_<eval <Tag0.Quest>>>)
if (<src.Quest_<eval <Tag0.Quest>>_Complete_Test>)
Try src.Quest_<eval <Tag0.Quest>>_Complete <uid>
else
src.sysmessage <def.Sysmessage_Color> Вы не выполнили задание, которое <sex дал/дала> Вам <Name>!
endif
endif
[EOF]
Пример скрипта - квеста. Для удобства советую создать папку Quests и создавать файлы с номером и описанием , например : 1.ScorpionQueen.scp
Код
[FUNCTION Quest_1_CanAccept]
// Функция - может ли игрок взять данный квест
// Обязательно должно быть возвращение из функции!!
// return 1 - может
// return 0 - не может
// Пример :
// if (<restest 15 i_ingot_iron>)
// return 1
// else
// return 0
// endif
[FUNCTION Quest_1_Name]
// Функция - показывает название квеста во всех диалогах
// Пример :
// return Мой первый квест
[FUNCTION Quest_1_Description]
// Функция - диалог квестового НПС.
// Пример :
// return Принеси мне то, незнаю что.
[FUNCTION Quest_1_Waiting]
// Функция - диалог ждущего НПС.
// Пример :
// return Мне уже надоело ждать дружище! Давай быстрей!
[FUNCTION Quest_1_Accept]
// Функция - действия при получении квеста.
// Пример :
// Tag0.Quest_1 = 1 // Обязательный параметр. Получаем квест под номером 1.
[FUNCTION Quest_1_Award]
// Функция - Описание награды в диалогах.
// Пример :
// return <def.BR><def.BR>Выполнив задание Вы получите 2.000 монет
[FUNCTION Quest_1_Mission]
// Функция - статус выполнения квеста.
// Пример :
// return <def.BR><def.BR> Вы убили <eval <Tag0.Orcs>> из 20
[FUNCTION Quest_1_Complete_Test]
// Функция - Проверяет выполнен ли квест
// Обязательно должно быть возвращение из функции!!
// return 1 - выполнен
// return 0 - не выполнен
// Пример :
// if (<restest 15 i_ingot_iron>)
// return 1
// else
// return 0
// endif
[FUNCTION Quest_1_Clear]
// Функция - действия при нажатии кнопки "Отказаться"
// Пример :
// Tag0.Quest_1 = // Обязательный параметр. Отменяем квест под номером 1.
// Tag0.QuestSlot = <Tag0.QuestSlot> - 1 // Обязательный параметр. Освобождаем один слот.
[FUNCTION Quest_1_Complete]
// Функция - Игрок выполняет квест.
// Пример :
// Tag0.Quest_1 = // Обязательный параметр. Отменяем квест под номером 1.
// Tag0.QuestSlot = <Tag0.QuestSlot> - 1 // Обязательный параметр. Освобождаем один слот.
// Tag0.Quest_1_Complete = 1 // Обязательный параметр. Квест под номером 1 выполнен.
// serv.newitem i_gold
// new.Amount = 2000
// new.bounce
// Квестовый НПС.
[CHARDEF c_q_Valorn]
DEFNAME = c_q_Valorn
ID = c_man
NAME = Valorn
CAN = MT_EQUIP|MT_USEHANDS|MT_WALK|MT_RUN|MT_MALE
TEVENTS = e_Quester // Обязательный параметр. Указываем что он квестер.
On=@Create
Tag0.Quest = 1 // Обязательный параметр. Указываем какой квест даёт этот НПС.
Color = Colors_Skin
STR = 100
DEX = 100
INT = 100
On=@Hit
return 1
On=@GetHit
return 1
On=@SpellEffect
return 1
On=@NPCRestock
[EOF]
Дилог со всеми квестами игрока.
Код
[DIALOG d_Quest_Page]
10,30
nomove
resizepic 0 0 5054 340 400
gumppictiled 10 10 320 380 2624
checkertrans 10 10 320 380
dorigin 30 45
dhtmlgump 10 10 320 50 0 0 <def.BFONT_YELLOW><def.CENTER>Журнал Заданий [<eval <Tag0.QuestSlot>>/15]<def.CENTERE><def.BFONTE>
for 999
if <Tag0.Quest_<eval <local._for>>>
button +0 *20 5601 5605 1 0 <eval <local._for>>
if (<Quest_<eval <local._for>>_Complete_Test>)
dtext +25 +-3 07fe <Quest_<eval <local._for>>_Name> [Выполнен]
else
dtext +25 +-3 07fe <Quest_<eval <local._for>>_Name>
endif
endif
endfor
[DIALOG d_Quest_Page Button]
ON=0
cTag0.QuestListPick =
ON=1 999
cTag0.QuestListPick = <argn>
dialogclose d_Quest_Page
sdialog d_Quest_Info
[DIALOG d_Quest_Info]
10,30
nomove
resizepic 0 0 5054 340 400
gumppictiled 10 10 320 380 2624
checkertrans 10 10 320 380
dhtmlgump 10 10 320 30 0 0 <def.BFONT_DYELLOW><def.CENTER><def.H4><Quest_<eval <cTag0.QuestListPick>>_Name><def.H4A><def.CENTERE><def.BFONTE>
dhtmlgump 15 35 315 330 0 1 <def.BFONT_YELLOW><def.H6><Quest_<eval <cTag0.QuestListPick>>_Description><Quest_<eval <cTag0.QuestListPick>>_Award><Quest_<eval <cTag0.QuestListPick>>_Mission><def.H6E><def.BFONTE>
button 10 370 4005 4007 1 0 1
dtext 45 370 07fe Отказаться
button 250 370 4005 4007 1 0 2
dtext 285 370 07fe Назад
[DIALOG d_Quest_Info Button]
ON=1
Try Quest_<eval <cTag0.QuestListPick>>_Clear
dialogclose d_Quest_Info
dialog d_Quest_Page
ON=2
dialogclose d_Quest_Info
dialog d_Quest_Page
[EOF]
Надеюсь описал понятно. Всем спасибо за внимание. Ткните лицом в недочёты