Помощь - Поиск - Пользователи - Календарь
Полная версия: [0.56b] Quest System V1.2a
UoKit.com Форумы > Ultima Online : Dev > Sphere Server > Архив готовых скриптов
Breaker
Данная квест система основанна на работе со строками и загрузкой htm-файлов в диалоги игры, к примеру как на оффициальных эмуляторах Lineage2, есть окно и есть html файлы в которых все описания квестов и их целей.

Если вы надумаете использовать данный скрипт, есть небольшая просьба, не забывайте подписывать автора (то есть меня), а то присуждение чужого плохой грех =)

Нус поехали, не для ламеров...

Определение переменных/флагов для работы системы.
Код

[DEFNAME QUEST_FLAGS]
guestsFile               scripts\SphereQuests.txt
questHtmlPath            html\
questflag_greeting       00
questflag_accepted       01
questflag_success        02
questflag_failed         04
questflag_complete       08

Сама квестовая система ака ENGINE(движок).
Код

//& #60;============================================================================
=========>
//<------------------------------------------------------------------------------------->
//<- Ultima Online: The Odyssey                                                        ->
//<- Sphere Version: 56x (56b-Nightly)                                                 ->
//<- Script Author: Breaker (Cache)                                                    ->
//<- Description: Quest System v1.2a                                                   ->
//<-                                                                                   ->
//<- Last edit date: 14.04.2007                                                        ->
//<------------------------------------------------------------------------------------->
//& #60;============================================================================
=========>

//[Параметры]--------------------------------
// nil - Не чего.
// ------------------------------------------

//[Переменные]-------------------------------
// RequestQuests  - Какие квесты должны быть выполнены для того чтоб взять квест
// RequestSkills  - Какие скиллы должны быть у игрока для того чтоб взять квест
// RequestItems   - Какие предметы должны быть у игрока для того чтоб взять квест
// RequestCTime   - Какое кол-во игрового времени должны быть у игрока для того
//                  чтоб взять квест
// ------------------------------------------
// RequireKillNPC - Что надо убить для выполнения квеста
// GiveItemOnKill - Предметы которые будут доваться при смерти моба из списка RequireKillNPC.
// RequireItems   - Что надо собрать для выполнения квеста
// Award          - Список награды за выполнение квеста.
// ------------------------------------------
// HtmlGreeting   - HTML-файл приветствия
// HtmlAccepted   - HTML-файл уже взятого квеста, если игрок опять подошёл к
//                  квестологу но квест ещё не готов
// HtmlSuccess    - HTML-файл успешного выполнения квеста, ну награда и всё такое
// HtmlFailed     - HTML-файл неудачного выполнения квеста, пусть проходит ещё раз.
// ------------------------------------------


//<------------------------------------------------------------------------------------->
//<[ARGS - QuestID,Value]--------------------------------------------------------------->
//<------------------------------------------------------------------------------------->
[FUNCTION GetQuestValue]
IF !(<FILE.FILEEXIST <DEF.guestsFile>>)
   SERV.LOG Quest System: Quest file nof found, system cancelled.
ELSE
   IF (<FILE.OPEN <DEF.guestsFile>>)
      LOCAL.Lines = "<FILE.FILELINES <DEF.guestsFile>>"

      FOR 1 <LOCAL.Lines>
        LOCAL.Line = "<FILE.READLINE <LOCAL._FOR>>"

        IF StrMatch("0","<LOCAL.Line>")
           // Empty string
        ELIF !StrCMPi("//","<StrSub 1 2 <LOCAL.Line>>")
           // Comment string
        ELIF !StrMatch("0","<QFGetQuestID <LOCAL.Line>>")
           LOCAL.QFID = "<QFGetQuestID <LOCAL.Line>>"
        ELIF !StrCMPi("<LOCAL.QFID>","<ARGV[0]>") && !StrMatch("0","<QFGetQuestVal <ARGV[1]>=<LOCAL.Line>>")
           FILE.CLOSE
           RETURN <QFGetQuestVal <ARGV[1]>=<LOCAL.Line>>
        ENDIF
        IF !StrCMPi("<LOCAL.QFID>","<ARGV[0]>") && StrMatch("","<StrEat <ARGS>>")
           FILE.CLOSE
           RETURN 1
        ENDIF
      ENDFOR
   ENDIF
   FILE.CLOSE
ENDIF
RETURN 0

//<------------------------------------------------------------------------------------->
//<[ARGS - 1: return list count, 0 - return list of quests]----------------------------->
//<------------------------------------------------------------------------------------->
[FUNCTION GetQuestsList]
IF !(<FILE.FILEEXIST <DEF.guestsFile>>)
   SERV.LOG Quest System: Quest file nof found, system cancelled.
ELSE
   IF (<FILE.OPEN <DEF.guestsFile>>)
      LOCAL.Lines = "<FILE.FILELINES <DEF.guestsFile>>"
      FOR 1 <LOCAL.Lines>
        LOCAL.Line = "<FILE.READLINE <LOCAL._FOR>>"

        IF StrMatch("0","<LOCAL.Line>")
           // Empty string
        ELIF !StrCMPi("//","<StrSub 1 2 <LOCAL.Line>>")
           // Comment string
        ELIF !StrMatch("0","<QFGetQuestID <LOCAL.Line>>")
           LOCAL.LIST .= ",<QFGetQuestID <LOCAL.Line>>"
           LOCAL.NUMS += 1
        ENDIF
      ENDFOR
   ENDIF
   FILE.CLOSE
   RETURN <QVAL <ARGN>?<dLOCAL.NUMS>:<LOCAL.LIST>>
ENDIF
RETURN 0

//<------------------------------------------------------------------------------------->
[FUNCTION QFGetQuestID]
ARGS=<Explode [] ,<ARGS>>
IF !StrCMPi("<ARGV[2]>","QUEST")
   RETURN <ARGV[3]>
ENDIF
RETURN 0

