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


Фотография

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

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

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

#821 Ссылка на это сообщение Potatoider

Potatoider
  • Знаменитый оратор


  • 4 350 сообщений
  •    

Отправлено

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

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

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

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



 




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

#822 Ссылка на это сообщение tokugava

tokugava
  • Новенький
  • 23 сообщений

Отправлено

Скриптами можно.

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

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

 

Строка с Next Quest в списке стадий не используется и не работает.

Большое спасибо!



#823 Ссылка на это сообщение tokugava

tokugava
  • Новенький
  • 23 сообщений

Отправлено

Скриптами можно.

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

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

 

Строка с Next Quest в списке стадий не используется и не работает.

Да, ещё вопрос если можно. Вдруг вы сталкивались с таким...
На предпоследней стадии кв гг должен поговорить с НПС, и вот что странно... 

Загружаюсь с сохранения где только что завершён ванильный квест, после которого начинается мой квест... с курьера и письма. Курьер приходит, квест начинается, все стадии работают кроме последней - разговора с НПС.
Когда прохожу свой квест, дохожу до НПС... он не вступает в диалог. Вообще. "Е" нажимаю... молчит зараза. Но стоит сохраниться рядом с ним и тут же загрузить эту сохранённую игру, он в диалог вступает, спокойно разговариваю с ним и завершаю квест.

У меня даже предположений нет почему так происходит. Возможно вы сталкивались с такой проблемой?

UPD: Квест не запускается. Сделал как в ванильных квестах в последней стадии своего квеста в той что отмечен чекбокс  Complite Quest написал SangQuestP02.Start() - не запустился. Через консоль в игре запускается.
Добавил стадию... выглядит теперь так:

SetObjectiveCompleted(50) ; Завершённая 50 стадия, это 100 стадия.

SangQuestP02.Start() ; Запуск 2 квеста
SangQuestP02.Setstage(10) ; Установка стадии 2 квеста
stop() ; Хз.. есть в ванильных квестах

Всё равно не запускается. 
Может быть у меня как то не так сам квест сделан? У меня 1 квест заканчивается разговором с НПС. После разговора квест завершается. 
И тут же должен начаться 2 квест и цель поговорить с тем же НПС. 
1 квест завершается и всё... 2 квест не запускается.
Я прикреплю скриншоты где и что отмечал и записывал, может быть вы увидите мою ошибку


 


Сообщение отредактировал tokugava: 28 июля 2023 - 19:17


#824 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 074 сообщений
  •    

Отправлено

У меня даже предположений нет почему так происходит. Возможно вы сталкивались с такой проблемой?

Диалоги НПСам не сразу после первой загрузки раздают, а только после второй.

Штука известная, и вроде было какое-то к ней решение (кажется), но деталей не помню.

 

После разговора квест завершается. 

Если у тебя в разговорном скрипт-фрагменте есть скрипт на завершение квеста - туда же можно закинуть и скрипт со стартом нового.



#825 Ссылка на это сообщение ac97

ac97
  • Скиталец
  • 43 сообщений

Отправлено

Ребят, а while (true) нельзя в папирусе, да? Прост, надо каждые полчаса запускать определенную функцию. Ругается на aaaCheckUpdateScript.psc(5,0): missing EOF at 'While'

 

Код прилагаю:

Scriptname aaaCheckUpdateScript extends Quest

int i = 0

While i < 10
	checkUpd()
	Utility.Wait(1800.0)
endWhile

Function checkUpd()
	string cppResult = aaaCheckUpdateFunctions.checkUpdate()
	If (cppResult == "true")
		Debug.MessageBox("Доступно новое обновление!")
	else
		
	endIf
endFunction

Всё, разобрался. while и подобные штуки должны быть внутри событий и функций

 

Исправленная версия, если кому-то надо:

Scriptname aaaCheckUpdateScript extends Quest

event OnInit()
	While(true)
		checkUpd()
		Utility.Wait(1800.0)
	endWhile
endEvent

Function checkUpd()
	string cppResult = aaaCheckUpdateFunctions.checkUpdate()
	If (cppResult == "true")
		Debug.MessageBox("Доступно новое обновление!")
	else
		
	endIf
endFunction

Сообщение отредактировал ac97: 30 июля 2023 - 14:55


#826 Ссылка на это сообщение tokugava

tokugava
  • Новенький
  • 23 сообщений

Отправлено

Диалоги НПСам не сразу после первой загрузки раздают, а только после второй.

Штука известная, и вроде было какое-то к ней решение (кажется), но деталей не помню.

 

Если у тебя в разговорном скрипт-фрагменте есть скрипт на завершение квеста - туда же можно закинуть и скрипт со стартом нового.

Спасибо!!!!
ВОбщем диалог так и не исправил. Сохраняюсь рядом, перегружаю тогда говорит. Буду искать информацию.

А нет такого же бага у СК с функцией GetGold в condition? 
А то выставил проверку в диалоге, что бы топик появлялся только когда золота больше или равно определённому количеству. Проверяю когда нет столько золота, не появляется как и надо.
Но вот беда, добавляю себе золота, а топик всё равно не появляется.
Пробовал GetItemCount тоже не работает =(

Скрин


Сообщение отредактировал tokugava: 31 июля 2023 - 02:40


#827 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 074 сообщений
  •    

Отправлено

Пробовал GetItemCount тоже не работает =(

У тебя субъект кондишна не тот выставлен. В таком виде ты у НПСа количества золота проверяешь, не у игрока.

Переставь первую строчку на Player.



#828 Ссылка на это сообщение tokugava

tokugava
  • Новенький
  • 23 сообщений

Отправлено

У тебя субъект кондишна не тот выставлен. В таком виде ты у НПСа количества золота проверяешь, не у игрока.

Переставь первую строчку на Player.

Спасибо! Помогло!



#829 Ссылка на это сообщение tokugava

tokugava
  • Новенький
  • 23 сообщений

Отправлено

У тебя субъект кондишна не тот выставлен. В таком виде ты у НПСа количества золота проверяешь, не у игрока.

Переставь первую строчку на Player.

Помогите пожалуйста ещё разик... Не могу вообще найти никакой информации как создать таймер ожидания до выполнения квеста.
Например НПС говорит "приходи через 3 суток(минимум), поговорим".
ГГ ждёт 3 суток, шатается по миру, 3 суток проходит и стадия квеста обновляется... мол прошло 3 суток (или больше) Надо сходить поговорить с НПС. 
Поиск в гугле не дал результатов.
Поиск в яше так же результатов не дал.
Поиск на ютубе результата не дал.

Запилил сам скрипт, по идее должен работать... но при компиляции ошибка чё то там не соответствует типу или не задано...
Вот сам скрипт:

Scriptname SangTimeScr extends Quest
Quest Property MyQuest  Auto

Int Property iTimeToFinish auto

Function timerFinish()
    iTimeToFinish = Utility.WaitGameTime(24) ;Ждём 24 часа
    MyQuest.SetStage(40)
EndFunction

Ну и даже если бы скрипт и сработал, я не знаю как вызывать функции в диалогах ((((
Может быть вы знаете где посмотреть информацию, примеры скриптов таких или даже может быть знаете где найти гайд или видео гайд? Помогите пожалуйста.


Сообщение отредактировал tokugava: 31 июля 2023 - 17:20


#830 Ссылка на это сообщение ac97

ac97
  • Скиталец
  • 43 сообщений

Отправлено

Помогите пожалуйста ещё разик... Не могу вообще найти никакой информации как создать таймер ожидания до выполнения квеста.
Например НПС говорит "приходи через 3 суток(минимум), поговорим".
ГГ ждёт 3 суток, шатается по миру, 3 суток проходит и стадия квеста обновляется... мол прошло 3 суток (или больше) Надо сходить поговорить с НПС. 
Поиск в гугле не дал результатов.
Поиск в яше так же результатов не дал.
Поиск на ютубе результата не дал.

Запилил сам скрипт, по идее должен работать... но при компиляции ошибка чё то там не соответствует типу или не задано...
Вот сам скрипт:

Scriptname SangTimeScr extends Quest
Quest Property MyQuest  Auto

Int Property iTimeToFinish auto

Function timerFinish()
    iTimeToFinish = Utility.WaitGameTime(24) ;Ждём 24 часа
    MyQuest.SetStage(40)
EndFunction

Ну и даже если бы скрипт и сработал, я не знаю как вызывать функции в диалогах ((((
Может быть вы знаете где посмотреть информацию, примеры скриптов таких или даже может быть знаете где найти гайд или видео гайд? Помогите пожалуйста.

Scriptname SangTimeScr hidden

Function timerFinish(int time)
    Utility.WaitGameTime(time) ;Ждём n часов
EndFunction

сохраняешь скрипт отдельно. Потом, в нужной стадии любого квеста, вызываешь функцию timerFinish(). ну и переключаешь дальше на стадию, если надо.

 

К примеру, у тебя текущая стадия квеста 35, где надо подождать. Открываешь скрипт текущей стадии и пишешь туда timerFinish(24), а потом, переход на следующую стадию


Сообщение отредактировал ac97: 01 августа 2023 - 09:59


#831 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 074 сообщений
  •    

Отправлено

Помогите пожалуйста ещё разик... Не могу вообще найти никакой информации как создать таймер ожидания до выполнения квеста.

Я где-то видел туториал, но заново найти так и не смог.

 

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

Такое лучше в квестах хранить, чем в диалогах.

 

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

Можно и без них обходиться, закидывая код для выполнения безо всяких функций. Особенно в скрипт-фрагментах.

 

Конкретно в твоем скрипте ты пытаешься на i, которое определено как целое число, назначить процедуру выполнения ожидания, которая вообще никак в виде целого числа представлена быть не может, потому что, ну, оно время ждет, а не что-то вычисляет =)

Естественно ругаться будет.

"iTimeToFinish =" просто лишнее. Проперти с ним, соответственно, тоже не нужно.



#832 Ссылка на это сообщение tokugava

tokugava
  • Новенький
  • 23 сообщений

Отправлено

Вобщем перемудрил сам себя..
Никакого скрипта дополнительного не нужно. Эта функция уже есть в утилитах...
Ломал голову а оказалось всё куда проще:

Utility.WaitGameTime(24)

Вот и всё что нужно было написать во фрагменте папируса на вкладке Quest stages
Код простой как 3 копейки:

SetObjectiveDisplayed(10)
Utility.WaitGameTime(24) ; Мда....
MyQuest01.SetStage(20)
SetObjectiveDisplayed(20)


#833 Ссылка на это сообщение budu200

budu200
  • Новенький
  • 20 сообщений

Отправлено

доброго времени суток...

Понимаю, что щас все в се и ** и **. но вот, я до сих пор в LE. Несколько лет не играл в скайрим. Нифига не помню. По крупицам восстанавливаюсь. Можно пример скрипта, как главногоо героя уложить в сауну на полочке? Можно(или нужно) через скрипт...потихому память возвращается.  Интересует как в Campfire, уложить ГГ на землю,чтобы он лежал и смотрел вокруг. как на стуле тока лежа. Не пинайте....я на стадии восстановления. Кста на второй вкладке. мой скрипт, он рабочий...если ругается строки посмотртеть, на которые ругается.

 

З.Ы. Кста Часто бывают ошибки из-за  очередности установки для LE.  skse_1_07_03 и Creation_Kit_1.9.32,  они перезаписывают главные скрипты друг друга, и можно получить в итоге тот же UTIL старой версии. Если какой то функции не хватат, посмотрите главные скрипты в обоих вариантах.


Сообщение отредактировал budu200: 02 марта 2024 - 04:00


#834 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 074 сообщений
  •    

Отправлено

доброго времени суток...

Понимаю, что щас все в се и ** и **. но вот, я до сих пор в LE. Несколько лет не играл в скайрим. Нифига не помню. По крупицам восстанавливаюсь. Можно пример скрипта, как главногоо героя уложить в сауну на полочке? Можно(или нужно) через скрипт...потихому память возвращается.  Интересует как в Campfire, уложить ГГ на землю,чтобы он лежал и смотрел вокруг. как на стуле тока лежа. Не пинайте....я на стадии восстановления. Кста на второй вкладке. мой скрипт, он рабочий...если ругается строки посмотртеть, на которые ругается.

 

З.Ы. Кста Часто бывают ошибки из-за  очередности установки для LE.  skse_1_07_03 и Creation_Kit_1.9.32,  они перезаписывают главные скрипты друг друга, и можно получить в итоге тот же UTIL старой версии. Если какой то функции не хватат, посмотрите главные скрипты в обоих вариантах.

Зачем тебе скрипт для того, чтобы укладывать игрока? Используй фурнитуру.

 

Скрипты для всех версий одной игры общие, насколько я знаю. В SE-AE добавили кое-то, но и там всё должно быть совместимо.



#835 Ссылка на это сообщение Eon_Tal

Eon_Tal
  • Новенький
  • 27 сообщений

Отправлено

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

 

 Вот тот который у меня

 

 Scriptname _Script_mask_nankir01 extends ObjectReference 

 

armor property myItem auto

bool property placed = FALSE auto

ObjectReference  property MyRef auto

EVENT onActivate(objectReference actronaut)
if placed == FALSE
  if actronaut.getItemCount(myItem) >= 1
   actronaut.removeItem(myItem, 1)
   placed = TRUE
   MyRef.Enable()
 
  else
   Debug.notification("У вас нет нужного предмета")
  endif
elseif placed == TRUE
              MyRef.Disable()
  actronaut.addItem(myItem, 1)
  placed = FALSE
 
endif

endEVENT



#836 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 074 сообщений
  •    

Отправлено

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

 

Для уровневых модификаций надо будет отдельные последовательные проверки под каждую делать. 

Сразу в скрипте массивом, или через цикл по формлисту. И выдавать назад тот предмет, который проверку прошел.

 

Озадачил гугловский ИИ, вот что он выдал.

Слегка подправил скрипт, но так как я уже несколько лет на парирусе не кодил, то сходу понять, рабочий ли он вообще, мне затруднительно =)

Попробуй сделать новый скрипт и скомпилировать. Не забудь указать в массиве все уровневые версии.

Scriptname _Script_mask_nankir01_Multi extends ObjectReference
; Массив, который будет хранить ВСЕ возможные версии предмета (маски).
; Вместо одного предмета, мы теперь работаем со списком.
Armor[] property myItems auto 
; Ссылка на объект в мире, который будет отображаться, когда предмет размещен.
ObjectReference property MyRef auto 
; Флаг, показывающий, размещен ли предмет.
bool property placed = FALSE auto
; Переменная для хранения ТОЧНОЙ версии предмета, которую разместил игрок.
; Это ключевое изменение, чтобы вернуть игроку именно тот предмет, который он положил.
Armor property itemThatWasPlaced auto

EVENT onActivate(ObjectReference actronaut)
    ; --- СЦЕНАРИЙ 1: Игрок хочет РАЗМЕСТИТЬ предмет ---
    if placed == FALSE
        int i = 0
        bool itemFound = FALSE        ; Запускаем цикл, чтобы проверить КАЖДЫЙ предмет из нашего списка в инвентаре игрока.
        while i < myItems.length && itemFound == FALSE
            Armor currentItem = myItems[i]            ; Если у игрока есть текущий предмет из списка...
            if player.getItemCount(currentItem) >= 1
                itemFound = TRUE ; ...мы нашли его!                1. Запоминаем, какой именно предмет мы забираем.
                itemThatWasPlaced = currentItem                ; 2. Забираем этот предмет у игрока.
                player.removeItem(itemThatWasPlaced, 1)                ; 3. Меняем состояние на "размещено".
                placed = TRUE                ; 4. Включаем видимость объекта в мире.
                MyRef.Enable()                ; Можно добавить уведомление об успехе
                Debug.notification("Предмет размещен.")
            endif            i += 1 ; Переходим к следующему предмету в списке.
        endwhile        ; Если после проверки всего списка мы ничего не нашли...
        if itemFound == FALSE
            Debug.notification("У вас нет нужного предмета.")
        endif
    ; --- СЦЕНАРИЙ 2: Игрок хочет ЗАБРАТЬ предмет ---
    elseif placed == TRUE        ; Убедимся, что у нас сохранена информация о том, какой предмет был размещен.
        if itemThatWasPlaced != None            ; 1. Выключаем видимость объекта в мире.
            MyRef.Disable()            ; 2. Возвращаем игроку ТОТ САМЫЙ предмет, который он разместил ранее.
            player.addItem(itemThatWasPlaced, 1)            ; 3. Сбрасываем состояние на "не размещено".
            placed = FALSE            ; 4. Очищаем переменную, чтобы избежать проблем в будущем.
            itemThatWasPlaced = None            Debug.notification("Предмет взят.")
        else
            ; Эта ситуация не должна произойти при нормальной работе, но это защита от ошибок.
            Debug.Trace("ОШИБКА: Предмет размещен, но нет информации о том, какой именно!")
        endif
    endif
endEVENT

Для зачарованных игроком предметов сложнее, так как скрипт не контролирует этот параметр вообще. Он просто удаляет (физически) предмет, и выдает назад его копию.

И, насколько я помню, с определением зачарований скриптом у игры все плохо, так что тут всю систему надо будет переделывать в корне (например, на контейнер с предметами, откуда будут браться "базовые" версии помещенных внутрь вещей, и активироваться на стенде), либо забить и использовать оружейные стойки и манекены.



#837 Ссылка на это сообщение Eon_Tal

Eon_Tal
  • Новенький
  • 27 сообщений

Отправлено

Для уровневых модификаций надо будет отдельные последовательные проверки под каждую делать. 

Сразу в скрипте массивом, или через цикл по формлисту. И выдавать назад тот предмет, который проверку прошел.

 

Озадачил гугловский ИИ, вот что он выдал.

Слегка подправил скрипт, но так как я уже несколько лет на парирусе не кодил, то сходу понять, рабочий ли он вообще, мне затруднительно =)

Попробуй сделать новый скрипт и скомпилировать. Не забудь указать в массиве все уровневые версии.

Scriptname _Script_mask_nankir01_Multi extends ObjectReference
; Массив, который будет хранить ВСЕ возможные версии предмета (маски).
; Вместо одного предмета, мы теперь работаем со списком.
Armor[] property myItems auto 
; Ссылка на объект в мире, который будет отображаться, когда предмет размещен.
ObjectReference property MyRef auto 
; Флаг, показывающий, размещен ли предмет.
bool property placed = FALSE auto
; Переменная для хранения ТОЧНОЙ версии предмета, которую разместил игрок.
; Это ключевое изменение, чтобы вернуть игроку именно тот предмет, который он положил.
Armor property itemThatWasPlaced auto

EVENT onActivate(ObjectReference actronaut)
    ; --- СЦЕНАРИЙ 1: Игрок хочет РАЗМЕСТИТЬ предмет ---
    if placed == FALSE
        int i = 0
        bool itemFound = FALSE        ; Запускаем цикл, чтобы проверить КАЖДЫЙ предмет из нашего списка в инвентаре игрока.
        while i < myItems.length && itemFound == FALSE
            Armor currentItem = myItems[i]            ; Если у игрока есть текущий предмет из списка...
            if player.getItemCount(currentItem) >= 1
                itemFound = TRUE ; ...мы нашли его!                1. Запоминаем, какой именно предмет мы забираем.
                itemThatWasPlaced = currentItem                ; 2. Забираем этот предмет у игрока.
                player.removeItem(itemThatWasPlaced, 1)                ; 3. Меняем состояние на "размещено".
                placed = TRUE                ; 4. Включаем видимость объекта в мире.
                MyRef.Enable()                ; Можно добавить уведомление об успехе
                Debug.notification("Предмет размещен.")
            endif            i += 1 ; Переходим к следующему предмету в списке.
        endwhile        ; Если после проверки всего списка мы ничего не нашли...
        if itemFound == FALSE
            Debug.notification("У вас нет нужного предмета.")
        endif
    ; --- СЦЕНАРИЙ 2: Игрок хочет ЗАБРАТЬ предмет ---
    elseif placed == TRUE        ; Убедимся, что у нас сохранена информация о том, какой предмет был размещен.
        if itemThatWasPlaced != None            ; 1. Выключаем видимость объекта в мире.
            MyRef.Disable()            ; 2. Возвращаем игроку ТОТ САМЫЙ предмет, который он разместил ранее.
            player.addItem(itemThatWasPlaced, 1)            ; 3. Сбрасываем состояние на "не размещено".
            placed = FALSE            ; 4. Очищаем переменную, чтобы избежать проблем в будущем.
            itemThatWasPlaced = None            Debug.notification("Предмет взят.")
        else
            ; Эта ситуация не должна произойти при нормальной работе, но это защита от ошибок.
            Debug.Trace("ОШИБКА: Предмет размещен, но нет информации о том, какой именно!")
        endif
    endif
endEVENT

Для зачарованных игроком предметов сложнее, так как скрипт не контролирует этот параметр вообще. Он просто удаляет (физически) предмет, и выдает назад его копию.

И, насколько я помню, с определением зачарований скриптом у игры все плохо, так что тут всю систему надо будет переделывать в корне (например, на контейнер с предметами, откуда будут браться "базовые" версии помещенных внутрь вещей, и активироваться на стенде), либо забить и использовать оружейные стойки и манекены.

 

Может звучит глупо ,но я скопировал данный вами скрипт , убрал пояснения . Выбило ошибку при компиляции , а именно:

 D:\Games\The Elder Scrolls V Skyrim - Special Edition\Data\Scripts\Source\temp\_Script_Mask_Miraak.psc(13,55): no viable alternative at input '\\r\\n'

D:\Games\The Elder Scrolls V Skyrim - Special Edition\Data\Scripts\Source\temp\_Script_Mask_Miraak.psc(17,71): no viable alternative at input '\\r\\n'
D:\Games\The Elder Scrolls V Skyrim - Special Edition\Data\Scripts\Source\temp\_Script_Mask_Miraak.psc(21,29): required (...)+ loop did not match anything at input 'i'



#838 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 074 сообщений
  •    

Отправлено

Выбило ошибку при компиляции , а именно:

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

На папирусе я не кодил уже несколько лет, и почти всё забыл из-за недостатка практики. 

Даже СК установленного с компилятором нет, чтоб точно проверить, на что именно он там ругается.

 

Как вариант, бот забыл задекларировать player (или это я вырезал эту часть, так как там в начале еще была проверка на активацию объекта только игроком).

Т.е. заменить 'player' на Game.GetPlayer() в трех местах скрипта.

Про последнюю ошибку хз.







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

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

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