Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> [0.56b] Quest System V1.2a, Автор скрипта и идеи: Breaker.
Breaker
сообщение 23.11.2007, 20:02
Сообщение #1


******

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.ru
FTP работает не всегда, только когда мой комп включен. По вечерам часто!
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Wuu
сообщение 23.11.2007, 20:36
Сообщение #2


****

Apprentice
Сообщений: 279
Регистрация: 2.3.2005
Группа: Пользователи
Наличность: 0
Из: Dobele
Пользователь №: 3.196



A ja sprashival u teba etot script nedelki 2 nazad ,prishlos samamu napisat (cerez nehochu) (IMG:style_emoticons/default/biggrin.gif)
Ehhh...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ZiRKoT
сообщение 25.12.2007, 0:33
Сообщение #3


**

Группа: Пользователи
Наличность: 0
Пользователь №: 9.075
Возраст: 18



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.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Wuu
сообщение 27.12.2007, 19:38
Сообщение #4


****

Apprentice
Сообщений: 279
Регистрация: 2.3.2005
Группа: Пользователи
Наличность: 0
Из: Dobele
Пользователь №: 3.196



file nof found (IMG:style_emoticons/default/wink.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ImProV1zator
сообщение 29.10.2019, 19:27
Сообщение #5


*****

Journeyman
Сообщений: 346
Регистрация: 22.11.2009
Группа: Пользователи
Наличность: 0
Пользователь №: 12.232
Возраст: 20



Код
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 в папке лежит


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 30.10.2019, 12:18
Сообщение #6


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8846
Пользователь №: 15.607



Цитата(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 лет прошло, а автор с того момента так и не ответил. По твоему сейчас он тебе ответит?)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ImProV1zator
сообщение 30.10.2019, 13:57
Сообщение #7


*****

Journeyman
Сообщений: 346
Регистрация: 22.11.2009
Группа: Пользователи
Наличность: 0
Пользователь №: 12.232
Возраст: 20



Цитата(Aimed @ 30.10.2019, 12:18) *

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

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


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Doberman
сообщение 30.10.2019, 23:55
Сообщение #8


******

Expert
Сообщений: 793
Регистрация: 5.2.2006
Группа: Пользователи
Наличность: 5479
Пользователь №: 5.032



Цитата(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.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ImProV1zator
сообщение 31.10.2019, 14:33
Сообщение #9


*****

Journeyman
Сообщений: 346
Регистрация: 22.11.2009
Группа: Пользователи
Наличность: 0
Пользователь №: 12.232
Возраст: 20



Цитата(Doberman @ 30.10.2019, 23:55) *

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


БЛАГОДАРЮ ! заработало!


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 28.3.2024, 19:17
Designed by Nickostyle