Скрипты - неотъемлемая часть GECK. При написании возникает очень много казусов. Данная тема должна помочь не наступать на "грабли" новичкам и делиться опытом с другими более продвинутых мододелов.
Дык вроде там для Обливиона. Какое радио? И снова в магическом эфире с вами я - Три-и-Орк-На-а-айт! Из самого сердца Имперского города, из башни белого золота, на которой установлен наш магический ретранслятор радио "Новости Нирна". Так, посмотрим, что тут у нас. Всё плохо, дети мои. Драконьи огни не горят, дреморы лезут из врат Обливиона, грязекрабы пугают жителей, а городу Бруме грозит огромный фаллический символ с рогами. И только наш Выходец из имперской тюрьмы снова отличился, разузнав, с кем спал покойный граф Королла. Слушайте об этом в наших светских новостях. А теперь хор альтмеров c песней "Радужный Демон".
Изменение репутации для пользователя KAIN48
KAIN48Offline
Сообщение №1082
написано: 30 октября 2013, 14:30
| Отредактировано: KAIN48 - 30 октября 2013, 14:30
Joopeeter не! Там не сказано для чего! Но раз человек спрашивает в теме FallouNV - наверное для Fallout Здесь спрашивают! Из-за этого твой скрипт и не прикрепил ещё!
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
этот скрипт стоит на деревьях и фонарях, едущих вдоль поезда . в определённый момент они останавливаются, выключается стук колёс(stuk), это работает. но потом, когда: "if timer == 10 PlaySound FXExplosionArtilleryExplosion endif"(здесь должен быть звук тормозов, пока просто тестирую) звука нет. я ставил вместо него другие функции, но тоже безрезультатно. в чём может быть проблема? и ещё один вопрос: как в момент торможения "швырнуть" гг(как от взрыва гранаты), но в строго определённом направлении?
В скрипте в полтора раза больше переменных, чем требуется, но проблема не в этом. Вероятнее всего, проблема в if timer == 10. Переменные типа float содержат чёрте сколько знаков после запятой, поэтому вероятность того, что в какой-то момент таймер будет равен точно 10, стремится к нулю. А может быть, движок офигевает от того, что все заскриптованные деревья и фонари, сколько их есть, должны разом бабахнуть артиллерией, и отказывается выполнять такое.
Joopeeter, про переменные я тоже так думал, но эту часть скрипта взял из образца и решил, что ну хз . а как быть? писать отдельным скриптом? а как их синхронизировать тогда?
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №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), а деревья со столбами пусть все с ним сверяются. И всё управление сценкой можно туда перенести, все дизейблы и плейсаунды, а деревья пусть только едут. Для случая, когда управляющий скрипт крутится на том же активаторе, который запускает паровоз, будет как-то так (в игре не проверял, возможны опечатки, а то и ошибки ):
Код
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
Просто замени проверку 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
JupiterJourOffline
Сообщение №1088
написано: 4 ноября 2013, 10:08
| Отредактировано: Joopeeter - 4 ноября 2013, 10:12
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
в скрипте, который на неписе? Или в скрипте квеста?
можно сделать еще в блоке
Код
begin OnDeath SetStage AAANewQuest 30 end
тогда срабатывание разовое В скрипте квеста будет проверятся условия постоянно пока работает квест, так же и на неписе, всегда когда он в онлайне . Даже когда этап квеста будет любой. Либо поставить еше условие if GetStage AAANewQuest == 20(могу с синтаксисом ошибаться, страницы на geck wiki отсуствует почему-то)
KAIN48, c интерьерами возможен такой вариант - изначально в интерьере расставлены оба варианта обстановки. Грязный изначально активен, чистый задизэйблен. На нужной стадии квеста грязный дизэйблится, чистый включается. Чтобы не включать/выключать каждый элемент в отдельнсоти есть (емнип) механизм так называемого родительского маркера (объекта). Т.е. состояние всех объектов связанных с родительским определяется его состоянием. Подробности сейчас не подскажу - в Скае этот механиз несколько отличен. В качестве примера можно посмотреть интерьеры в Ф3 (дом в Мегатонне и апартаменты в Тенпенни-Тауэр) - там оно как раз так реализовано.
<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a> Да, мы бандиты и бродяги, как злословит молва, Мы попадаем в передряги, помня эти слова. Смотри вперед и не сдавайся ты на милость судьбе! Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Изменение репутации для пользователя СтарейсинаЛаенс
В качестве примера можно посмотреть интерьеры в Ф3 (дом в Мегатонне и апартаменты в Тенпенни-Тауэр) - там оно как раз так реализовано
Там так реализовано из-за того, что подмена интерьеров в случаях с жилищами совершенно не годится - игрок, вернувшись в изменённый домик, желает найти в шкафчиках всё то, что он туда насовал раньше, а своих плюшевых мишек там, где он их положил. Зато атака гулей в том же Тенпенни-тауэре сделана с подменой интерьеров, как и устранение последствий атаки. Зачем. Представим, что игрок в процессе боя накидал на пол сломанного оружия и всякого хлама из инвентаря, а в урнах заныкал патроны или ещё что-нибудь. При изменении интерьера без подмены всё это останется и в новом, по идее чисто прибранном интерьере. Ну, контейнеры ещё можно заменить, а подметать мусор с пола без FOSE - нетривиальная задача. Работа с навмешем, если в новом интерьере передвинута статика, тоже усложняется. Я уж молчу про то, что в таких совмещённых интерьерах вообще замучаешься даже простые вещи делать. Достаточно посмотреть через ГЭКК на тот же дом в Мегатонне или у Тенпенни.
Joopeeter, моё дело предложить вариант, а уж что и как реализовывать - выбор вопрошающего
<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a> Да, мы бандиты и бродяги, как злословит молва, Мы попадаем в передряги, помня эти слова. Смотри вперед и не сдавайся ты на милость судьбе! Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
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
Ну вообще то это не совсем к скриптам относиться, но по теме вопроса: Задача: Зачистить помещение Х. Через 3 дня после зачистки помещение должно быть чистеньким и заселено НПС. ( Неясность: НПС должны быть уже существующие на момент зачистки по близости или совсем другие ? ) Решение: Создается 2 отдельных интериора, один где будут бандиты которых надо убить. Второй чистый, где будут заселены НПС. Двери-телепорты устанавливаются одна в одну и дверь ведущая в чистое помещение устанавливается с параметром изначально отключена. Создается контролирующий квест. Отслеживаем бандитов на предмет их живучести/смерти, когда все бандиты устранены то сдаем задание по их устранению. Ключевая стадия[ отслеживаем условие смены интериоров ] [условие смены интериоров] Включаем отсчет дней - сколько должно пройти времени до смены интериора. Проверяем удаление игрока от объекта - ну если ГГ постоянно шастает в городе то резкая замена будет смотреться нелогично, типо ГГ тут рядом и тишина, а помещение уже и убрали и заселили. Надо отследить что бы ГГ ушел из города и только тогда менять интериор. В этом случае будет выглядеть как будто пока ГГ отсутствовал все поменялось. При соблюдении условий дисайблим первую дверь и енэйблим вторую ( в новое чистое помещение) Почему 2 отдельный интериора ? Потому что не надо геройствовать, этого никто не оценит. Чистый интериор можно переделать очень капитально, разместить там кучу всяких маркеров, прописать маршруты НПС. Наконец создать очень правдоподобную картину жизни и все это без лишней головной боли. Если НПС будут новые, то вообще ГУД, они могут тут ждать своего часа без каких либо проблем. Ну а если сюда должны будут прийти уже существующие НПС то они только рады будут свежей локации. Незабываем после добавления пакетов АИ неписям, сделать перезагрузку АИ. Почему опять все через квест ? Потому что квест можно запустить когда надо и через скрипт квеста можно довольно много чего отследить и изменить, в придачу нам будут доступны еще и стадии квеста с возможностью прописать тоже необходимые скрипты и для особо одаренных игроков можно сделать указатель - иди сюда и делай то то - И самое главное что после того как квест нам больше не нужен его можно прибить и он не будет больше нам мешаться. А то что квесты работают довольно стабильно знают наверно все и это еще один плюс в использовании как основы именно квеста. Скока букв и не строчки кода.....
Два интерьера оценит каждый, кто оставит в "грязном" интерьере своего компаньона, а через три дня захочет найти его в "чистом".
Да, оценят, это точно. Можно предложить такое решение. Ставим внутри триггер на весь интерьер. На нём скрипт с десятью, а лучше двадцатью реф-переменными, чтоб точно хватило. Всех вошедших, которые GetPlayerTeammate==1, записываем в эти переменные. Или даже всех, кто не игрок и не абориген. При замене интерьера проверяем их насчёт GetInCell, и если они ещё внутри, перемещаем их в новый интерьер.
Именно так, я бы сказал что это уже момент отладки, такие моменты есть всегда. Только вот мне бы и в голову не пришло оставить напарника где попало. Я обычно их либо в дом ГГ отправляю либо уже в этом доме оставляю сидеть. Ну можно тригеры и не ставить а просто перед сменой интериоров прошарить кто там и выгнать всех или переместить в новый интериор. Вообще то как себя может повести игрок, предсказать очень сложно, а все предугадать невозможно. Для этого есть комментарии к моду.
Привет всем! Думал, что сложность двух интерьеров в том что бы их сделать! А оказывается в компаньонах! Как я понял из вопроса, человеку нужно. Что бы получив задание игрок пришёл и убил всех в одном интерьере. Так скажем банду преступников, которая там обосновалась. Интерьер замусоренный не только тем, что можно собрать, но и пятнами крови, сломаной мебелью, посудой и тп. Читаю обсуждение и пока не решил, что лучше. По работе удобней заселить неписями "чистый" интерьер, Настроить их житьё-бытьё. А потом решать проблему напарников (компаньонов) Ведь если всё делать в одном, "грязном" интерьере, какая каша там получиться. Тут и бандиты, мусор, завалы, сдвинутая и опрокинутая мебель. И тут же "добропорядочные жильцы (маркеры). Это скрипт с большим списком disable объектов, это невозможность сдвинуть мебель из-за сетки навмеш. Был "завал", а вокруг сетка навмеш - нет завала, а дырка в сетке после его сокрытия осталась. Сдвинулся немного стол, изменилось положение шкафа с "упавшего", перевёрнутого, на стоящий и снова дырка в сетке. Наверное дырки в сетке это не критично, просто при настройке поведения "добропорядочного" населения это нужно учитывать.
В принципе не критично, но если это большая дырка или много то будет прикольно смотреть ка НПС ходят по комнате как по лабиринту. Я вот только не помню а система укрытий работает в вегасе ? Если да то не гуд эти дырки.
В принципе не критично, но если это большая дырка или много то будет прикольно смотреть ка НПС ходят по комнате как по лабиринту. Я вот только не помню а система укрытий работает в вегасе ? Если да то не гуд эти дырки.
По идее, навмеш надо делать именно под уже мирный интерьер, т.к. зачистка проходит быстро и врядли мы там поселимся.
Хотя, пожалуй в подобных случаях лучше интерьеры подменять. Скрещивать всё в одном актуально, например, для домов ГГ.
There is always another way...
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №1108
написано: 8 ноября 2013, 00:27
| Отредактировано: Joopeeter - 8 ноября 2013, 00:33
это невозможность сдвинуть мебель из-за сетки навмеш
Для включения и отключения кусков навмеша есть функции DisableNavMesh и EnableNavMesh. Правда, не знаю, насколько хорошо они работают, сам не пользовался.
Можно в ячейке и Image Space Modifier скриптово поменять на более жизнерадостный. Так что "однокомнатный" вариант осуществим, но его геморройность стремительно растёт с количеством предполагаемых изменений.
Эти функции были введены экспериментально специально для моста в Ривет сити и сами разработчики не рекомендуют ей пользоваться. В 3м фоле я использовал ее и вроде полет был нормальный, но блин там был свой головняк с созданием этого навмеша. Вообще есть много чего интересного и при желании можно многое сделать, но вопрос не о том можно или нет а как удобнее и менее глючно.
У меня есть несколько 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...