Potatoider Опубликовано 1 октября, 2015 Опубликовано 1 октября, 2015 Тема для вопросов по скриптингу.Функции папируса:На английскомНа русском (не все, но базис) 3
PaTi6op Опубликовано 3 октября, 2015 Опубликовано 3 октября, 2015 02.10.2015 16:45:03, Dimonoider сказал(-а): Простейший скрипт добавления предмета игроку. ; extends ObjectReference Miscobject property MoyPredmet auto {объявление переменной типа MiscObject MoyPredmet. Данная переменная устанавливается в окне редактора, на конкретной копии объекта или на базовом объекте, кнопка Properties}Event OnActivate (ObjectReference akActionRef) {Обработка события Activate, где akActionRef - актер, активирующий данный объект} game.getplayer().additem(MoyPredmet, 1) {Добавление предмета MoyPredmet в инвентарь игроку в кол-ве одна штука} endevent Автор - Bartolomeo Этот объект добавляется в инвентарь только при активации его игроком?
Potatoider Опубликовано 3 октября, 2015 Автор Опубликовано 3 октября, 2015 03.10.2015 13:57:52, PaTi6op сказал(-а): Этот объект добавляется в инвентарь только при активации его игроком? Да, поэтому и событие OnActivate. Список событий можно глянуть здесь (отмотайте вниз) P.S. Сообщения перенесу в тему вопросов по скриптингу
PaTi6op Опубликовано 3 октября, 2015 Опубликовано 3 октября, 2015 Да, прошу прощения, что не там написал. А какой скрипт нужен, чтобы предмет добавлялся игроку при входе в игру? Не могу уловить смысл этого скрипта, если я могу просто добавить предмет в нужное мне место и взять его.
Potatoider Опубликовано 3 октября, 2015 Автор Опубликовано 3 октября, 2015 03.10.2015 14:20:31, PaTi6op сказал(-а): Да, прошу прощения, что не там написал. А какой скрипт нужен, чтобы предмет добавлялся игроку при входе в игру? Miscobject property MoyPredmet auto Event OnInit() game.getplayer().additem(MoyPredmet, 1) EndEvent
makcmebel Опубликовано 6 октября, 2015 Опубликовано 6 октября, 2015 Подскажите, если я в TES5Edit в каком-то предмете, к которому привязан скрипт, изменю его свойства (property), с самим скриптом нужно что-то делать? перекомпилировать может в СК?
werr Опубликовано 6 октября, 2015 Опубликовано 6 октября, 2015 06.10.2015 08:12:08, makcmebel сказал(-а):Подскажите, если я в TES5Edit в каком-то предмете, к которому привязан скрипт, изменю его свойства (property), с самим скриптом нужно что-то делать? перекомпилировать может в СК? Если ты сам код не трогаешь, то перекомпилировать не нужно. 1 A Random Dude's Story
Karandra Опубликовано 6 октября, 2015 Опубликовано 6 октября, 2015 А есть ли вообще описание синтаксиса и семантики этого папируса (только не в форме Бэкуса — Наура)? Kortex Mod Manager: Discord | GitHub | Web-site
werr Опубликовано 6 октября, 2015 Опубликовано 6 октября, 2015 06.10.2015 13:27:15, Кербер сказал(-а): А есть ли вообще описание синтаксиса и семантики этого папируса (только не в форме Бэкуса — Наура)? У Bartolomeo статья есть, я ее проглядел бегло. Не знаю, на сколько она хороша, чтобы учиться по ней. Но альтернативы в ру-сегменте нет. Если можешь читать английский текст, то, конечно, лучше читать не пересказ в помеси с сочинением, а оригинал от разработчика. Погляди сам: http://www.creationkit.com/Papyrus_Introduction Но если хочешь научиться, то не обязательно брать и зубрить теорию. Начинай разбирать простенькие примеры. Односложные, так сказать. Они есть в оригинальной статье. 1 A Random Dude's Story
Karandra Опубликовано 6 октября, 2015 Опубликовано 6 октября, 2015 Посмотрел я на всё это и у меня отпало всякое желание что-либо писать на этом папирусе. Это помесь 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" или что? Kortex Mod Manager: Discord | GitHub | Web-site
werr Опубликовано 6 октября, 2015 Опубликовано 6 октября, 2015 а-а! Все несколько не так. Но на самом деле ничего страшного или нелогичного нет. Дома буду, обьясню 1 A Random Dude's Story
Potatoider Опубликовано 6 октября, 2015 Автор Опубликовано 6 октября, 2015 06.10.2015 17:05:38, Кербер сказал(-а): Посмотрел я на всё это и у меня отпало всякое желание что-либо писать на этом папирусе. Это помесь ANSI C с ООП и странным синтаксисом (даже не сишным). И я так и не понял язык этот регистрозависимый или нет. На самом деле тут... Тут нужно забить на всю эту муру. Папирус как курсач, все эти "давайте мы вас научим" - как курсач, а Вы - тот препод что будет его слушать. Т.е. одна вода. Очень много воды в дефолтных скриптах, свои же пишешь просто включая воображалку. А еще раздолбайство и лень. И описанные функции.
Karandra Опубликовано 7 октября, 2015 Опубликовано 7 октября, 2015 06.10.2015 17:15:01, werr92 сказал(-а):а-а! Все несколько не так. Но на самом деле ничего страшного или нелогичного нет. Дома буду, обьясню Где там мой ответ? Kortex Mod Manager: Discord | GitHub | Web-site
werr Опубликовано 7 октября, 2015 Опубликовано 7 октября, 2015 07.10.2015 19:39:18, Кербер сказал(-а): Где там мой ответ? А где мой дом? Да вот же он! В общем... 06.10.2015 17:05:38, Кербер сказал(-а):Это помесь ANSI C с ООП и странным синтаксисом (даже не сишным). И я так и не понял язык этот регистрозависимый или нет. Хезе, разбирающиеся люди говорят, что "папирус" - это скорее "искаженный ассемблер". Уж так ли это, судить не берусь, я с ассемблером вместе водку не пил. Сишный синтаксис тут немного да присутствует (это уже мое ИМХО). Объявление проперти (переменных), написание функций(если нужны свои функции) после или до основного тела программы. И нет, не регистрозависимый язык. 06.10.2015 17:05:38, Кербер сказал(-а): Ну, допустим есть вот такой скрипт. ........ elseif akActionRef Разве здесь не должно быть условия? Что-то вроде "elseif akActionRef != game.getplayer()", или это отбрасывается? Тогда наверное логичнее было бы написать "else" или в папирусе нет такого оператора? Ну это что-то типа слэнга) Не самая удачная идея в обучающий скрипт сувать подобное, но это так же как в СИ к примеру: можно писать i = i + 1, а можно написать просто i++ . это из той же оперы. Поэтому что твой вариант, что предложенный - все одно. Про "elseif". Ну, конечно же, в папирусе есть и просто "else", а "elseif" - его развитие, чтобы не открывать и не закрывать еще один else() и endif. Опять же это сокращение. В папирусе любой цикл (структура) должен быть открыт и закрыт (как в фортране90 или 74 например). Если проводить аналогию с Си, то это что-то такое: if (...) { .... набор команд ... } 06.10.2015 17:05:38, Кербер сказал(-а):akActionRef Это что, такая традиция использовать именно такие имена переменных или ограничение папируса? (akActionRef as actor) Приведение типа. Что представляет собой akActionRef? Число например "0x00047AF" или что? а вот тут уже интересней. скрипт, который добавляется локально (т.е. я хочу сказать, который вешается на предметы, а не в стадиях квеста прописывается), по-сути своей представляет объявление проперти (переменных) и набор положений (State) и ивентов (events). грубо говоря, начало и конец стейта - это начало и конец тела программы (или, верней подпрограммы, потому что таких стейтов в скрипте может быть хоть миллион). А внутри же стейта присутствуют ивенты (события, говоря просто). Игра распознает, в каком стейте мы сейчас находимся и как только происходит событие (event), то игра выполняет то, что написано внутри этого события (от слов event ONActivate() и до слов endevent как в примере). Это я все к чему написал? К тому, что у ивента есть аргументы: Event OnActivate(ObjectReference akActionRef) так что это не традиция и не ограничение. это название аргумента. в случае с ивентом OnActivate() - это референс того, кто активирует. можно объявить проперти актера, которому задать значение какое-нибудь. таким образом в случае с akActionRef можно будет проверить на соответствие с этим актером. или как в скрипте делается, на соответствие референса активирующего референсу игрока. If akActionRef == game.getplayer() 1 A Random Dude's Story
Karandra Опубликовано 7 октября, 2015 Опубликовано 7 октября, 2015 07.10.2015 21:21:26, werr92 сказал(-а): Это я все к чему написал? К тому, что у ивента есть аргументы: Да ты что? Извини мой сарказм, просто в программировании я не новичок, так что я знаю что ObjectReference это объявление типа, а akActionRef это имя переменной. Меня интересовало почему везде используется именно такой префикс (ak)? Что, все просто копируют чужие прототипы функций и не удосуживаются писать свои? Ну и опять же. "Что представляет собой akActionRef? Число например "0x00047AF" или что?" Я хотел узнать как взаимодействуют между собой типы. Потому что (MiscObject as actor) наверное не сработает. Или всё же сработает? Kortex Mod Manager: Discord | GitHub | Web-site
werr Опубликовано 7 октября, 2015 Опубликовано 7 октября, 2015 07.10.2015 22:14:29, Кербер сказал(-а):Да ты что? Извини мой сарказм, просто в программировании я не новичок, Извиняю. Как-никак сейчас это модно, использовать сарказм. И говоря, что ты программист задавать вопросы о базовых понятиях.так что я знаю что ObjectReference это объявление типа, а akActionRef это имя переменной. Меня интересовало почему везде используется именно такой префикс (ak)? Что, все просто копируют чужие прототипы функций и не удосуживаются писать свои? Вот если бы ты поумерил сарказму и вник в то, что я написал, то понял бы, что ответ был дан корректный. Даже с правильной терминологией, чтоб было удобно понимать как прогеру, так и простому обывателю. НЕТ, akActionRef - это не имя переменной! Тут это аргумент функции и это важно для дальнейшего обьяснения. Это hardcoded часть, так сказать. В папирусе есть ивенты (сейчас думай о них как о стандартных функциях из библиотеки какого-нибудь классического языка программирования). Так вот для всех этих ивентов (все еще думай о них как о функциях:d) количество, название и последовательность аргументов строго прописана! Прописана составителями этого языка программирования. И префикс ak как раз тут подчеркивает, что это не простая переменная, которую можно назвать как хочешь, а конкретный и строго определенный аргумент(!) Ивента. Уот так уот! Поэтому, отвечая на твой вопрос "почему везде используется такой префикс и такое название?" - потому что мы, пользователи, используем стандартную библиотеку, где это все уже предопределено. Но, как ты правильно заметил, можно составлять и свои. Только это на практике в папирусе не нужно. Тут всего-навсего игра для имбицилов, а не численное моделлирование функций состояния квантового ангармонического осциллятора. Ну и опять же. "Что представляет собой akActionRef? Число например "0x00047AF" или что?" Я хотел узнать как взаимодействуют между собой типы. Потому что (MiscObject as actor) наверное не сработает. Или всё же сработает? Тут я не ручаюсь за 100% достоверность своих слов. По идее, akActionRef является обьектом типа objectreference (ты заметил), а objectreference является расширителем для form. Form ID, если точнее. Последний же - это число в шестнадцатеричной системе счисления. Которое уже является уникальным для каждого обьекта и с какого-то недопоя хранит в себе всю инфу о предмете. FormID это тот уровень, на котором игра понимает что за предметы в ней. Таким образом, игра различит, что у миск обжекта с актером мало общего и при компиляции выдаст несоответствие типов. Может быть игра как-то иначе мыслит, но то, что тут выдаст ошибку — это точно. А вот если ты например получишь какой-то обжект референс и приравняешь его к актеру (причем твой референс будет именно актера), то игра воспримит корректно. Ну как-то так. Надеюсь я все же ответил на твои вопросы и расставил акценты правильно. И сорри, я сам не программист, поэтому что хочу, то и ворочу... П.с. и да, я знаю, что в слове 'обьект' нет мягкого знака. Это все злой китайский телефон. 2 A Random Dude's Story
Karandra Опубликовано 8 октября, 2015 Опубликовано 8 октября, 2015 07.10.2015 23:32:05, werr92 сказал(-а): количество, название и последовательность аргументов строго прописана! Количество и последовательность понятно, но зачем, блин, название то хардкодить? Это глупо. Язык не регистро-зависим, но имена аргументов функций менять нельзя. Интересно что там курили в Bethesd'е. 07.10.2015 23:32:05, werr92 сказал(-а): Таким образом, игра различит, что у миск обжекта с актером мало общего и при компиляции выдаст несоответствие типов. Может быть игра как-то иначе мыслит, но то, что тут выдаст ошибку — это точно. А вот если ты например получишь какой-то обжект референс и приравняешь его к актеру (причем твой референс будет именно актера), то игра воспримит корректно. Мда. reinterpret_cast тут и рядом не стоял. Теперь я надеюсь что в TES VI будет другой скриптовый язык. И желательно не производства Bethesd'ы. Kortex Mod Manager: Discord | GitHub | Web-site
werr Опубликовано 8 октября, 2015 Опубликовано 8 октября, 2015 08.10.2015 00:14:51, Кербер сказал(-а): Теперь я надеюсь что в TES VI будет другой скриптовый язык. И желательно не производства Bethesd'ы. Будет производства бесезды. Но что-то они там явно поменяли) Просачивались скриншоты редактора, и если судить по ним, то скрипты в ф4 это отдельный обьект, который можно в окно рендера(?) Помещать... o_0. Осталось узнать, в каком направлении сдвиг произошел: в дебри или в убобство модмейкеров) 1 A Random Dude's Story
zilav Опубликовано 8 октября, 2015 Опубликовано 8 октября, 2015 08.10.2015 00:14:51, Кербер сказал(-а): Теперь я надеюсь что в TES VI будет другой скриптовый язык. И желательно не производства Bethesd'ы. По косвенным ответам от разработчиков на форуме, скриптовый язык для FO4 пишет тот же человек, что и делал папирус. Но он обещал поработать над ошибками, когда ему ткнули носом в ряд проблем. А что получилось - скоро узнаем :whistling: Он кстати достаточно часто отвечает на вопросы по папирусу на офф. форуме даже спустя 4 года, большая редкость для Беседки.
YourBunnyWrote Опубликовано 9 октября, 2015 Опубликовано 9 октября, 2015 07.10.2015 23:32:05, werr92 сказал(-а):НЕТ, akActionRef - это не имя переменной! Тут это аргумент функции и это важно для дальнейшего обьяснения. Это hardcoded часть, так сказать. В папирусе есть ивенты (сейчас думай о них как о стандартных функциях из библиотеки какого-нибудь классического языка программирования). Так вот для всех этих ивентов (все еще думай о них как о функциях:d) количество, название и последовательность аргументов строго прописана! Прописана составителями этого языка программирования. И префикс ak как раз тут подчеркивает, что это не простая переменная, которую можно назвать как хочешь, а конкретный и строго определенный аргумент(!) Ивента. Уот так уот!Имена аргументов в обработчиках событий не захардкожены. Тут даже были примеры, работоспособность которых я проверял, которые это подтверждают, которые ныне потёрты во благо вселенской оптимизации раздела мастерской славу Ситиса. Типы, количество и порядок аргументов предопределены, что вполне логично. Кстати, я не проверял, но вполне вероятно, что для аргументов обработчиков событий предусмотрено автоматическое преобразование типов.Почему всегда копируют имена аргументов из документации:а) не понимают сути;б) не придают особого значения их названию;в) сотни иных вариантов. 06.10.2015 17:05:38, Кербер сказал(-а):(akActionRef as actor)Приведение типа. Что представляет собой akActionRef? Число например "0x00047AF" или что?akActionRef в примере в твоём посте - объект типа ObjectReference. Потёртые скрипты13.04.2014 19:51:22, YourBunnyWrote сказал(-а):В таком случае я бы предложил следующий вариант:Этот скрипт повесить на активатор ScriptName MyActivatorScript extends ObjectReference Message[] Property messages Auto ObjectReference[] Property orSet1 Auto ObjectReference[] Property orSet2 Auto ObjectReference[] Property orSet3 Auto ObjectReference[] Property orSet4 Auto ObjectReference[] Property orSet5 Auto ObjectReference[] Property orSet6 Auto ObjectReference[] Property orSet7 Auto ObjectReference[] Property orSet8 Auto ObjectReference[] Property orSet9 Auto ObjectReference[] Property orSet10 Auto ObjectReference[] Property orSet11 Auto ObjectReference[] Property orSet12 Auto ObjectReference[] Property orSet13 Auto ObjectReference[] Property orSet14 Auto ObjectReference[] Property orSet15 Auto ; Функция дизейблит указанный сэт Function disableSelectedSet(ObjectReference[] orSet) int i = 0 While i < orSet.Length orSet[i].Disable() i += 1 EndWhile EndFunction ; Функция энейблит указанный сэт Function enableSelectedSet(ObjectReference[] orSet) int i = 0 While i < orSet.Length orSet[i].Enable() i += 1 EndWhile EndFunction ; Функция дизейблит объекты во всех 15 сэтах Function disableAllSets() disableSelectedSet(orSet1) disableSelectedSet(orSet2) disableSelectedSet(orSet3) disableSelectedSet(orSet4) disableSelectedSet(orSet5) disableSelectedSet(orSet6) disableSelectedSet(orSet7) disableSelectedSet(orSet8) disableSelectedSet(orSet9) disableSelectedSet(orSet10) disableSelectedSet(orSet11) disableSelectedSet(orSet12) disableSelectedSet(orSet13) disableSelectedSet(orSet14) disableSelectedSet(orSet15) EndFunction Event OnActivate(ObjectReference a) ; Дизейблим объекты во всех сетах disableAllSets() ; Рандомно выбираем сет, объекты в котором будем энейблить int rand = Utility.RandomInt(1, 15) If rand == 1 enableSelectedSet(orSet1) ElseIf rand == 2 enableSelectedSet(orSet2) ElseIf rand == 3 enableSelectedSet(orSet3) ElseIf rand == 4 enableSelectedSet(orSet4) ElseIf rand == 5 enableSelectedSet(orSet5) ElseIf rand == 6 enableSelectedSet(orSet6) ElseIf rand == 7 enableSelectedSet(orSet7) ElseIf rand == 8 enableSelectedSet(orSet8) ElseIf rand == 9 enableSelectedSet(orSet9) ElseIf rand == 10 enableSelectedSet(orSet10) ElseIf rand == 11 enableSelectedSet(orSet11) ElseIf rand == 12 enableSelectedSet(orSet12) ElseIf rand == 13 enableSelectedSet(orSet13) ElseIf rand == 14 enableSelectedSet(orSet14) Else enableSelectedSet(orSet15) EndIf ; Показать сообщение об активации соответстствующего сета If messages.Length < rand Debug.Trace("В массиве с сообщениями недостаточно элементов", 2) Else messages[rand - 1].Show() EndIf EndEvent ; В этом состоянии блокируется активация объекта State blockActivation Event OnActivate(ObjectReference a) ; Ничего не делаем EndEvent EndState Этот скрипт просто сохранить в папке Data\Scripts\Source, никуда не вешая ScriptName MyTriggerScript extends ObjectReference Hidden ; "Абстрактный", если можно так сказать, скрипт (класс) для наших триггеров ; Ссылка на наш активатор MyActivatorScript Property myActivator Auto ; В этом состоянии блокируется активация триггера State blockActivation Event OnTrigger(ObjectReference a) ; Ничего не делаем EndEvent EndState Этот скрипт повесить на первый триггер, который будет блокировать активацию ScriptName MyTriggerScript1 extends MyTriggerScript ; Скрипт первого триггера, блокирующего активацию нашего активатора Event OnTrigger(ObjectReference akActionRef) ; Блокируем активацию нашего активатора myActivator.GoToState("blockActivation") ; Блокируем активацию этого триггера GoToState("blockActivation") EndEvent Этот - на второй триггер ScriptName MyTriggerScript2 extends MyTriggerScript ; Скрипт второго триггера, который дизейблит все объекты Event OnTrigger(ObjectReference akActionRef) ; Дизейблим все сеты myActivator.disableAllSets() ; Блокируем активацию этого триггера GoToState("blockActivation") EndEvent 1 Всё провисло и болтается.
Syswow Опубликовано 10 октября, 2015 Опубликовано 10 октября, 2015 Всем привет, вообщем хочу заменить оригинальное горение глаз вампира, из мода "DVA" Когда в моде вампир начинает бой, у него пылают глаза в бою. Вообщем хочу всегда такие глаза. Помогите пожалуйста, что нужно cделать ? Вот скрин: Хочу постоянно такие глаза В Showracemenu ставлю такие глаза, но потом они возвращаются в оригинальное значение по умолчанию...
Bald Опубликовано 22 октября, 2015 Опубликовано 22 октября, 2015 Люди как сделать так чтобы при прочтении книг ГГ получил перк?
werr Опубликовано 22 октября, 2015 Опубликовано 22 октября, 2015 22.10.2015 17:31:41, Bald сказал(-а): Люди как сделать так чтобы при прочтении книг ГГ получил перк? auto state WAITING Event OnRead() Game.GetPlayer().AddPerk(Perk001) GoToState("DONE") endEvent endstate state DONE ; endstate 2 A Random Dude's Story
zilav Опубликовано 22 октября, 2015 Опубликовано 22 октября, 2015 Кстати на официальном форуме создатель папируса рекомендовал не использовать эту конструкцию Game.GetPlayer(), а вместо этого создавать алиас под игрока и проводить операции с ним. Вроде медленно работает, не так оперативно обрабатывается в очереди скриптов или что-то в этом роде, уже не помню, это было года 2 назад. В данном случае это неважно так как вызывается редко, а вот для очень часто запускаемых скриптов может быть критично.
Bald Опубликовано 23 октября, 2015 Опубликовано 23 октября, 2015 22.10.2015 17:52:18, werr92 сказал(-а): auto state WAITING Event OnRead() Game.GetPlayer().AddPerk(Сюда я поставил свой перк) GoToState("DONE") endEvent endstate state DONE ; endstate В игре не чего не произошло, что я делаю не так?
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти