Модератор форума: КсюXa, ApeX  
Форум » Fallout: New Vegas » Мастерская » Скрипты (Вопросы и ответы)

Скрипты
a3apbi4  Offline  Сообщение №1 написано: 7 декабря 2010, 18:01



11
Скрипты - неотъемлемая часть GECK. При написании возникает очень много казусов. Данная тема должна помочь не наступать на "грабли" новичкам и делиться опытом с другими более продвинутых мододелов.




JupiterJour  Offline  Сообщение №1081 написано: 30 октября 2013, 14:24


_



KAIN48  Offline  Сообщение №1082 написано: 30 октября 2013, 14:30 | Отредактировано: KAIN48 - 30 октября 2013, 14:30


Шаманистый шаман


Joopeeter не! Там не сказано для чего! Но раз человек спрашивает в теме FallouNV - наверное для Fallout
Здесь спрашивают!
Из-за этого твой скрипт и не прикрепил ещё!

Мы вышли из дома, когда во всех... Поздно вышли!
ross  Offline  Сообщение №1083 написано: 4 ноября 2013, 06:29



25
доброе утро!

Код
scn AAATest
float timer
Float YPos
Float YAchse
Begin GameMode
Set YPos to GetPos X
set timer to timer + getsecondspassed
if timer > 10
Set YAchse to YPos
stuk.disable
else
set yachse to ypos +22
endif
if timer == 10
PlaySound FXExplosionArtilleryExplosion
endif
SetPos X Yachse
if getpos x >= 3424
setpos x 1376
endif
End

этот скрипт стоит на деревьях и фонарях, едущих вдоль поезда :D . в определённый момент они останавливаются, выключается стук колёс(stuk), это работает. но потом, когда: "if timer == 10
PlaySound FXExplosionArtilleryExplosion
endif"(здесь должен быть звук тормозов, пока просто тестирую) звука нет. я ставил вместо него другие функции, но тоже безрезультатно. в чём может быть проблема?
и ещё один вопрос: как в момент торможения "швырнуть" гг(как от взрыва гранаты), но в строго определённом направлении?

JupiterJour  Offline  Сообщение №1084 написано: 4 ноября 2013, 06:46


_


В скрипте в полтора раза больше переменных, чем требуется, но проблема не в этом.
Вероятнее всего, проблема в if timer == 10. Переменные типа float содержат чёрте сколько знаков после запятой, поэтому вероятность того, что в какой-то момент таймер будет равен точно 10, стремится к нулю. А может быть, движок офигевает от того, что все заскриптованные деревья и фонари, сколько их есть, должны разом бабахнуть артиллерией, и отказывается выполнять такое.

ross  Offline  Сообщение №1085 написано: 4 ноября 2013, 06:59



25
Joopeeter, про переменные я тоже так думал, но эту часть скрипта взял из образца и решил, что ну хз :D . а как быть? писать отдельным скриптом? а как их синхронизировать тогда?

JupiterJour  Offline  Сообщение №1086 написано: 4 ноября 2013, 08:42 | Отредактировано: Joopeeter - 4 ноября 2013, 08:52


_


Можно и не отдельным скриптом. Просто замени проверку timer==10 на timer>=10 и добавь "одноразовую" переменную, чтобы каждый фрейм не бабахало. Да и stuk каждый фрейм за Disable дёргать тоже плохо.
Код
scn AAATest
     float timer
     Float YPos
     Float YAchse
     short DoOnce
     Begin GameMode
     if DoOnce==0
       Set YPos to GetPos X
       set timer to timer + getsecondspassed
       if timer > 10
        Set YAchse to YPos
        stuk.disable
       else
        set yachse to ypos +22
       endif
       if timer >= 10
        PlaySound FXExplosionArtilleryExplosion
       set DoOnce to 1
       endif
       SetPos X Yachse
       if getpos x >= 3424
        setpos x 1376
       endif
     endif
     End

Как видим, поездка будет одноразовая. Чтобы перезапустить, надо обнулить переменную DoOnce на всех движущихся объектах. Хм, некрасиво. Лучше использовать какое-то внешнее условие, одно для всех. Не знаю, как у тебя реализован запуск поездки, это условие там надо устанавливать.

Можно и отдельным скриптом. Запустить таймер на каком-нибудь активаторе рядышком (пусть будет ActivatorRef), а деревья со столбами пусть все с ним сверяются. И всё управление сценкой можно туда перенести, все дизейблы и плейсаунды, а деревья пусть только едут. Для случая, когда управляющий скрипт крутится на том же активаторе, который запускает паровоз, будет как-то так (в игре не проверял, возможны опечатки, а то и ошибки smile2 ):

Код
scn ActivatorScript

short Speed
float timer

Begin OnActivate
     set Speed to 22
     set timer to 0
End

Begin GameMode
     if Speed > 0
      set timer to timer+GetSecondsPassed
      if timer>=10
       if Speed == 22
        stuk.disable
        PlaySound FXExplosionArtilleryExplosion
       endif
       set Speed to Speed - 0.1
      endif
     endif
End

и на подвижных деревьях тогда остаётся только
Код
scn AAATest

     float Position

     Begin GameMode
     if ActivatorRef.Speed > 0
       Set Position to GetPos x
       Set Position to Position+ActivatorRef.Speed
      if Position < 3424
        SetPos x Position
       else
        SetPos x 1376
       endif
     endif
     End

Artem13  Offline  Сообщение №1087 написано: 4 ноября 2013, 09:56


Mercenaries. Со смертью на ты.


Цитата Joopeeter

Просто замени проверку timer==10 на timer>=10 и добавь "одноразовую" переменную, чтобы каждый фрейм не бабахало.

Можно немного по-другому:

float dlt

...
set dlt to timer - 10
if(dlt < 0.1 && dlt > -0.1)
...

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
JupiterJour  Offline  Сообщение №1088 написано: 4 ноября 2013, 10:08 | Отредактировано: Joopeeter - 4 ноября 2013, 10:12


_


Цитата ross

как в момент торможения "швырнуть" гг(как от взрыва гранаты), но в строго определённом направлении?


Чёрт, это я что-то упустил из виду, когда приделывал к скрипту плавное торможение. :D
Для швыряния актёров служит функция PushActorAway.

[постоянная ссылка Ref].PushActorAway player [сила]
[актёр Ref].PushActorAway player [сила]

Если сила положительная, игрок полетит от ссылки, если отрицательная - к ссылке.

ross  Offline  Сообщение №1089 написано: 4 ноября 2013, 11:18



25
Joopeeter, мозг слегка кипит(никогда прежде не занимался подобным). но всё работает как часы!
это на активаторе:

Код
scn aaatesta
short prover
short speed
float timer
begin gamemode
set timer to timer +getsecondspassed
if prover == 0
   if timer > 10
     stuk.disable
     PlaySound FXExplosionArtilleryExplosion
     set prover to 1
     PushActorAway player 22
     set speed to 0
   else
     set speed to 22
   endif
endif
end

это на деревьях-лампах:

Код
scn AAATestb
float pozishn
Begin GameMode
Set pozishn to GetPos X + starter.speed
setpos x pozishn
if getpos x > 3424
setpos x 1376
endif
End

спасибо, тебе! good

KAIN48  Offline  Сообщение №1090 написано: 5 ноября 2013, 08:22


Шаманистый шаман


Привет всем!
Один человек спросил
А изменить стадию квеста после смерти непися (выполнения здания) можно так.
if НеписьID.GetDead == 1
SetStage AAANewQuest 30


Я спрошу у народа в Мастерской - вдруг я ошибаюсь и советую неправильно!

Мы вышли из дома, когда во всех... Поздно вышли!
ITU  Offline  Сообщение №1091 написано: 5 ноября 2013, 09:21 | Отредактировано: ITU - 5 ноября 2013, 09:27



995
Цитата KAIN48

в скрипте, который на неписе? Или в скрипте квеста?

можно сделать еще в блоке

Код
begin OnDeath
SetStage AAANewQuest 30
end


тогда срабатывание разовое
В скрипте квеста будет проверятся условия постоянно пока работает квест, так же и на неписе, всегда когда он в онлайне . Даже когда этап квеста будет любой.
Либо поставить еше условие if  GetStage  AAANewQuest == 20(могу с синтаксисом ошибаться, страницы на geck wiki отсуствует почему-то)

Artem13  Offline  Сообщение №1092 написано: 5 ноября 2013, 10:29


Mercenaries. Со смертью на ты.