//<------------------------------------------------------------------------------------->
[FUNCTION QFGetQuestVal]
IF StrMatch("*=*", "<ARGS>")
   ARGS=<Explode =,<ARGS>>
   IF !StrCMPi("<ARGV[1]>","<ARGV[2]>")
      IF StrCMPi("nil","<ARGV[3]>")
         LOCAL.RESULT=<ARGV[3]>
         LOCAL.IDX=4
         WHILE !StrMatch("","<ARGV[<EVAL <LOCAL.IDX>>]>")
          LOCAL.RESULT .= ,<ARGV[<EVAL <LOCAL.IDX>>]>
          LOCAL.IDX += 1
         ENDWHILE
         RETURN <LOCAL.RESULT>
      ENDIF
   ENDIF
ENDIF
RETURN 0



//<------------------------------------------------------------------------------------->
//<[ARRV[0] - QuestHTMLFile, ARGV[1] - Page]-------------------------------------------->
//<------------------------------------------------------------------------------------->
[FUNCTION GetQuestHtml]
LOCAL.ARG1=<StrArg <ARGS>>
LOCAL.ARG2=<StrEat <ARGS>>
LOCAL.ARG2=<QVAL (<EVAL 0<LOCAL.ARG2>>)?<LOCAL.ARG2>:1>
IF (<FILE.FILEEXIST <DEF.questHtmlPath><LOCAL.ARG1>>)
   IF (<FILE.OPEN <DEF.questHtmlPath><LOCAL.ARG1>>)
      LOCAL.IsRead=0
      FOR 1 <FILE.FILELINES <DEF.questHtmlPath><LOCAL.ARG1>>
//      LOCAL.String = <StrToUpper <FILE.READLINE <LOCAL._FOR>>>
        LOCAL.String = <FILE.READLINE <LOCAL._FOR>>
        IF StrMatch("</PAGE>","<LOCAL.String>")
           LOCAL.IsRead=0
        ENDIF
        IF (<LOCAL.IsRead>==<EVAL <LOCAL.ARG2>>)
           IF StrMatch("0","<LOCAL.QText>")
              LOCAL.QText = <FILE.READLINE <LOCAL._FOR>>
           ELSE
              LOCAL.QText .= <FILE.READLINE <LOCAL._FOR>>
           ENDIF
        ENDIF
        IF StrMatch("<PAGE *","<LOCAL.String>")
           LOCAL.IsRead=<StrSub 7 1 <StrTrim(<LOCAL.String>)>>
        ENDIF
      ENDFOR
   ENDIF
   FILE.CLOSE
   RETURN <LOCAL.QText>
ENDIF
RETURN 0



//<------------------------------------------------------------------------------------->
//<[ARGS - QuestHTMLFile]--------------------------------------------------------------->
//<------------------------------------------------------------------------------------->
[FUNCTION GetQuestHtmlPages]
IF (<FILE.FILEEXIST <DEF.questHtmlPath><ARGS>>)
   IF (<FILE.OPEN <DEF.questHtmlPath><ARGS>>)
      LOCAL.Pages=0
      FOR 1 <FILE.FILELINES <DEF.questHtmlPath><ARGS>>
//      LOCAL.String = <StrToUpper <FILE.READLINE <LOCAL._FOR>>>
        LOCAL.String = <FILE.READLINE <LOCAL._FOR>>
        IF StrMatch("<PAGE *","<LOCAL.String>")
           LOCAL.Pages += 1
        ENDIF
      ENDFOR
   ENDIF
   FILE.CLOSE
   RETURN <LOCAL.Pages>
ENDIF
RETURN 0



//<------------------------------------------------------------------------------------->
//<[Requests Quest Checks]-------------------------------------------------------------->
//<------------------------------------------------------------------------------------->
[FUNCTION QRequests]
IF (<GetQuestValue <ARGS>>)
   IF (<ACCOUNT.TOTALCONNECTTIME> >= <GetQuestValue <ARGS>,RequestCTime>)
      IF (<QRequestQuests <ARGS>>) && (<QRequestSkills <ARGS>>) && (<QRequestItems <ARGS>>)
         RETURN 1
      ENDIF
   ENDIF
ENDIF
RETURN 0

//<------------------------------------------------------------------------------------->
[FUNCTION QRequestQuests]
IF !StrMatch("0","<GetQuestValue <ARGS>,RequestQuests>")
   ARGS="<GetQuestValue <ARGS>,RequestQuests>"
   FOR 0 <EVAL <ARGV>-1>
     IF !(<TAG0.<ARGV[<LOCAL._FOR>]>>&questflag_complete)
        RETURN 0
     ENDIF
   ENDFOR
ENDIF
RETURN 1

//<------------------------------------------------------------------------------------->
[FUNCTION QRequestSkills]
IF !StrMatch("0","<GetQuestValue <ARGS>,RequestSkills>")
   ARGS="<GetQuestValue <ARGS>,RequestSkills>"
   FOR 0 <EVAL <ARGV>-1>
     LOCAL.ARG1=<StrArg <ARGV[<LOCAL._FOR>]>>
     LOCAL.ARG2=<StrEat <ARGV[<LOCAL._FOR>]>>
     IF StrMatch("0","<LOCAL.ARG2>")
        LOCAL.KEY=<LOCAL.ARG1>
        LOCAL.VALUE=1
     ELIF (<dLOCAL.ARG1>)
        LOCAL.KEY=<LOCAL.ARG2>
        LOCAL.VALUE=<LOCAL.ARG1>
     ELIF (<dLOCAL.ARG2>)
        LOCAL.KEY=<LOCAL.ARG1>
        LOCAL.VALUE=<LOCAL.ARG2>
     ELSE
        SERV.LOG @Quest System: Error of "QRequestSkills" check in quest "<ARGS>".
        RETURN 0
     ENDIF
     IF (<OBJ.<LOCAL.KEY>> < <LOCAL.VALUE>)
        RETURN 0
     ENDIF
   ENDFOR
ENDIF
RETURN 1

