Модератор форума: Влесам, Врыл, Detect_Life, Монгольчик  
Все о моддинге в ПЗ
ВлесамДата: Вторник, 2011.08.02, 12:53 | Сообщение # 461
Влесам
Евангелист ХГ4
Группа: Администраторы
Сообщений: 7382
Репутация: 38
Статус: Временно отсутствует
Да, координата.
В смысле так же становится? Все изменения пропадают?
diablo 6666 сообщений diablo


Разделяй и Влесамаствуй.
 
SojДата: Вторник, 2011.08.02, 13:09 | Сообщение # 462
Soj
Ранг 5
Группа: Honest Group
Сообщений: 533
Репутация: 48
Статус: Временно отсутствует
а изменять их в "объекты" ?
если там то да когда я изменяю и через несколько екунд так же становится
P.S. Сообщений: 6666 ехех


 
лжеMorgenSДата: Вторник, 2011.08.02, 13:15 | Сообщение # 463
лжеMorgenS
Ранг 4
Группа: Заблокированные
Сообщений: 219
Репутация: 10
Статус: Временно отсутствует
И так.Буду пробовать.А как изменить поселок?хочу дома убрать поставить всякую бойду)там будут жить разбойники! :o

Слишком большой баннер, удалил.
Вступи в сообщество Steam
 
SojДата: Вторник, 2011.08.02, 13:17 | Сообщение # 464
Soj
Ранг 5
Группа: Honest Group
Сообщений: 533
Репутация: 48
Статус: Временно отсутствует
0_0 ооо получилось

 
лжеMorgenSДата: Вторник, 2011.08.02, 13:40 | Сообщение # 465
лжеMorgenS
Ранг 4
Группа: Заблокированные
Сообщений: 219
Репутация: 10
Статус: Временно отсутствует
Quote (Soj)
0_0 ооо получилось

Скрин в студию

Добавлено (2011.08.02, 13:40)
---------------------------------------------
А у меня не запускаеться MobSurgeon
Ошибку пишит што файл не нашол


Слишком большой баннер, удалил.
Вступи в сообщество Steam
 
jmasterДата: Вторник, 2011.08.02, 15:27 | Сообщение # 466
Ранг 1
Группа: Новички
Сообщений: 33
Репутация: 1
Статус: Временно отсутствует
MorgenS, установи сопустсвующий пак dll-ек
 
лжеMorgenSДата: Вторник, 2011.08.02, 15:56 | Сообщение # 467
лжеMorgenS
Ранг 4
Группа: Заблокированные
Сообщений: 219
Репутация: 10
Статус: Временно отсутствует
jmaster, Да уж догодался давно..просто ПО переустнавливал.Забыл

Слишком большой баннер, удалил.
Вступи в сообщество Steam
 
jmasterДата: Среда, 2011.08.24, 11:24 | Сообщение # 468
Ранг 1
Группа: Новички
Сообщений: 33
Репутация: 1
Статус: Временно отсутствует
Робин выложил свой редактор: MapED
 
РобинГудДата: Пятница, 2011.11.04, 05:27 | Сообщение # 469
РобинГуд
Ранг 7
Группа: Honest Group
Сообщений: 1659
Репутация: 31
Статус: Временно отсутствует
jmaster, О.О

Добавлено (2011.11.03, 14:47)
---------------------------------------------
А если я не могу распаковать редресс модкретором, какой прогой можно это сделать?

Добавлено (2011.11.04, 05:27)
---------------------------------------------
Блин придётся искать самому






На Ингосе нет волков
 
Detect_LifeДата: Пятница, 2011.11.04, 12:50 | Сообщение # 470
Detect_Life
Глава
Группа: Администраторы
Сообщений: 4505
Репутация: 50
Статус: Временно отсутствует
Quote (РобинГуд)
какой прогой можно это сделать?

EiEdit
 
