Перейти к содержимому


Фотография

Вопросы по скриптам

papyrus help скрипты вопросы

  • Авторизуйтесь для ответа в теме

#1 Ссылка на это сообщение Dimonoider

Dimonoider
  • Картошечка


  • 4 324 сообщений
  •    
Наш автор

Отправлено

Тема для вопросов по скриптингу.

Функции папируса:

На английском

На русском (не все, но базис)



 




  • Авторизуйтесь для ответа в теме
Сообщений в теме: 442

#2 Ссылка на это сообщение PaTi6op

PaTi6op
  • Скиталец
  • 55 сообщений

Отправлено

Простейший скрипт добавления предмета игроку.

; extends ObjectReference

Miscobject property MoyPredmet auto
{объявление переменной типа MiscObject MoyPredmet.
Данная переменная устанавливается в окне редактора, на конкретной копии объекта
или на базовом объекте, кнопка Properties}Event OnActivate (ObjectReference akActionRef)
{Обработка события Activate, где akActionRef - актер, активирующий данный объект}
game.getplayer().additem(MoyPredmet, 1)
{Добавление предмета MoyPredmet в инвентарь игроку в кол-ве одна штука}
endevent
Автор - Bartolomeo

Этот объект добавляется в инвентарь только при активации его игроком?

#3 Ссылка на это сообщение Dimonoider

Dimonoider
  • Картошечка


  • 4 324 сообщений
  •    
Наш автор

Отправлено

Этот объект добавляется в инвентарь только при активации его игроком?

Да, поэтому и событие OnActivate.

Список событий можно глянуть здесь (отмотайте вниз)



P.S. Сообщения перенесу в тему вопросов по скриптингу



#4 Ссылка на это сообщение PaTi6op

PaTi6op
  • Скиталец
  • 55 сообщений

Отправлено

Да, прошу прощения, что не там написал. А какой скрипт нужен, чтобы предмет добавлялся игроку при входе в игру? Не могу уловить смысл этого скрипта, если я могу просто добавить предмет в нужное мне место и взять его.

#5 Ссылка на это сообщение Dimonoider

Dimonoider
  • Картошечка


  • 4 324 сообщений
  •    
Наш автор

Отправлено

Да, прошу прощения, что не там написал. А какой скрипт нужен, чтобы предмет добавлялся игроку при входе в игру? 

Miscobject property MoyPredmet auto

Event OnInit()
game.getplayer().additem(MoyPredmet, 1)
EndEvent



#6 Ссылка на это сообщение makcmebel

makcmebel
  • Скиталец
  • 30 сообщений

Отправлено

Подскажите, если я в TES5Edit в каком-то предмете, к которому привязан скрипт, изменю его свойства (property), с самим скриптом нужно что-то делать? перекомпилировать может в СК?



#7 Ссылка на это сообщение werr

werr
  • больной на всю голову

  • 1 602 сообщений
  •    
Наш автор

Отправлено

Подскажите, если я в TES5Edit в каком-то предмете, к которому привязан скрипт, изменю его свойства (property), с самим скриптом нужно что-то делать? перекомпилировать может в СК?


Если ты сам код не трогаешь, то перекомпилировать не нужно.

#8 Ссылка на это сообщение Кербер

Кербер
  • Лорд



  • 3 598 сообщений
  •    

Отправлено

А есть ли вообще описание синтаксиса и семантики этого папируса (только не в форме Бэкуса — Наура)?



#9 Ссылка на это сообщение werr

werr
  • больной на всю голову

  • 1 602 сообщений
  •    
Наш автор

Отправлено

А есть ли вообще описание синтаксиса и семантики этого папируса (только не в форме Бэкуса — Наура)?

У Bartolomeo статья есть, я ее проглядел бегло. Не знаю, на сколько она хороша, чтобы учиться по ней. Но альтернативы в ру-сегменте нет. Если можешь читать английский текст, то, конечно, лучше читать не пересказ в помеси с сочинением, а оригинал от разработчика. Погляди сам: http://www.creationk...us_Introduction

 

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



#10 Ссылка на это сообщение Кербер

Кербер
  • Лорд



  • 3 598 сообщений
  •    

Отправлено