//<------------------------------------------------------------------------------------->
[FUNCTION QRequestItems]
IF !StrMatch("0","<GetQuestValue <ARGS>,RequestItems>")
   ARGS="<GetQuestValue <ARGS>,RequestItems>"
   FOR 0 <EVAL <ARGV>-1>
     LOCAL.ARG1=<StrArg <ARGV[<LOCAL._FOR>]>>
     LOCAL.ARG2=<StrEat <ARGV[<LOCAL._FOR>]>>
     IF StrMatch("0","<LOCAL.ARG2>")
        LOCAL.KEY=<LOCAL.ARG1>
        LOCAL.VALUE=1
     ELIF (<dLOCAL.ARG1>)
        LOCAL.KEY=<LOCAL.ARG2>
        LOCAL.VALUE=<LOCAL.ARG1>
     ELIF (<dLOCAL.ARG2>)
        LOCAL.KEY=<LOCAL.ARG1>
        LOCAL.VALUE=<LOCAL.ARG2>
     ELSE
        SERV.LOG @Quest System: Error of "QRequestItems" check in quest "<ARGS>".
        RETURN 0
     ENDIF
     IF !(<RESTEST <dLOCAL.VALUE> <LOCAL.KEY>>)
        RETURN 0
     ENDIF
   ENDFOR
ENDIF
RETURN 1



//<------------------------------------------------------------------------------------->
//<[Give Quest Items List]-------------------------------------------------------------->
//<------------------------------------------------------------------------------------->
[FUNCTION QGiveQuestItems]
IF (<GetQuestValue <ARGS>>)
   IF !(<GetQuestValue <ARGS>,GiveQuestItems>)
      RETURN 1
   ENDIF
   ARGS="<GetQuestValue <ARGS>,GiveQuestItems>"
   FOR 0 <EVAL <ARGV>-1>
     LOCAL.ARG1=<StrArg <ARGV[<LOCAL._FOR>]>>
     LOCAL.ARG2=<StrEat <ARGV[<LOCAL._FOR>]>>
     IF StrMatch("0","<LOCAL.ARG2>")
        LOCAL.KEY=<LOCAL.ARG1>
        LOCAL.VALUE=1
     ELIF (<dLOCAL.ARG1>)
        LOCAL.KEY=<LOCAL.ARG2>
        LOCAL.VALUE=<LOCAL.ARG1>
     ELIF (<dLOCAL.ARG2>)
        LOCAL.KEY=<LOCAL.ARG1>
        LOCAL.VALUE=<LOCAL.ARG2>
     ELSE
        SERV.LOG @Quest System: error of "QGiveQuestItems" set in quest "<ARGS>".
        RETURN 0
     ENDIF
     SERV.GiveItem <LOCAL.KEY>,<dLOCAL.VALUE>,<FINDLAYER.21.UID>
     NEW.ATTR |= attr_newbie
   ENDFOR
   RETURN 1
ENDIF
RETURN 0


//<------------------------------------------------------------------------------------->
//<[Require kill init function]--------------------------------------------------------->
//<------------------------------------------------------------------------------------->
[FUNCTION QInitReqKills]
IF (<GetQuestValue <ARGS>>)
   IF StrMatch("0","<GetQuestValue <ARGS>,RequireKillNPC>")
      RETURN 1
   ENDIF
   LOCAL.QID=<ARGS>
   ARGS="<GetQuestValue <ARGS>,RequireKillNPC>"
   FOR 0 <EVAL <ARGV>-1>
     LOCAL.ARG1=<StrArg <ARGV[<LOCAL._FOR>]>>
     LOCAL.ARG2=<StrEat <ARGV[<LOCAL._FOR>]>>
     IF StrMatch("0","<LOCAL.ARG2>")
        LOCAL.KEY=<LOCAL.ARG1>
        LOCAL.VALUE=1
     ELIF (<dLOCAL.ARG1>)
        LOCAL.KEY=<LOCAL.ARG2>
        LOCAL.VALUE=<LOCAL.ARG1>
     ELIF (<dLOCAL.ARG2>)
        LOCAL.KEY=<LOCAL.ARG1>
        LOCAL.VALUE=<LOCAL.ARG2>
     ELSE
        SERV.LOG @Quest System: error of "QInitReqKills" set in quest "<ARGS>".
        RETURN 0
     ENDIF
     IF !StrMatch("0","<GetQuestValue <LOCAL.QID>,GiveItemOnKill>")
        QInitItemOnKill <LOCAL.QID>,<LOCAL._FOR>,<LOCAL.KEY>
     ELIF !(<TAG0.Q<LOCAL.KEY>_killed>)
        TAG.Q<LOCAL.KEY>_killed = <dLOCAL.VALUE>,0
     ENDIF
   ENDFOR
ENDIF
RETURN 0

//<------------------------------------------------------------------------------------->
[FUNCTION QGetReqItemValue]
IF !StrMatch("0","<GetQuestValue <StrArg <ARGS>>,RequireItems>")
   LOCAL.ItemID=<StrArg <StrEat <ARGS>>>
   ARGS="<GetQuestValue <StrArg <ARGS>>,RequireItems>"
   FOR 0 <EVAL <ARGV>-1>
     LOCAL.ARG1=<StrArg <ARGV[<dLOCAL._FOR>]>>
     LOCAL.ARG2=<StrEat <ARGV[<dLOCAL._FOR>]>>
     IF StrMatch("0","<LOCAL.ARG2>")
        LOCAL.KEY=<LOCAL.ARG1>
        LOCAL.VALUE=0
     ELIF (<dLOCAL.ARG1>)
        LOCAL.KEY=<LOCAL.ARG2>
        LOCAL.VALUE=<LOCAL.ARG1>
     ELIF (<dLOCAL.ARG2>)
        LOCAL.KEY=<LOCAL.ARG1>
        LOCAL.VALUE=<LOCAL.ARG2>
     ELSE
        SERV.LOG @Quest System: error of "QGetReqItemValue" in function "QInitReqKills".
     ENDIF
     IF !StrCMPi("<LOCAL.ItemID>","<LOCAL.KEY>")
        RETURN <dLOCAL.VALUE>
     ENDIF
   ENDFOR
