Список форумов
Гипат.org
Найдется место всем!


:: В чате сейчас никого нет
Скрипт
   Список форумов -> MODный форум
Автор
Сообщение
BAS
Загонщик


Пришел: 01.02.2012
Сообщения: 10
Добавлено: 23 февраля 2012, 09:20 [?] [PM]   [«»]

Всем привет, всех с Днем Защитника Отечества!

Может кто-нибудь рассказать как строить скрипт в *.mob файлах?

Порядок, правила, и т.д.

Буду очень благодарен ;)
Valter
Зайчатник


Пришел: 28.02.2009
Сообщения: 32
Откуда: Россия
Добавлено: 23 февраля 2012, 14:34 [?] [PM] [M]   [«»]

Разборка структуры скрипта достаточно хорошо раскрыта на форуме Хонестов. Материал взят с их сайта.

Структура скриптов ПЗ:
При запуске моба первым выполняется WorldScript( ).
Он выполняется 1 раз, так что KillScript() внутри него не нужен. Из него запускаются все остальные скрипты, которые выглядят так:

Код:
Script _имя скрипта_
(
if
(
_Условие, при котором выполнится скрипт_  // можно оставить пустым
)
then
(
KillScript() // нужен для того, чтобы скрипт сработал только 1 раз
// иначе будет выполняться 1 раз в цикл
_Действия внутри скрипта_
)
)


Условие может быть сложным, при этом каждое дополнительное условие пишется внутри if( ) с новой строчки. Скрипт выполнится если все условия истинны.

У этих скриптов есть параметры, которые указываются при объявлении скрипта:

Код:

 DeclareScript _имя скрипта_ ( _имя переменной1_ : _тип_ ,  _имя переменной2_ : _тип_)


Знака, разделяющего операторы нет, каждый новый оператор пишется с новой строчки
Знак комментов: "//"
В скрипте ПЗ есть 3 типа переменных: object, float и group

object - может содержать персонажей, монстров, или предметы (например двери, решетки и т.д.)
float - любое число
group - массив из элементов типа object

Переменные задаются в функции GlobalVars( ), которая расположена в самом верху:

Код:
 GlobalVars (
 _имя переменной1_ : _тип_ ,
 _имя переменной2_ : _тип_ ,
 // ...
 _имя переменнойN_ : _тип_     
 )


Есть 2 вида особых переменных, которые лучше объявлять всегда:
NULL : object // - неопределенный (пустой) объект. Можно отправить как аргумент в скрипт, который требует object.
Heroes : group // - список игроков. Заполняется автоматически, что очень удобно.

Общий вид скрипта в мобе:

Код:
GlobalVars (
 NULL : object,
 i : object,
 Heroes : group,
 _имя переменной1_ : _тип_ ,
 _имя переменной2_ : _тип_ ,
 // ...
 _имя переменнойN_ : _тип_     
 )

 DeclareScript _имя скрипта1_ ( _имя переменной1_ : _тип_ ,  _имя переменной2_ : _тип_)
 DeclareScript _имя скрипта2_ (  )
 DeclareScript _имя скрипта3_ ( this : object )

 Script _имя скрипта1_
 (
      if
      (
        _Условие, при котором выполнится скрипт_   
      )
      then
      (
        KillScript()     
         _Действия внутри скрипта_             
      )
 )

 Script _имя скрипта2_
 (
      if
      (
        _Условие, при котором выполнится скрипт_   
      )
      then
      (
        KillScript()     
         _Действия внутри скрипта_             
      )
 )

 Script _имя скрипта3_
 (
      if
      (
        _Условие, при котором выполнится скрипт_   
      )
      then
      (
        KillScript()     
         _Действия внутри скрипта_             
      )
 )

 WorldScript
 (
     Sleep( 2 )
     _имя скрипта3_( NULL )
 )


"Особенности" скрипта ПЗ:

В условии скрипта ОБЯЗАТЕЛЬНО должна быть функция
например:
Код:

 if
 (
            fBool
 )// ошибка скрипта!


 if
 (
            IsEqual(fBool , 1)
 )// а так сработает



Цикл for не понимает аргументов функции, внутри которой он запущен!
например:

Код:
DeclareScript #Follow#2 ( this : object , oGoing : object )

 Script #Follow#1
 (
            if
            (
              Any( i , Heroes, IsLess( DistanceUnitUnit( i , oGoing ) , 7 ) )
            )
            then
            (
              KillScript()
              fDist = 15
              For( VSS#i#val , Heroes )
              ( // ошибка скрипта, т.к. в цикле не принимается переменная oGoing !
                #FindPlayer ( VSS#i#val , oGoing  )
              )
              Sleep(2)
              UMFollow ( oGoing , oPlayer )
              #Follow#2 ( oPlayer , oGoing )
            )
 )




Вот ссылка из Города Джунов про описание скриптовых команд http://www.gipat.ru/forum/index.php?showtopic=663&hl=


Также полезно будет изучить mob-ы из технодемки Весны или Новогоднего мода от GG. Они там с оочень детальными коментариями. Для освоения скриптинга будет очень полезным.

Ну и при возникновении более детальных вопросов поищи ответы на форумах..
_________________
Истина — это всего лишь заблуждение, которое просуществовало столетия. А заблуждение — это истина, просуществовавшая лишь минуту.
BAS
Загонщик


Пришел: 01.02.2012
Сообщения: 10
Добавлено: 24 февраля 2012, 09:52 [?] [PM]   [«»]

Вот пробовал разные варианты. Но почему-то работает только 1 из них.

Не работает
Код:

GlobalVars (
  NULL : object,
  VSS#i#val : object,
  i : object,
  Bailings : group
)

DeclareScript Start_quest (  this : object )


Script Start_quest
(
  if
  (
  )
  then
  (
    KillScript(  )
    QStart( "z23q2" )
    QObjSeeUnit( "GetObject(1000309)" )
    QObjSeeObject( "GetObject(1973972)" )
    QObjSeeObject( "GetObject(973972)" )
    QObjKillUnit( "GetObject (1000340)" )
    QObjKillUnit( "GetObject(1000309)" )
  )
)

Script Start_quest_2
(
  if
  (
    IsDead( GetObject (1973973) )
  )
  then
  (
    QFinish(  )
    Sart_quest_3(NULL)
  )
)

Script Start_quest_3
(
  if
  (
  )
  then
  (
    QObjSeeUnit( "GetObject(1973973)" )
    QObjKillUnit( "GetObject (1973973)" )
   
WorldScript
(
  Sleep( 2 )
  AddObject( Bailings, GetObject(1000309) )
  Start_quest(NULL)
  Start_quest_2(NULL)
  Start_quest_3(NULL)
)


Не работает
Код:

GlobalVars (
  NULL : object,
  VSS#i#val : object,
  i : object,
  Bailings : group,
  LMP Bailing Gipath Mage 8 : object
)

DeclareScript Start_quest
DeclareScript Start_quest_1 (  this : object )
DeclareScript Start_quest_2 (  this : object )
DeclareScript Start_quest_3 (  this : object )
DeclareScript Start_quest_4 (  this : object )
DeclareScript Start_quest_5 (  this : object )

Script Start_quest
(
  if
  (
  )
  then
  (
    KillScript(  )
    QStart( "z23q2" )
    GsSetVarMax(0,"q.z23q2.z23q2.1",1)
    QObjSeeUnit( "GetObject(1000309)" )

    Start_quest_1(NULL)
  )
)

Script Start_quest_1
(
  if
  (
  Any(IsDead( "GetObject(1000309)" : object ) : 0)
  )
  then
  (
    KillScript(  )
    GsSetVarMax(0,"q.z23q2.z23q2.1",2)
    GsSetVarMax(0,"q.z23q2.z23q2.2",1)
    QObjSeeObject( "GetObject(1973972)" )
   
    Start_quest_2(NULL)
  )
)

Script Start_quest_3
(
  if
  (
  Any(IsDead( "GetObject(1973972)" : object ) : 0)
  )
  then
  (
    KillScript(  )
    GsSetVarMax(0,"q.z23q2.z23q2.2",3)
    GsSetVarMax(0,"q.z23q2.z23q2.3",2)
    QObjSeeObject( "GetObject(973972)" )
    QObjKillUnit( "GetObject (1000340)" )
   
    Start_quest_4
  )
)

Script Start_quest_4
(
  if
  (
  Any(IsDead( "GetObject(1000340)" : object ) : 1)
  )
  then
  (
    KillScript(  )
    GsSetVarMax(0,"q.z23q2.z23q2.3",4)
    GsSetVarMax(0,"q.z23q2.z23q2.4",3)
    QObjKillGroup("Bailings" : group )
   
    Start_quest_5
  )
)

Script Start_quest_5
(
  if
  (
  Any(IsDead( "Bailings" : group ) : 1)
  )
  then
  (
    KillScript(  )
    QObjSeeUnit( "GetObject(1973973)" )
    QObjKillUnit( "GetObject (1973973)" )
    QFinish(  )
  )
)

WorldScript
(
  Sleep( 2 )
  LMP Bailing Gipath Mage 8 = GetObjectByID( "1000309" )
  AddObject( Bailings, GetObject(1000309) )
)


Не работает
Код:

GlobalVars (
  NULL : object,
  VSS#i#val : object,
  i : object,
  Bailings : group
)

DeclareScript KillBailings#2#1 (  this : object )
DeclareScript KillBailings#2#2 (  this : object )
DeclareScript KillBailings#2#3 (  this : object )
DeclareScript KillBailings#2#4 (  this : object )
DeclareScript Close (  this : object )

Script KillBailings#2#1
(
  if
  (
  )
  then
  (
    KillScript(  )
    QStart( "z23q2" )
    QObjSeeUnit( "GetObject(1000309)" )
  )
)

Script KillBailings#2#2
(
  if
  (
  )
  then
  (
    KillScript(  )
    QObjSeeObject( "GetObject(1973972)" )
  )
)

Script KillBailings#2#3
(
  if
  (
  )
  then
  (
    KillScript(  )
    QObjSeeObject( "GetObject(973972)" )
    QObjKillUnit( "GetObject (1000340)" )
  )
)

Script KillBailings#2#4
(
  if
  (
  )
  then
  (
    KillScript(  )
    QObjKillGroup( "grp" : Balings )
  )
)

Script Close
(
  if
  (
  )
  then
  (
    KillScript(  )
    QObjSeeUnit( "GetObject(1973973)" )
    QObjKillUnit( "GetObject (1973973)" )
    QFinish(  )
  )
)

WorldScript
(
  Sleep( 2 )
  AddObject( Bailings, GetObject(1000309) )
  KillBailings#2#1( NULL )
  KillBailings#2#2( NULL )
  KillBailings#2#3( NULL )
  KillBailings#2#4( NULL )
  Close( NULL )
)


Работает только если я пишу так

Код:

Script Kill
QStart(zXqY)
QObjSeeUnit ( id )
QObjSeeObject ( id )
QObjSeeObject ( id )
QObjKillUnit( id )
QObjKillUnit( id )
QObjSeeUnit( id )
QObjKillUnit( id )
QFinish()


Но если я заменяю строку

QObjKillUnit( id ) на функцию QObjKillGroup("GrouoName")

Код:

Script Kill
QStart(zXqY)
QObjSeeUnit ( id )
QObjSeeObject ( id )
QObjSeeObject ( id )
QObjKillUnit( id )
QObjKillUnit( id )
QObjKillGroup("GrouoName")
QObjSeeUnit( id )
QObjKillUnit( id )
QFinish()

   
WorldScript
(
  Sleep( 2 )
  AddObject( Bailings, GetObject(1000309) )
  Kill(NULL)
)



То квест не выполняется (даже первое подзадание)

Советы Города Джунов не помогают((
BAS
Загонщик


Пришел: 01.02.2012
Сообщения: 10
Добавлено: 24 февраля 2012, 11:23 [?] [PM]   [«»]

Вот еще два варианта.

Код:

GlobalVars (
  NULL : object,
  VSS#i#val : object,
  i : object,
  Bailings : group,
  LMP Bailing Gipath Mage 8 : object
)

DeclareScript KillBailing#1#1 (  this : object )
DeclareScript KillBailing#1#2 (  this : object )
DeclareScript KillBailing#1#3 (  this : object )
DeclareScript KillBailing#1#4 (  this : object )
DeclareScript KillBailing#1#5 (  this : object )
DeclareScript KillBailing#1#6 (  this : object )
DeclareScript KillBailing#1#7 (  this : object )
DeclareScript KillBailing#1#8 (  this : object )

Script KillBailing#1#1
(
  if
  (
  )
  then
  (
    KillScript(  )
    QStart("z23q2")
    GSSetVarMax( 0, "q.z23q2.z23q2.1",1 )
    QObjSeeUnit( "GetObject(1000309)" )
    KillBailing#1#2(NULL)
  )
)

Script KillBailing#1#2
(
  if
  (
  )
  then
 (
   KillScript(  )
   GSSetVarMax( 0,"q.z23q2.z23q2.1" ,2 )
   GSSetVarMax( 0,"q.z23q2.z23q2.2" ,1 )
   QObjSeeObject( "GetObject(1973972)" )
   KillBailing#1#3(NULL)
  )
)

Script KillBailing#1#3
(
  if
  (
  )
  then
  (
     KillScript(  )
     GsSetVarMax( 0,"q.z23q2.z23q2.2" ,2 )
     GsSetVarMax( 0,"q.z23q2.z23q2.3" ,1 )
     QObjSeeObject( "GetObject(973972)" )
     KillBailings#1#4
  )
)
Script KillBailings #1#4
(
  if
  (
  )
  then
  KillScript(  )
  GsSetVarMax( 0,"q.z23q2.z23q2.3" ,2 )
  GsSetVarMax( 0,"q.z23q2.z23q2.4" ,1 )
  QObjKillUnit( "GetObject (1000340)" )
  KillBailing#1#5(NULL)
  )
)

Script KillBailing#1#5
(
  if
  (
  Every(i,Bailings,Not(IsAlive(i)))
  )
  then
  (
    KillScript(  )
    GsSetVarMax( 0,"q.z23q2.z23q2.4" ,2 )
    GsSetVarMax( 0,"q.z23q2.z23q2.5" ,1 )
    QObjKillGroup( Bailings )
    KillBailing#1#6
  )
)

Script KillBailing#1#6
(
  if
  (
  )
  then
  (
    KillScript(  )
    GsSetVarMax( 0,"q.z23q2.z23q2.5" ,2 )
    GsSetVarMax( 0,"q.z23q2.z23q2.6" ,1 )
    QObjSeeObject( "GetObject(1973973)" )
    KillBailing#1#7
  )
)
Script KillBailing#1#7
(
  if
  (
  )
  then
  (
    KillScript(  )
    GsSetVarMax( 0,"q.z23q2.z23q2.6" ,2 )
    GsSetVarMax( 0,"q.z23q2.z23q2.7" ,1 )
    QObjKillUnit( "GetObject (1973973)" )
    KillBailing#1#8
  )
)

Script KillBailing#1#8
(
  if
  (
  )
  then
  (
    KillScript(  )
    GsSetVarMax( 0,"q.z23q2.z23q2.7" ,2 )
    GsSetVarMax( 0,"q.z23q2.z23q2.8" ,1 )
    QFinish(  )
  )
)

   



WorldScript
(
  ConsoleString("Test!")
  Sleep( 2 )
  LMP Bailing Gipath Mage 8  = GetObjectByID( "1000309" )
  AddObject( Bailings, GetObject( 1000309 )  )
  KillBailing#1#1( NULL )
  KillBailing#1#2( NULL )
  KillBailing#1#3( NULL )
  KillBailing#1#4( NULL )
  KillBailing#1#5( NULL )
  KillBailing#1#6( NULL )
  KillBailing#1#7( NULL )
  KillBailing#1#8( NULL )
)


И второй, на нем я проверял возможно ли то, что условие выполнения подзадания нужно писать в блоке "if"
Код:

GlobalVars (
  NULL : object,
  VSS#i#val : object,
  i : object,
  Bailings : group,
  LMP Bailing Gipath Mage 8 : object
)

DeclareScript KillBailing#1#1 (  this : object )
DeclareScript KillBailing#1#2 (  this : object )
DeclareScript KillBailing#1#3 (  this : object )
DeclareScript KillBailing#1#4 (  this : object )
DeclareScript KillBailing#1#5 (  this : object )
DeclareScript KillBailing#1#6 (  this : object )
DeclareScript KillBailing#1#7 (  this : object )
DeclareScript KillBailing#1#8 (  this : object )

Script KillBailing#1#1
(
  if
  (
  QObjSeeUnit( "GetObject(1000309)" )
  )
  then
  (
    KillScript(  )
    QStart("z23q2")
    GSSetVarMax( 0, "q.z23q2.z23q2.1",1 )
    KillBailing#1#2(NULL)
  )
)

Script KillBailing#1#2
(
  if
  (
  QObjSeeObject( "GetObject(1973972)" )
  )
  then
 (
   KillScript(  )
   GSSetVarMax( 0,"q.z23q2.z23q2.1" ,2 )
   GSSetVarMax( 0,"q.z23q2.z23q2.2" ,1 )
   KillBailing#1#3(NULL)
  )
)

Script KillBailing#1#3
(
  if
  (
  QObjSeeObject( "GetObject(973972)" )
  )
  then
  (
     KillScript(  )
     GsSetVarMax( 0,"q.z23q2.z23q2.2" ,2 )
     GsSetVarMax( 0,"q.z23q2.z23q2.3" ,1 )
     KillBailings#1#4
  )
)
Script KillBailings #1#4
(
  if
  (
  QObjKillUnit( "GetObject (1000340)" )
  )
  then
  KillScript(  )
  GsSetVarMax( 0,"q.z23q2.z23q2.3" ,2 )
  GsSetVarMax( 0,"q.z23q2.z23q2.4" ,1 )
  KillBailing#1#5(NULL)
  )
)

Script KillBailing#1#5
(
  if
  (
  Every(i,Bailings,Not(IsAlive(i)))
  QObjKillGroup( Bailings )
  )
  then
  (
    KillScript(  )
    GsSetVarMax( 0,"q.z23q2.z23q2.4" ,2 )
    GsSetVarMax( 0,"q.z23q2.z23q2.5" ,1 )
    KillBailing#1#6
  )
)

Script KillBailing#1#6
(
  if
  (
  QObjSeeObject( "GetObject(1973973)" )
  )
  then
  (
    KillScript(  )
    GsSetVarMax( 0,"q.z23q2.z23q2.5" ,2 )
    GsSetVarMax( 0,"q.z23q2.z23q2.6" ,1 )
    KillBailing#1#7
  )
)
Script KillBailing#1#7
(
  if
  (
  QObjKillUnit( "GetObject (1973973)" )
  )
  then
  (
    KillScript(  )
    GsSetVarMax( 0,"q.z23q2.z23q2.6" ,2 )
    GsSetVarMax( 0,"q.z23q2.z23q2.7" ,1 )
    KillBailing#1#8
  )
)

Script KillBailing#1#8
(
  if
  (
  )
  then
  (
    KillScript(  )
    GsSetVarMax( 0,"q.z23q2.z23q2.7" ,2 )
    GsSetVarMax( 0,"q.z23q2.z23q2.8" ,1 )
    QFinish(  )
  )
)

   



WorldScript
(
  ConsoleString("Test!")
  Sleep( 2 )
  LMP Bailing Gipath Mage 8  = GetObjectByID( "1000309" )
  AddObject( Bailings, GetObject( 1000309 )  )
  KillBailing#1#1( NULL )
  KillBailing#1#2( NULL )
  KillBailing#1#3( NULL )
  KillBailing#1#4( NULL )
  KillBailing#1#5( NULL )
  KillBailing#1#6( NULL )
  KillBailing#1#7( NULL )
  KillBailing#1#8( NULL )
)
Devastator
Загонщик


Пришел: 15.03.2009
Сообщения: 11
Добавлено: 27 февраля 2012, 20:30 [?] [PM]   [«»]

BAS выпиши тексты подзаданий (хотя бы в общих чертах, например: 1 прийти в точку, 2 завалить юнита, 3 свалить с карты и.т.п.) и все объекты ( в твоём случае юниты ) участвующие в скрипте. Я напишу тебе твой скрипт правильно и с комментариями, что бы ты понял, как он работает.
_________________
Не зная броду воспользуйся эхолотом не соваться в воду неприемлемо.
BAS
Загонщик


Пришел: 01.02.2012
Сообщения: 10
Добавлено: 28 февраля 2012, 07:08 [?] [PM]   [«»]

Код:

QStart("z23q2") //Начать квест
QObjSeeObject( "GetObject(1973972)" ) //Увидеть юнит
QObjSeeObject( "GetObject(1973972)" ) //Увидеть объект
QObjSeeObject( "GetObject(973972)" ) //Увидеть объект
QObjKillUnit( "GetObject (1000340)" )  //Убить охрану объекта ( id=973972)
Вот тут следовало бы прописать "применить предмет на объект" но я еще мал.
QObjKillGroup( Bailings ) //Убить группу
QObjSeeObject( "GetObject(1973973)" ) //Увидеть объект (по квесту это ключник, у него ключ)
QObjKillUnit( "GetObject (1973973)" ) //Убить его, ну и заодно забрать ключ.
QFinish(  ) //Финиш (Ибо как сделать дверь закрывающеюся ключом не придумал)
BAS
Загонщик


Пришел: 01.02.2012
Сообщения: 10
Добавлено: 28 февраля 2012, 07:11 [?] [PM]   [«»]

Вот МКушка, чтоб более понятно было.


z23q2.rar  
52.6 KB, Скачано 89 раз(а).
 
Sagrer
Убийца троллей


Пришел: 24.12.2001
Сообщения: 3548
Откуда: Курск
Добавлено: 28 февраля 2012, 11:23 [?] [PM] [M] [w] [m] [i]   [«»]

насчет переставшего работать скрипта - мы в GG во все мобы втыкали "отладочную подсистему" - оно громко сказано а на самом деле если включен заранее определенный флаг (обычная глобальная переменная типа IsDebug) то в консоль всегда сыпятся всякие текстовые сообщения, даже если ничего в мобе не происходит и никакого специфического скрипта с логированием чего-то в консоль нет - сам факт появления в консоли сообщений типа "welcome to SuslPrtlGip" позволяет понять приняла ли игра скрипт и начала ли она его исполнять вообще. Это во первых.

Во-вторых - обязательно надо делать бекапы работающего скрипта! Либо надо пользоваться чем то вроде Subversion либо заливать в общее хранилище (например ftp с которым работает вся команда) только 100% рабочий моб, ну и ежедневный\еженедельный в зависимости от скорости работ бекап всего хранилища (для svn ессно не нужно).

В третьих, и это самое главное - _все_ изменения в мобы вносятся понемногу, по нескольку строчек, после чего запускается игра, проверяется работает ли вообще скрипт (как минимум, обычно через консоль провоцируется исполнение нужного куска и проверяется как оно вообще работает), игра вырубается и можно дописывать еще немного чего-нибудь. Если после написания очередного десятка строк к примеру скрипт работатать перестал вообще, от слова совсем - комментируются все внесенные заново изменения, если так работает - раскомментируем по одной строчке и проверяем, пока не найдем на какой строке происходит затык - на этой строчке и медитируем.

З.Ы. цельные листинги скриптов сюда выкладывать смысла мало, из них надо выделять непринимаемые игрой конструкции путем отладки в живом мобе на живой же игре и их уже смотреть.

З.Ы.№2 из вышесказанного по скриптингу вообще хочу добавить вот ещё что на что не обращено внимание - скрипт многопоточный. Это значит что _все_ функции которые вы вызвали из WorldScript начинают исполняться одновременно в момент начала игры, если вы к примеру вызвали функцию из другой функции, а затем после ее вызова дали ещё какую то команду - эта следующая команда вполне может начать выполняться ещё до того как вызванная ранее функция будет исполнена, такие дела. Вызванная функция если её условия не выполнены - продолжает висеть и ждать скоего часа - как только то что в if станет истиной - оно сработает. Более того, даже когда функция исполнится - она продолжит висеть и ждать удобного момента чтобы сработать ещё раз, и ещё и ещё... если конечно у вас там нету KillScript который нужен как раз для того чтобы функцию таки прибить - отсюда следует что KillScript-а в функции может не быть только в тех редких случаях когда это действительно нужно и скриптер написавший такое чётко понимает что именно он при этом делает (один такой глюк у нас перерос в функцию запуска лютого, бешеного апокалипсиса которая спавнит стопятьсот смерчей на Суслангерских локациях, а началось всё с забытого KillScript в функции управляющей внутриигровым временем суток).
Итого, по сути каждая функция это отдельный поток. Если не учитывать этот факт иногда могут появляться очень странные, чудесатые и вообще непонятные "глюки". Да, а ещё KillScript совершенно не мешает функции быть запущенной ещё раз при следующем посещении локации игровым персонажем, и если то что в if истина - всё это сработает ещё раз так что надо делать дополнительную проверку а не надеяться только на KillScript, привет багу с драконьими костями в оригинальной игре например.
_________________
Мы уйдем без следа, ни имен ни примет.
Этот мир простоит еще тысячи лет.
Нас и раньше здесь не было - после не будет.
Ни ущерба, ни пользы от этого нет. (с) Омар Хайям
Demoth
Разведчик


Пришел: 02.09.2007
Сообщения: 105
Добавлено: 28 февраля 2012, 14:58 [?] [PM] [i]   [«»]

Раз уж пошла речь об отладке скрипта, то рекомендую прогу Script Debuger от KnightL.
Она конечно сильно грешит ложными срабатываниями(так что надо еще самому понимать есть ли ошибка на самом деле или нет) и не видит некоторые ошибки (к примеру использование аргументов скрипта в теле цикла for), однако большую часть ошибок она узнает вполне успешно.
Лично я уже отвык от ПЗ'шной скриптовой паранойи в плане синтаксиса - "компилится" практически всегда, даже после большого количества изменений в скрипте.
Sagrer
Убийца троллей


Пришел: 24.12.2001
Сообщения: 3548
Откуда: Курск
Добавлено: 28 февраля 2012, 17:58 [?] [PM] [M] [w] [m] [i]   [«»]

да я ту штуку пробовал, как то не впечатлила ибо видит не всё а значит все равно более чем реальна ситуация когда написал стопицот функций, скрипт работать перестал а где ошибка х его з, все равно всё коммертировать и проверять кусочками... вообще была мышля добавить в surgeon простейшие проверки типа подсчёта скобочек и прочую мелочевку но влом было %). Мне проще писать скрипт медленно но надежно %).
_________________
Мы уйдем без следа, ни имен ни примет.
Этот мир простоит еще тысячи лет.
Нас и раньше здесь не было - после не будет.
Ни ущерба, ни пользы от этого нет. (с) Омар Хайям
Demoth
Разведчик


Пришел: 02.09.2007
Сообщения: 105
Добавлено: 28 февраля 2012, 19:45 [?] [PM] [i]   [«»]

Sagrer, ну я бы не сказал, что она много ошибок пропускает... Вот то, что она выдает много несуществующих ошибок - это да, чистая правда.
Тут спорить пожалуй не имеет смысла, это дело вкуса, а вообще никто не мешает писать аккуратно, но все равно перепроверять програмкой.
Небольшой оффтоп: нельзя поправить на форуме баг с изменением сообщения? Если попытаться изменить только-что добавленное сообщение, то он ругается, дескать нельзя добавлять так часто.
Aleks
Опытный воин


Пришел: 27.06.2004
Сообщения: 535
Откуда: Днепропетровск
Добавлено: 28 февраля 2012, 22:21 [?] [PM] [i]   [«»]

Длительное время самым активным пользователем форума был один специфический спамер, так что я выставил эту задержку на 45 секунд, сейчас выставил 15.
_________________
Против глупости сами боги бессильны.
Devastator
Загонщик


Пришел: 15.03.2009
Сообщения: 11
Добавлено: 28 февраля 2012, 23:09 [?] [PM]   [«»]

Вот что у меня получилось:

Код:
GlobalVars ( //Объявляем глобальные переменные
  NULL : object, //NULL особая переменная для загрузки скриптов в WorldScript
  i : object, //Данный символ будет считаться объектом
  KeyKeeper : object, //Что бы не писать GetObject( 1973973 ) мы заменяяем его на KeyKeeper
  Ohrana : group, //Тоже, что описано выше, но только для группы, короче слово Ohrana теперь название группы
  Bailings : group,
  Heroes : group
)

DeclareScript Quest1 ( this : object ) //Declare script объявление имён скриптов и присвоение им переменной(ых) в данном случае this
DeclareScript Quest2 ( this : object )
DeclareScript Quest3 ( this : object )
DeclareScript Quest4 ( this : object )
DeclareScript Quest5 ( this : object )
DeclareScript Quest6 ( this : object )
DeclareScript Quest7 ( this : object )
DeclareScript Quest8 ( this : object )
DeclareScript Quest9 ( this : object )
DeclareScript Quest10 ( this : object )

Script Quest1  //Старт скрипта
(
  if //Если
  (
    GroupSize( GroupCross( GroupSee( Heroes ) , Bailings ) ) //Группа Heroes видит группу Bailings
  )
  then //Тогда
  (
    KillScript( ) //Убить скрипт если этого не написать, то этот скрипт при выполнении условия IF будет бесконечно повторяться жёстко вешая игру
    GsSetVar( 0 , "q.z23q2.z23q2.1" , 2 ) // Выполнить подзадание 1
    GsSetVar( 0 , "q.z23q2.z23q2.2" , 1 ) // Запустить подзадание 2
    Quest2( this ) //Подгрузить необходимый скрипт. Нет нужды подгружать их все сразу через WorldScript это только добавит лишних тормозов
  )
)

Script Quest2
(
  if
  (
    Any( i , Heroes , IsLess( DistanceUnitUnit( i , GetObject( 1973972 ) ) , 8 ) ) //У любого из группы Heroes дистанция до объекта (в данном случае это магический огонь) меньше 8
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.2" , 2 )
    GsSetVar( 0 , "q.z23q2.z23q2.3" , 1 )
    Quest3( this )
  )
)

Script Quest3
(
  if
  (
    Any( i , Heroes , IsLess( DistanceUnitUnit( i , GetObject( 973972 ) ) , 8 ) )
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.3" , 2 )
    GsSetVar( 0 , "q.z23q2.z23q2.4" , 1 )
    GsSetVar( 0 , "q.z23q2.z23q2.5" , 1 )
    Quest4( this )
    Quest5( this )
    Quest6( this )
  )
)

Script Quest4
(
  if
  (
    Every( i , Ohrana , IsDead( i ) ) //Каждый из группы Ohrana отбросил копыта
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.4" , 2 )
  )
)

Script Quest5
(
  if
  (
    IsEqual( GetLeverState( GetObject( 973972 ) ) , 1 ) //Положение рычага ( в данном случае алтарь "магический огонь" ) равно 1, то есть он активирован
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.5" , 2 )
  )
)

Script Quest6
(
  if
  (
    IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.4" ) , 2 ) //Проверка выполнено ли подзадание 4
    IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.5" ) , 2 ) //Проверка выполнено ли подзадание 5
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.6" , 1 )
    Quest7( this )
  )
)

Script Quest7
(
  if
  (
    Every( i , Bailings , IsDead( i ) ) //Проверка убиты ли все члены группы Bailings
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.6" , 2 )
    GsSetVar( 0 , "q.z23q2.z23q2.7" , 1 )
    Quest8( this )
  )
)

Script Quest8
(
  if
  (
    GroupHas( GroupSee( Heroes ) , KeyKeeper ) //Любой из группы Heroes увидел хранителя ключа
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.7" , 2 )
    GsSetVar( 0 , "q.z23q2.z23q2.8" , 1 )
    Quest9( this )
  )
)

Script Quest9
(
  if
  (
    HaveItem( 0 , 111 ) //Есть ли у игрока 0 ( сервер ) ключ от портала? ( я присвоил ему ID 111 )
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.8" , 2 )
    GsSetVar( 0 , "q.z23q2.z23q2.9" , 1 )
    Quest10( this )
  )
)

Script Quest10
(
  if
  (
    IsEqual( GetLeverState( GetObject( 100000 ) ) , 1 ) //Активирован ли портал? То есть рычаг в положении 1
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.9" , 2 )
    GsSetVar( 0 , "q.z23q2.z23q2" , 2 ) //Квест завершён
    QuestComplete( 0 , "z23q2" ) //Пригласить дракончика полетать возле игрока :)
  )
)

WorldScript ( //WorldScript это уникальный тип скрипта который загружается при старте карты
  Sleep( 2 ) //Подождать немного чтобы не сглючило
  KeyKeeper = GetObject( 1973973 ) //KeyKeeper - это объект 1973973
  AddObject( Ohrana , GetObject( 1000340 ) ) // Добавить в группу Ohrana объект 1000340
  AddObject( Bailings , GetObject( 1973972 ) )
  Quest1( NULL ) //Подгрузить первый скрипт (в данном случае Quest1 при старте карты)
)


BAS я немного переписал тексты твоего задания, что бы оно получилось более логичным. Что бы этот скрипт работал нужно ещё добавить в датабазу 2 позиции, но об этом позже пока попробуй понять скрипт, что не понятно, спрашивай.
_________________
Не зная броду воспользуйся эхолотом не соваться в воду неприемлемо.



z23q2.zip  
2.43 KB, Скачано 93 раз(а).
 
Sagrer
Убийца троллей


Пришел: 24.12.2001
Сообщения: 3548
Откуда: Курск
Добавлено: 29 февраля 2012, 13:21 [?] [PM] [M] [w] [m] [i]   [«»]

2Devastator

Есть одна логическая нестыковка:

Код:
Quest2( this ) //Подгрузить необходимый скрипт. Нет нужды подгружать их все сразу через WorldScript это только добавит лишних тормозов


Допустим, игрок нашёл указанных персонажей, Quest1 выполнился, Quest2 запущен и ждёт своего часа. И тут игрок вместо того чтобы дальше выполнять задание внезапно решает сбегать на базу пересобрать батарейку, или ещё куда сбегать, ну приспичило ему. Внимание вопрос - кто при следующем посещении локации запустит quest2? %). Понятно что это актуально больше для синглплеера, но и в мульти можно огрести веселый багодром %).

