| 
		
	
	
	
	
	   [0.56b] Quest System V1.2a, Автор скрипта и идеи: Breaker.  | 
	 
	    
	  | 
	           | 
	 
   
	 
  
 
	
		| Breaker | 
		
			
			
				   23.11.2007, 20:02
			 
			
			
		 | 
	 
	
		
        	 
  
        		      
  
        		Expert 
        		Сообщений: 529 
        		Регистрация: 25.12.2004         		Группа: Пользователи Наличность: 0         		Из: Москва 
        		Пользователь №: 2.792 
Возраст: 27
  
        		 
        	 
        	   
        | 
       
			
			Данная квест система основанна на работе со строками и загрузкой 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
 
 Вроде как усё =) Будут вопросы либо суда либо в асю =) как смогу так и отвечу.  
			
			
  -------------------- 
Все мои скрипты и сервера:  ftp://sphere@magery.ruFTP работает не всегда, только когда мой комп включен. По вечерам часто!  
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
 
	
		   | 
		   | 
	 
 
	Сообщений в этой теме 
	   Breaker   [0.56b] Quest System V1.2a   23.11.2007, 20:02    Wuu   A ja sprashival u teba etot script nedelki 2 nazad...   23.11.2007, 20:36    ZiRKoT   00:35:ERROR:(questtest.scp,11)Can't resolve ...   25.12.2007, 0:33    Wuu   file nof found ;)    27.12.2007, 19:38       Doberman   
У меня была настроена и работала эта система, пот...   30.10.2019, 23:55        ImProV1zator   
И, если память не подводит, в Sphere.ini смотри O...   31.10.2019, 14:33 
	
 
	2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0) 
	Пользователей: 0  
 
        				  
  | 
 |