ENDIF
RETURN 0

//<------------------------------------------------------------------------------------->
[FUNCTION QInitItemOnKill]
LOCAL.QID=<StrArg <ARGS>>
LOCAL.Count=<StrArg <StrEat <ARGS>>>
LOCAL.NpcID=<StrArg <StrEat <StrEat <ARGS>>>>
ARGS="<GetQuestValue <LOCAL.QID>,GiveItemOnKill>"
IF (<ARGV[<dLOCAL.Count>]>)
   LOCAL.ARG1=<StrArg <ARGV[<dLOCAL.Count>]>>
   LOCAL.ARG2=<StrEat <ARGV[<dLOCAL.Count>]>>
   IF StrMatch("0","<LOCAL.ARG2>")
      LOCAL.ItemID=<LOCAL.ARG1>
      LOCAL.ItemCount=1
   ELIF (<dLOCAL.ARG1>)
      LOCAL.ItemID=<LOCAL.ARG2>
      LOCAL.ItemCount=<LOCAL.ARG1>
   ELIF (<dLOCAL.ARG2>)
      LOCAL.ItemID=<LOCAL.ARG1>
      LOCAL.ItemCount=<LOCAL.ARG2>
   ELSE
      SERV.LOG @Quest System: error of "QInitItemOnKill" in function "QInitReqKills".
   ENDIF
   TAG.Q<LOCAL.NpcID>_killed=<LOCAL.ItemID>,<dLOCAL.ItemCount>,<QGetReqItemValue <LOCAL.QID>,<LOCAL.ItemID>>
   RETURN 1
ENDIF
RETURN 0



//<------------------------------------------------------------------------------------->
//<[Requires check functions]----------------------------------------------------------->
//<------------------------------------------------------------------------------------->
[FUNCTION QHaveRequires]
IF (<GetQuestValue <ARGS>>)
   IF (<QHaveReqItems <ARGS>>) && (<QHaveReqKills <ARGS>>)
      RETURN 1
   ENDIF
ENDIF
RETURN 0

//<------------------------------------------------------------------------------------->
[FUNCTION QHaveReqItems]
IF !StrMatch("0","<GetQuestValue <ARGS>,RequireItems>")
   ARGS="<GetQuestValue <ARGS>,RequireItems>"
   FOR 0 <EVAL <ARGV>-1>
     IF !(<RESTEST <ARGV[<dLOCAL._FOR>]>>)
        RETURN 0
     ENDIF
   ENDFOR
ENDIF
RETURN 1

//<------------------------------------------------------------------------------------->
[FUNCTION QHaveReqKills]
IF !StrMatch("0","<GetQuestValue <ARGS>,RequireKillNPC>")
   IF !StrMatch("0","<GetQuestValue <ARGS>,GiveItemOnKill>")
      RETURN 1
   ENDIF
   ARGS="<GetQuestValue <ARGS>,RequireKillNPC>"
   FOR 0 <EVAL <ARGV>-1>
     LOCAL.ARG1=<StrArg <ARGV[<LOCAL._FOR>]>>
     LOCAL.ARG2=<StrEat <ARGV[<LOCAL._FOR>]>>
     IF StrMatch("0","<LOCAL.ARG2>")
        LOCAL.KEY=<LOCAL.ARG1>
        LOCAL.VALUE=1
     ELIF (<dLOCAL.ARG1>)
        LOCAL.KEY=<LOCAL.ARG2>
        LOCAL.VALUE=<LOCAL.ARG1>
     ELIF (<dLOCAL.ARG2>)
        LOCAL.KEY=<LOCAL.ARG1>
        LOCAL.VALUE=<LOCAL.ARG2>
     ELSE
        SERV.LOG @Quest System: error of "QHaveReqKills" check in quest "<ARGS>".
        RETURN 0
     ENDIF
     LOCAL.QTAG=<StrEat <TAG0.Q<LOCAL.KEY>_killed>>
     IF (<dLOCAL.QTAG> < <dLOCAL.VALUE>)
        RETURN 0
     ENDIF
   ENDFOR
ENDIF
RETURN 1


//<------------------------------------------------------------------------------------->
//<[Requires consume function]---------------------------------------------------------->
//<------------------------------------------------------------------------------------->
[FUNCTION QConsumeRequires]
IF (<GetQuestValue <ARGS>>)
   QClearRequireKillNPC <ARGS>
   IF (<GetQuestValue <ARGS>,RequireItems>)
      ARGS="<GetQuestValue <ARGS>,RequireItems>"
      FOR 0 <EVAL <ARGV>-1>
        CONSUME <ARGV[<dLOCAL._FOR>]>
      ENDFOR
   ENDIF
   RETURN 1
ENDIF
RETURN 0

[FUNCTION QClearRequireKillNPC]
IF !StrMatch("0","<GetQuestValue <ARGS>,RequireKillNPC>")
   ARGS="<GetQuestValue <ARGS>,RequireKillNPC>"
   FOR 0 <EVAL <ARGV>-1>
     LOCAL.ARG1=<StrArg <ARGV[<LOCAL._FOR>]>>
     LOCAL.ARG2=<StrEat <ARGV[<LOCAL._FOR>]>>
     IF StrMatch("0","<LOCAL.ARG2>")
        LOCAL.KEY=<LOCAL.ARG1>
        LOCAL.VALUE=1
     ELIF (<dLOCAL.ARG1>)
        LOCAL.KEY=<LOCAL.ARG2>
        LOCAL.VALUE=<LOCAL.ARG1>
     ELIF (<dLOCAL.ARG2>)
        LOCAL.KEY=<LOCAL.ARG1>
        LOCAL.VALUE=<LOCAL.ARG2>
     ELSE
        SERV.LOG @Quest System: error of "QClearRequireKillNPC" check in quest "<ARGS>".
        RETURN 0
     ENDIF
     TAG.Q<LOCAL.KEY>_killed=
   ENDFOR
