Скрипты - неотъемлемая часть GECK. При написании возникает очень много казусов. Данная тема должна помочь не наступать на "грабли" новичкам и делиться опытом с другими более продвинутых мододелов.
Да,спасибо. Но все же это немного не то)) Из всего перечисленого мне ближе всего подходит последний тутор,так как мой простенький квест ограничевается лишь поиском записей. Ну в целом да,согласен,вдруг решу добавить еще что-то.
читаем там найденную записку,после прочтения появляется название квеста "Невидимый враг", и добавляется задание:
То тогда делаешь так...
Прежде всего надо создать записку, которую будем читать в Пип-бое. Создается в разделе Item-Note. Тип записки - текстовый, в поле текста пишем то, что хотели бы поведать игроку, ну скажем - "Ходят слухи, что если собрать 20 крышек от Квантовой Ядер-колы, то в казино Топс дадут приз - годовую подписку на журнал "Мурзилка". Модель записке назначать необязательно, потому что в игровом мире она не появляется в "живом" виде. Поскольку при получении записки должно произойти некое событие - значит нам нужен скрипт, запускающий это событие. Но к записке-Note нельзя прикрутить скрипт - значит нам нужна "фальшивая" записка из раздела Item-MiscItem, к которой мы и прицепим скрипт. Находишь в указанном разделе любую готовую записку с моделью листка бумаги, (например - записка HVRangerNoteItem), меняешь ей айди и сохраняешь, как новый объект. У нас теперь есть две записки: одна - Note, "настоящая", текст которой можно будет читать в Пип-бое, и одна - MiscItem, "фальшивая", которую мы будем находить в игре. Теперь нужен скрипт, который будет убирать "фальшивую" записку из инвентаря, давать игроку "настоящую" записку и запускать планируемое событие. Идем в раздел скриптов и создаем новый, простенький скрипт. Пока пишем предварительно вот такие команды: scn Имя скрипта
begin OnAdd player ;(срабатывает при добавлении игроку заскриптованного этим скриптом предмета) player.addnote айди_настоящей записки ;(эта команда добавляет игроку "настоящую" записку-note) removeme ;(эта команда удаляет из инвентаря полученную фальшивую записку) end
Тип скрипта - объектный. Сохраняешь скрипт, открываешь "фальшивую" записку и назначаешь ей только что созданный скрипт.
Скидываешь эту записку в нужное место на локации. Или кладешь в какой-нибудь сундук и уже сундук размещаешь на месте, короче - по вкусу. На этом этапе мы имеем такой результат: находим в игре записку, подбираем и получаем в Пип-бое в разделе Заметок нужный текст про крышки от Ядер-колы. Далее нам нужно сделать запуск некоего события, которое мы планируем, а именно - получение задания по поиску этих 20-ти крышек. Значит - нужен квест. Идем в раздел квестов и создаем новый квест. Пишем ему айди и ЗАГЛАВНЫМИ буквами пишем имя, например - В ПОИСКАХ КРЫШЕК. Ставим приоритет по желанию, допустим - 50 и, не переходя на другие вкладки, сохраняем квест. Чек-бокс "Стартовать с началом игры" отмечать необязательно, квест будет запускаться командой от записки. Открываем квест, переходим на вкладку стадий и создаем три последовательные стадии - 1, 10, 20. Почему номера стадиям даются не по-порядку (1, 2, 3) - это для того, чтобы можно было впоследствии "втиснуть" между стадиями еще другие, если надумалось что-то внести еще в квест. В каждой стадии в правом окне создаем по одному пустому Quest Stage Items, чтобы стало доступным поле назначения результ-скрипта для данной стадии. Сохраняем квест. Открываем квест снова и переходим на вкладку заданий квеста. Заданий у нас будет два: первое (№1) будет сообщать, что нужно найти 20 крышек, второе (№10)) скажет нам, что все крышки найдены. Создаем задание номер раз, пишем необходимый текст (найти 20 крышек). Создаем задание номер десять, пишем в нем текст (все крышки найдены, нате вам награду). Сохраняем квест. Теперь нужно внести в ранее созданный скрипт записки команду на запуск квеста. Открываем скрипт и добавляем в конец блока (до слова end !!!) следующую команду - setstage айди_квеста 1 . Этой командой мы запускаем 1-ю стадию квеста. Сохраняем скрипт Открываем КВЕСТ и переходим там на вкладку стадий. Выбираем стадию 1, выделяем в правом окне строчку Empty и в поле результ-скрипта пишем: setobjectivedisplayed айди_квеста 1 1 . Обязательно после этого жмем под полем текста скрипта кнопочку Compile Result! Этим результ-скриптом мы запускаем квест и выводим на экран текст задания номер 1. Теперь надо определиться с предметами поиска. Если нужно будет найти один и тот же предмет, разбросанный по Пустоши в количестве 20-ти штук (те же "особенные" крышки) - то тут все просто. Создаем в соответствующем разделе этот самый предмет и раскидываем его в 20-ти местах по всей Мохаве, где душе угодно. Переходим в раздел скриптов и создаем еще один, КВЕСТОВЫЙ, скрипт. В нем пишем: scn имя_этого_скрипта
short DoOnce
begin GameMode if (player.GetItemCount айди_нужного_предмета == 20) && (DoOnce == 0) ;если есть 20шт необходимого setstage айди_нашего_квеста 10 ;переключить данный квест в стадию 10 set DoOnce to 1 ;сделать значение отслеживающей переменной DoOnce равным 1 elseif (GetStage айди_нашего_квеста == 10) && (DoOnce == 1) ;иначе, если стадия равна 10 и переменная равна 1 setobjectivecompleted айди_нашего_квеста 10 1 ; отметить в Пип-бое задание 10 как выполненное setstage айди_нашего_квеста 20 ;переключить данный квест в стадию 20 set DoOnce to 2 ;сделать значение отслеживающей переменной DoOnce равным 2 endif end Что делает скрипт: вначале он проверяет, что у игрока есть необходимое количество указанных предметов и переключает квест на стадию 10. Затем, поскольку стадия стала равной 10, скрипт следом отмечает в Пип-бое, что и задание №10 тоже выполнено и переключает квест в стадию 20. Отслеживающая переменная DоOnce нужна для того, чтобы скрипт после нахождения предметов не выводил каждую секунду сообщения и не "щелкал" по стадиям. Это, типа, переменная одноразовости. Назначаем этот квестовый скрипт нашему созданному квесту. Осталось расписать стадии квеста. Идем в квест, выделяем в нем 10-ю стадию. В результ-скрипте этой стадии пишем: setobjectivecompleted айди_квеста 1 1 ; эта команда отмечает в Пип-бое, что задание №1 выполнено setobjectivedisplayed айди_квеста 10 1 ; эта команда выводит показ задания №10 Жмем кнопку компиляции результата. Выделяем затем 20-ю стадию и в правом окне ставим галочку в чек-боксе Complete Quest. На этом всё. Можно проверять в игре. Если же нужно найти не 20 штук одного и того же предмета, а 20 уникальных, то есть совершенно разных - то тут могут быть варианты. Можно в квестовом скрипте в строчке проверки наличия необходимых предметов прописать все 20, типа: if (player.GetItemCount айди_нужного_предмета№1 == 1) && (player.GetItemCount айди_нужного_предмета№2 == 1) && (и так далее), хоть это и громоздко, зато просто. Можно на каждый из предметов повесить один общий скрипт, увеличивающий при добавлении этого предмета некую глобальную переменную, а в квестовом скрипте отслеживать не количество предметов в инвентаре, а значение этой глобальной переменной. Короче - надо сначала знать, что ты будешь "разбрасывать"
georgy11, кстати - вот образец плагина. Можешь посмотреть-поковырять. Записка лежит в Гудспрингсе, на крыльце магазина Чета, предметы (правда всего пять, на двадцать у меня терпения не хватило) разбросаны неподалеку, на каждый указывает маркер компаса. Ну и в конце ждет на том же крылечке награда. ;)
Жесть какая,спасибо огромное! Попробую обязательно все,квестер из меня никакой,разве что идей для их создания много. Но это будет первый шаг,с вашей помощью,на эту скользкую дорожку. Спасибо вам ребят,за то что учите нас нубов КсЮха
У меня вот вопрос: в моде у одного довольно сильного модмейкера наткнулась на такой момент - в условиях топика стоит GetStage XXXX >= 2 AND GetStage XXXX < 3 AND Вот интересно - зачем так сделано? Что можно воткнуть между 2-й и 3-й стадиями? Почему не поставить просто "Стадия равна двум"? А ведь это сделано специально, практически во всех топиках мода так прописано.
GetStage XXXX >= 2 AND GetStage XXXX < 3 AND Вот интересно - зачем так сделано? Что можно воткнуть между 2-й и 3-й стадиями? Почему не поставить просто "Стадия равна двум"?
Формально "целое значение больше или равно двум и притом меньше трёх" в точности означает "целое значение равно двум", каково бы ни было происхождение этого целого значения. В то же время разработка движется инкрементально, и кроме релизных в последовательности бывают тестовые версии. Возможно, в какой-то момент там были не двойка и тройка, а двойка и семёрка. Да, в момент смены семёрки на тройку вроде бы идеально совсем выкинуть второе условие, а в первом сменить знак на равенство - но! Если автор предполагает двльнейшую разработку, которая будет ещё не раз нуждаться в отладке, а для отладки там должен быть всё-таки диапазон, а не точная цифра... Тогда лучше держать два условия, чтобы уменшить количество исправлений (и опечаток) при очередном переходе от релиза к бете и обратно. Это только один из вариантов, как и для чего могла образоваться такая конструкция... Конечно, могла быть и совершенно нелепая причина вроде того, что автор по религиозным соображениям не признаёт равенства!
Ipatow, похоже, что всё-таки первое... Мод явно не завершен, поскольку в нем есть много моментов, нуждающихся в доработке. Но автор давно его забросил А жаль. --------------------------------------------- Тогда еще вопрос из области телепатии. Там же в моде есть два топика, принадлежащих разным персонажам. У обоих топиков в результ-скрипте (begin) прописан показ определенного месседжа плюс еще кое-какие действия. Мистика, но факт - у одного непися после произнесения топика месседж показывается, у другого - нет . Причем эти самые "еще кое-какие действия" из этого же результ-скрипта выполняются, т.е. - скрипт срабатывает!!! Загадка, над которой бьюсь уже четыре дня . Месседжи ничем друг от друга не отличаются, кроме текста.
Добавлено (22 Марта 2018, 09:15) --------------------------------------------- Тэк-с... Пока печатала сообщение - меня осенила мысль. Я её подумала и проверила на практике. В общем - с месседжами разобралась Никогда не сталкивалась с этим ранее и ни за что бы не подумала, что если в результ-скрипте ОДНОГО квеста объявлена переменная, а в ДРУГОМ квесте в результ-скрипте есть переменная с таким же именем - то это считается одной, общей переменной. Поэтому у меня (и у автора оригинального мода) второй месседж и не показывался, что первый топик менял значение переменной.
Ой, всё...
Изменение репутации для пользователя Ipatow
IpatowOffline
Сообщение №1631
написано: 22 марта 2018, 07:34
| Отредактировано: Ipatow - 22 марта 2018, 07:36
Никогда не сталкивалась с этим ранее и ни за что бы не подумала, что если в результ-скрипте ОДНОГО квеста объявлена переменная, а в ДРУГОМ квесте в результ-скрипте есть переменная с таким же именем - то это считается одной, общей переменной.
Такое распространяется на все безымянные скрипты - из диалогов, из пакетов, из стадий квестов, из перков... Я не знаю, все ли они считаются частью одного и того же скрипта - вроде бы объектного на мобе, я помню пересечения с ним по именам переменных - но по меньшей мере многие. Даже если на объекте скрипта нет - всё это исправно дописывается к пустому скрипту. Как я понимаю, это фундаментальное свойство скриптового двигателя фолаутов - исполняются только именованные скрипты. В случае со скриптом реплики - когда реплика может произноситься разными персонажами - это должно порой вызывать волшебные происшествия, поскольку в объектных скриптах разных персонажей одинаково могут называться сильно разные по смыслу и даже типу переменные.
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №1632
написано: 22 марта 2018, 08:14
| Отредактировано: Joopeeter - 22 марта 2018, 08:15
Об эти переменные в результах тут вообще регулярно бьются и спрашивают. Не так часто как про "голова не совпадает с телом" и "я удалил леса и горы, теперь у меня везде торчат ЛОДы", но всё же. Хотя в учебнике, казалось бы, чёрным по белому. Может, в Картотеку добавить: - Можно ли объявлять переменные в результ-скриптах? - И НЕ ДУМАЙ!
Изменение репутации для пользователя КсюXa
КсюXaOffline
Сообщение №1633
написано: 22 марта 2018, 08:24
| Отредактировано: КсюXa - 22 марта 2018, 08:25
По скриптам Обливиона учебник, какой же ещё. На форуме тоже про переменные в результах было раза три или четыре. Бывает, такие переменные в результах работают, но если кто не хочет себе геморрой, тому не надо так делать. Тем более нет таких случаев, когда переменную нельзя было бы объявить в специально предназначенных для этого местах.
Приветствую. Написал скрипт. а как компилировать его - найти не могу, вижу только полную перекомпиляцию всех, что мне абсолютно не нужно. Установлен geck 1.4 и power-up для него.
Компилировать специально и не надо. Для того, чтобы написать скрипт надо: нажать на карандаш на верхней панели, вписать , выбрать тип и нажать на значок дискетки. После этого скрипт можно применять на чем-то\ком-то.
А при сохранении скрипта редактор не выкидывал сообщение об ошибке? Типа: в строке ХХХ неверная функция Y? Хотя, если ГЕКК без глюкоисправителя - то сообщений не будет, разрабы "постарались", кастрировали и без того несчастный редактор. Ну и как сказал бы Леонид Аркадьевич: скрипт - в студию!
А при сохранении скрипта редактор не выкидывал сообщение об ошибке? Типа: в строке ХХХ неверная функция Y? Хотя, если ГЕКК без глюкоисправителя - то сообщений не будет, разрабы "постарались", кастрировали и без того несчастный редактор.
Ну вот как раз для нормального дебага поставил power-up. А ошибок вроде не выдавало. Вообще бы инфы по синтаксису бы по-больше где-то почитать...
Раз не выдавало - так может скрипт рабочий? Просто не запускается. Он на что повешен? Какой у него "игровой" блок?. блок GameMode работает, когда идет игровой процесс блок OnActivate - когда активируется заскриптованный объект блок... Ну и так далее... У тебя как?
б) создать базовый эффект, со скриптом, меняющим карму. Базовый эффект назначить актор-эффекту. В перке в качестве точки входа выбрать кнопку "Способность" и выбрать из списка этот актор-эффект.
Недавно я попробовал создать скрипт, который привязан к оружию и вносит/отменяет изменения когда его надеваешь/убираешь.
Команды, начинающиеся с "player.", например добавить перк, и.т.д. работают, но мне также потребовалось изменить значения параметров, относящихся к "Game settings".
И к своему разочарованию я обнаружил, что GECK по непонятной мне причине не хочет компилировать скрипт с командой "setgs" , а как по другому внести изменения в параметры "Game settings" я не знаю
Если кто-нибудь компетентен в данном вопросе, то заранее благодарен за совет.
Запускаю GECK с правами администратора через ярлык с припиской в конце " nvse_loader.exe" -editor " не знаю, достаточно этого, или нет.Т.е., в принципе крманда "setgs" должна и в скрипте тоже, не только в консоли? На неё нет каких-то ограничений?
Во-первых, с запуском всё правильно.
Во-вторых, ты отрыл мне глаза на особенности вегасовского экстендера, см. комментарий в конце описания SetGameSetting. Нет ли странностей с использованием консольной функции из скрипта - в данном случае в виде con_SetGameSetting, сказать не могу, но некоторые подобным образом завёрнутые функции игру клинили (они работали, но после них всё оказывалось печёнками наружу). Насколько надёжнее в этом смысле экстендер-плагиновская функция Console - тоже не знаю, но по крайней мере эти варианты компилироваться будут, и их работоспособность можно будет протестировать.
На практике я работал только с FOSE и пользовался только SetNumericGameSetting, которая в скриптах сразу была уместна.
Изменение репутации для пользователя youngyone01
youngyone01Offline
Сообщение №1647
написано: 9 мая 2018, 15:18
| Отредактировано: youngyone01 - 9 мая 2018, 15:27
Подскажите, как навесить специальную анимацию (например, игры на скрипке) не на НПС, а на ГГ, допустим, при активации той же скрипки в инвентаре. Подозреваю, что там должны быть команды disableplayercontrols, потом playsound с указанием звука со скрипичной мелодией, и потом в конце мелодии enableplayercontrols. Но чувствую, что там еще какие-то тонкости есть, которых не знаю.
Добавлю, что анимации, предназначенные для просмотра от третьего лица, от первого лица не работают. Я пробовал так запускать курение сигарет и дуковское питьё из горла. Не видно ни рук, ни предмета в руках, видно только некоторое покачивание камеры.