Перейти к содержанию

Рекомендуемые сообщения

Опубликовано
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

Этот объект добавляется в инвентарь только при активации его игроком?
Опубликовано
03.10.2015 13:57:52, PaTi6op сказал(-а):

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

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

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



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

Опубликовано
Да, прошу прощения, что не там написал. А какой скрипт нужен, чтобы предмет добавлялся игроку при входе в игру? Не могу уловить смысл этого скрипта, если я могу просто добавить предмет в нужное мне место и взять его.
Опубликовано
03.10.2015 14:20:31, PaTi6op сказал(-а):

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

Miscobject property MoyPredmet auto

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

Опубликовано

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

Опубликовано
06.10.2015 08:12:08, makcmebel сказал(-а):

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


Если ты сам код не трогаешь, то перекомпилировать не нужно.
  • Нравится 1
Опубликовано
06.10.2015 13:27:15, Кербер сказал(-а):

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

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

 

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

  • Нравится 1
Опубликовано

Посмотрел я на всё это и у меня отпало всякое желание что-либо писать на этом папирусе. Это помесь 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" или что?

pre_1454504183__logo.png.webp.png Kortex Mod Manager: Discord | GitHub | Web-site
Опубликовано
06.10.2015 17:05:38, Кербер сказал(-а):

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

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

 

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

Опубликовано
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
Опубликовано
07.10.2015 21:21:26, werr92 сказал(-а):

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

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

pre_1454504183__logo.png.webp.png Kortex Mod Manager: Discord | GitHub | Web-site
Опубликовано
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
Опубликовано
07.10.2015 23:32:05, werr92 сказал(-а):

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

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

 

07.10.2015 23:32:05, werr92 сказал(-а):

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

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

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

 

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

pre_1454504183__logo.png.webp.png Kortex Mod Manager: Discord | GitHub | Web-site
Опубликовано
08.10.2015 00:14:51, Кербер сказал(-а):

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


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

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

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

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

Опубликовано
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

Всё провисло и болтается.

Опубликовано

Всем привет, вообщем хочу заменить оригинальное горение глаз вампира, из мода "DVA" Когда в моде вампир начинает бой, у него пылают глаза в бою. Вообщем хочу всегда такие глаза. Помогите пожалуйста, что нужно cделать ? Вот скрин:  

Хочу постоянно такие глаза
ScreenShot_2923622_19094064.jpg.webp.png

 

В Showracemenu ставлю такие глаза, но потом они возвращаются в оригинальное значение по умолчанию... 

  • 2 недели спустя...
Опубликовано
22.10.2015 17:31:41, Bald сказал(-а):

Люди как сделать так чтобы при прочтении книг ГГ получил перк?

 

auto state WAITING

Event OnRead()
     Game.GetPlayer().AddPerk(Perk001)

     GoToState("DONE")
endEvent

endstate

 

state DONE

;

endstate

  • Нравится 2
Опубликовано

Кстати на официальном форуме создатель папируса рекомендовал не использовать эту конструкцию Game.GetPlayer(), а вместо этого создавать алиас под игрока и проводить операции с ним. Вроде медленно работает, не так оперативно обрабатывается в очереди скриптов или что-то в этом роде, уже не помню, это было года 2 назад. В данном случае это неважно так как вызывается редко, а вот для очень часто запускаемых скриптов может быть критично.

Опубликовано
22.10.2015 17:52:18, werr92 сказал(-а):

auto state WAITING

Event OnRead()
     Game.GetPlayer().AddPerk(Сюда я поставил свой перк)

     GoToState("DONE")
endEvent

endstate

 

state DONE

;

endstate

В игре не чего не произошло, что я делаю не  так? 

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...