ENDIF
RETURN 1


//<------------------------------------------------------------------------------------->
//<[Require kill counter]--------------------------------------------------------------->
//<------------------------------------------------------------------------------------->
[FUNCTION QNeedToKill]
//SYSMESSAGE UID: <ARGS>
//SYSMESSAGE NAME: <UID.<ARGS>.NAME>
//SYSMESSAGE IsNPC: <QVAL <UID.<ARGS>.NPC>?Yes:No>
//SYSMESSAGE OBODY: <UID.<ARGS>.OBODY>
IF (<UID.<ARGS>.NPC>)
   LOCAL.NAME=<UID.<ARGS>.NAME>
   LOCAL.QTAG=Q<UID.<ARGS>.OBODY>_killed
   IF (<TAG0.<LOCAL.QTAG>>)
      ARGS=<TAG0.<LOCAL.QTAG>>
      IF StrMatch("i_*","<ARGV[0]>")
         IF (RAND(<ARGV[1]>)==0) && (<ARGV[2]> > <RESCOUNT <ARGV[0]>>)
            SERV.GiveItem <ARGV[0]>,1,<FINDLAYER.21.UID>
            NEW.ATTR |= attr_newbie
            LOCAL.NAME = <NEW.NAME>
            SYSMESSAGE @25, Quest: <LOCAL.NAME>'s gived - <RESCOUNT <ARGV[0]>>/<ARGV[2]>.
         ENDIF
         RETURN 1
      ELIF (<ARGV[0]> > <ARGV[1]>)
         TAG.<LOCAL.QTAG>=<ARGV[0]>,<EVAL (<ARGV[1]>+1)>
         SYSMESSAGE @129, Quest: <LOCAL.NAME>s killed - <EVAL (<ARGV[1]>+1)>/<ARGV[0]>.
         RETURN 1
      ENDIF
   ENDIF
ENDIF
RETURN 0


//<------------------------------------------------------------------------------------->
//<[Award Creator]---------------------------------------------------------------------->
//<------------------------------------------------------------------------------------->
[FUNCTION QGiveAward]
IF (<GetQuestValue <ARGS>>)
   IF !(<GetQuestValue <ARGS>,Award>)
      RETURN 1
   ENDIF
   ARGS="<GetQuestValue <ARGS>,Award>"
   FOR 0 <EVAL <ARGV>-1>
     LOCAL.VALUE="<StrArg <ARGV[<LOCAL._FOR>]>>"
     LOCAL.KEY = "<QVAL (<dLOCAL.VALUE>)?<StrEat <ARGV[<LOCAL._FOR>]>>:<StrArg <ARGV[<LOCAL._FOR>]>> >"
     LOCAL.VALUE="<QVAL (<dLOCAL.VALUE>)?<dLOCAL.VALUE>:1>
     SERV.GiveItem <LOCAL.KEY>,<dLOCAL.VALUE>,<FINDLAYER.21.UID>
   ENDFOR
   RETURN 1
ENDIF
RETURN 0


//<------------------------------------------------------------------------------------->
//<[Function - QuestDialog][ARGV - QuestID]--------------------------------------------->
//<------------------------------------------------------------------------------------->
[FUNCTION QuestDialog]
IF (<GetQuestValue <ARGS>>)
   IF (<TAG0.<ARGS>>&questflag_success) && !(<QHaveRequires <ARGS>>)
      TAG.<ARGS> &= ~questflag_success
   ELIF (<TAG0.<ARGS>>&questflag_accepted) && (<QHaveRequires <ARGS>>)
      TAG.<ARGS> |= questflag_success
   ENDIF

//   SYSMESSAGE Quest <ARGS> Flags: <TAG0.<ARGS>>

   CTAG.LastQuest=<ARGS>
   IF (<TAG0.<ARGS>>==questflag_greeting)
      IF (<GetQuestsList 1> >= 20)
         SYSMESSAGE @33, You can't take any more quests.
         RETURN 1
      ENDIF
      SYSMESSAGE @097, QDialog: d_quest_greeting
      SDIALOG d_quest_greeting

   ELIF (<TAG0.<ARGS>>&questflag_complete)
      SYSMESSAGE @73, This quest already completed.

   ELIF (<TAG0.<ARGS>>&questflag_failed)
      SYSMESSAGE @095, QDialog: d_quest_failed
      SDIALOG d_quest_failed

   ELIF (<TAG0.<ARGS>>&questflag_success)
      SYSMESSAGE @095, QDialog: d_quest_success
      SDIALOG d_quest_success

   ELIF (<TAG0.<ARGS>>&questflag_accepted)
     SYSMESSAGE @095, QDialog: d_quest_accepted
     SDIALOG d_quest_accepted
   ENDIF
ENDIF


//<------------------------------------------------------------------------------------->
//<------------------------------------------------------------------------------------->
//<------------------------------------------------------------------------------------->
[DIALOG d_quest_greeting]
0,0
page 0
resizepic 200 150 5170 360 400
gumppic 220 180 92
gumppic 260 180 93
gumppic 375 180 93
gumppic 420 180 93
gumppic 515 180 94
dtext  340  152    0 Quest Log
dtext  275  185    0 <GetQuestValue <CTAG.LastQuest>,Name>

LOCAL.HTML="HtmlGreeting"
LOCAL.Pages=<EVAL <GetQuestHtmlPages <GetQuestValue <CTAG.LastQuest>,<LOCAL.HTML>>>>

