Расскажите мне, почему, когда я создал свой квест, диалоги из него не появились в игре у НПС, хотя условия выполняются. Надо сохранить игру перед НПС и загрузить ее? Я что-то слышал о такой проблеме...
А, да есть такое. Не обязательно перед НИП сохранять. Просто сохранить и загрузить. Тогда все диалоги из квеста уже работают. А лично я не ставлю галочку "Start game enabled" у квеста, а запускаю его скриптом.
Event OnInit() Utility.Wait(1.0) Start() EndEvent
Скрипт к самому квесту цепляется. Еще что-то писали о решении с помощью SEQ файлов, но не знаю, что это.
Тоже вариант... Но если Вы делаете мод не только для себя, было бы правильным свести к минимуму побочные эффекты. А перезапись всех рас сделает мод несовместимым со многими другими модами.
Чтоб работало OnEquipped, скрипт ведь должен либо к самому свитку цепляться, либо к алиасу, в котором какой-то конкретный из свитков.
А в предыдущей версии ты в скрипт на игроке не вставлял ничего типа Utility.Wait(x)? Эта функция не даст скрипту продолжить выполнение до закрытия меню. Если же ничего такого нету, то, вроде, вещь должна нормально сниматься и удаляться даже если игрок в меню.
Если какой-то квест отбирает у игрока все вещи и перемещает их в какой-то контейнер при помощи функции RemoveAllItems, то он запросто может и квестовые вещи отбирать. У функции есть флаг abRemoveQuestItems. Это уж как автор скрипта захочет...
А вообще, по-моему, сделать вещь квестовой можно только запихнув её в алиас, у которого стоит галочка "квестовый предмет".
Если нужно сделать, чтоб вещь оставалась у игрока при любых условиях, то... уф.. Ну можно прицепить на неё скрипт. Если вещь у игрока отберут любым способом, скрипт будет через секунду возвращать её назад. Не подойдет?
Да я о чем-то такого типа и говорил... Только не обязательно удалять предмет из одного контейнера, а потом создавать новый в другом. В этом случае, наверное, не перенесутся зачарования и улучшения предмета, если такие есть. Можно просто переместить именно этот предмет обратно. И, вместо проверки стадии квеста, может быть любая другая проверка.
Добавлено (12 Июня 2014, 21:13) --------------------------------------------- Я готовые скрипты не выкладываю потому что люди иногда начинают думать, что это единственный вариант и его нужно скопировать символ-в-символ.
А в RemoveItem и RemoveAllItems можно задать, куда они будут перемещаться. Если ничего не задавать, то удаляются. И через AddItem можно, но там другая история.
Сделать вещи квестовыми - тоже не проблема. Но толку-то... Все-равно смогут их отобрать. Если найдешь хоть какой-то ванильный предмет, который не отбирают, тогда можно посмотреть, как оно там сделано.
Автовозвращение отобранного можно сделать без изменения каких-либо ванильных записей.
Любой скрипт в любой момент может создать любую вещь где-угодно (или взять уже созданную) и сунуть её в любой алиас любого квеста (сделать квестовой). Вариантов много. Можно и с изменением ванильного квеста, и вообще без изменения чего-либо ванильного. Плохо, что название квеста так и не сказал... Я бы посмотрел, как именно создаются вещи, как даются игроку и действительно ли опустошение происходит уже после выдачи (зачем?). В общем, чтоб лучший вариант выбрать, нужно ванильный квест посмотреть.
Добавлено (13 Июня 2014, 01:33) --------------------------------------------- Можно сделать, чтоб каждый раз при попадании в тюрьму, игроку давался квестовый напильник. Или только при попадании в определенную тюрьму. И без изменения ванильных записей. В общем, мало информации
В предметах есть два серебрянных блюда помеченные:DLC1SilverPlatter01IdleCups DLC1SilverPlatter01IdleFood Я припоминаю, что в замке Воликхар вроде бы при первом посещении стоят пленники с блюдами в руках. Но Idle маркеров с похожими названиями нет. Есть только - MQ201HoldingDrinkTrayIdleMarker, но нпс его игнорирует. Точнее стоит на том же месте, но не держит ничего в руках.
Я бы сначала нашел нужную Idle в списке Animations для Character. А потом можно сделать свой IdleMarker с этой Idle или вызывать её скриптом. Там есть функция PlayIdle для Actor. Если только потом не окажется, что Idlы тут вообще не при чем...
О. Я как-то не подумала там посмотреть. А на счет Idle. Сколько я помню, но если персонаж что-то делает с вещами в руках, то это либо фурнитура, либо анимация, либо активатор. Третьего не дано.
Вроде, разобрался немного. Раб в замке Волкихар - это DLC1VQ02FeastThrall2. К нему приделан пакет - DLC1VQ02FeastThrall2HoldTray
В пакете сказано, где стоять. И в закладке Idles у пакета прописано использовать IdleMQ201HoldingDrinkTray.
Открыл пакет Изольды, зашел во вкладку Idles, добавил IdleMQ201HoldingDrinkTray. И всё. Теперь Изольда держит поднос. Ну когда не ходит...
У драугров точно есть пакет, который говорит им "Используй IdleMarker"..? LinkedRef-маркер или еще напрямую указанный. Перепроверь пакеты. Может, на самих драуграх пакетов и нету, а warehouse им его через алиас цеплял. Или еще как-то.
У него там еще условия на пакетах. ambushsleeppackage - только тогда, когда какая-то переменная == 0 остальные два - когда переменная == 1.
Может, это условие и мешает. Я бы забил на эти пакеты и сделал свой собственный.
Добавлено (14 Июня 2014, 09:51) --------------------------------------------- А, понял, зачем переменная... Сейчас попробую сделать засаду, если ноутрбук потянет.
А... Понятненько... Ну этот конкретный квест не отбирает квестовые вещи... Хотя мог бы.
Он запущен не со старта игры, а запускается в конце предыдущего квеста. В момент старта квеста алиасы создают две вещи на маркере PartyCenterMarker, а позже скрипт перемещает их к игроку.
Если нужно, чтоб выдавались еще три вещи, то вариантов много:
1. Как в оригинале. Добавить еще три алиаса с создаваемыми предметами и отредактировать скрипт выдачи. Не сработает, если квест уже начат.
2. Добавить три пустых+опциональных алиаса. Снова отредактировать скрипт выдачи, чтоб он сначала создавал вещь на маркере PartyCenterMarker, потом совал её в алиас (сделать квестовой), а потом перемещал игроку. Как-то так (не проверено):
ObjectReference Property PartyCenterMarker Auto ReferenceAlias Property SomeAlias Auto Actor Property PlayerRef Auto
ObjectReference Ref = PartyCenterMarker.PlaceAtMe(SomeItem) ;;создать на маркере SomeAlias.ForceRefTo(Ref) ;;сунуть в алиас PlayerRef.AddItem(Ref) ;;передать игроку
Будет работать даже если квест уже запущен. Или просто PlayerRef.AddItem(SomeItem), но уже после очистки инвентаря. Предмет не будет квестовым.
3. Можно как-нибудь обойтись вообще без изменения ванильного квеста. Привожу абсолютно точно не лучший, но один из вариантов. Создать новый квест. В нем 4 алиаса: три алиаса с трема твоими вещами и помечены как квестовые, а четвертый алиас указывает на сундук, в который у игрока забирают вещи. На 4м алиасе скрипт с ивентом OnItemAdded. Когда срабатывает этот инвент (тоесть, у игрока отбирают вещи), скрипт передает игроку три вещи. Но это так... Можно что-то намного изящнее придумать.
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №138
| Тема: Вопросы по скриптам Papyrus
написано: 15 июня 2014, 21:15
| Отредактировано: Dsion - 15 июня 2014, 21:28
Да... Это я облажался. Не поставил .0 после целых чисел и c++ всё неправильно посчитало.
В любом случае, это всё фигня... Вот моя редакция формулы: int phase = qFloor((time + 23.5)/3.0) % 8; Это если фаза начинается в полдень (как в оригинале).
Или даже еще проще: int phase = qFloor(time/3.0) % 8; Если фаза начинается в полночь.
И всё тут.
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №140
| Тема: Вопросы по скриптам Papyrus
написано: 16 июня 2014, 23:06
| Отредактировано: Dsion - 16 июня 2014, 23:11
qFloor - это Floor. А % - это modulo. Офигенный оператор. Ты меня уже, наверное, ненавидишь и не хочешь никаких советов, иначе я бы посоветовал разобраться с modulo. Очень полезно для любых программистов.
Он возвращает остаток от деления: 8 % 8 = 0 - делится без остатка. 9 % 8 = 1 10 % 8 = 2 80 % 8 = 0 83 % 8 = 3 4 % 8 = 4
Если брать остаток от деления именно на 8, то он всегда меньше 8.
Я формулы в Qt проверял и оттуда скопировал... У Qt чуть ли не всё на "q" или "Q" начинается... Для папируса действительно надо просто Floor, а остальное без изменений.
Arin дело говорит... Скорее всего, у него sandbox пакет. Некоторые торговцы sandbox пакет и используют. Важно только задать подходящий к случаю радиус. Например, у Белетора с 8 часов до 20 часов активен sandbox пакет. Центр - Белеторов стол, радиус - 50. 50 - это очень мало. Потому он особо никуда и не рыпается. Ну или можно сделать новый пакет: сидеть или стоять в конкретном месте и никакого sandbox.
Добавлено (18 Июня 2014, 11:42) --------------------------------------------- Если в названии пакета не присутствует слово sandbox, это еще не значит, что он - не sandbox. Название - это только название. Суть - внутри.
Ну если задача именно так стоит... Наверное, в энчанте понадобилось бы два магических эффекта:
1. Концентрация на цель. С кастомными Projectile. Метает Projectile и наносит урон. Но урон-то магический. Я не помню точно, можно ли установить физическую защиту как ресист для магического эффекта. Надо проверить. Для создания этого эффекта можно скопировать эффект с обычного "Пламени".
2. Концентрация на самого себя. Со скриптом, который отбирает стрелы каждую секунду и прерывает каст, если стрел нету. Зачем этот эффект? Тебе ведь нужно, чтоб стрелы отбирались постоянно во время стрельбы, а не только тогда, когда ты в кого-то попадаешь.
Кастомные Projectile очень легко создать. Для тестов можно даже обычные стрелы использовать.
Вот.. Но это только те мысли, что сразу пришли. Может, есть и поинтереснее способы.
Но какой от этого всего толк, если нельзя указать физическую защиту как ресист...
Тоесть, можно, конечно, сделать скрипт, который будет высчитывать урон, основываясь на броне цели и навыке стрельбы кастера... Но как-то это криво. Разобраться бы, как обычное оружие автоматическим сделать. Или, возможно, стреляющие длинными очередями.
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №147
| Тема: Вопросы по скриптам Papyrus
написано: 18 июня 2014, 12:33
| Отредактировано: Dsion - 18 июня 2014, 13:07
Мне кажется, что я способ получше придумал, чем магические эффекты. Надо проверить только.
Добавлено (18 Июня 2014, 16:33) --------------------------------------------- Попробуй вот такой вариант. Сначала создается посох и зачарование для него с Concentration Self эффектом. К зачарованию цепляется скрипт:
Код
Scriptname DartMassacre extends ActiveMagicEffect
Weapon Property TrapDartWeapon01 Auto Ammo Property TrapDart Auto Actor Caster
Event OnEffectStart(Actor akTarget, Actor akCaster) Caster = akCaster RegisterForSingleUpdate(0.1) EndEvent
Event OnUpdate()
If (Caster.GetItemCount(TrapDart) > 0) Caster.RemoveItem(TrapDart, 1) TrapDartWeapon01.Fire(Caster, TrapDart) RegisterForSingleUpdate(0.1)
Else Caster.InterruptCast()
EndIf
EndEvent
Все Property в скрипте заполняются автоматическим заполнением.
Работает это всё почти так, как тебе нужно. Но всплывают несколько проблем... В общем, попробуй. В любом случае, это весело. Я минут 7 не мог оторваться от расстрела мирных жителей дротиками. Хорошо бы придумать, как обойтись без посоха. Идея есть, вроде.
Dsion, а ты боезапас экипируешь? Если да, то за одно обновление будет съедаться 2 ед. боезапаса.
Да? Если экипированы, сами расходуются? Так даже лучше. Можно обойтись одной функцией IsEquipped(дротик) вместо проверки количества и удаления.
Но там основная проблема в другом... Если персонаж держит в руках стрелковое оружие, то всё круто. А если держит некоторые другие виды оружие, то 1) оружие становится невидимым 2) дротики летят не совсем точно туда, куда целишься. Посох как-раз к таким "другим" видам относится. Как бы так сделать включение и отключение пулемета без использования посоха?
Если задуматься, то не круто это всё... Скорее всего, DPS у такого скрипта будет зависеть от производительности компьютера и частоты смены кадров. Но других идей нету пока...