З.Ы. нифига там ничего не тормозит можно хоть стопицот скриптов запускать висеть из WorldScript, тормозить будет только если куча скриптов _выполняется_ (если работает то что после then) одновременно.
_________________
Мы уйдем без следа, ни имен ни примет.
Этот мир простоит еще тысячи лет.
Нас и раньше здесь не было - после не будет.
Ни ущерба, ни пользы от этого нет. (с) Омар Хайям
Devastator
Загонщик


Пришел: 15.03.2009
Сообщения: 11
Добавлено: 29 февраля 2012, 15:30 [?] [PM]   [«»]

Цитата:
Допустим, игрок нашёл указанных персонажей, Quest1 выполнился, Quest2 запущен и ждёт своего часа. И тут игрок вместо того чтобы дальше выполнять задание внезапно решает сбегать на базу пересобрать батарейку, или ещё куда сбегать, ну приспичило ему. Внимание вопрос - кто при следующем посещении локации запустит quest2? %). Понятно что это актуально больше для синглплеера, но и в мульти можно огрести веселый багодром %).

Sagrer спасибо тебе! Я этот момент не учёл.
Тогда так:
Код:
GlobalVars ( //Объявляем глобальные переменные
  NULL : object, //NULL особая переменная для загрузки скриптов в WorldScript
  i : object, //Данный символ будет считаться объектом
  KeyKeeper : object, //Что бы не писать GetObject( 1973973 ) мы заменяяем его на KeyKeeper
  Ohrana : group, //Тоже, что описано выше, но только для группы, короче слово Ohrana теперь название группы
  Bailings : group,
  Heroes : group
)