FOR 1 <EVAL <LOCAL.Pages>+1>
  page <EVAL <LOCAL._FOR>>
  dtext  225  524    0 Page <EVAL <LOCAL._FOR>>/<EVAL <LOCAL.Pages>>
  dhtmlgump 230 230 313 240 0 1 <GetQuestHtml <GetQuestValue <CTAG.LastQuest>,<LOCAL.HTML>>,<LOCAL._FOR>>
  IF (<LOCAL._FOR> > 1)
     dtext  235 483    0 Previous
     button 295 480 9790 9791 0 <EVAL <LOCAL._FOR>-1> 0
  ENDIF
  IF (<LOCAL._FOR> < <EVAL <LOCAL.Pages>>)
     dtext  455 483    0 Next
     button 500 480 9790 9791 0 <EVAL <LOCAL._FOR>+1> 0
  ELSE
     dtext  455 483    0 Accept
     button 500 480 9790 9791 1 0 1
  ENDIF
ENDFOR

[DIALOG d_quest_greeting BUTTON]
ON=1
TAG0.<CTAG.LastQuest> |= questflag_accepted
QInitReqKills <CTAG.LastQuest>
IF (<GetQuestValue <CTAG.LastQuest>,GiveQuestItems>)
   QGiveQuestItems <CTAG.LastQuest>
ENDIF
SYSMESSAGE @73, Quest "<GetQuestValue <CTAG.LastQuest>,Name>" accepted.


//<------------------------------------------------------------------------------------->
//<------------------------------------------------------------------------------------->
//<------------------------------------------------------------------------------------->
[DIALOG d_quest_accepted]
0,0
page 0
resizepic 200 150 5170 360 400
gumppic 220 180 92
gumppic 260 180 93
gumppic 375 180 93
gumppic 420 180 93
gumppic 515 180 94
dtext  340  152    0 Quest Log
dtext  275  185    0 <GetQuestValue <CTAG.LastQuest>,Name>

LOCAL.HTML="HtmlAccepted"
LOCAL.Pages=<EVAL <GetQuestHtmlPages <GetQuestValue <CTAG.LastQuest>,<LOCAL.HTML>>>>

FOR 1 <EVAL <LOCAL.Pages>+1>
  page <EVAL <LOCAL._FOR>>
  dtext  225  524    0 Page <EVAL <LOCAL._FOR>>/<EVAL <LOCAL.Pages>>
  dhtmlgump 230 230 313 240 0 1 <GetQuestHtml <GetQuestValue <CTAG.LastQuest>,<LOCAL.HTML>>,<LOCAL._FOR>>
  IF (<LOCAL._FOR> > 1)
     dtext  235 483    0 Previous
     button 295 480 9790 9791 0 <EVAL <LOCAL._FOR>-1> 0
  ENDIF
  IF (<LOCAL._FOR> < <EVAL <LOCAL.Pages>>)
     dtext  455 483    0 Next
     button 500 480 9790 9791 0 <EVAL <LOCAL._FOR>+1> 0
  ELSE
     dtext  445 483    0 Process
     button 500 480 9790 9791 1 0 1
  ENDIF
ENDFOR

[DIALOG d_quest_accepted BUTTON]
ON=1
QInitReqKills <CTAG.LastQuest>
//SYSMESSAGE @73, Quest "<GetQuestValue <CTAG.LastQuest>,Name>" processed.
//SYSMESSAGE All Requires Complete? <QVAL <QHaveRequires <CTAG.LastQuest>>?Yes:No>


//<------------------------------------------------------------------------------------->
//<------------------------------------------------------------------------------------->
//<------------------------------------------------------------------------------------->
[DIALOG d_quest_success]
0,0
page 0
resizepic 200 150 5170 360 400
gumppic 220 180 92
gumppic 260 180 93
gumppic 375 180 93
gumppic 420 180 93
gumppic 515 180 94
dtext  340  152    0 Quest Log
dtext  275  185    0 <GetQuestValue <CTAG.LastQuest>,Name>

LOCAL.HTML="HtmlSuccess"
LOCAL.Pages=<EVAL <GetQuestHtmlPages <GetQuestValue <CTAG.LastQuest>,<LOCAL.HTML>>>>

FOR 1 <EVAL <LOCAL.Pages>+1>
  page <EVAL <LOCAL._FOR>>
  dtext  225  524    0 Page <EVAL <LOCAL._FOR>>/<EVAL <LOCAL.Pages>>
  dhtmlgump 230 230 313 240 0 1 <GetQuestHtml <GetQuestValue <CTAG.LastQuest>,<LOCAL.HTML>>,<LOCAL._FOR>>
  IF (<LOCAL._FOR> > 1)
     dtext  235 483    0 Previous
     button 295 480 9790 9791 0 <EVAL <LOCAL._FOR>-1> 0
  ENDIF
  IF (<LOCAL._FOR> < <EVAL <LOCAL.Pages>>)
     dtext  455 483    0 Next
     button 500 480 9790 9791 0 <EVAL <LOCAL._FOR>+1> 0
  ELSE
     dtext  437 483    0 Complete
     button 500 480 9790 9791 1 0 1
  ENDIF
ENDFOR

[DIALOG d_quest_success BUTTON]
ON=1
IF (<QHaveRequires <CTAG.LastQuest>>)
   QConsumeRequires <CTAG.LastQuest>
   QGiveAward <CTAG.LastQuest>
   TAG.<CTAG.LastQuest> |= questflag_complete
   SYSMESSAGE @73, Quest "<GetQuestValue <CTAG.LastQuest>,Name>" completed.
ELSE
   SYSMESSAGE You do not have required objects for complete this quest.
ENDIF


//<------------------------------------------------------------------------------------->
//<------------------------------------------------------------------------------------->
//<------------------------------------------------------------------------------------->
[DIALOG d_quest_failed]
0,0
page 0
resizepic 200 150 5170 360 400
gumppic 220 180 92
gumppic 260 180 93
gumppic 375 180 93
gumppic 420 180 93
gumppic 515 180 94
dtext  340  152    0 Quest Log
dtext  275  185    0 <GetQuestValue <CTAG.LastQuest>,Name>

LOCAL.HTML="HtmlFailed"
LOCAL.Pages=<EVAL <GetQuestHtmlPages <GetQuestValue <CTAG.LastQuest>,<LOCAL.HTML>>>>

