Тема для вопросов по скриптингу.
Функции папируса:
На английском
На русском (не все, но базис)
#1
Отправлено
- werr, Chesh¡re и Olechkafum нравится это
#2
Отправлено
Простейший скрипт добавления предмета игроку.
; extends ObjectReference Miscobject property MoyPredmet auto {объявление переменной типа MiscObject MoyPredmet. Данная переменная устанавливается в окне редактора, на конкретной копии объекта или на базовом объекте, кнопка Properties}Event OnActivate (ObjectReference akActionRef) {Обработка события Activate, где akActionRef - актер, активирующий данный объект} game.getplayer().additem(MoyPredmet, 1) {Добавление предмета MoyPredmet в инвентарь игроку в кол-ве одна штука} endeventАвтор - Bartolomeo
Этот объект добавляется в инвентарь только при активации его игроком?
#9
Отправлено
А есть ли вообще описание синтаксиса и семантики этого папируса (только не в форме Бэкуса — Наура)?
У Bartolomeo статья есть, я ее проглядел бегло. Не знаю, на сколько она хороша, чтобы учиться по ней. Но альтернативы в ру-сегменте нет. Если можешь читать английский текст, то, конечно, лучше читать не пересказ в помеси с сочинением, а оригинал от разработчика. Погляди сам: http://www.creationk...us_Introduction
Но если хочешь научиться, то не обязательно брать и зубрить теорию. Начинай разбирать простенькие примеры. Односложные, так сказать. Они есть в оригинальной статье.
- ferretcha это нравится
#10
Отправлено
Посмотрел я на всё это и у меня отпало всякое желание что-либо писать на этом папирусе. Это помесь 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" или что?
#12
Отправлено
Посмотрел я на всё это и у меня отпало всякое желание что-либо писать на этом папирусе. Это помесь ANSI C с ООП и странным синтаксисом (даже не сишным). И я так и не понял язык этот регистрозависимый или нет.
На самом деле тут... Тут нужно забить на всю эту муру. Папирус как курсач, все эти "давайте мы вас научим" - как курсач, а Вы - тот препод что будет его слушать. Т.е. одна вода.
Очень много воды в дефолтных скриптах, свои же пишешь просто включая воображалку. А еще раздолбайство и лень. И описанные функции.
#14
Отправлено
Где там мой ответ?
А где мой дом? Да вот же он!
В общем...
Это помесь 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()
- ferretcha это нравится
#15
Отправлено
Это я все к чему написал? К тому, что у ивента есть аргументы:
Да ты что? Извини мой сарказм, просто в программировании я не новичок, так что я знаю что ObjectReference это объявление типа, а akActionRef это имя переменной. Меня интересовало почему везде используется именно такой префикс (ak)? Что, все просто копируют чужие прототипы функций и не удосуживаются писать свои?
Ну и опять же. "Что представляет собой akActionRef? Число например "0x00047AF" или что?" Я хотел узнать как взаимодействуют между собой типы. Потому что (MiscObject as actor) наверное не сработает. Или всё же сработает?
#16
Отправлено
Извиняю. Как-никак сейчас это модно, использовать сарказм. И говоря, что ты программист задавать вопросы о базовых понятиях.Да ты что? Извини мой сарказм, просто в программировании я не новичок,
Вот если бы ты поумерил сарказму и вник в то, что я написал, то понял бы, что ответ был дан корректный. Даже с правильной терминологией, чтоб было удобно понимать как прогеру, так и простому обывателю.так что я знаю что ObjectReference это объявление типа, а akActionRef это имя переменной. Меня интересовало почему везде используется именно такой префикс (ak)? Что, все просто копируют чужие прототипы функций и не удосуживаются писать свои?
НЕТ, akActionRef - это не имя переменной! Тут это аргумент функции и это важно для дальнейшего обьяснения. Это hardcoded часть, так сказать. В папирусе есть ивенты (сейчас думай о них как о стандартных функциях из библиотеки какого-нибудь классического языка программирования). Так вот для всех этих ивентов (все еще думай о них как о функциях:d) количество, название и последовательность аргументов строго прописана! Прописана составителями этого языка программирования. И префикс ak как раз тут подчеркивает, что это не простая переменная, которую можно назвать как хочешь, а конкретный и строго определенный аргумент(!) Ивента. Уот так уот!
Поэтому, отвечая на твой вопрос "почему везде используется такой префикс и такое название?" - потому что мы, пользователи, используем стандартную библиотеку, где это все уже предопределено. Но, как ты правильно заметил, можно составлять и свои. Только это на практике в папирусе не нужно. Тут всего-навсего игра для имбицилов, а не численное моделлирование функций состояния квантового ангармонического осциллятора.
Тут я не ручаюсь за 100% достоверность своих слов.Ну и опять же. "Что представляет собой akActionRef? Число например "0x00047AF" или что?" Я хотел узнать как взаимодействуют между собой типы. Потому что (MiscObject as actor) наверное не сработает. Или всё же сработает?
По идее, akActionRef является обьектом типа objectreference (ты заметил), а objectreference является расширителем для form. Form ID, если точнее. Последний же - это число в шестнадцатеричной системе счисления. Которое уже является уникальным для каждого обьекта и с какого-то недопоя хранит в себе всю инфу о предмете. FormID это тот уровень, на котором игра понимает что за предметы в ней. Таким образом, игра различит, что у миск обжекта с актером мало общего и при компиляции выдаст несоответствие типов.
Может быть игра как-то иначе мыслит, но то, что тут выдаст ошибку — это точно. А вот если ты например получишь какой-то обжект референс и приравняешь его к актеру (причем твой референс будет именно актера), то игра воспримит корректно.
Ну как-то так. Надеюсь я все же ответил на твои вопросы и расставил акценты правильно. И сорри, я сам не программист, поэтому что хочу, то и ворочу...
П.с. и да, я знаю, что в слове 'обьект' нет мягкого знака. Это все злой китайский телефон.
#17
Отправлено
количество, название и последовательность аргументов строго прописана!
Количество и последовательность понятно, но зачем, блин, название то хардкодить? Это глупо. Язык не регистро-зависим, но имена аргументов функций менять нельзя. Интересно что там курили в Bethesd'е.
Таким образом, игра различит, что у миск обжекта с актером мало общего и при компиляции выдаст несоответствие типов.
Может быть игра как-то иначе мыслит, но то, что тут выдаст ошибку — это точно. А вот если ты например получишь какой-то обжект референс и приравняешь его к актеру (причем твой референс будет именно актера), то игра воспримит корректно.
Мда. reinterpret_cast тут и рядом не стоял.
Теперь я надеюсь что в TES VI будет другой скриптовый язык. И желательно не производства Bethesd'ы.
#18
Отправлено
Теперь я надеюсь что в TES VI будет другой скриптовый язык. И желательно не производства Bethesd'ы.
Будет производства бесезды. Но что-то они там явно поменяли) Просачивались скриншоты редактора, и если судить по ним, то скрипты в ф4 это отдельный обьект, который можно в окно рендера(?) Помещать... o_0. Осталось узнать, в каком направлении сдвиг произошел: в дебри или в убобство модмейкеров)
- ferretcha это нравится
#19
Отправлено
Теперь я надеюсь что в TES VI будет другой скриптовый язык. И желательно не производства Bethesd'ы.
По косвенным ответам от разработчиков на форуме, скриптовый язык для FO4 пишет тот же человек, что и делал папирус. Но он обещал поработать над ошибками, когда ему ткнули носом в ряд проблем. А что получилось - скоро узнаем
Он кстати достаточно часто отвечает на вопросы по папирусу на офф. форуме даже спустя 4 года, большая редкость для Беседки.
#20
Отправлено
Имена аргументов в обработчиках событий не захардкожены. Тут даже были примеры, работоспособность которых я проверял, которые это подтверждают, которые ныне потёрты воНЕТ, akActionRef - это не имя переменной! Тут это аргумент функции и это важно для дальнейшего обьяснения. Это hardcoded часть, так сказать. В папирусе есть ивенты (сейчас думай о них как о стандартных функциях из библиотеки какого-нибудь классического языка программирования). Так вот для всех этих ивентов (все еще думай о них как о функциях:d) количество, название и последовательность аргументов строго прописана! Прописана составителями этого языка программирования. И префикс ak как раз тут подчеркивает, что это не простая переменная, которую можно назвать как хочешь, а конкретный и строго определенный аргумент(!) Ивента. Уот так уот!
Почему всегда копируют имена аргументов из документации:
а) не понимают сути;
б) не придают особого значения их названию;
в) сотни иных вариантов.
akActionRef в примере в твоём посте - объект типа ObjectReference.(akActionRef as actor)
Приведение типа. Что представляет собой akActionRef? Число например "0x00047AF" или что?
- werr это нравится
Всё провисло и болтается.
Темы с аналогичным тегами papyrus, help, скрипты, вопросы
Моддинг →
Моддинг Skyrim →
Восстановление на основе Зала ДозораАвтор Alex_andra, 11 дек 2023 mod, help |
|
|||
|
Моддинг →
Моддинг Skyrim →
Отстройка ВинтерхолдаАвтор Alex_andra, 10 авг 2023 bugs, moding, help |
|
||
Моддинг →
Моддинг Oblivion →
Скрипт Для СнаряженияАвтор БесездаБойчик, 07 сен 2022 скрипты, скрипт |
|
|||
Моддинг →
Моддинг Skyrim →
Нужны добровольцы для теста модаАвтор arkadiy111, 11 апр 2022 help |
|
|||
help
Моддинг →
Моддинг Skyrim →
Ram and Skyrim seАвтор Samurai1, 03 апр 2022 help |
|
Количество пользователей, читающих эту тему: 3
0 пользователей, 3 гостей, 0 скрытых