DeclareScript Quest1 ( this : object ) //Declare script объявление имён скриптов и присвоение им переменной(ых) в данном случае this
DeclareScript Quest2 ( this : object )
DeclareScript Quest3 ( this : object )
DeclareScript Quest4 ( this : object )
DeclareScript Quest5 ( this : object )
DeclareScript Quest6 ( this : object )
DeclareScript Quest7 ( this : object )
DeclareScript Quest8 ( this : object )
DeclareScript Quest9 ( this : object )
DeclareScript Quest10 ( this : object )

Script Quest1  //Старт скрипта
(
  if //Если
  (
    Not( IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.1" ) , 2 ) )
    GroupSize( GroupCross( GroupSee( Heroes ) , Bailings ) ) //Группа Heroes видит группу Bailings
  )
  then //Тогда
  (
    KillScript( ) //Убить скрипт если этого не написать, то этот скрипт при выполнении условия IF будет бесконечно повторяться жёстко вешая игру
    GsSetVar( 0 , "q.z23q2.z23q2.1" , 2 ) // Выполнить подзадание 1
    GsSetVar( 0 , "q.z23q2.z23q2.2" , 1 ) // Запустить подзадание 2
  )
)

Script Quest2
(
  if
  (
    Not( IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.2" ) , 2 ) )
    IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.1" ) , 2 )
    Any( i , Heroes , IsLess( DistanceUnitUnit( i , GetObject( 1973972 ) ) , 8 ) ) //У любого из группы Heroes дистанция до объекта (в данном случае это магический огонь) меньше 8
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.2" , 2 )
    GsSetVar( 0 , "q.z23q2.z23q2.3" , 1 )
  )
)

Script Quest3
(
  if
  (
    Not( IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.3" ) , 2 ) )
    IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.2" ) , 2 )
    Any( i , Heroes , IsLess( DistanceUnitUnit( i , GetObject( 973972 ) ) , 8 ) )
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.3" , 2 )
    GsSetVar( 0 , "q.z23q2.z23q2.4" , 1 )
    GsSetVar( 0 , "q.z23q2.z23q2.5" , 1 )
  )
)

Script Quest4
(
  if
  (
    Not( IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.4" ) , 2 ) )
    IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.3" ) , 2 )
    Every( i , Ohrana , IsDead( i ) ) //Каждый из группы Ohrana отбросил копыта
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.4" , 2 )
  )
)

Script Quest5
(
  if
  (
    Not( IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.5" ) , 2 ) )
    IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.3" ) , 2 )
    IsEqual( GetLeverState( GetObject( 973972 ) ) , 1 ) //Положение рычага ( в данном случае алтарь "магический огонь" ) равно 1, то есть он активирован
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.5" , 2 )
  )
)

Script Quest6
(
  if
  (
    Not( IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.6" ) , 1 ) )
    Not( IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.6" ) , 2 ) )
    IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.4" ) , 2 ) //Проверка выполнено ли подзадание 4
    IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.5" ) , 2 ) //Проверка выполнено ли подзадание 5
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.6" , 1 )
  )
)

Script Quest7
(
  if
  (
    Not( IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.6" ) , 2 ) )
    IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.6" ) , 1 )
    Every( i , Bailings , IsDead( i ) ) //Проверка убиты ли все члены группы Bailings
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.6" , 2 )
    GsSetVar( 0 , "q.z23q2.z23q2.7" , 1 )
  )
)

Script Quest8
(
  if
  (
    Not( IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.7" ) , 2 ) )
    IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.6" ) , 2 )
    GroupHas( GroupSee( Heroes ) , KeyKeeper ) //Любой из группы Heroes увидел хранителя ключа
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.7" , 2 )
    GsSetVar( 0 , "q.z23q2.z23q2.8" , 1 )
  )
)

Script Quest9
(
  if
  (
    Not( IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.8" ) , 2 ) )
    IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.7" ) , 2 )
    HaveItem( 0 , 111 ) //Есть ли у игрока 0 ( сервер ) ключ от портала? ( я присвоил ему ID 111 )
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.8" , 2 )
    GsSetVar( 0 , "q.z23q2.z23q2.9" , 1 )
  )
)

Script Quest10
(
  if
  (
    Not( IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.9" ) , 2 ) )
    IsEqual( GsGetVar( 0 , "q.z23q2.z23q2.8" ) , 2 )
    IsEqual( GetLeverState( GetObject( 100000 ) ) , 1 ) //Активирован ли портал? То есть рычаг в положении 1
  )
  then
  (
    KillScript( )
    GsSetVar( 0 , "q.z23q2.z23q2.9" , 2 )
    GsSetVar( 0 , "q.z23q2.z23q2" , 2 ) //Квест завершён
    QuestComplete( 0 , "z23q2" ) //Пригласить дракончика полетать возле игрока :)
  )
)

WorldScript ( //WorldScript это уникальный тип скрипта который загружается при старте карты
  Sleep( 2 ) //Подождать немного чтобы не сглючило
  KeyKeeper = GetObject( 1973973 ) //KeyKeeper - это объект 1973973
  AddObject( Ohrana , GetObject( 1000340 ) ) // Добавить в группу Ohrana объект 1000340
  AddObject( Bailings , GetObject( 1973972 ) )
  Quest1( NULL ) //Подгрузить скрипт (в данном случае Quest1 при старте карты)
  Quest2( NULL )
  Quest3( NULL )
  Quest4( NULL )
  Quest5( NULL )
  Quest6( NULL )
  Quest7( NULL )
  Quest8( NULL )
  Quest9( NULL )
  Quest10( NULL )
)


Sagrer я кстати забыл, а в сингле все скрипты висят в памяти или таким же макаром сбрасываются при перезаходе на карту?
_________________
Не зная броду воспользуйся эхолотом не соваться в воду неприемлемо.
Sagrer
Убийца троллей


Пришел: 24.12.2001
Сообщения: 3548
Откуда: Курск
Добавлено: 02 марта 2012, 10:43 [?] [PM] [M] [w] [m] [i]   [«»]

Цитата:
Sagrer я кстати забыл, а в сингле все скрипты висят в памяти или таким же макаром сбрасываются при перезаходе на карту?


любой скрипт живёт только пока персонаж не покинул локацию, при смене локи в живых останутся только значения глобальных переменных.
_________________
Мы уйдем без следа, ни имен ни примет.
Этот мир простоит еще тысячи лет.
Нас и раньше здесь не было - после не будет.
Ни ущерба, ни пользы от этого нет. (с) Омар Хайям
Протопал
Зайчатник


Пришел: 01.01.2012
Сообщения: 20
Добавлено: 09 июля 2012, 17:12 [?] [PM]   [«»]

Привет, ГГ ))) смотрю братишка мой по выносил вам мозг ))
Теперь и мой черед.
Я тут на досуге взялся усложнить квест типа:убить жабу, элементом -
Если группа А видит кого-либо из партии игроков то квест провален.
Вроде бы нечего сложного:
создаем глобальную переменную Garpii : group
далее обычно в группу добавляются объекты : мобы
и задается что собственно функция прерывающийся квест.
но я хочу добавить в групп всех мобов посредством Дипломатической группы. все нужные мне мобы которые не должны видеть игроков находятся в одной Дип.г. №2(ибо добавлять почти 100 мобов по 1му командой AddObekt просто захламление скрипта) , вот ка бы мне её задать в качестве группы которая не должна видеть игроков? я пораскинул мозгами на скудных просторах знаний скриптов ПЗ и вот что у меня получилось.
Код:
GlobalVars (
  NULL : object,
  VSS#i#val : object,
  i : object,
  Garpii : group
)
DeclareScript Garpii (  this : object )
Script Garpii
(
  if
  (
  )
  then
  (
    //GetPlayerUnits( nDiplomacyGroup : float )
GroupCross( grpA : group , grpB : group ) : group//
GroupSub( GetPlayerUnits( 2 ) , Garpii )
   )
)
это кусок кода который меня больше всего беспокоит .
Вот этот элемент я радил в процесе умственых изысканий :) GroupSub( GetPlayerUnits( 2 ) , Garpii ) вроде он должен сравнивая пустую группу гарпии и Дип.г. 2 создавать 3ю "сумму групп" , но вот в чем вопрос как будет называться эта получившиеся группа??? Ибо чтоб дальше задать нужно знать как называется группа. и еше ворос то, что я наколякакл вобше рационально ? :D Я пытался просто сразу в качестве группы завершающей квест в случаи обнаружения игроков, задать Дипломатическую группу но так не хотело работать.
Показать сообщения:   
   Список форумов -> MODный форум
Версия для печати
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы
Вы можете скачивать выложенные файлы
Перейти:  
Часовой пояс: GMT +4:00