FOR 1 <EVAL <LOCAL.Pages>+1>
  page <EVAL <LOCAL._FOR>>
  dtext  225  524    0 Page <EVAL <LOCAL._FOR>>/<EVAL <LOCAL.Pages>>
  dhtmlgump 230 230 313 240 0 1 <GetQuestHtml <GetQuestValue <CTAG.LastQuest>,<LOCAL.HTML>>,<LOCAL._FOR>>
  IF (<LOCAL._FOR> > 1)
     dtext  235 483    0 Previous
     button 295 480 9790 9791 0 <EVAL <LOCAL._FOR>-1> 0
  ENDIF
  IF (<LOCAL._FOR> < <EVAL <LOCAL.Pages>>)
     dtext  455 483    0 Next
     button 500 480 9790 9791 0 <EVAL <LOCAL._FOR>+1> 0
  ELSE
     dtext  437 483    0 Complete
     button 500 480 9790 9791 1 0 1
  ENDIF
ENDFOR

[DIALOG d_quest_failed BUTTON]
ON=1
QConsumeRequires <CTAG.LastQuest>
TAG.<CTAG.LastQuest> =
SYSMESSAGE @33, Quest "<GetQuestValue <CTAG.LastQuest>,Name>" failed.


//& #60;============================================================================
=========>
//<------------------------------------------------------------------------------------->
//<[Quests List]------------------------------------------------------------------------>
//<------------------------------------------------------------------------------------->
//& #60;============================================================================
=========>
[DIALOG d_quests_list]
0,0
page 0
resizepic 200 150 5170 420 400
resizepic 246 206 9300 340  25
//resizepic 240 232 9350 340 294
gumppic 220 180 92
gumppic 260 180 93
gumppic 375 180 93
gumppic 455 180 93
gumppic 570 180 94
gumppic 220 180 9004
dtext  345  152    0 Current quests list
dtext  275  185    0 <NAME>

gumppic 245 529 2362
dtext  260 524   0 Not completed
gumppic 400 529 2361
dtext  415 524   0 Completed
gumppic 515 529 2360
dtext  530 524   0 Failed

LOCAL.QList="<StrEat <GetQuestsList>>"
FOR 1 <GetQuestsList 1>
LOCAL.Quest=<StrArg <LOCAL.QList>>
IF (<TAG0.<LOCAL.Quest>>)
    IF (<TAG0.<LOCAL.Quest>>&questflag_complete)
       LOCAL.QC += 1
    ELIF (<TAG0.<LOCAL.Quest>>&questflag_success)
       resizepic 235 <EVAL 225+(<LOCAL._FOR>*21)> 9300 300 22
       gumppic 245 <EVAL 230+(<LOCAL._FOR>*21)> 2361
       dtext  265 <EVAL 226+(<LOCAL._FOR>*21)>    0 <GetQuestValue <LOCAL.Quest>,Name>
       button 540 <EVAL 230+(<LOCAL._FOR>*21)> 2181 2181 1 0 <LOCAL._FOR>
       LOCAL.QC += 1
    ELIF (<TAG0.<LOCAL.Quest>>&questflag_failed)
       resizepic 235 <EVAL 225+(<LOCAL._FOR>*21)> 9300 300 22
       gumppic 245 <EVAL 230+(<LOCAL._FOR>*21)> 2360
       dtext  265 <EVAL 226+(<LOCAL._FOR>*21)>    0 <GetQuestValue <LOCAL.Quest>,Name>
       button 540 <EVAL 230+(<LOCAL._FOR>*21)> 2181 2181 1 0 <LOCAL._FOR>
       LOCAL.QF += 1                        
    ELSE
       resizepic 235 <EVAL 225+(<LOCAL._FOR>*21)> 9300 300 22
       gumppic 245 <EVAL 230+(<LOCAL._FOR>*21)> 2362
       dtext  265 <EVAL 226+(<LOCAL._FOR>*21)>    0 <GetQuestValue <LOCAL.Quest>,Name>
       button 540 <EVAL 230+(<LOCAL._FOR>*21)> 2181 2181 1 0 <LOCAL._FOR>
       LOCAL.QT += 1
    ENDIF
ENDIF
LOCAL.QList=<StrEat <LOCAL.QList>>
ENDFOR
dtext  270  209    0 Completed: <dLOCAL.QC>
dtext  380  209    0 Failed: <dLOCAL.QF>
dtext  470  209    0 Taked <dLOCAL.QT>/20


[DIALOG d_quests_list BUTTON]
ON=1 65000
LOCAL.QList="<StrEat <GetQuestsList>>"
FOR 1 <GetQuestsList 1>
LOCAL.Quest=<StrArg <LOCAL.QList>>
LOCAL.QList=<StrEat <LOCAL.QList>>
IF (<ARGN>==<LOCAL._FOR>)
    QConsumeRequires <LOCAL.Quest>
    SYSMESSAGE @53, Quest "<GetQuestValue <LOCAL.Quest>,Name>" aborted.
    TAG.<LOCAL.Quest>=
    SDIALOG d_quests_list
    RETURN 1
ENDIF
ENDFOR
SDIALOG d_quests_list
RETURN 1


//& #60;============================================================================
=========>
//<------------------------------------------------------------------------------------->
//<[Quest System EVENTs]---------------------------------------------------------------->
//<------------------------------------------------------------------------------------->
//& #60;============================================================================
=========>
[EVENTS e_quest_system]
ON=@Kill
SRC.QNeedToKill <ARGO.UID>


ON=@CharClientTooltip
IF StrMatch("c_q_*","<ACT.ID>")
   ADDCLILOC 1072269
ENDIF


ON=@ItemClientTooltip
IF StrMatch("i_q_*","<ACT.BaseID>")
   ADDCLILOC 1072351
ENDIF