Посмотрел я на всё это и у меня отпало всякое желание что-либо писать на этом папирусе. Это помесь ANSI C с ООП и странным синтаксисом (даже не сишным). И я так и не понял язык этот регистрозависимый или нет.
 
Ну, допустим есть вот такой скрипт.

Scriptname MyFirstScript extends ObjectReference
MiscObject property MyItem auto
Event OnActivate(ObjectReference akActionRef)
                 If  akActionRef == game.getplayer() 
     akActionRef.additem(MyItem, 1)
                elseif  akActionRef
    (akActionRef as actor).kill()
   Endif
endevent

elseif akActionRef
Разве здесь не должно быть условия? Что-то вроде "elseif  akActionRef != game.getplayer()", или это отбрасывается? Тогда наверное логичнее было бы написать "else" или в папирусе нет такого оператора?
 
akActionRef
Это что, такая традиция использовать именно такие имена переменных или ограничение папируса?
 
(akActionRef as actor)
Приведение типа. Что представляет собой akActionRef? Число например "0x00047AF" или что?



#11 Ссылка на это сообщение werr

werr
  • больной на всю голову

  • 1 602 сообщений
  •    
Наш автор

Отправлено

а-а! Все несколько не так. Но на самом деле ничего страшного или нелогичного нет. Дома буду, обьясню

#12 Ссылка на это сообщение Dimonoider

Dimonoider
  • Картошечка


  • 4 324 сообщений
  •    
Наш автор

Отправлено

Посмотрел я на всё это и у меня отпало всякое желание что-либо писать на этом папирусе. Это помесь ANSI C с ООП и странным синтаксисом (даже не сишным). И я так и не понял язык этот регистрозависимый или нет.
 

На самом деле тут... Тут нужно забить на всю эту муру. Папирус как курсач, все эти "давайте мы вас научим" - как курсач, а Вы - тот препод что будет его слушать. Т.е. одна вода. 

 

Очень много воды в дефолтных скриптах, свои же пишешь просто включая воображалку. А еще раздолбайство и лень. И описанные функции. 



#13 Ссылка на это сообщение Кербер

Кербер
  • Лорд



  • 3 598 сообщений
  •    

Отправлено

а-а! Все несколько не так. Но на самом деле ничего страшного или нелогичного нет. Дома буду, обьясню

Где там мой ответ?



#14 Ссылка на это сообщение werr

werr
  • больной на всю голову

  • 1 602 сообщений
  •    
Наш автор

Отправлено

Где там мой ответ?

А где мой дом? Да вот же он!

 

В общем...

Это помесь ANSI C с ООП и странным синтаксисом (даже не сишным). И я так и не понял язык этот регистрозависимый или нет.

Хезе, разбирающиеся люди говорят, что "папирус" - это скорее "искаженный ассемблер". Уж так ли это, судить не берусь, я с ассемблером вместе водку не пил. Сишный синтаксис тут немного да присутствует (это уже мое ИМХО). Объявление проперти (переменных), написание функций(если нужны свои функции) после или до основного тела программы. И нет, не регистрозависимый язык.

 

 

Ну, допустим есть вот такой скрипт.

........

elseif akActionRef
Разве здесь не должно быть условия? Что-то вроде "elseif  akActionRef != game.getplayer()", или это отбрасывается? Тогда наверное логичнее было бы написать "else" или в папирусе нет такого оператора?

 Ну это что-то типа слэнга) Не самая удачная идея в обучающий скрипт сувать подобное, но это так же как в СИ к примеру:

можно писать i = i + 1, а можно написать просто i++ . это из той же оперы. Поэтому что твой вариант, что предложенный - все одно. Про "elseif". Ну, конечно же, в папирусе есть и просто "else", а "elseif" - его развитие, чтобы не открывать и не закрывать еще один else() и endif. Опять же это сокращение. В папирусе любой цикл (структура) должен быть открыт и закрыт (как в фортране90 или 74 например). Если проводить аналогию с Си, то это что-то такое:

if (...)

{

....

набор

команд

...

 

 

akActionRef
Это что, такая традиция использовать именно такие имена переменных или ограничение папируса?
 
(akActionRef as actor)
Приведение типа. Что представляет собой akActionRef? Число например "0x00047AF" или что?

а вот тут уже интересней. скрипт, который добавляется локально (т.е. я хочу сказать, который вешается на предметы, а не в стадиях квеста прописывается), по-сути своей представляет объявление проперти (переменных) и набор положений (State) и ивентов (events). грубо говоря, начало и конец стейта - это начало и конец тела программы (или, верней подпрограммы, потому что таких стейтов в скрипте может быть хоть миллион). А внутри же стейта присутствуют ивенты (события, говоря просто). Игра распознает, в каком стейте мы сейчас находимся и как только происходит событие (event), то игра выполняет то, что написано внутри этого события (от слов event ONActivate() и до слов endevent как в примере). 

 

Это я все к чему написал? К тому, что у ивента есть аргументы:

Event OnActivate(ObjectReference akActionRef)

 

так что это не традиция и не ограничение. это название аргумента. в случае с ивентом OnActivate() - это референс того, кто активирует. можно объявить проперти актера, которому задать значение какое-нибудь. таким образом в случае с akActionRef можно будет проверить на соответствие с этим актером. или как в скрипте делается, на соответствие референса активирующего референсу игрока. 

If  akActionRef == game.getplayer()



#15 Ссылка на это сообщение Кербер

Кербер
  • Лорд



  • 3 598 сообщений
  •    

Отправлено

Это я все к чему написал? К тому, что у ивента есть аргументы:

Да ты что? Извини мой сарказм, просто в программировании я не новичок, так что я знаю что ObjectReference это объявление типа, а akActionRef это имя переменной. Меня интересовало почему везде используется именно такой префикс (ak)? Что, все просто копируют чужие прототипы функций и не удосуживаются писать свои?
 
Ну и опять же. "Что представляет собой akActionRef? Число например "0x00047AF" или что?" Я хотел узнать как взаимодействуют между собой типы. Потому что (MiscObject as actor) наверное не сработает. Или всё же сработает?



#16 Ссылка на это сообщение werr

werr
  • больной на всю голову

  • 1 602 сообщений
  •    
Наш автор

Отправлено

Да ты что? Извини мой сарказм, просто в программировании я не новичок,

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

так что я знаю что ObjectReference это объявление типа, а akActionRef это имя переменной. Меня интересовало почему везде используется именно такой префикс (ak)? Что, все просто копируют чужие прототипы функций и не удосуживаются писать свои?

Вот если бы ты поумерил сарказму и вник в то, что я написал, то понял бы, что ответ был дан корректный. Даже с правильной терминологией, чтоб было удобно понимать как прогеру, так и простому обывателю.
НЕТ, akActionRef - это не имя переменной! Тут это аргумент функции и это важно для дальнейшего обьяснения. Это hardcoded часть, так сказать. В папирусе есть ивенты (сейчас думай о них как о стандартных функциях из библиотеки какого-нибудь классического языка программирования). Так вот для всех этих ивентов (все еще думай о них как о функциях:d) количество, название и последовательность аргументов строго прописана! Прописана составителями этого языка программирования. И префикс ak как раз тут подчеркивает, что это не простая переменная, которую можно назвать как хочешь, а конкретный и строго определенный аргумент(!) Ивента. Уот так уот!

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

Ну и опять же. "Что представляет собой akActionRef? Число например "0x00047AF" или что?" Я хотел узнать как взаимодействуют между собой типы. Потому что (MiscObject as actor) наверное не сработает. Или всё же сработает?

Тут я не ручаюсь за 100% достоверность своих слов.
По идее, akActionRef является обьектом типа objectreference (ты заметил), а objectreference является расширителем для form. Form ID, если точнее. Последний же - это число в шестнадцатеричной системе счисления. Которое уже является уникальным для каждого обьекта и с какого-то недопоя хранит в себе всю инфу о предмете. FormID это тот уровень, на котором игра понимает что за предметы в ней. Таким образом, игра различит, что у миск обжекта с актером мало общего и при компиляции выдаст несоответствие типов.

Может быть игра как-то иначе мыслит, но то, что тут выдаст ошибку — это точно. А вот если ты например получишь какой-то обжект референс и приравняешь его к актеру (причем твой референс будет именно актера), то игра воспримит корректно.


Ну как-то так. Надеюсь я все же ответил на твои вопросы и расставил акценты правильно. И сорри, я сам не программист, поэтому что хочу, то и ворочу...

П.с. и да, я знаю, что в слове 'обьект' нет мягкого знака. Это все злой китайский телефон.

#17 Ссылка на это сообщение Кербер

Кербер
  • Лорд



  • 3 598 сообщений
  •    

Отправлено

количество, название и последовательность аргументов строго прописана!

Количество и последовательность понятно, но зачем, блин, название то хардкодить? Это глупо. Язык не регистро-зависим, но имена аргументов функций менять нельзя. Интересно что там курили в Bethesd'е.

 

Таким образом, игра различит, что у миск обжекта с актером мало общего и при компиляции выдаст несоответствие типов.

Может быть игра как-то иначе мыслит, но то, что тут выдаст ошибку — это точно. А вот если ты например получишь какой-то обжект референс и приравняешь его к актеру (причем твой референс будет именно актера), то игра воспримит корректно.

 Мда. reinterpret_cast тут и рядом не стоял.

 

Теперь я надеюсь что в TES VI будет другой скриптовый язык. И желательно не производства Bethesd'ы.



#18 Ссылка на это сообщение werr

werr
  • больной на всю голову

  • 1 602 сообщений
  •    
Наш автор

Отправлено

Теперь я надеюсь что в TES VI будет другой скриптовый язык. И желательно не производства Bethesd'ы.


Будет производства бесезды. Но что-то они там явно поменяли) Просачивались скриншоты редактора, и если судить по ним, то скрипты в ф4 это отдельный обьект, который можно в окно рендера(?) Помещать... o_0. Осталось узнать, в каком направлении сдвиг произошел: в дебри или в убобство модмейкеров)

#19 Ссылка на это сообщение zilav

zilav
  • Профи
  • 300 сообщений
  •  

Отправлено

Теперь я надеюсь что в TES VI будет другой скриптовый язык. И желательно не производства Bethesd'ы.

По косвенным ответам от разработчиков на форуме, скриптовый язык для FO4 пишет тот же человек, что и делал папирус. Но он обещал поработать над ошибками, когда ему ткнули носом в ряд проблем. А что получилось - скоро узнаем :whistling:

Он кстати достаточно часто отвечает на вопросы по папирусу на офф. форуме даже спустя 4 года, большая редкость для Беседки.



#20 Ссылка на это сообщение YourBunnyWrote

YourBunnyWrote
  • Рабочий лень
  • 3 200 сообщений
  •    
Наш автор

Отправлено

НЕТ, akActionRef - это не имя переменной! Тут это аргумент функции и это важно для дальнейшего обьяснения. Это hardcoded часть, так сказать. В папирусе есть ивенты (сейчас думай о них как о стандартных функциях из библиотеки какого-нибудь классического языка программирования). Так вот для всех этих ивентов (все еще думай о них как о функциях:d) количество, название и последовательность аргументов строго прописана! Прописана составителями этого языка программирования. И префикс ak как раз тут подчеркивает, что это не простая переменная, которую можно назвать как хочешь, а конкретный и строго определенный аргумент(!) Ивента. Уот так уот!

Имена аргументов в обработчиках событий не захардкожены. Тут даже были примеры, работоспособность которых я проверял, которые это подтверждают, которые ныне потёрты во благо вселенской оптимизации раздела мастерской славу Ситиса. Типы, количество и порядок аргументов предопределены, что вполне логично. Кстати, я не проверял, но вполне вероятно, что для аргументов обработчиков событий предусмотрено автоматическое преобразование типов.
Почему всегда копируют имена аргументов из документации:
а) не понимают сути;
б) не придают особого значения их названию;
в) сотни иных вариантов.
 

(akActionRef as actor)
Приведение типа. Что представляет собой akActionRef? Число например "0x00047AF" или что?

akActionRef в примере в твоём посте - объект типа ObjectReference.
 
Потёртые скрипты

  • werr это нравится

TESAll.Ru в Discord бесплатно, без SMS.






Темы с аналогичным тегами papyrus, help, скрипты, вопросы

Количество пользователей, читающих эту тему: 2

0 пользователей, 2 гостей, 0 скрытых