И так.Буду пробовать.А как изменить поселок?хочу дома убрать поставить всякую бойду)там будут жить разбойники! Слишком большой баннер, удалил. Вступи в сообщество Steam
Добавлено (2011.11.03, 14:47) --------------------------------------------- А если я не могу распаковать редресс модкретором, какой прогой можно это сделать?
Добавлено (2011.11.04, 05:27) --------------------------------------------- Блин придётся искать самому
На данный момент увлекся созданием квестов. По мануалам Врыла, домашнее задание про свинью (замена жабу на свинью) сделал. Но я не совсем понял структуру написания скриптов. Я пишу скрипт(вернее пытаюсь) для нового квеста и у меня пока не совсем получается. Я просматриваю похожие скрипты написанные для HG350 мода но никак не могу правильно написать именно для своего квеста. Скрипты просто не работают. На этом форуме я читал мануалы по моддингу и некоторые совету про написания скриптов. Также, читал про скриптописание и на других всевозможных форумах. Процесс вникание в структуру медленно, но идёт. Хотелось бы подробно узнать про особенности и подводные камни скриптинга ПЗ и написать новый квест.
При запуске моба первым выполняется WorldScript( ). Он выполняется 1 раз, так что KillScript() внутри него не нужен. Из него запускаются все остальные скрипты, которые выглядят так:
Code
Script _имя скрипта_ ( if ( _Условие, при котором выполнится скрипт_ // можно оставить пустым ) then ( KillScript() // нужен для того, чтобы скрипт сработал только 1 раз // иначе будет выполняться 1 раз в цикл _Действия внутри скрипта_
) )
Условие может быть сложным, при этом каждое дополнительное условие пишется внутри if( ) с новой строчки. Скрипт выполнится если все условия истинны.
У этих скриптов есть параметры, которые указываются при объявлении скрипта:
Знака, разделяющего операторы нет, каждый новый оператор пишется с новой строчки Знак комментов: "//" В скрипте ПЗ есть 3 типа переменных: object, float и group
object - может содержать персонажей, монстров, или предметы (например двери, решетки и т.д.) float - любое число group - массив из элементов типа object
Переменные задаются в функции GlobalVars( ), которая расположена в самом верху:
Есть 2 вида особых переменных, которые лучше объявлять всегда: NULL : object // - неопределенный (пустой) объект. Можно отправить как аргумент в скрипт, который требует object.
Heroes : group // - список игроков. Заполняется автоматически, что очень удобно.
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 - Папа, а правда, что от форумов тупеют? - ГыыЫ... сынок...ЛоЛ...
Пояснения нет. Одна из скриптовых команд и функций которая хз что делает. Так вот. Я немножко поэкспериментировал... значит, SetScience. Тестировалось на рычаге, на юнитах еще не экспериментировал.
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, но с условием. - Папа, а правда, что от форумов тупеют? - ГыыЫ... сынок...ЛоЛ...
Для того, что бы сундук (да и не только сундук, а любой рычаг) открывался с помощью ловкости рук необходимо:
Если редактируешь моб с помощью 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 - Папа, а правда, что от форумов тупеют? - ГыыЫ... сынок...ЛоЛ...
Врыл, где прописывать 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() _Действия внутри скрипта_
'*' Помечены скипты и переменные, которые нужны, если в квесте нужно вести кого то за собой. Можно удалить если не нужно. ConsoleString ( "MobScript OK" ) // <-- Если скрипт написан правильно, то, при выходе на карту, в консоли должен появиться текст. Иначе в скрипте есть ошибка.
Скрипт #StartQuest В этом скрипте я обычно прописываю все подготовительные действия квеста: расстановка монстров, назначение переменных и групп и т.д. и из нее запускаю первый квест: #SubObj01 ( NULL ) - Папа, а правда, что от форумов тупеют? - ГыыЫ... сынок...ЛоЛ...
Можно запустить все скрипты подзаданий разом, и они будут выполняться когда условие в скрипте станет TRUE. Например так: #SubObj01 ( NULL ) #SubObj02 ( NULL ) #SubObj03 ( NULL ) #SubObj04 ( NULL ) А можно сделать так, чтобы новое подзадание появлялось только после выполнения предыдущего: