Поиск - Участники - Календарь
Перейти к полной версии: Скрипты: функции и блоки.
ElderScrolls.Net Conference > The Elder Scrolls > Гильдия мастеров > Oblivion Construction Set
vitalka
Не секрет, что начинающий плагиностроитель сталкивался с такой проблемой как написание скриптов. Когда в голове созрел великий плагин (а все великие плагины, к сожалению, не обходятся без скриптов), и когда нужно повесить какой либо скрипт на созданный вами потом и кровью предмет, и когда открываешь редактор скриптов, вот тут и возникает вопрос - а с чего, собственно говоря, начинать?
Предлогаю в этой теме описывать саму функцию или блок вот по такой схеме:
Функция или блок со ссылкой на страничку cs.elderscrolls.com - его описание.
Ну, вобщем, я сейчас начну, а кто захочет, может продолжить.

Итак. С чего начинается скрипт? А скрипт начинается с его имени. Для этого есть специальная функция:


scriptname - имя скрипта. Это функция, с которой должны начинаться все скрипты. После этой функции вы должны написать само имя этого скрипта. Пример:
Код:

Scriptname Moiskript

Или можно сократить:
Код:

scn Moiskript


добавлено vitalka - [mergetime]1168508973[/mergetime]
Продолжим. Что такое блоки. Блоки - это такие специальные функции, в теле которых и находится сам скрипт. В зависимости от того, какой блок вы выберете, будет зависить когда и при каком условии будет срабатывать ваш скрипт. Блок начинается командой  "begin" и заканчивается командой "end". Пример:
Код:

scn Moiskript

begin GameMode

тут ваш скрипт

end
Narzaveys
А вы не подскажите скрипт, по телепортации персонажа, тоесть, что-бы персонаж наступал на определённую метку или переходил определённую границу и телепортировался в новую ячейку или даже мир? smile.gif
boblen
На вскидку: Нужны 2 маркера TeleportMe и TeleportMark
На TeleportMe вешаем скрипт:

scn TeleportMeTo

begin GameMode
float dist
set dist to GetDistance Player
if ( dist < 20 )
   player.MoveTo TeleportMark
endif
end

Если с возвратом подобным способом, то аналогично, просто расположить точку выхода нужно в другом месте... Если точка входа/выхода нужна в одном месте (типа двери), то скрипт придется усложнять...
vitalka
Цитата: (Narzaveys @ 14.01.07 - 00:28)
А вы не подскажите скрипт, по телепортации персонажа, тоесть, что-бы персонаж наступал на определённую метку или переходил определённую границу и телепортировался в новую ячейку или даже мир? smile.gif

Кхм... Немного не по теме вопрос. Попробуй сделать как сказал boblen. Ну а мы используем информацию boblen-а для своих целей. smile.gif
Итак, разберем его скрипт.

Код:
scn TeleportMeTo


Называем наш скрипт именем TeleportMeTo. Это уже понятно.

Код:
begin GameMode


Блок GameMode - этот блок будет работать всегда, т.е по окончании скрипта в этом блоке, он запускается заново. И так до бесконечности. Пока, конечно, вы не выйдите из, например, пещеры, где находится предмет со скриптом. Поэтому будте осторожны. Слишком большой скрипт может затормозить игру.

Код:
float dist


Объявляем переменную dist типа float. В скрипте можно объявлять переменные трех типов:

short - это цифра в диапазоне от -32,768 до 32,767
long  - диапазон от  -2,147,483,648 до 2,147,483,647
float  - диапазон от 1.18E-38 до 3.40E38

Я бы советовал в данном скрипте объявлять переменную типа short. Это сэкономит память компьютера. Потому что как только скрипт начинает работать, в памяти компьютера выделяется место под переменные, и в зависимости от того, какого типа переменную мы объявили, будет зависеть и количество места под нее. (поправьте меня, если ошибаюсь.  blush2.gif )

Код:
set dist to GetDistance Player


