|
|
|
[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 работает не всегда, только когда мой комп включен. По вечерам часто!
|
|
|
|
Wuu |
27.12.2007, 19:38
|
Apprentice
Сообщений: 279
Регистрация: 2.3.2005 Группа: Пользователи Наличность: 0 Из: Dobele
Пользователь №: 3.196
|
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|