Robi4okДата: Пятница, 2011.12.16, 07:55 | Сообщение # 471
Ранг 1
Группа: Новички
Сообщений: 7
Репутация: 0
Статус: Временно отсутствует
На данный момент увлекся созданием квестов. По мануалам Врыла, домашнее задание про свинью (замена жабу на свинью) сделал.
Но я не совсем понял структуру написания скриптов. Я пишу скрипт(вернее пытаюсь) для нового квеста и у меня пока не совсем получается. :o Я просматриваю похожие скрипты написанные для HG350 мода но никак не могу правильно написать именно для своего квеста. Скрипты просто не работают.
На этом форуме я читал мануалы по моддингу и некоторые совету про написания скриптов. Также, читал про скриптописание и на других всевозможных форумах. Процесс вникание в структуру медленно, но идёт. Хотелось бы подробно узнать про особенности и подводные камни скриптинга ПЗ и написать новый квест.
 
ВрылДата: Суббота, 2011.12.17, 12:36 | Сообщение # 472
Врыл
Ранг 7
Группа: Модераторы
Сообщений: 2229
Репутация: 29
Статус: Временно отсутствует
Структура скриптов ПЗ:

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

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

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

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

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

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

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

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

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


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

Heroes : group // - список игроков. Заполняется автоматически, что очень удобно.

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

//
// Авторство скрипта! )))))
//
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 )
)


Ну, в общем то, и все по структуре.


- Папа, а правда, что от форумов тупеют?
- ГыыЫ... сынок...ЛоЛ...
 
ВрылДата: Суббота, 2011.12.17, 13:02 | Сообщение # 473
Врыл
Ранг 7
Группа: Модераторы
Сообщений: 2229
Репутация: 29
Статус: Временно отсутствует
Дальше немного инфы из темы про скрипты в техничке:

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

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

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

Code

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


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

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 )
            )
)

В этом примере я обошел проблему вводом глобальной переменной oVR = oGoing

Отличие GSSetVar от GSSetVarMax

GSSetVar( nPlayer : float , Var : string , nVar : float )
- устанавливает значение: nVar в переменную с именем: Var у игрока номер: nPlayer.

GSSetVarMax( nPlayer : float , Var : string , nVar : float )
- устанавливает значение: nVar в переменную с именем: Var у игрока номер: nPlayer, только если новое значение nVar больше чем предыдущее, иначе ничего не произойдет!

Квесты иногда начинают глючить, несмотря на то, что скрипт написан абсолютно без ошибок!
Происходит это из-за того, что движок ПЗ перед началом выполнения скрипта может самопроизвольно присваивать квестовым переменным "q.zXXqXX.zXXqXX" совершенно дикие значения, например 50, 60 и т.п. Хотя по идее свежесозданная переменная должна иметь значение строго равное 0 !

Так что лучше юзать GSSetVar


- Папа, а правда, что от форумов тупеют?
- ГыыЫ... сынок...ЛоЛ...
 
ВрылДата: Суббота, 2011.12.17, 13:04 | Сообщение # 474
Врыл
Ранг 7
Группа: Модераторы
Сообщений: 2229
Репутация: 29
Статус: Временно отсутствует
Влесам:

Это писал Farlander
В ГГшном справочнике этого нет.

В общем, в списке доступных скриптов есть команда SetScience. Там только написано название, и... в общем, это:

Код:
SetScience( object , float , float , float , float , float , float )

Пояснения нет. Одна из скриптовых команд и функций которая хз что делает. Так вот. Я немножко поэкспериментировал... значит, SetScience. Тестировалось на рычаге, на юнитах еще не экспериментировал.

SetScience( object , float1 , float2 , float3 , float4 , float5 , float6 )

object - рычаг. В данном случае обелиск.
float1 - номер квестового предмета, который действует на этот рычаг (т.е. можно менять, чтоб сначала один квестовый предмет работал, бац, команда в скрипте, на этот же объект нуна другой предмет)
float2 - кол-во ЛР требуеме для успешного активирования рычага. Если проставлены и float1 и float2 (а так же float3 и float6, об этом ниже), то можно активировать рычаг и с помощью ЛР, и с помощью предмета. Если недостаточно ЛР - то без предмета ничего не выйдет.
float3 - сразу замечу, если значения float3, float4, float5 и float6 равны нулю, то на рычаг не наводится рука, независимо от просталвенного ЛР и номера предмета. Так вот. float3. В значении 0 - неактивен. В значении 1 и более (пока что неизвестно есть ли последствие от того, как работает команда в зависимости от значения любого из float3-float6, вроде все работает одинаково, но я еще экспериментирую) - рычаг можно активировать с помощью ЛР. Если значение float2 равно 0, то активируется без ЛР.
float4 - неизвестно. Если значение 0 - рычаг неактивен, если 1 - он активен, но у персонажа не получается его активировать. Не зависит от float1 и float2, при проставленном float1 квестовый предмет с соотв. номером на рычаг не наводится. Значение float4 пока еще не найдено.
float5 - см. float4.
float6 - Если значение 0 (при float3-float5 со значением 0) - рычаг неактивен. Если значение 1 и более (здесь так же, как и со случаем с float3) то рычаг можно активировать с помощью квестового предмета, номером которого является float1. При значении float3 и float6 не равным 0, рычаг можно активировать как с помощью ЛР, так и с помощью квестового предмета (напомню, что в мобе на сам объект можно проставлять: либо неактивен, либо открывается без ничего, либо открывается с предметом, либо с ЛР. Все вместе нельзя. Скриптами же, походу можно делать совмещенные варианты).

Эксперименты по поводу команды SetScience продолжаются, возможно команда используется не только на рычагах, но и на юнитах.

---------------------------------------------
Писал CAHEK7

Idle( Unit : object )| Комманда блокирует юнит: Unit. Возможно синоним
BlockUnit, но действует не только на игроков и нельзя снять блок.

IsCameraPlaying() : float| возвращает 32- если камера находится под управлением команды PlayCamera, когда действие команды PlayCamera заканчивается, то возвращается 0.

SetEnemy( Unit : object , nPlayer : float )| делает объект: Unit врагом для игрока nPlayer. Можно даже поссорить двух юнитов, принадлежащих одному игроку.

SetWind( x:float , y:float , z:float , wind:float )| создает ветер, если wind=1. x,y,z направлени и сила ветра.

SleepUntil( bool : float )| , SleepUntilIdle( Unit : object )| аналоги sleep, но с условием.


- Папа, а правда, что от форумов тупеют?
- ГыыЫ... сынок...ЛоЛ...
 
ВрылДата: Суббота, 2011.12.17, 13:07 | Сообщение # 475
Врыл
Ранг 7
Группа: Модераторы
Сообщений: 2229
Репутация: 29
Статус: Временно отсутствует
Для того, что бы сундук (да и не только сундук, а любой рычаг) открывался с помощью ловкости рук необходимо:

Если редактируешь моб с помощью MOBSurgeon, то на вкладке "Объекты" в разделе "Рычаги" -> "Имя твоего сундука (рычага)" в параметре "AsOpen" установить значение "5". А в параметре "Sleight" величину значения ловкости рук, при равной или больше которой, сундук будет открыт. Сохраняешь моб.

Если редактируешь моб с помощью MOB Reversing Tool, то заходи в ID_OBJECTDBFILE -> ID_OBJECTSECTION -> ID_LEVER -> ID_LEVER_SCIENCE_STATS_NEW. В этом разделе через запятую будет 3 цифры. Первую ставишь 5, вторую не трогаешь, а в третью ставишь величину навыка ловкости рук необходимую для открытия. Нажимаешь Apply Changes и сохраняешь моб.

Кстати вот остальные значения параметра "AsOpen":
0 - сундук можно открыть только с помощью скриптовой команды SwitchLeverState.
1 - открывается без условий.
5 - если я не ошибаюсь можно открыть не только с помощью ловкости рук, но и ключом.
8 - можно токрыть исключительно ключом, ID которого прописан в параметре "KEY".

Инфа с gipat.ru


- Папа, а правда, что от форумов тупеют?
- ГыыЫ... сынок...ЛоЛ...
 