ON=@ItemDropOn_Item
IF StrMatch("i_q_*","<ACT.BaseID>")
   IF (<ARGO.BaseID>==<ACT.BaseID>)
   ELIF (<ARGO.UID>!=<SRC.FINDLAYER.21.UID>)
      SRC.SYSMESSAGE @33, You can't pull out a quest items.
      RETURN 1
   ENDIF
ENDIF


ON=@ItemDropOn_Char
IF StrMatch("i_q_*","<ACT.BaseID>")
   IF (<ARGO.UID>!=<SRC.UID>)
      SRC.SYSMESSAGE @33, You can't pull out a quest items.
      RETURN 1
   ENDIF
ENDIF


ON=@ItemDropOn_Ground
IF StrMatch("i_q_*","<ACT.BaseID>")
   SRC.SYSMESSAGE @33, You can't drop a quest items.
   ACT.BOUNCE
   RETURN 1
ENDIF

[EOF]



Пример квеста, то есть структура файла описания квестов для движка.
Код

[Quest Q0001]
Name=Guard Raimon: Hearings in city.
HtmlGreeting=0001_greeting.htm
HtmlAccepted=0001_accepted.htm
HtmlSuccess=0001_success.htm
HtmlFailed=nil
RequestQuests=nil
RequestSkills=nil
RequestItems=nil
RequestCTime=nil
GiveQuestItems=nil
RequireKillNPC=c_skeleton, c_slime
GiveItemOnKill=i_q_bone 1, i_q_plazma 1
RequireItems=5 i_q_bone, 10 i_q_plazma
Award=i_katana,250 i_gold


Как сделать квест:
1) Создаём секцию в "файла описания квестов", пример выше. Тот что
[Quest Q0001]

2) Создаём папку в корне сферы под названием html, и создаём в этой папке файлы 0001_greeting.htm, 0001_accepted.htm, 0001_success.htm, 0001_failed.htm, в которых содержиться текст с описанием той стадии квеста к которой пренадлежит данный файл, то есть при преветствии игрока "greeting" пишем там "привет, как дела...."

Система HTML файла
Код

<page 1>
Страница первая
<basefont color=black>Чёрный текст<br>
<center>Центрированный текст</center>
и так далее..
</page>
<page 2>
Страница вторая и так далее...
<basefont color=black>Ohh... you fail job.<br>
<center>Текст.</center>
</page>
.....
.....
<page n>
<basefont color=black>Ohh... you fail job.<br>
<center>Bye.</center>
</page>

Страниц может быть хоть 100.... система будет их открывать постранично...

На всех игроков необходмо повесить эвент e_quest_system, в данном евенте для 55 сферы надо удалить триггеры ON=@ItemClientTooltip которые необхоимы для клиентов 5.0.х версии.

Для сферы 56b и клиентов 5.0.х+ в SphereTables.scp или SphereSkills.scp, с секции [SKILLCLASS X], добавить:
Код

ON=@UserQuestButton
SRC.DIALOG d_quests_list
RETURN 1


Вроде как усё =) Будут вопросы либо суда либо в асю =) как смогу так и отвечу.
Wuu
A ja sprashival u teba etot script nedelki 2 nazad ,prishlos samamu napisat (cerez nehochu) biggrin.gif
Ehhh...
ZiRKoT
00:35:ERROR:(questtest.scp,11)Can't resolve <FILE.FILEEXIST scripts\SphereQuests.txt>
00:35:ERROR:(questtest.scp,11)Undefined symbol ''
00:35:(questtest.scp,12)Quest System: Quest file nof found, system cancelled.
Wuu
file nof found wink.gif
ImProV1zator
Код
guestsFile               scripts\Freedom\Quests\questsinfo.txt 


Код
Can't resolve <FILE.FILEEXIST scripts\Freedom\Quests\questsinfo.txt>
19:25:ERROR:(SphereQuests.scp,55)Undefined symbol ''
19:25:(SphereQuests.scp,56)Quest System: Quest file nof found, system cancelled.



файл txt в папке лежит
Aimed
Цитата(ImProV1zator @ 29.10.2019, 17:27) *

Код
guestsFile               scripts\Freedom\Quests\questsinfo.txt 


Код
Can't resolve <FILE.FILEEXIST scripts\Freedom\Quests\questsinfo.txt>
19:25:ERROR:(SphereQuests.scp,55)Undefined symbol ''
19:25:(SphereQuests.scp,56)Quest System: Quest file nof found, system cancelled.

файл txt в папке лежит


Зачем ты лезешь поднимать свой сервер если такую банальную проблему сам не в состоянии решить? Почти 12 лет прошло, а автор с того момента так и не ответил. По твоему сейчас он тебе ответит?)
ImProV1zator
Цитата(Aimed @ 30.10.2019, 12:18) *

Зачем ты лезешь поднимать свой сервер если такую банальную проблему сам не в состоянии решить? Почти 12 лет прошло, а автор с того момента так и не ответил. По твоему сейчас он тебе ответит?)

У меня была настроена и работала эта система, потом некоторые файлы со временем потерялись и сейчас восстанавливаю.Проблема может быть в самой сфере (менял), она не видит txt файл (который сохранился без изменений)
Doberman
Цитата(ImProV1zator @ 30.10.2019, 13:57) *

У меня была настроена и работала эта система, потом некоторые файлы со временем потерялись и сейчас восстанавливаю.Проблема может быть в самой сфере (менял), она не видит txt файл (который сохранился без изменений)


Проверяй пути к файлам:
Код

[DEFNAME QUEST_FLAGS]
guestsFile               scripts\SphereQuests.txt
questHtmlPath            html\
questflag_greeting       00
questflag_accepted       01
questflag_success        02
questflag_failed         04
questflag_complete       08

И, если память не подводит, в Sphere.ini смотри OF_FileCommands.
ImProV1zator
Цитата(Doberman @ 30.10.2019, 23:55) *

И, если память не подводит, в Sphere.ini смотри OF_FileCommands.


БЛАГОДАРЮ ! заработало!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.