Скрипты - неотъемлемая часть GECK. При написании возникает очень много казусов. Данная тема должна помочь не наступать на "грабли" новичкам и делиться опытом с другими более продвинутых мододелов.
Изменение репутации для пользователя KAIN48
KAIN48Offline
Сообщение №631
написано: 29 января 2012, 02:20
| Отредактировано: KAIN48 - 29 января 2012, 07:30
Возможно ли сделать с помощью скрипта, что бы после третьего выстрела (и попадания в нпц), нпц умирал, не смотря на то, сколько у него осталось жизней?
Это наверное подменой оружия можно сделать. Допустим в инвентаре 2 магазина(коробок) с одним патроном. (Создать новые аммо) калибр и тп. и Clip Raunds 1 Скриптом считать наличие в инвентаре, как стало 0, менять оружие на оружие с уроном 1000 и плюс три магазина с одним патроном каждый, как стало 2 снова менять на обычный ствол. Вот только как с перезарядкой быть! Получится выстрелил - перезарядил, как из древней берданки, или одноствольного охотничьего ружья! А второе наверное не сделать Пока. И ещё, нужно как то решить проблему выстрела не по цели! Допустим игрок выстрелил один раз или два и сменил оружие на мощное, тогда непись будет убит с первого выстрела, или со второго. Вывод - подумать можно, но скорее всего то же не реально. Ведь нет способа узнать в кого стреляет игрок.
Graf, внимательно читай описание секций (блоков). OnHit должен вешаться на объект, ПО которому стреляют, т.е. на непися. А OnActivate не работает на оружии. Для оружия есть блок OnFire. С попаданиями в принципе можно попробовать, вроде есть функция для определения повреждения конечностей, но тогда все повреждения придётся прописывать в глобальном скрипте, при этом нужно как то получить РефИД цели. Возможно, с помощью НВСЕ и можно, но помучиться придётся серьёзно.
<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a> Да, мы бандиты и бродяги, как злословит молва, Мы попадаем в передряги, помня эти слова. Смотри вперед и не сдавайся ты на милость судьбе! Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Graf, если мне память не изменяет, есть подобный эффект в Fallout 3 - там от Репеллента со второго или третьего удара взрываются головы у кротокрысов, вследствие чего они, естественно умирают. Собственно, может это то что нужно?
Добавлено (29.01.2012, 13:42) --------------------------------------------- Volkogava, там достаточно одного удара, просто нужно подождать, скорее всего реализовано как отравление.
<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a> Да, мы бандиты и бродяги, как злословит молва, Мы попадаем в передряги, помня эти слова. Смотри вперед и не сдавайся ты на милость судьбе! Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Artem13, ясно, жаль. --- Не знаю, может сейчас глупость скажу, но можно ведь например сделать так, чтобы при попадании по неписю, ему в инвентарь добавлялся какой-либо предмет (не playabe), и когда количество этих предметов достигало 3-х штук, его убивало?
Не знаю, может сейчас глупость скажу, но можно ведь например сделать так, чтобы при попадании по неписю, ему в инвентарь добавлялся какой-либо предмет (не playabe), и когда количество этих предметов достигало 3-х штук, его убивало?
Хм, можно попробывать...
...-Вот такой вот парадокс. Мы делаем моды для игр, в которые уже давно не играем...
Интересная задача. Вот один из возможных вариантов решения. Предварительно создаем две фракции: WoundedFaction (раненные) и KilledFaction (убитые) Пишем эффектовый скрипт:
Code
scn HeadThreekScript
ref HitTarget short doOnce
BEGIN ScriptEffectStart set HitTarget to GetSelf if HitTarget.getdead == 0 if HitTarget.GetInFaction WoundedFaction == 0 && HitTarget.GetInFaction KilledFaction == 0 HitTarget.addtofaction WoundedFaction 1 elseif HitTarget.GetInFaction WoundedFaction == 1 && HitTarget.GetInFaction KilledFaction == 0 HitTarget.addtofaction KilledFaction 1 HitTarget.removefromfaction WoundedFaction elseif HitTarget.GetInFaction WoundedFaction == 0 && HitTarget.GetInFaction KilledFaction == 1 set doOnce to 1 endif endif end
BEGIN ScriptEffectFinish if doOnce == 1 HitTarget.killactor player 1, 2 endif end
Смысл скрипта такой: при первом попадании НПС добавляется во фракцию раненных, при втором выбывает из фракции раненных во фракцию убитых, при третьем умирает. На базе этого скрипта создается Базовый эффект, который в свою очередь служит основой для Объектного эффекта, который вешается на оружие. Проверено в игре, работает.
====================== Мод "Нью-Йорк" на русском: 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
Spalny_Vagon, прикольно. С фракциями не работал и даже не подумал, что можно их припахать.
<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a> Да, мы бандиты и бродяги, как злословит молва, Мы попадаем в передряги, помня эти слова. Смотри вперед и не сдавайся ты на милость судьбе! Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Кроме фракций еще можно использовать ранги. Также широко применяются и ActorValue, в частности переменные типа variable01, которые весьма удобны (я их использую довольно часто). К сожалению, Беседка их тоже использует, поэтому применять их в скриптах, подобных приведенному выше (на кого бог пошлет), нельзя.
====================== Мод "Нью-Йорк" на русском: 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
Как сделать так, чтобы NPC первым завел диалог с игроком, если он(игрок) попадает в определенный триггер?
Можно и без триггера, специально для этого есть AI-пакет Dialogue. Указываешь нужные дистанции, и НПС на определенном расстоянии до ГГ начнет диалог. При этом первая фраза должна быть из топика Greeteng.
====================== Мод "Нью-Йорк" на русском: 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
Добавлено (31.01.2012, 20:15) --------------------------------------------- А как сделать так, чтобы непись убегал (пакет Travel) после определенного варианта диалога?
Vi[RUS], Я так вижу ты не проходил мой мод "Arena Mod v1.5" рекомендую скачать, там всё это есть, и даже больше. Просто будешь использывать скрипты которые написал я, в своём плагине. Вставь в Result Script (End) такую строчку:
Code
NpcRef.addscriptpackage "PackageTravel" resetAi
Ну а в аи пекете, указывакшь куда будет бежать NPC. Но это добавление НПЦ свой пакет, в игре не проверял, так как есть некие проблемы.
...-Вот такой вот парадокс. Мы делаем моды для игр, в которые уже давно не играем...
Graf, Скрипт вставил. НПЦ выбегает из интерьера в котором он находился, но если вслед за ним из интерьера выйду и я, то он снова вернется обратно в интерьер, побродит там пару сек, снова выйдет и обратно вернется, и так далее.
Каким образом можно посмотреть, сколько свободного места осталось у определенного NPC?
Делаю так:
float WWEinfo short InfoActive
при активации предмета:
Set InfoActive to 1 Set WWEinfo to ( WKCSref.GetAV CarryWeight - WKCSref.GetAV InventoryWeight) ; ShowMessage InfoCWSmMsg WWEinfo ; Свободного места: %.2f Set InfoActive to 0
В результате он мне показывает только CarryWeight, не учитывая вычитание. Пробовал оставить только WKCSref.GetAV InventoryWeight, тогда в сообщении в любом случае показывает 0.00
Добавлено (05.02.2012, 15:08) --------------------------------------------- И еще вопрос - команда PlaceAtMe, как сказано в Вики, размещаемый объект будет с теми же значениях координат (XYZ), что и на вызываемом объекте. Так вот, можно ли разместить объект, например, выше вызываемого?
И еще вопрос - команда PlaceAtMe, как сказано в Вики, размещаемый объект будет с теми же значениях координат (XYZ), что и на вызываемом объекте. Так вот, можно ли разместить объект, например, выше вызываемого?
А почему нет?
...-Вот такой вот парадокс. Мы делаем моды для игр, в которые уже давно не играем...
И еще вопрос - команда PlaceAtMe, как сказано в Вики, размещаемый объект будет с теми же значениях координат (XYZ), что и на вызываемом объекте. Так вот, можно ли разместить объект, например, выше вызываемого?
На http://geck.bethsoft.com в одном месте сказано, что можно указать направление и расстояние до вызывающего объекта (про высоту не сказано ничего), а в другом месте сказано, что ни направление, ни расстояние не работают, поэтому указывать их не имеет никакого смысла, все равно размещаемый объект выпадет куда попало на свободное место.
====================== Мод "Нью-Йорк" на русском: 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
На http://geck.bethsoft.com в одном месте сказано, что можно указать направление и расстояние до вызывающего объекта (про высоту не сказано ничего), а в другом месте сказано, что ни направление, ни расстояние не работают, поэтому указывать их не имеет никакого смысла, все равно размещаемый объект выпадет куда попало на свободное место.
Обидно. -- Ну а по первому вопросу есть какие-нибудь идеи?
Тремя командами (Obj - ID того, чего размещаешь, dlt - на какую высоту помещаешь):
Code
float zzz
player.PlaceAtMe Obj 1 set zzz to player.GetPos Z Obj.SetPos Z (zzz + dlt)
Да, это для размещения над игроком.
<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a> Да, мы бандиты и бродяги, как злословит молва, Мы попадаем в передряги, помня эти слова. Смотри вперед и не сдавайся ты на милость судьбе! Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Изменение репутации для пользователя ITU
ITUOffline
Сообщение №657
написано: 5 февраля 2012, 13:15
| Отредактировано: ITU - 5 февраля 2012, 13:18
float zzz Obj.PlaceAtMe set zzz to GetPos Z Obj.SetPos Z (zzz + dlt)
так коллизия не двигается... а с фурнитурой вообще прикол можно сделать спавн xmarker чуть выше, а уже потом на него вешать появление чего хочешь
Code
ref targetobj float zzz
set targetobj to xmarket.placeatme 1 0 0 set zzz to targetobj.GetPos Z targetobj.SetPos Z (zzz+число) targetobj.placeatme объект 1 targetobj.disable targetobj.MarkForDelete
Нет никаких идей, на мой взгляд там все правильно. Почему у Вас не считает, я не знаю. Я проверил в игре (фаллаут-3), у меня считает по любому, как его не крути, может у Вас в message что-то не так, хотя там тоже вроде как трудно ошибиться. Попробуйте так:
Code
float WWEinfo ;short InfoActive - это явно лишнее, оно на результат никак не влияет.
begin onActivate Set WWEinfo to WKCSref.GetAV CarryWeight Set WWEinfo to WWEinfo - WKCSref.GetAV InventoryWeight ShowMessage InfoCWSmMsg WWEinfo ; Свободного места: %.2f end
====================== Мод "Нью-Йорк" на русском: 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