• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
AleksTirex, всё! Получилось то что нужно. Всё компилируется, а главное работает. Теперь уже буду сам эксперименты ставить на триггерах и активаторах. Спасибо большое за помощь.
Добавлено (25 Января 2014, 16:32) --------------------------------------------- И теперь вопрос немного другого плана. Звуки, можно их вешать на триггеры или активаторы?
Но теперь другая проблема, как сделать чтобы при заходе на триггер нпс создавался единожды а то получаются сплошные дубликаты.
Вот об этом я и писал - нужно точно определиться, что ты хочешь сделать... Если нужно, что бы НПС был создан один раз, зачем заморочки со сложными скриптами? В СК создаешь в нужном месте НПС скрытым по умолчанию (отмечено Initially Disabled). Триггер или активатор связываешь с НПС через Linked Ref. На триггер или активатор вешаешь скрипт:
Event OnActivate(ObjectReference akActionRef) ;- Произошло событие - активирован активатор if akActionRef == Game.GetPlayer();- Если событие вызвано игроком Self.GetLinkedRef().Enable();- Связанного с активатором НПС делаем видимым endif endEvent
Event OnTriggerEnter(ObjectReference akActionRef);- Произошло событие - вход в зону триггера if akActionRef == Game.GetPlayer();- Если в зону триггера вошел игрок Self.GetLinkedRef().Enable();- Связанного с триггером НПС делаем видимым endif endEvent
Ребята, подскажите скрипт в котором при выбросе предмета из инвертаря он исчезал а на его месте появлялся активатор, а то всё не разберусь с Event OnItemRemoved...
подскажите скрипт в котором при выбросе предмета из инвертаря он исчезал а на его месте появлялся активатор
Что-то тут не то в принципе. Если предмет уже в инвентаре, значит, игрок может взаимодействовать с ним в игре и активатор ему не нужен. Обычно активаторы используют в обратной ситуации - когда надо взять предмет, который не берётся. Например, висит в игре в воздухе Древний Свиток. Никакой предмет в игре висеть не может, упадёт. Так подвесили статик, который висеть может, а вот брать его нельзя. Тогда поверх него поставили активатор. Игрок думает, что взаимодействует со свитком, а на самом деле - с активатором. После взаимодействия с активатором скрипт удаляет статик, удаляет сам активатор и добавляет в инвентарь игроку уже нормальный Свиток. Игрок думает, что взял висевший в воздухе Свиток.
Изменение репутации для пользователя Мостик
МостикOffline
Сообщение №696
написано: 29 января 2014, 16:34
| Отредактировано: Мостик - 29 января 2014, 16:34
AleksTirex, либо же просто можно после появления скелета, удалить сам триггер)
Добавлено (29 Января 2014, 20:34) ---------------------------------------------
Цитата Aksyonov
Спасибо, как видите я с редактором creation Kit не слишком хорошо знаком, и думал что сделать то о чем спросил можно только при помощи скриптов, тем более что нужно сделать следующие, у нас есть дерево, к нему подходит давакин нажимает и проигрывается анимация если есть топор в инвентаре, давакин начинает рубить дерево, активное дерево Enable удаляется - и судя по вашим словам переключается в ползунок Disable а другое дерево на этом же месте появляется, в нашем случае это обычный пенек, но тогда в моде будет необходимо добавить туда где находится дерево миллионы пеньков? я думаю без скрипта все же не обойтись ? как считаете ?
Aksyonov, для рубки дерева нет анимации... Только для рубки дров на пне, а она врят ли вам подойдет ... + дерево нужно будет создавать как Static, а еще лучше как активатор.
И Совершенно верно!!! Тут нужен скрипт который во первых, вызовет анимацию. Во вторых уберет или удалит ваше дерево а активирует ваш пень. Скрипт не сложный.
Выглядит примерно так.
Код
ScriptName TreeScript extends ObjectReference
ObjectReference Property Tree auto ; Ваше дерево ObjectReference Property Shrub auto ; Ваш пень
Event OnActivate(ObjectReference akActionRef) Shrub.Enable() ; Добавляем пень. Tree.Disable() ; Убираем дерево. Либо можно его удалить методом Tree.Delete() EndEvent
ScriptName TreeScript extends ObjectReference ObjectReference Property Tree auto ; Ваше дерево ObjectReference Property Shrub auto ; Ваш пень
Event OnActivate(ObjectReference akActionRef) Shrub.Enable() ; Добавляем пень. Tree.Disable() ; Убираем дерево. Либо можно его удалить методом Tree.Delete() EndEvent
Да и кстати... Видел вас интересует анимация в скайриме. Вот почитайте это.
Да очень интересует, но то о чем говорится в статье я уже делать научился, анимацию добавлять теперь умею, другое дело как там создать свой собственный скелет, сейчас приходится открывать какой нибудь скелет из игры и делать анимацию для него, а вот как создать свой собственный скелет я пока не знаю, но хочу научится, пока ещё не понимаю зачем в игру два файла skeleton.nif это то сама модель с костями а вот skeleton.hkx зачем? ограничение костей? ведь hkx по идеи должен содержать анимацию а для статичного скелета какая там анимация может быть, видимо просто прописаны ограничение движение костей.
Изменение репутации для пользователя Greez
GreezOffline
Сообщение №700
написано: 30 января 2014, 19:21
| Отредактировано: Greez - 30 января 2014, 19:22
подскажите, можно ли как то скриптами заставить непися (например корову или курицу) остановиться и не двигаться некоторое время, секунд на 10 ? что то вроде дизэйблАИ, только что бы совсем отрубалось ее АИ и главное ноги, а не только способность замечать ГГ
перк взаимодействия с объектом я уже сделал, но хочу добавить 10 секундную анимацию. будет очень глупо выглядеть если в это время корова пойдет дальше гулять по своим коровьим делам
Изменение репутации для пользователя LordVadim
LordVadimOffline
Сообщение №701
написано: 30 января 2014, 19:55
| Отредактировано: LordVadim - 30 января 2014, 19:58
подскажите, можно ли как то скриптами заставить непися (например корову или курицу) остановиться и не двигаться некоторое время, секунд на 10 ? что то вроде дизэйблАИ, только что бы совсем отрубалось ее АИ и главное ноги, а не только способность замечать ГГ
Можно. На НПС вешается скрипт:
Scriptname StopAIActorScript extends Actor
Event OnActivate(ObjectReference akActionRef);- Событие активации НПС if akActionRef == Game.GetPlayer();- Если активировал игрок Self.EnableAI(False) ;- Отключаем AI Debug.Wait(10);- Ждем 10 секунд Self.EnableAI(True) ;- Включаем AI endif endEvent
LordVadim спасибо за ответ. до этого я не совсем корректно использовал EnableAI(False) и у меня животные продолжали ходить, поэтому и стал искать альтернативу. но вроде все получилось.
я чуть раньше еще один вопрос про снег задавал, который к моему великому сожалению остался без ответа. может кто нибудь все таки подскажет как выйти из положения. Есть задача. Задетектить скриптом, что ГГ в данный момент стоит на снегу или в воде или на камнях (не суть важно, мне главное понять механику)
Как я понимаю проверить это можно, создав некий маг. эффект, например ауру на ГГ и совместив это с ImpactDataSet провести проверку на столкновения ауры с поверхностью и понять какой там прописан материал. материал вода и снег там есть. т.е. по логике можно понять что ГГ сейчас на снегу или в воде. Или не ауру, а какой нибудь предмет ронять, проверить на столкновение и удалять его. Я других способов что то не вижу. На ВиКи как то очень бедненько все расписано и мне банально не хватает понимания как этим манипулировать. Был бы очень признателен, если бы кто то либо объяснил эту механику или помог найти туториал по этой теме.
я расковырял мод footprints (собсна там я и понял, что проверки делаются через импактдатасет. Но пока не могу повторить и добиться хоть каких то результатов. мне по сути нужно по запросу скрипта, проиграть чек. который выдаст да вода или да снег и во всех остальных случаях false.
Народ, можно ли скриптом через маг эффект выбросить в мир объект к примеру под ноги персонажу? Или ещё каким похожим способом который можно прикрутить к еде...
Народ, можно ли скриптом через маг эффект выбросить в мир объект к примеру под ноги персонажу? Или ещё каким похожим способом который можно прикрутить к еде...
Game.GetPlayer().DropObject(какой то объект, кол-во)
Подскажите пожалуйста решение. Мне надо запустить event когда предмет (objectreference) появляется (enable) как это можно сделать?!
В общем задача такая, по тригеру enable-тся objectreference, и я хочу сделать так, что б при определенном условии обьект не enable-лился. Но при этом нельзя трогать скрипт на тригаре. Поэтому у меня была мысль на обьект повесить еще один скрипт с проверкой, но я не знаю, при помощи чего запустить event.
Как-то криво написано, но я надеюсь мысль понятна?!
Но при этом нельзя трогать скрипт на тригаре. Поэтому у меня была мысль на обьект повесить еще один скрипт с проверкой, но я не знаю, при помощи чего запустить event.
А не проще было бы на триггер повесить еще один скрипт в котором и делать проверки?
Изменение репутации для пользователя VIPerMX
VIPerMXOffline
Сообщение №708
написано: 7 февраля 2014, 10:02
| Отредактировано: VIPerMX - 7 февраля 2014, 10:05
А не проще было бы на триггер повесить еще один скрипт в котором и делать проверки?
Было бы, но там небольшая загвоздка, обьект включается (там очень сложный скрипт и двойной тригер) после выхода из тригера с небольшой задержкой, которую сложно рассчитать. Т.е. тригер включает обьект, и надо его сразу отключить по проверке. Можно попробовать поставить утилити вэйт (или как там таймер был), рассчитать до появления обьекта и отключить его. Но самое было б замечательное старт евента при появлении обьекта, но такой функции в скриптах нет!
Изменение репутации для пользователя LordVadim
LordVadimOffline
Сообщение №709
написано: 7 февраля 2014, 11:59
| Отредактировано: LordVadim - 7 февраля 2014, 12:00
Но самое было б замечательное старт евента при появлении обьекта, но такой функции в скриптах нет!
Правильным решением было бы все таки изменить скрипт на триггере. Если этого не делать, то единственным решением, на мой взгляд, будет следующее:
Scriptname VerificationSCRIPT extends ObjectReference ;- Дополнительный скрипт на триггере
Event OnActivate(ObjectReference TriggerRef) ;- Событие активации триггера RegisterForUpdate(0.1) ;- Включаем вызов процедуры OnUpdate() 10 раз в секунду Utility.Wait(10) ;- Задержка (время задержки установить чуть больше чем необходимо для срабатывания основного скрипта триггера) UnregisterForUpdate() ;- Отключаем вызов процедуры OnUpdate() EndEvent
Event OnUpdate() ;- Событие вызывается 10 раз в секунду ;- ;- Здесь проводить необходимые проверки объектов (функции IsDisabled()IsEnabled() ) ;- EndEvent
А зачем вы использовали евент он апдейт?! Не проще ли будет event onTriggerLeave потом utility.wait а дальше оператор ветвления на проверку?
Ты же сам сказал, что не можешь точно рассчитать время которое нужно поставить в Wait(). Если поставить слишком короткую задержку - проверки могут пройти до окончания работы основного скрипта. Если слишком длинную - объекты будут "моргать" на экране, то есть появляться на какое то время, а затем исчезать. А через OnUpdate() состояние объектов проверяется 10 раз в секунду (можно и чаще). То есть как только состояние изменилось выполняются твои проверки и объект или скрывается или остается видимым. Пользователь, практически, не заметит появления ("моргания") объекта на экране если он должен быть скрыт.
Изменение репутации для пользователя VIPerMX
VIPerMXOffline
Сообщение №712
написано: 7 февраля 2014, 20:09
| Отредактировано: VIPerMX - 7 февраля 2014, 20:09
ObjectReference Property thisPlayer Auto Hidden ObjectReference Property light_1 Auto ObjectReference Property light_2 Auto ObjectReference Property light_3 Auto ObjectReference Property light_4 Auto Bool Property allLightsOn Auto Hidden Bool Property allLightsOff Auto Hidden Bool Property OnTimer Auto Bool Property specialCaseNoDisables Auto Bool Property specialCaseNoEnables Auto Bool Property debugModeOn = True Auto Float Property OnTimerAutoUpdate Auto Float Property OnTimerBeginTime Auto Float Property OnTimerEndTime Auto
EVENT onInit()
thisPlayer = Game.getPlayer()
ENDEVENT
EVENT onCellAttach()
IF ((OnTimerAutoUpdate > 0) && (OnTimer)) IF (debugModeOn) IF (specialCaseNoDisables || specialCaseNoEnables) Debug.MessageBox("debugModeOn: " + Self + " is on a timer and auto-updating every " + OnTimerAutoUpdate + " seconds, however its specialCaseNoDisables and/or specialCaseNoEnables flag is set. Disabling. ") disable() return ELSEIF (!(mask(1, 0, 0, 0) || mask(1, 1, 0, 0) || mask(1, 1, 1, 0) || mask(1, 1, 1, 1))) Debug.MessageBox("DebugModeOn: " + Self + " has mismatched lights! I.E. light_1 must be set before you can set light_2. Disabling. ") disable() return ENDIF ENDIF
Это код из модификации Lightning Just in Time. Он очень хитрий и я решил не трогать его а добавить свой скрипт.
Ничего особо хитрого я тут не увидел. Все изменения видимости объектов происходят в событии OnUpdate(). Тебе, всего лишь, в конец этого события (перед EndEvent) надо вставить свои проверки и изменять видимость объектов как тебе нужно... и всё.
Господа, всем привет. Модостроением в скайриме занялся совсем недавно, и на данный момент с другом клепаем серию квестов связанных с очень "оригинальной" тематикой вампиров у меня появилось два вопроса:
1) По умолчанию шанс получить болезнь "сангвинаре вампирис" 10%. Как сделать скрипт, чтобы персонаж после выпитого зелья гарантированно получал "сангвинаре" вне зависимости от его резистов к болезням и т.д. (выпил - получил)
2) Возможно ли сделать скрипт, позволяющий каждую игровую ночь в случайном порядке генерить n-ое количество неписей в рандомных местах скайрима. Прошу прощения если выразился не совсем удачно, в общем суть приблизительно такая: После выполнения определенного квеста на игрока начинает охоту некая группа "охотников на вампиров". Как реализовать возможность, чтобы каждую ночь у игрока был шанс натолкнутся на такую группу в рандомном количестве 2-4 участника в любом месте карты, кроме помещений.
Это код из модификации Lightning Just in Time. Он очень хитрий и я решил не трогать его а добавить свой скрипт.
Если правильно понял, то надо не включать объект при каких-то условиях. И этот объект один из light_1...light_3 и т.д? Если это так, и очень не хочется вмешиваться/изменять тот скрипт, то можно просто в том скрипте удалять (стирать) ссылку на свой объект если включать нельзя, и потом опять её добавлять, когда включать/управлять можно.
Например, твой объект light_3, тогда на него повесь скрипт:
ObjectReference Property akObject Auto
Function OnOff() if ; условие запрета включения объекта light_3 (akObject as LightingBall).light_3 = none else (akObject as LightingBall).light_3 = self as ObjectReference endif endFunction
akObject - это объект, на котором висит основной скрипт, LightingBall - название того скрипта.
В любой функции или событии запускается команда на эту функцию OnOff(), или при загрузки локации, или по какому-то триггеру (но до срабатывания основного триггера того скрипта), или ещё как. Там в зависимости от условий, можно включаться или нет, стирается или восстанавливается ссылка на свой объект.
Если нет ссылки на объект, то его и выключить нельзя, просто нечего выключать.
*************
Можно и на другой объект повесить такой скрипт, тогда вместо self передавать назначенное свойство на свой объект. Это сам принцип, дальше уже придумаете что и как.
Изменение репутации для пользователя TrueError
TrueErrorOffline
Сообщение №717
написано: 11 февраля 2014, 14:49
| Отредактировано: TrueError - 11 февраля 2014, 14:50
Кто-нибудь знает как увеличить время нахождения в шкуре оборотня? Вроде за это отвечает скрипт PlayerWerewolfChangeScript, но что-то я в нем совсем запутался.
Добавлено (11 Февраля 2014, 18:49) --------------------------------------------- Шел по хлебным крошкам, но нашел как регулировать время в шкуре оборотня. Если кому интересно, заглядываем под спойлер
1) В Object Window переходим в подраздел Character->Quest. 2) Находим квест PlayerWerewolfQuest. Открываем. 3) Переходим во вкладку Scripts. 5) ПКМ на PlayerWerewolfChangeScript 6) Выбираем пункт Edit Properties. 7) Ищем две переменные: StandartDurationSeconds - отвечает за начальное время, в шкуре вервольфа, в секундах. (по умолчанию - 150) FeedExtensionTimeSecond - отвечает за прибавку ко времени вервольфа, после перекуса человечинкой, в секундах. (по умолчанию - 30)
Все работает. Как оказалось, даже напрямую в скрипт лезть не нужно.
Изменение репутации для пользователя p1cador
p1cadorOffline
Сообщение №718
написано: 13 февраля 2014, 10:28
| Отредактировано: p1cador - 14 февраля 2014, 18:33
Добрый день. Помогите пожалуйста новичку в скриптописании.
Хочу написать скрипт, который немного меняет параметры игрока при убийстве им других персонажей. И что-то никак не могу найти подходящее событие. Т.е. ищу что-то вроде OnDeath, только наоборот - чтобы происходило не когда персонажа убивают, а когда он убивает кого-то. Можно конечно скрипт с OnDeath засунуть во всех возможных Actor'ов, но это: 1) Долго. 2) Могу пропустить кого-нибудь. 3) Да и вообще некрасиво.
Может быть есть более изящное решение? Подскажите пожалуйста, в каком направлении копать, есть ли какие-нибудь похожие скрипты?
Update: Подумал, что похожий скрипт должен висеть на Эбонитовом клинке - ибо друзей всяких много может быть, а на каждом не висит скрипт на OnDeath. Раскопал, что появляется отдельное скрытое задание на убийство товарищей. В скрипте этого задания тупо запускается функция с названием вроде friendkilled(), которая увеличивает кол-во убитых друзей на 1 и проверяет, четное ли число друзей мы убили, и если да - запускает сценку с Мефалой. А вот как определяется, что мы вообще кого-то убили, и был ли другом тот, кого мы убили - нигде нет. Уже вроде все перелопалил:(
Update2: Спасибо за помощь, но я уже разобрался.
Изменение репутации для пользователя Arin
ArinOffline
Сообщение №719
написано: 13 февраля 2014, 16:21
| Отредактировано: Arin - 13 февраля 2014, 16:29
Доброго времени суток. Не могли бы вы помочь со скриптом? Мне нужен скрипт, при котором между игроком и нпс начинается поединок, при этом - или нпс не наносить никакого урона (и магией тоже, или магия блокируется). - или стоит со щитом и просто блокирует удары. Мне этот скрипт нужен для создания тренера, который учит не только с помощью окно, но и проводит настоящие тренировочные поединки.
Наука всегда оказывается не права. Она не в состоянии решить ни одного вопроса, не поставив при этом десятка новых. Джордж Бернард Шоу
Arin, а посмотри Вилкаса. Там, ведь, при поступлении к Соратникам, по сути, как раз тренировочный поединок.
<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a> Да, мы бандиты и бродяги, как злословит молва, Мы попадаем в передряги, помня эти слова. Смотри вперед и не сдавайся ты на милость судьбе! Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)