Команда set -занести, записать. Сейчас поймете.

Функция GetDistance ObjectID - определяет расстояние от предмета или актера на котором висит скрипт до какого-нибудь ObjectID. ObjectID может быть также предметом или актером. В данном случае это сам ГГ.

Вобщем, эту строчку можно перевести как "записать в переменную dist расстояние до игрока".

Код:
if ( dist < 20 )


Команда if - сравнение. Переводится как "если".  В данном случае - " если расстояние до игрока меньше 20". Итак, если расстояние до игрока меньше 20 то выполняется следующая строка скрипта. А если больше или равно 20, то все что находится между if и endif выполнятся не будет.

Код:
player.MoveTo TeleportMark


Функция MoveTo MarkerID - премещение объекта к MarkerID. В данном случае перемещаем игрока к TeleportMark. Здесь можно было воспользоваться функцией MoveToMarker MarkerID - специальной функцией для перемещения к маркеру. Чем они отличаются? Эээ.... А фиг его знает. Скорее всего, так же экономит рессурсы компьютера.
И еще одно примечание. Если вы перемещаете своего героя, то после этой строки всегда должна стоять функция Return. Эта функция прекращает дальнейшее выполнения скрипта. Иначе, может возникнуть такой глюк как мерцание экрана.

Код:
endif


Команда if всегда должна заканчиваться такой строкой.

Код:
end


Конец. Блока GameMode я имею ввиду. smile.gif
Scripter
Возможно опять вопрос не в тему, но все же спрошу: есть ли функции, возвращающий значения характеристик персонаж(сила, ловкость и т.д.)? Если есть опишите ее. Или опишите как это сделать другим образом.
vitalka
Цитата: (Scripter @ 20.01.07 - 23:20)
Возможно опять вопрос не в тему, но все же спрошу: есть ли функции, возвращающий значения характеристик персонаж(сила, ловкость и т.д.)? Если есть опишите ее. Или опишите как это сделать другим образом.

Функция GetActorValue StatName, где StatName - это характеристика или навык игрока. Возвращает текущее значение характеристики или навыка.

Функция GetBaseActorValue StatName - возвращает базовое значение характеристики или навыка.

Функция SetActorValue StatName value - устанавливает базовое значение value характеристики или навыка.

Функция ForceActorValue StatName value - устанавливает текущее значение value характеристики или навыка.

Функция ModActorValue StatName value - изменяет характеристику или навык персонажа на величину value. Может принимать отрицательные значения.

Список StatName можно посмотреть тут.

Пример:

Код:
set var to Player.GetActorValue Strength

Записываем в переменную var текущее значение силы игрока.

Код:
Player.ModActorValue Health 10

Увеличивает текущее здоровье игрока на 10 едениц.

добавлено vitalka - [mergetime]1169383724[/mergetime]
Выдержка из моего туториальчика по созданию себе помошника. Полностью туториал можно почитать тут.


Код:

ScriptName MyGirlScript

short Button; сюда будем заносить номер нажатой кнопки
short MyVar; потом объясню

begin onActivate

Поле  OnActivate запускается тогда, когда объект активируют. В данном случае,когда мы подходим к персонажу и нажимаем клавишу пробел. Далее проверим, жив ли наш персонаж. А то неудобно както с трупом разговаривать. Для этого существует функция GetDead. Эта функция возвращает 1, если наш объект дохлый.

Код:

if ( MyGirlRef.GetDead <= 0 )


Вобщем, если наш объект ( MyGirlRef - имя, которое мы вводили в Render Window) не дохлый (GEtDead не равна еденице), то делаем следующее:

Код:

MessageBox "Любимая... " "пойдем со мной" "подожди здесь" "сходи прогуляйся" "беги домой" "а что у тебя в карманах?"


Функция MessageBox выводит на экран окошко с кнопками. Содержимое первых кавычек - это заголовок окна. Содержимое последующих кавычек - это собственно кнопки, на которые можно нажимать.


Код:

Set MyVar to 1; заносим еденицу в MyVar

else; а иначе, если персонаж дохлый (GetDead = 1, т.е больше нуля)

Message "Твоя девушка померла."


Функция Message, не выводит на экран никакого окошка а пишет сообщение в верхнем левом углу экрана. (типа сообщения Quicksave, когда мы жмем на F5)

Код:

Set MyVar to -1

Return


Return означает дальнейшее прекращение обработки скрипта.


Код:

endif;команда if всегда так должна заканчиваться
end onActivate; команда onActivate - тоже ( можно просто end)


begin GameMode

if ( MyVar == 1 )



Т.е если наш персонаж жив и мы нажали какую-либо кнопку (см. выше), то идем дальше:


Код:

Set Button to GetButtonPressed



Записываем номер нажатой кнопки в нашу переменную Button. Функция GetButtonPressed возвращает значение нажатой клавиши. Нумерация кнопок начинается с нуля. Т.е если мы нажали первую кнопку, то функция вернет значение 0.

Код:

if ( Button == 0 ); если мы нажали первую кнопку

SetIgnoreFriendlyHits 1



Наверное, каждый попадал в такую ситуацию, когда в бою случайно задевал за какого-нибудь дружественного персонажа, после чего он набрасывался на вас с кулаками. Так вот, функция SetIgnoreFriendlyHits позволит использовать вашего помощника в качестве груши.


Код:

SetOwnership



Функция SetOwnership  устанавливает принадлежность предмета к собственности NPC или фракции. Т.е. теперь помошник будет принадлежать вам. (есть некоторые сомнения по описанию этой функции. Если я не прав, прошу сообщить в этой теме)


Код:

AddScriptPackage "MyGirlPackageFollow"



Добавляет наш пакет, который мы составляли раннее.


Код:

StopWaiting MyGirlPackageFollow



Если предыдущая команда нашему персонажу была, например,"подожди здесь", то этот пакет был приостановлен. Теперь мы его запускаем заново и приостанавливаем другие два наших пакета:


Код:

Wait MyGirlPackageRun
Wait MyGirlPackageWander

Set MyVar to -1



Можно, в принципе, обойтись и без этой переменной, но так мы экономим время обработки скрипта, когда мы не жмем ни на какие кнопки.


Код:

Return

elseif ( Button == 1 )

Wait MyGirlPackageFollow
Wait MyGirlPackageRun
Wait MyGirlPackageWander

Set MyVar to -1

Return


А иначе, если нажата вторая кнопка, приостановить все пакеты. Персонаж будет стоять на месте.

Код:

elseif ( Button == 2 )

AddScriptPackage "MyGirlPackageWander"
StopWaiting MyGirlPackageWander
Wait MyGirlPackageFollow
Wait MyGirlPackageRun

Set MyVar to -1

Return


elseif ( Button == 3 )

AddScriptPackage "MyGirlPackageRun"
StopWaiting MyGirlPackageRun
Wait MyGirlPackageFollow
Wait MyGirlPackageWander

Set MyVar to -1

Return


Ну, тут все понятно - запустить один пакет, оба других приостановить.

Код:

elseif (Button == 4 )

KarmanRef.Activate player 1


Если нажата кнопка 5 - активировать объект KarmanRef, т.е наш сундук.

Код:

Set MyVar to -1

Return

endif
endif

end GameMode


добавлено vitalka - [mergetime]1169384485[/mergetime]
user posted image
Tellus
Здравствуйте все! Извините! Вопрос может быть не по теме, но возможно с помощью скрипта создать магический эффект, увеличивающий вес, который может переносить персонаж, на подобии эффекта "Перышко", но на прямую, то есть не как в эффекте "Перышко" (не плюс вес который у персонажа уже имеется в рюкзаке к значению веса какого персонаж может переносить в соответствии с развитием его силы в момент кастования заклинания "Перышко").
vitalka
Честно говоря, не знаю, можно ли на прямую воздействовать на этот параметр. Ведь в игре он расчитывается вот так:

макс.переносимый вес = сила * 5

Зато можно изменять мах. переносимый вес увеличивая силу.
Scripter
У меня возник такой вопрос, как перемещать объекты статики? В частности каким образом открываются тайные двери, вроде той, что в самом начале игры в темнице открывает Рено или той, что во дворе Скингардского замка, справа от входа.
Заранее благодарен.
boblen
Это не статики, а активаторы с заранее прописанной анимацией.
Warhite
А как можно проверять значение навыка ГГ в своём скрипте не подскажете, а?
Плиз!!!!!
vitalka
Смотри пост номер 6.
Ser9K
ScriptName ZDeath08script
begin MenuMode
if ( GetStage ZFaction08 == 15 )
zBanditRef.StartCombat Player
zBanditRef2.StartCombat Player
zBanditRef3.StartCombat Player
zBanditRef4.StartCombat Player
endif
End

Что не так? Дело в том что НПС не хотят со мной дратся, когда все условия выполняются. Скрипт со значение Quest и стоит в том квесте где должен сработать. Может в это вся проблема?
Klain MkKlaski
Попробуй у них увеличить значение агрессии к player'у до 100. (Просто допиши соответствующие строчки в этом же скрипте для каждого из нападающих).
Ser9K
Товарищи, а есть скрипт, чтобы не отдельный НПС нападал, а целая группа (фракция). Например, от агрессии в 100 единиц они иногда друг на друга нападают...а это как то не логично. nono.gif
Eternal
А что писать если я хочу сделать меч?
Ser9K
Цитата: (Eternal @ 20.02.07 - 16:28)
А что писать если я хочу сделать меч?


biggrin.gif  Мечи в максе делают, а скрипты для этого не нужны. Или ты имеешь в виду что-то другое?
Eternal
>> Ser9K:
Понятно. Я просто начинающий плагостроитель и хочется создать что-нить интересное. А чтоба дом сделать,что надо знать?
Klain MkKlaski
Посмотри в теме Tes CS. Там дано достаточно много ссылок на различные статьи, причом на русском языке. Прочитаешь и многое станет понятно. Начать нужно с этого.
Narzaveys
Здравствуйте, это опять я и всё по тому же вопросу. К примеру если я хочу сделать переход в другую провинцию, мне что по всей границе расставлять маркеры, или же есть способ поэффективнее?
Klain MkKlaski
Такой вопрос: Продолжает ли обрабатываться квестовый скрипт после того как последнее задание в квесте выполнено   ???
boblen
Если не используется команда StopQuest, то квестовый скрипт продолжит работать даже после завершения квеста.
Klain MkKlaski
Спасибо Боблен)

А квестовая переменная при этом видимо сохраняет последнее значение.

  Но я столкнулся с проблемой. Жестко привязанные к актеру пакеты как-то непонятно зависят от значения этой самой квестовой переменной.

То есть: Один пакет выполняется при "k=1", в момент окончания пакета "к" приравниваю 2, начинает выполняться второй пакет, в момент его окончания присваиваю "к"- 3.

А после этого начинает выполняться первый пакет где "к=1"))) И так в цикле! (очень утрированно и в общем всё написал)

   Ошибки никакой я не допустил, ибо проверил всё очень много раз.  В этом конструкторе полно касяков.

(первый пакет - нпс идет до определённого места, второй пакет - дойдя до этого места садится на стул в этой же комнате.)



Сначала я подумал,  проблема в том что нужно стартовать пакет при "к=1" и тут же изменить значение к (хз как она там себя ведёт) - не помогло.

Не знаю поняли вы меня или нет.
Narzaveys
А возможно ли сделать такой скрипт, чобы форма земли изменялась и у неё менялись текстуры, от попадания ядра к примеру? smile.gif
Графен
>> Narzaveys:
Нет. Терраморфинг в Обле точно невозможен smile.gif Но:

Такой извратско-идиотский сценарий - сделать в земле дырку и замаскировать ее статиком с зеленой травяной текстурой. А потом убрать статик. Или можно генерировать эдакие декоративные статичные "кратеры". Момент появления всей этой бутафории, есесно, маскировать каким-нить фаербольным взрывом.

А вот осуществить такую безумную идею на практике - это точно задача не из тривиальных smile.gif

>> Klain MkKlaski:
Цитата: 
В этом конструкторе полно касяков.

Перезатачиваю руки под другие предметы, дорого tongue.gif smile.gif
Klain MkKlaski
Цитата: 
Перезатачиваю руки под другие предметы, дорого 


Намёк на мои кривые руки? Эт ты зря. Может знаю я не так много, но то что знаю - то знаю.  smile.gif


  Вот ещё. В разделе топиков, в меню квестов, не работает проверка функцией GetItemCount. Хотел сделать, чтобы в топике Greeting было одно приветствие, если нет в инвентаре предмета, и другое если он там есть. Игра выдаёт только ту запись, где колличество предметов равно "0", даже если предмет есть в инвентаре.

  Есть подозрение, что на каждую запись журнала, может быть только одно приветствие в гритинге. Может из-за этого и есть галочка quest в предметах. Звучит тупо, но проверте сами...

Я чувствую полную безисходность, хочется выбросить свой компьютер в окошко кому-нибудь на голову.

(Предыдущую проблему вроде решил. Длинные сцены, где много актёров и много пакетов лучше скриптовать в соответствующих скриптах квестов, то есть добавлять там необходимые пакеты и ремоовить их, вкрапливая при этом всё что понадобится.)

 
Ser9K
Цитата: 
Вот ещё. В разделе топиков, в меню квестов, не работает проверка функцией GetItemCount. Хотел сделать, чтобы в топике Greeting было одно приветствие, если нет в инвентаре предмета, и другое если он там есть. Игра выдаёт только ту запись, где колличество предметов равно "0", даже если предмет есть в инвентаре. 


Там нужно поставить галочку на Run to target. Если стоит, тогда даже и не знаю, у меня работает.
Klain MkKlaski
Да! Теперь и у меня заработало!!!!
 
   Спасибо  good.gif

Ты не знаешь случайно что именно она значит и в каких ещё случаях ставиться???
Графен
>> Klain MkKlaski:
Ставить галку надо, если проверяемое условие относиться не к говорящему, а к тому, с кем он говорит. Вроде бы.

ЗЫ
Про руки, это я пошутил так smile.gif
Arilita
Цитата: (Ser9K @ 18.02.07 - 21:04)
Товарищи, а есть скрипт, чтобы не отдельный НПС нападал, а целая группа (фракция). Например, от агрессии в 100 единиц они иногда друг на друга нападают...а это как то не логично. nono.gif


Против излишней агрессии друг к другу setIgnoreFriendlyHits должно помогать, если они действительно в одной фракции...
А еще... ну может, это мне так кажется... StartCombat player надо в gamemode проставлять, вроде бы...
gadzilla
Скажите, а есть функция, которая возвращает последний нанесенный плеером урон?
Или вообще хоть какая-то функция связанная с нанесенным игроком (не игроку!) уроном.
Заранее благодарен.
Garin
Смотри учебник по скриптам для Обливиона - OSFM v1.0
Там полное описание типов блоков, всех основных функций и функций расширителя скриптового языка  Обливиона OBSE v0009a. Если где и искать, то там.
Учебник пока что выложен на форуме:
http://forum.rumor.ru/https://www.elderscrolls.net/conference/index.php?showtopic=1201
В ближайшее время будет опубликована оф-лайн версия в виде PDF.
Narzaveys
Конечно лучше бы они его сделали как файл для скачки.
Garin
Мне нужно еще несколько дней для доводки первого тома учебника OSFM.

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