Robi4okДата: Суббота, 2011.12.17, 16:45 | Сообщение # 476
Ранг 1
Группа: Новички
Сообщений: 7
Репутация: 0
Статус: Временно отсутствует
Спасибо Врыл! Ценная инфа. Буду изучать и исправлять свои ошибки.
 
Robi4okДата: Четверг, 2011.12.29, 15:55 | Сообщение # 477
Ранг 1
Группа: Новички
Сообщений: 7
Репутация: 0
Статус: Временно отсутствует
Врыл, где прописывать GSSetVar чтобы 2-задание стартовало только при условии выполнение 1-задания? Нужно-ли указывать командой GSSetVar что стартует 1-задание?
[spoiler]
NULL : object,
i : object,
Heroes : group,
_имя переменной1_ : _тип_ ,
)

DeclareScript _имя скрипта1_ ( this : object )
DeclareScript _имя скрипта2_ ( this : object )

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

)
)

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

)
)

WorldScript
(
Sleep( 2 )
_имя скрипта2_( NULL )
)
 
ВрылДата: Воскресенье, 2012.01.01, 15:34 | Сообщение # 478
Врыл
Ранг 7
Группа: Модераторы
Сообщений: 2229
Репутация: 29
Статус: Временно отсутствует
Вот заготовка, которую я использую при создании новых квестов:

'*' Помечены скипты и переменные, которые нужны, если в квесте нужно вести кого то за собой. Можно удалить если не нужно.

ConsoleString ( "MobScript OK" ) // <--

Если скрипт написан правильно, то, при выходе на карту, в консоли должен появиться текст. Иначе в скрипте есть ошибка.

Скрипт #StartQuest
В этом скрипте я обычно прописываю все подготовительные действия квеста: расстановка монстров, назначение переменных и групп и т.д. и из нее запускаю первый квест:
#SubObj01 ( NULL )


- Папа, а правда, что от форумов тупеют?
- ГыыЫ... сынок...ЛоЛ...
 
ВрылДата: Воскресенье, 2012.01.01, 15:39 | Сообщение # 479
Врыл
Ранг 7
Группа: Модераторы
Сообщений: 2229
Репутация: 29
Статус: Временно отсутствует
Можно запустить все скрипты подзаданий разом, и они будут выполняться когда условие в скрипте станет TRUE.
Например так:
#SubObj01 ( NULL )
#SubObj02 ( NULL )
#SubObj03 ( NULL )
#SubObj04 ( NULL )
А можно сделать так, чтобы новое подзадание появлялось только после выполнения предыдущего:
Code

Script #SubObj01
(
       if
       (
           //условие
       )
       then
       (
         KillScript()
         Sleep( 2 )
         GSSetVar( 0, "q.zXXqXX.zXXqXX.1", 2 )
         GSSetVar( 0, "q.zXXqXX.zXXqXX.2", 1 )
         #SubObj02 ( NULL )     
       )
)


- Папа, а правда, что от форумов тупеют?
- ГыыЫ... сынок...ЛоЛ...
 
ВрылДата: Воскресенье, 2012.01.01, 15:51 | Сообщение # 480
Врыл
Ранг 7
Группа: Модераторы
Сообщений: 2229
Репутация: 29
Статус: Временно отсутствует
Значения глобальной переменной "q.zXXqXX.zXXqXX.1":

1 - подзадание активно
2 - подзадание выполнено
3 - подзадание провалено

если нужно выполнить или провалить весь квест то используем переменную "q.zXXqXX.zXXqXX"

Запуск первого подзадания обычно прописывается еще в mq (файл quest.reg).
Например:
Code
[briefing receive]
name=z33q2_1
give items=
give quests=q.z33q2.z33q2
give quests=q.z33q2.z33q2.1


Т.е. Еще до запуска квестового скрипта будет активен квест и первое подзадание.


- Папа, а правда, что от форумов тупеют?
- ГыыЫ... сынок...ЛоЛ...
 
Поиск:
Copyright by Honest Group © 2024. All rights reserved. Используются технологии uCoz Created & Supported by Ash