KAIN48, c интерьерами возможен такой вариант - изначально в интерьере расставлены оба варианта обстановки. Грязный изначально активен, чистый задизэйблен. На нужной стадии квеста грязный дизэйблится, чистый включается. Чтобы не включать/выключать каждый элемент в отдельнсоти есть (емнип) механизм так называемого родительского маркера (объекта). Т.е. состояние всех объектов связанных с родительским определяется его состоянием. Подробности сейчас не подскажу - в Скае этот механиз несколько отличен. В качестве примера можно посмотреть интерьеры в Ф3 (дом в Мегатонне и апартаменты в Тенпенни-Тауэр) - там оно как раз так реализовано.

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
СтарейсинаЛаенс  Offline  Сообщение №1093 написано: 5 ноября 2013, 10:30



60
Я сейчас за рулем под рукой ГЭККА нэт так что не могу полностью ответить но вроде как-бы там должно быть
Код
SetStage AAANewQuest 25 // 30

JupiterJour  Offline  Сообщение №1094 написано: 5 ноября 2013, 10:57 | Отредактировано: Joopeeter - 5 ноября 2013, 11:01


_


Цитата Artem13

В качестве примера можно посмотреть интерьеры в Ф3 (дом в Мегатонне и апартаменты в Тенпенни-Тауэр) - там оно как раз так реализовано


Там так реализовано из-за того, что подмена интерьеров в случаях с жилищами совершенно не годится - игрок, вернувшись в изменённый домик, желает найти в шкафчиках всё то, что он туда насовал раньше, а своих плюшевых мишек там, где он их положил. Зато атака гулей в том же Тенпенни-тауэре сделана с подменой интерьеров, как и устранение последствий атаки. Зачем. Представим, что игрок в процессе боя накидал на пол сломанного оружия и всякого хлама из инвентаря, а в урнах заныкал патроны или ещё что-нибудь. При изменении интерьера без подмены всё это останется и в новом, по идее чисто прибранном интерьере. Ну, контейнеры ещё можно заменить, а подметать мусор с пола без FOSE - нетривиальная задача. Работа с навмешем, если в новом интерьере передвинута статика, тоже усложняется. Я уж молчу про то, что в таких совмещённых интерьерах вообще замучаешься даже простые вещи делать. Достаточно посмотреть через ГЭКК на тот же дом в Мегатонне или у Тенпенни.

Artem13  Offline  Сообщение №1095 написано: 5 ноября 2013, 14:22


Mercenaries. Со смертью на ты.


Joopeeter, моё дело предложить вариант, а уж что и как реализовывать - выбор вопрошающего :)

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
magnumspec  Offline  Сообщение №1096 написано: 5 ноября 2013, 14:25



Joopeeter, А как навмеши реагируют на включение и отключение дверей? Я имею ввиду, что двери-телепорты регистрируются в навмеше ячейки, но не произойдет ли что-нибудь нехорошее,если зарегистрированную дверь отключить?

There is always another way...
JupiterJour  Offline  Сообщение №1097 написано: 5 ноября 2013, 14:38


_


Цитата magnumspec

А как навмеши реагируют на включение и отключение дверей? Я имею ввиду, что двери-телепорты регистрируются в навмеше ячейки, но не произойдет ли что-нибудь нехорошее,если зарегистрированную дверь отключить?


А что им сделается, навмешам? Дверь же никуда не девается, просто никто её не видит, не ощущает и активировать не может.

magnumspec  Offline  Сообщение №1098 написано: 5 ноября 2013, 14:39



Цитата Joopeeter

А что им сделается, навмешам? Дверь же никуда не девается, просто никто её не видит, не ощущает и активировать не может.

Это радует. :)

There is always another way...
Spalny_Vagon  Offline  Сообщение №1099 написано: 5 ноября 2013, 16:37


Мастер


Цитата Joopeeter

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


Если интерьер заселен актерами, то они могут собрать мусор, пакет find. Убрать можно практически все, ну разве что кроме moveble static. Я делал как-то мародеров, они после боя подметали все оружие и патроны, хрен за ними успеешь что-нибудь собрать.

======================
Мод "Нью-Йорк" на русском: https://modgames.net/load/fallout3/addon/new-york-bolshoe-yabloko/34-1-0-1294
Мод "Нью-Йорк" на английском: https://modgames.net/load/fallout3/kvesty/the-big-apple/23-1-0-19771
djsave  Offline  Сообщение №1100 написано: 6 ноября 2013, 08:14


=TMG= TeamModingGames


505
Ну вообще то это не совсем к скриптам относиться, но по теме вопроса:
Задача: Зачистить помещение Х. Через 3 дня после зачистки помещение должно быть чистеньким и заселено НПС.
( Неясность: НПС должны быть уже существующие на момент зачистки по близости или совсем другие ? )
Решение:
Создается 2 отдельных интериора, один где будут бандиты которых надо убить. Второй чистый, где будут заселены НПС.
Двери-телепорты устанавливаются одна в одну и дверь ведущая в чистое помещение устанавливается с параметром изначально отключена.
Создается контролирующий квест. Отслеживаем бандитов на предмет их живучести/смерти, когда все бандиты устранены то сдаем задание по их устранению. Ключевая стадия[ отслеживаем условие смены интериоров ]
[условие смены интериоров]
Включаем отсчет дней - сколько должно пройти времени до смены интериора.
Проверяем удаление игрока от объекта - ну если ГГ постоянно шастает в городе то резкая замена будет смотреться нелогично, типо ГГ тут рядом и тишина, а помещение уже и убрали и заселили. Надо отследить что бы ГГ ушел из города и только тогда менять интериор. В этом случае будет выглядеть как будто пока ГГ отсутствовал все поменялось.
При соблюдении условий дисайблим первую дверь и енэйблим вторую ( в новое чистое помещение)


Почему 2 отдельный интериора ? Потому что не надо геройствовать, этого никто не оценит. Чистый интериор можно переделать очень капитально, разместить там кучу всяких маркеров, прописать маршруты НПС. Наконец создать очень правдоподобную картину жизни и все это без лишней головной боли. Если НПС будут новые, то вообще ГУД, они могут тут ждать своего часа без каких либо проблем. Ну а если сюда должны будут прийти уже существующие НПС то они только рады будут свежей локации. Незабываем после добавления пакетов АИ неписям, сделать перезагрузку АИ.


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


Скока букв и не строчки кода..... blush

=TMG= Team Moding Games
Spalny_Vagon  Offline  Сообщение №1101 написано: 6 ноября 2013, 17:23


Мастер


Цитата djsave

Почему 2 отдельный интериора ? Потому что не надо геройствовать, этого никто не оценит.


Два интерьера оценит каждый, кто оставит в "грязном" интерьере своего компаньона, а через три дня захочет найти его в "чистом".

======================
Мод "Нью-Йорк" на русском: https://modgames.net/load/fallout3/addon/new-york-bolshoe-yabloko/34-1-0-1294
Мод "Нью-Йорк" на английском: https://modgames.net/load/fallout3/kvesty/the-big-apple/23-1-0-19771
magnumspec  Offline  Сообщение №1102 написано: 6 ноября 2013, 17:44



Цитата Spalny_Vagon

Два интерьера оценит каждый, кто оставит в "грязном" интерьере своего компаньона, а через три дня захочет найти его в "чистом".

Это кстати да. 
А можно ли как-то глобально приказать местным неписям переместиться с одной ячейки в другую?

There is always another way...
JupiterJour  Offline  Сообщение №1103 написано: 6 ноября 2013, 18:02


_


Цитата Spalny_Vagon

Два интерьера оценит каждый, кто оставит в "грязном" интерьере своего компаньона, а через три дня захочет найти его в "чистом".


:D Да, оценят, это точно. Можно предложить такое решение.
Ставим внутри триггер на весь интерьер. На нём скрипт с десятью, а лучше двадцатью реф-переменными, чтоб точно хватило. Всех вошедших, которые GetPlayerTeammate==1, записываем в эти переменные. Или даже всех, кто не игрок и не абориген. При замене интерьера проверяем их насчёт GetInCell, и если они ещё внутри, перемещаем их в новый интерьер.

djsave  Offline  Сообщение №1104 написано: 7 ноября 2013, 07:44


=TMG= TeamModingGames


505
Цитата Joopeeter

Всех вошедших, которые GetPlayerTeammate==1


Именно так, я бы сказал что это уже момент отладки, такие моменты есть всегда. Только вот мне бы и в голову не пришло оставить напарника где попало. Я обычно их либо в дом ГГ отправляю либо уже в этом доме оставляю сидеть.
Ну можно тригеры и не ставить а просто перед сменой интериоров прошарить кто там и выгнать всех или переместить в новый интериор. Вообще то как себя может повести игрок, предсказать очень сложно, а все предугадать невозможно.
Для этого есть комментарии к моду.

=TMG= Team Moding Games
KAIN48  Offline  Сообщение №1105 написано: 7 ноября 2013, 08:39


Шаманистый шаман


Привет всем!
Думал, что сложность двух интерьеров в том что бы их сделать! А оказывается в компаньонах!
Как я понял из вопроса, человеку нужно. Что бы получив задание игрок пришёл и убил всех в одном интерьере.
Так скажем банду преступников, которая там обосновалась. Интерьер замусоренный не только тем, что можно собрать, но и пятнами крови, сломаной мебелью, посудой и тп.
Читаю обсуждение и пока не решил, что лучше.
По работе удобней заселить неписями "чистый" интерьер, Настроить их житьё-бытьё. А потом решать проблему напарников (компаньонов)
Ведь если всё делать в одном, "грязном" интерьере, какая каша там получиться. Тут и бандиты, мусор, завалы, сдвинутая и опрокинутая мебель. И тут же "добропорядочные жильцы (маркеры).
Это скрипт с большим списком disable объектов, это невозможность сдвинуть мебель из-за сетки навмеш.
Был "завал", а вокруг сетка навмеш - нет завала, а дырка в сетке после его сокрытия осталась. Сдвинулся немного стол, изменилось положение шкафа с "упавшего", перевёрнутого, на стоящий и снова дырка в сетке.
Наверное дырки в сетке это не критично, просто при настройке поведения "добропорядочного" населения это нужно учитывать.

Мы вышли из дома, когда во всех... Поздно вышли!
djsave  Offline  Сообщение №1106 написано: 7 ноября 2013, 11:35


=TMG= TeamModingGames


505
Цитата KAIN48

Наверное дырки в сетке это не критично


В принципе не критично, но если это большая дырка или много то будет прикольно смотреть ка НПС ходят по комнате как по лабиринту. Я вот только не помню а система укрытий работает в вегасе ? Если да то не гуд эти дырки.

=TMG= Team Moding Games
magnumspec  Offline  Сообщение №1107 написано: 7 ноября 2013, 17:03



Цитата djsave

В принципе не критично, но если это большая дырка или много то будет прикольно смотреть ка НПС ходят по комнате как по лабиринту. Я вот только не помню а система укрытий работает в вегасе ? Если да то не гуд эти дырки.

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

Хотя, пожалуй в подобных случаях лучше интерьеры подменять. Скрещивать всё в одном актуально, например, для домов ГГ.

There is always another way...
JupiterJour  Offline  Сообщение №1108 написано: 8 ноября 2013, 00:27 | Отредактировано: Joopeeter - 8 ноября 2013, 00:33


_


Цитата KAIN48

это невозможность сдвинуть мебель из-за сетки навмеш


Для включения и отключения кусков навмеша есть функции DisableNavMesh и EnableNavMesh. Правда, не знаю, насколько хорошо они работают, сам не пользовался.

Можно в ячейке и Image Space Modifier скриптово поменять на более жизнерадостный. Так что "однокомнатный" вариант осуществим, но его геморройность стремительно растёт с количеством предполагаемых изменений.

djsave  Offline  Сообщение №1109 написано: 8 ноября 2013, 08:49


=TMG= TeamModingGames


505
Цитата Joopeeter

есть функции DisableNavMesh и EnableNavMesh


Эти функции были введены экспериментально специально для моста в Ривет сити и сами разработчики не рекомендуют ей пользоваться. В 3м фоле я использовал ее и вроде полет был нормальный, но блин там был свой головняк с созданием этого навмеша. Вообще есть много чего интересного и при желании можно многое сделать, но вопрос не о том можно или нет а как удобнее и менее глючно.

=TMG= Team Moding Games
Hellraiser  Offline  Сообщение №1110 написано: 8 ноября 2013, 10:57 | Отредактировано: Hellraiser - 8 ноября 2013, 11:05


Dr. Moreau


У меня есть несколько xmarker'ов в плаге, которые выступают в качестве родителей и к ним привязано множество объектов. В нужный момент я дисаблю xmarker'ы в скрипте и вписываю функцию, допустим, xmarkerIDRef.markfordelete.
Вопрос таков: markfordelete сработает только для этого маркера или для всех привязанных к нему объектов тоже?
Или придется прописывать markfordelete для каждого удаляемого объекта?

Death is the old debt, which sooner or later will have to pay.
This is as good a day to die as any, but at your funeral nobody will come.
Your way in hell you'll have to do yourself... Happy journey!
Alright, guys, all will be there, but you before...
Форум » Fallout: New Vegas » Мастерская » Скрипты (Вопросы и ответы)
Поиск:





Ответ на жалобу смотрите в разделе жалоб