Скрипты - неотъемлемая часть GECK. При написании возникает очень много казусов. Данная тема должна помочь не наступать на "грабли" новичкам и делиться опытом с другими более продвинутых мододелов.
Здравствуйте, прочитал такую вот штуку про айдл анимации и не понял, это получается можно сделать так, что я набираю команду и персонаж проигрывает анимацию нпс? Я знаю что можно персонажа заставить делать анимацию с помощью tfc, но это неудобно. А так, играя от третьего лица, врубать анимации, было бы здорово. Особенно было бы здорово такие скрипты поместить в инвентарь в виде предметов, чтобы на хоткеи нужные анимации цеплять. Это вообще реально? Сложно?
Подскажите скрипт для создания своего собственного верстака/плитки (я вообще хочу кофе машинку рабочую сделать), со своими собственными рецептами. Или если есть на эту тему туториал, дайте ссылку. Я просто в скриптах полный ноль.Примечание модератора: ... ... ... ... ... ... ... ... Сообщение перенесено в соответствующую тему. ЛС автору выслано. ApeX
Изменение репутации для пользователя ApeX
ApeXOffline
Сообщение №1659
написано: 25 августа 2018, 18:53
| Отредактировано: ApeX - 25 августа 2018, 18:55
Yaroslav2018, если для кофе-машины, то проще добавить свой рецепт для костра. А в роли активатора(костра) выбрать другую модель. Рецепты находятся в Miscellaneous>Recipes, активаторы костра или верстака в World Objects>Activator. Открываешь ванильный костер, меняешь ID, модель, название и удаляешь амбиентный звук. И создаешь свой рецепт. Так же и для тех активаторов, которые работают как верстак и используют его скрипт, например WorkBench. Только в этом случае в рецепте надо указать не лагерный костер, а верстак. P.S. А кофе ведь добавляется одной из DLC.
Добавлено (26 Августа 2018, 16:29) --------------------------------------------- А ведь было подобное.
Изменение репутации для пользователя КсюXa
КсюXaOffline
Сообщение №1660
написано: 26 августа 2018, 15:44
| Отредактировано: КсюXa - 26 августа 2018, 16:25
Приветствую! Надеюсь тема еще жива...Прежде чем спросить о том, что мне надо, я поинтересуюсь, можно ли здесь размещать вопросы по скриптам Fallout 3? Просто на форуме третьего фолыча не нашел тему со скриптами.
Оке! Есть мод, который может спавнить активатор (лампу). К активатору привязан скрипт, на вкл/выкл при обычной активации, и настройка цвета "лампочки" при активации из скрытности. Сразу скажу, что со скриптингом (если так можно назвать то, что я ваяю) знаком я чуть больше года, из этого времени "занимаюсь" им я дней 5. Ближе к телу! Сваял я скрипт, вышеупомянутый, и свет горит, и менюшка настройки есть, но сами "лампочки" не меняются...тыкался сам, по форумам лазил, даже по забугорским, но ни чего проясняющего для себя не нашел (может и плохо искал, но это не точно). И вот пришел к тому, что бы умные люди лично ткнули (лицом в какахи) пальцем туда, куда надо... Ну, и сам скрипт!
scn AAAGenericLamp01
float posX ;координаты лампы float posY ;координаты лампы float posZ ;координаты лампы int Button ;кнопка выбора цвета ref Lamp ;лампа ref ActLight ;источник света int LightCol ;цвет short LightON ;вкл/выкл
Begin OnActivate
Set Lamp to GetSelf
If player.isSneaking ;активация при скрытности ShowMessage FSLightColor ;диалог о цвете set Button to GetButtonPressed If Button == 0 ;холодный If LightCol != 1 Set LightCol to 1 EndIf ElseIf Button == 1 ;холодный пульс If LightCol != 2 Set LightCol to 2 EndIf ElseIf Button == 2 ;дефолт пульс If LightCol != 3 Set LightCol to 3 EndIf ElseIf Button == 3 ;теплый If LightCol != 4 Set LightCol to 4 EndIf ElseIf Button == 4 ;теплый пульс If LightCol != 5 Set LightCol to 5 EndIf ElseIf Button == 5 ;сброс (дефолт) If LightCol != 0 Set LightCol to 0 EndIf ElseIf Button == 6 ;выход EndIf EndIf
If LightON == 0 Set posX to Lamp.GetPos x Set posY to Lamp.GetPos y Set posZ to Lamp.GetPos z + 28 If LightCol == 0 Set ActLight to Player.PlaceAtMe FSLampGenericDef01 1 ActLight.SetPos x posX ActLight.SetPos y posY ActLight.SetPos z posZ Set LightON to 1 ElseIf LightCol == 1 Set ActLight to Player.PlaceAtMe FSLampGenericCold01 1 ActLight.SetPos x posX ActLight.SetPos y posY ActLight.SetPos z posZ Set LightON to 1 ElseIf LightCol == 2 Set ActLight to Player.PlaceAtMe FSLampGenericColdPulse01 1 ActLight.SetPos x posX ActLight.SetPos y posY ActLight.SetPos z posZ Set LightON to 1 ElseIf LightCol == 3 Set ActLight to Player.PlaceAtMe FSLampGenericDefPulse01 1 ActLight.SetPos x posX ActLight.SetPos y posY ActLight.SetPos z posZ Set LightON to 1 ElseIf LightCol == 4 Set ActLight to Player.PlaceAtMe FSLampGenericWarm01 1 ActLight.SetPos x posX ActLight.SetPos y posY ActLight.SetPos z posZ Set LightON to 1 ElseIf LightCol == 5 Set ActLight to Player.PlaceAtMe FSLampGenericWarmPulse01 1 ActLight.SetPos x posX ActLight.SetPos y posY ActLight.SetPos z posZ Set LightON to 1 EndIf ElseIf LightON == 1 ActLight.Disable ActLight.MarkForDelete Set LightON to 0 EndIf
End
P.S. Пометки на русском делал для себя...скрипт был раза в три длиннее, я начал путаться. ПРОШУ! Помогите мне, пожалуйста!
Изменение репутации для пользователя JupiterJour
JupiterJourOffline
Сообщение №1664
написано: 5 декабря 2018, 21:47
| Отредактировано: Joopeeter - 5 декабря 2018, 21:49
Пока кнопка не нажата, функция GetButtonPressed возвращает -1. Потом, после того как кнопка была нажата, функция один раз возвращает номер кнопки и опять сбрасывается на -1. Во время работы блока OnActivate ни одна кнопка ещё не нажата. То есть в этом блоке надо оставить только проверку на скрытный режим, сам показ сообщения и выключение и удаление. Всё остальное делается в гейммоде. Активировали лампу, сработал OnActivate, показалось сообщение (игра в это время в менюмоде), нажали кнопку, игра вернулась в гейммодд (а функция помнит кнопку), в гейммоде спросили функцию и запомнили ответ в переменной, ну и так далее.
Добавлено (06 Декабря 2018, 00:48) --------------------------------------------- GetButtonPressed
То есть в этом блоке надо оставить только проверку на скрытный режим, сам показ сообщения и выключение и удаление
Я бы ещё предложил не задавать вопрос про цвет, если лампе надо выключаться.
К размышлению: сама идея "активации вприсядку", то есть изменения режима активации при помощи скрытности, происходит из обливионной древности, когда не было возможности предложить на выбор несколько способов активации. В первых версиях движка третьего фолаута была проблема с деактивацией перков при отключении модов, и это замедлило распространение толкового подхода (activation choice добавляются через entry point перков)... Сегодня (да уж лет десять) всё там работает правильно, и кошерно бы прекратить приседания
Joopeeter, Огромное спасибо, все заработало! Просто про GetButtonPressed вскользь читал, вот и выросло непонимание...Я же говорю, надо было, что бы кто-то ткнул пальцем
Ipatow,
Цитата Ipatow
кошерно бы прекратить приседания
Как это можно сделать в моем случае? Надо что бы активация была отдельно, смена цвета отдельно. Я насоображал только такой вариант. Напоминаю, что опыт скриптинга 5 дней.
Как это можно сделать в моем случае? Надо что бы активация была отдельно, смена цвета отдельно.
В предъявленном скрипте смена цвета исполняется внутри блока OnActivate, так что она никак не отдельно от активации.
Для элегантного управления лампой через один активатор следует создать перк и использовать первую строчку в таблице Entry Point. В условиях появления вариантов активации кроме очевидного GetIsID уместно использовать GetScriptVariable.
В соседней теме уже задавал вопрос о весе химии и проч.,
Цитата Blacksun
Но тогда вес изменится на норме тоже. А как сделать чтобы только на "Хардкоре"?
в общем цель задать вес всем невесомым предметам в игре, но только при режиме "Хардкор". Опыта 0. Скажите ход мыслей ниже правильный не? Пока не могу попробовать сам.
1) Запуск nvse_loader.exe с параметром -editor (Так с помощью скрипт. расширения получим доступ к функции SetWeight) 2) С помощью функции IsHardcore и SetWeight установить вес невесомым предметам
Здравствуйте, господа! Хочу вот написать скрипт, который бы после убийства непися призывал на его место на N - количество секунд союзное существо, которое по истечении времени умирало бы ( что-то вроде заклинания призыва из TES), а в нем ( скрипте), как я понимаю, не обойтись без переменной timer ( это же переменная, да?). Кто-то может объяснить как этот timer работает?
существо, которое по истечении времени умирало бы ( что-то вроде заклинания призыва из TES), а в нем ( скрипте), как я понимаю, не обойтись без переменной timer ( это же переменная, да?). Кто-то может объяснить как этот timer работает?
Наверное, удобнее всего, поскольку это существо, дать ему врождённую способность со скриптованным эффектом (говорили, что это нестабильно... но я бы попробовал). Причём там весь скрипт будет по сути
SCRIPTNAME SuicideIn60Seconds FLOAT TimeLived BEGIN ScriptEffectUpdate SET TimeLived TO TimeLived + ScriptEffectElapsedSeconds IF TimeLived > 60 Kill ENDIF END
Привязал скриптовый эффект к существу, но ничего не сработало. Проблема в самом скрипте или я что-то не то делаю?
Рискну предположить что дело именно в скрипте: существо согласно скрипта должно умереть через 60 секунд, но при этом не заданы условия начала отсчета времени. Часики просто не начинают тикать...
не заданы условия начала отсчета времени. Часики просто не начинают тикать...
Отсчёт от запуска скрипта... Можно то же самое изобразить, заменив ScriptEffectUpdate на GameMode, а ScriptEffectElapsedSeconds на GetSecondsPassed... Может быть, тут найдутся грабли, если за минуту существо не успело сотвориться или если оно умирает так медленно, что KIll его раз за разом бьёт по голове издыхающего... Проверять, как именно оно там косячит, можно добавив отладочные сообщения в скрипт - хотя я бы начал с того, что... оно ведь как спелл оформлено? вот взять и AddSpell его на кого попало - помрёт или нет?
begin ScriptEffectStart if GetLastHitCritical && GetDead == 1
Во-первых, если это эффект, стоит обратить внимание, чтобы он не рассеивался в момент смерти - иначе что-то сделать в память о покойном скрипт не сможет... Это вообще, не в связи с неработоспособностью данного скрипта.
Теперь что не так со скриптом. Функция GetLastHitCritical может выдать единичку только в блоках OnHit и OnHitWith. Но в этих блоках GetDead никогда не даст единицы (а GetCauseofDeath не скажет причину), потому что во время работы этих блоков пациент ещё жив.
Напрашивается выход - передать критовость из блока в блок через переменную:
SHORT LuckyShot SHORT DiedOnce BEGIN OnHit SET LuckyShot TO GetLastHitCritical END BEGIN GameMode IF DiedOnce RETURN ENDIF IF GetDead SET DiedOnce TO 1 IF LuckyShot PlaceAtMe кого следует ENDIF Disable ENDIF END
Изменение репутации для пользователя OtecZoper
OtecZoperOffline
Сообщение №1678
написано: 27 мая 2019, 19:23
| Отредактировано: OtecZoper - 27 мая 2019, 19:29
Всех приветствую, появилось еще 2 вопроса. Первый - возможно ли внутри одного скрипта вызывать другой скрипт? Второй - как можно написать скрипт, который будет проверять кем является NPC (гулем, животным, человеком и т. д.)?
Сначала GetIsCreature, а дальнейшее различение существ при помощи GetIsCreatureType, неписей при помощи GetIsRace и GetIsSex.
С командами-то все ясно. Мой косяк, не так проблему описал. Нужно чтобы скрипт проверял каждое убитое существо или непися из определенного оружия. То есть, убиваешь какого-то рейдера, скрипт определяет его как нпц и что-то делает, а если убиваешь кротокрыса, то скрипт определяет его как животное и ничего не делает. Как-то так.
Добавлено (31 Мая 2019, 19:59) --------------------------------------------- Все хорошо, удалось все решить самому.