Помощь - Поиск - Пользователи - Календарь
Полная версия: Квесты.
UoKit.com Форумы > Ultima Online : Dev > Sphere Server > Архив готовых скриптов
Ardarion
Сегодня хорошее настроение и в связи с этим решил выложить систему автоквестов.
Система такая - 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]


Надеюсь описал понятно. Всем спасибо за внимание. Ткните лицом в недочёты smile.gif
Cors
извеняюся за тупой вопрос но как сделать чтобы был виден русский язык. зашел в блокнот сохранил в формате UTF-8 вызвал диалог на что сфера мне выдала такую ошибку
21:12:ERROR:Undefined symbol 'd_Quest_Page'
21:12:ERROR:Invalid RES_DIALOG.
меня кадировку на ANSI прикрасно работает blink.gif тока русского не видит =)))
Ardarion
Зайди в EmEditor поставь Юникод (UTF-8) и сними галочку "Добавить сигнатуру Юникод (ВОМ)".
d`ArcZeal
Опять пропаганда секретной программы.
Пишите скрипты в блокнотах! smile.gif
Cors
Ardarion дай плз сылку чтобы скачать етот эдитор русский, а то я анг скачал сохраняю делаю как ты написал сфера вобще не запускаеться-(
Barracoon
Цитата(Cors @ 6.7.2007, 20:47) *
Ardarion дай плз сылку чтобы скачать етот эдитор русский, а то я анг скачал сохраняю делаю как ты написал сфера вобще не запускаеться-(
Дык... Воспользуйся советом DarkZeal'а - используй блокнот вместо EmEditor'а rolleyes.gif
Вобще непонимаю за что многие EmEditor любят... на редкость ужасный редактор, с кучей абсолютно ненужных функций, да и в навесок ресурсы жрет как собака
Ardarion
Ну во первых на вкус и цвет, как известно, товарищей нет ... А во вторых с современным железом, те ресурсы которые он жрёт - не такая уж и проблема... Для написание скриптов под сферу - тулза хорошая... для языков программирования таких как С++ С# итд конечно лучше использовать чтонибудть вроде MVS 2005.
Cors
сфера ето конечно оч весело, чтобы работал этот скрипт я делаю сначала сохраняю в формает анси, делай перезагрузку скриптов, сохраняю в формате утв-8 делай опять перезагрузку скритов и он работает и больше не выдает такую ошибку , правда при рестарте сфере опять выежываеться=))))
14:32:ERROR:Undefined symbol 'd_Quest_Page'
14:32:ERROR:Invalid RES_DIALOG.
DIKIY
не забывайте, что это для 5x клиентов, под 3 нужно переделывать т.к. нет кнопки quest
Viktar
А что тут под 2.0.3 клиент нужно исправлять? и делать?
Viktar
Жду от вас, очень ответ! Пожалуйсто
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.