Так что потерпите еще немного...  smile.gif
Night User
А каким скриптом можно отнять здоровье у игрока?
Например игрок отвечает на вопросы и при неправильном ответе у него отнимается здоровье
Klain MkKlaski
    Советую тебе прочитать учебник, на странице что указал Гарин. Если ты собрался сделать плагин, то возникнет ещё много вопросов. В основном по функциям - вот о них то как раз в этом учебнике очень хорошо и написанно.
3BEPb
люди! может напишите инструкцию для чайников??? я лично в скриптах полный 0... я бы был оч блогодарин еслибы было несколько примеров с описанием =) учиться хотю.  biggrin.gif
Night User
Я не понял как отнимать здоровье у игрока.
3BEPb
Цитата: 
Я не понял как отнимать здоровье у игрока.

ну если тебе это поможет- я вообще нечего непонял =0)
Narzaveys
Как заскриптовать статую, что бы при её за действие, можно было бы поспать?
И второй скрипт про туже статую, но только что бы она давала какие нибудь плюсы или у неё можно было обучатся чему нибудь и приносить жертву?
Night User
Я создал message box с вариантами ответов
Нужно отнять здоровье у игрока, если он выберет неправильный ответ!
Klain MkKlaski
Цитата: 
Как заскриптовать статую, что бы при её за действие, можно было бы поспать?


Видимо никак. Ведь у каждой кровати есть привязанная анимация, а у статуи такой нет. Если только попытаться при её активации вызвать меню сна, напрямую))

Цитата: 
И второй скрипт про туже статую, но только что бы она давала какие нибудь плюсы или у неё можно было обучатся чему нибудь и приносить жертву?


Это легко можно сделать, но потому что ты напиал трудно что-либо советовать. Инфы мало)
Ser9K
У меня простетский вопрос. Как работает скрипт с временем. То есть в котором что-то происходит по прошествии трех дней?
Мехруныч
Цитата: (Ser9K @ 16.06.07 - 17:34)
У меня простетский вопрос. Как работает скрипт с временем. То есть в котором что-то происходит по прошествии трех дней?

Ставится таймер посмотри в Vampire Script.
Леснойорех(STA)
Люди, помогите.
Кому не лень, напишите скрипт:
Определённый предмет появляется в определённое время(например в 16:00)
И исчезает в определённое время (например в 17:00), в определённый день года.

Вывесите скрипт здесь.
Мехруныч
Цитата: (Леснойорех(STA) @ 03.07.07 - 15:43)
Люди помогите
Кому не лень напишите скрипт:
Определённый предмет поевлялся в опредилённое время(например в 16:00)
И исчезал в определённое время(например в 17:00),в определённый день года.

Вывисите скрипт здесь.

Ну и флудераст. angry2.gif
varjag
>> Леснойорех(STA):
Сознательный дабл-постинг в следующий раз будет наказан. Если ответа нет, то значит знающий человек ещё не успел увидеть вопрос. Имейте терпение.

>> Мехруныч:
Дабы не оффтопить обвинениями во флудёрстве, есть 1) личка, 2) репутация. В следующий раз оба получат письменные предупреждения.

Читаем правила форума. Незнание не освобождает...
Леснойорех(STA)
Нет бы помочь моделёру - так они репутацию понижают.

Высказать свою обиду вы можете через личные сообщения. Здесь совершенно без надобности посты не по теме. varjag.
Petrovich
Опишу свою проблему. У моего компаньона, вернее компаньонки после перемещения (Fast Travel) в какой-нибудь город (именно в город) появляется еще одно лицо (дублируется) - выглядит ужасно. Проблема возникла после установки последнего патча на игру. Так вот я слышал, что эту проблему можно решить с помощью Disable-Enable. Прошу высказывать свои мысли.
Упрощенная версия форума. Для перехода в полную нажмите на эту ссылку.
Invision Power Board © 2001-2025 Invision Power Services, Inc.