stanislavd Опубликовано 26 сентября, 2018 Опубликовано 26 сентября, 2018 как правильно написать условие определения умер ли нпс? Actor Property Actor1 Auto If (Actor1.GetDead()) Debug.MessageBox("Yippee!") EndIf (середину не смотри)
Vitalyudin Опубликовано 26 сентября, 2018 Опубликовано 26 сентября, 2018 26.09.2018 20:14:25, stanislavd сказал(-а):как правильно написать условие определения умер ли нпс? GetDead - это получение инфы о статусе "мёртв" актёра, ты её типа получаешь, но ничего дальше не делаешь. В твой пример больше подойдёт IsDead.
stanislavd Опубликовано 27 сентября, 2018 Опубликовано 27 сентября, 2018 (изменено) 26.09.2018 22:36:07, Vitalyudin сказал(-а): GetDead - это получение инфы о статусе "мёртв" актёра, ты её типа получаешь, но ничего дальше не делаешь. В твой пример больше подойдёт IsDead. мне и нужно получить статус, чтобы потом воскресить... будут ещё строчки wait и воскрешение.. (кстати какой оператор это делает??? но мне нужно, чтобы не на том месте где его грохнули, а на том где он первый раз появился, т.е. стоит маркер) и ещё одно: можно ли менять уровень сложности нпс командой? Изменено 27 сентября, 2018 пользователем stanislavd
BornToNight Опубликовано 27 сентября, 2018 Опубликовано 27 сентября, 2018 Здравствуйте. Рылся в интернете весь, установил Creation Kit, посмотрел пару уроков. Информации очень много и почти вся она мне не подходит. Собственно сам вопрос, мне нужно вызывать определённый скрипт на нажатию клавиши. Т.е., например я нажимаю NumPad1 и около меня спавнится какой-нибудь монстр. Думаю, сам скрипт я смогу написать, вопрос в том, как играя вызывать скрипт нажатием клавиши.
Azazellz Опубликовано 27 сентября, 2018 Опубликовано 27 сентября, 2018 27.09.2018 10:37:51, BornToNight сказал(-а): Здравствуйте. Рылся в интернете весь, установил Creation Kit, посмотрел пару уроков. Информации очень много и почти вся она мне не подходит. Собственно сам вопрос, мне нужно вызывать определённый скрипт на нажатию клавиши. Т.е., например я нажимаю NumPad1 и около меня спавнится какой-нибудь монстр. Думаю, сам скрипт я смогу написать, вопрос в том, как играя вызывать скрипт нажатием клавиши. https://www.creationkit.com/index.php?title=OnKeyDown_-_Form Ну или https://www.creationkit.com/index.php?title=OnKeyUp_-_Form Но сначала нужно кнопку зарегистрировать этим https://www.creationkit.com/index.php?title=RegisterForKey_-_Form Нужен СКСЕ.
BornToNight Опубликовано 27 сентября, 2018 Опубликовано 27 сентября, 2018 27.09.2018 12:34:05, Azazellz сказал(-а): https://www.creationkit.com/index.php?title=OnKeyDown_-_Form Ну или https://www.creationkit.com/index.php?title=OnKeyUp_-_Form Но сначала нужно кнопку зарегистрировать этим https://www.creationkit.com/index.php?title=RegisterForKey_-_Form Нужен СКСЕ. SKSE поставил. К какому объекту привязывать скрипт?
Azazellz Опубликовано 27 сентября, 2018 Опубликовано 27 сентября, 2018 27.09.2018 12:37:17, BornToNight сказал(-а):SKSE поставил. К какому объекту привязывать скрипт? Это уж тебе виднее. Обычно такие штуки к квесту с алиасом игрока в нем привязываются.
werr Опубликовано 27 сентября, 2018 Опубликовано 27 сентября, 2018 27.09.2018 12:37:17, BornToNight сказал(-а):SKSE поставил. К какому объекту привязывать скрипт? К квесту. Последняя вкладка (Scripts). A Random Dude's Story
BornToNight Опубликовано 29 сентября, 2018 Опубликовано 29 сентября, 2018 2 дня пытался написать скрипт (о котором говорил выше). Не получилось( По ощущениям, у меня как будто не подхватываются функции SKSE. Направьте меня, пожалуйста(. Желательно ответ более обширней Scriptname A2 extends Quest GlobalVariable Property myKey Auto int hotKey = 71 int enabled Event OnInit() Debug.Notification("Started AutoCombatCam") RegisterForSingleUpdate(1) EndEvent Event OnKeyDown(Int KeyCode) If Input.IsKeyPressed(hotkey) ; Only run code when the status changes Debug.Notification("Hotkey Pressed") If enabled == 1 Debug.Notification("Turned On") RegisterForUpdate(1) Debug.Notification("Started") enabled = 0 Else ; If enabled == 0 Debug.Notification("Turned Off") UnregisterForUpdate() Debug.Notification("Killed") enabled = 1 EndIf EndIf EndEvent Event OnUpdate() Debug.Notification("EXEC") RegisterForKey(hotkey) hotkey = myKey.getValueInt() If enabled == 1 Game.GetPlayer().AddItem(Gold001, 10) EndIf RegisterForSingleUpdate(1) EndEvent Ошибки D:\Games\R.G. Mechanics\Skyrim - Legendary Edition\Data\Scripts\Source\temp\A2.psc(15,5): variable Input is undefined D:\Games\R.G. Mechanics\Skyrim - Legendary Edition\Data\Scripts\Source\temp\A2.psc(15,11): none is not a known user-defined type D:\Games\R.G. Mechanics\Skyrim - Legendary Edition\Data\Scripts\Source\temp\A2.psc(33,1): RegisterForKey is not a function or does not exist D:\Games\R.G. Mechanics\Skyrim - Legendary Edition\Data\Scripts\Source\temp\A2.psc(37,27): variable Gold001 is undefined No output generated for A2, compilation failed.
werr Опубликовано 30 сентября, 2018 Опубликовано 30 сентября, 2018 29.09.2018 15:21:00, BornToNight сказал(-а):2 дня пытался написать скрипт (о котором говорил выше). Не получилось( По ощущениям, у меня как будто не подхватываются функции SKSE. Направьте меня, пожалуйста(. Желательно ответ более обширнейЯ накидал по-быстрому рабочий шаблон с комментариями:Спойлер Scriptname A2 extends Quest Actor property PlayerREF auto MiscObject property Gold001 auto ;other properties float fTimeForExecution ;other variables ;------------STATES----------------- Auto STATE Initial Event OnInIt() RegisterKeyboard() GoToState("KeyInputState") EndEvent ENDSTATE STATE KeyInputState Event OnKeyDown(Int iKey) if iKey == 79 ;NUM1 Debug.Notification("Macros 01 is running") MacrosFunction01() elseif iKey == 80 ;NUM2 Debug.Notification("Macros 02 is running") MacrosFunction02() elseif iKey == 81 ;NUM3 Debug.Notification("Macros 03 is running") MacrosFunction03() endif GoToState("BusyRunning") EndEvent ENDSTATE STATE BusyRunning Event OnBeginState() Utility.Wait(fTimeForExecution) GoToState("KeyInputState") EndEvent ENDSTATE ;------------FUNCTIONS----------------- Function RegisterKeyboard() RegisterForKey(79) ;NUM1 RegisterForKey(80) ;NUM2 RegisterForKey(81) ;NUM3 endfunction Function MacrosFunction01() fTimeForExecution = 0.5 ;Give time for macros to run Int iRandomGoldAmount = Utility.GetRandomInt(10, 100) PlayerREF.AddItem(Gold001, iRandomGoldAmount) endfunction Function MacrosFunction02() fTimeForExecution = 1.0 ;Give time for macros to run ;Some stuff endfunction Function MacrosFunction03() fTimeForExecution = 1.0 ;Give time for macros to run ;Some stuff endfunction В твоем коде ошибки. Также, похоже, что SKSE неправильно установлен -- компилятор его действительно не подхватывает, судя по ошибке "(33,1): RegisterForKey is not a function or does not exist". 1 A Random Dude's Story
BornToNight Опубликовано 1 октября, 2018 Опубликовано 1 октября, 2018 (изменено) 30.09.2018 15:33:16, werr сказал(-а): Я накидал по-быстрому рабочий шаблон с комментариями: Спойлер Спасиииииииибо огромное! Очень вам благодарен. Код отличный и понятный. Удалил State между OnInit(), т.к. компилятор ругался. Изменено 1 октября, 2018 пользователем BornToNight
CISCO.:i:..:i:. Опубликовано 1 октября, 2018 Опубликовано 1 октября, 2018 Доброго времени суток. подскажите почему не работает - почему объект_3 не появляется и не исчезает. СкриптObjectReference property Object_1 auto ObjectReference property Object_2 auto ObjectReference property Object_3 auto function onLoad() if Object_1 == Enable(true) && Object_2 == Enable(true) Object_3.Enable() elseIf Object_1 == Enable(true) && Object_2 == Disable(true) Object_3.Disable() elseIf Object_1 == Disable(true) && Object_2 == Enable(true) Object_3.Disable() elseIf Object_1 == Disable(true) && Object_2 == Disable(true) Object_3.Disable() endIf endFunction
mr Jyggalag Опубликовано 1 октября, 2018 Опубликовано 1 октября, 2018 01.10.2018 13:42:55, CISCO.:i:..:i:. сказал(-а): Доброго времени суток. подскажите почему не работает - почему объект_3 не появляется и не исчезает. СкриптObjectReference property Object_1 auto ObjectReference property Object_2 auto ObjectReference property Object_3 auto function onLoad() if Object_1 == Enable(true) && Object_2 == Enable(true) Object_3.Enable() elseIf Object_1 == Enable(true) && Object_2 == Disable(true) Object_3.Disable() elseIf Object_1 == Disable(true) && Object_2 == Enable(true) Object_3.Disable() elseIf Object_1 == Disable(true) && Object_2 == Disable(true) Object_3.Disable() endIf endFunction А все остальные объекты делают то, что нужно? Попробуй использовать конструкцию IsDisabled вместо Object_1 == Disable(true)
Vitalyudin Опубликовано 1 октября, 2018 Опубликовано 1 октября, 2018 01.10.2018 13:42:55, CISCO.:i:..:i:. сказал(-а): Доброго времени суток. подскажите почему не работает - почему объект_3 не появляется и не исчезает. СкриптObjectReference property Object_1 auto ObjectReference property Object_2 auto ObjectReference property Object_3 auto function onLoad() if Object_1 == Enable(true) && Object_2 == Enable(true) Object_3.Enable() elseIf Object_1 == Enable(true) && Object_2 == Disable(true) Object_3.Disable() elseIf Object_1 == Disable(true) && Object_2 == Enable(true) Object_3.Disable() elseIf Object_1 == Disable(true) && Object_2 == Disable(true) Object_3.Disable() endIf endFunction Замени функцию на ивент. Нет события - нет срабатывания. Ну, и советом выше тоже не пренебрегай.
CISCO.:i:..:i:. Опубликовано 1 октября, 2018 Опубликовано 1 октября, 2018 (изменено) 01.10.2018 15:29:54, mr Jyggalag сказал(-а): А все остальные объекты делают то, что нужно? Попробуй использовать конструкцию IsDisabled вместо Object_1 == Disable(true) 01.10.2018 15:33:52, Vitalyudin сказал(-а): Замени функцию на ивент. Нет события - нет срабатывания. Ну, и советом выше тоже не пренебрегай. Спасибо за идеи - но ни при каком раскладе не пашет. может я не правильно пояснил изначально. Object_3 - должен менять своё положение Enable/Disable в зависимости от положения Object_2 и Object_1 (которые в свою очередь меняют своё положение Enable/Disable путём активации другого скрипта - там всё нормально работает - Object_2 и Object_1 появляются и исчезают при выполненных условиях) СкриптObjectReference property Object_1 auto ObjectReference property Object_2 auto ObjectReference property Object_3 auto Event onLoad() if (Object_1.IsEnabled()) && (Object_2.IsEnabled()) Object_3.Enable(true) elseIf (Object_1.IsEnabled()) && (Object_2.isDisabled()) Object_3.Disable(true) elseIf (Object_1.isDisabled()) && (Object_2.IsEnabled()) Object_3.Disable(true) elseIf (Object_1.isDisabled()) && (Object_2.isDisabled()) Object_3.Disable(true) endIf endEvent Изменено 1 октября, 2018 пользователем CISCO.:i:..:i:.
Vitalyudin Опубликовано 1 октября, 2018 Опубликовано 1 октября, 2018 01.10.2018 22:18:18, CISCO.:i:..:i:. сказал(-а): Спасибо за идеи - но ни при каком раскладе не пашет. СкриптObjectReference property Object_1 auto ObjectReference property Object_2 auto ObjectReference property Object_3 auto Event onLoad() if (Object_1.IsEnabled()) && (Object_2.IsEnabled()) Object_3.Enable(true) elseIf (Object_1.IsEnabled()) && (Object_2.isDisabled()) Object_3.Disable(true) elseIf (Object_1.isDisabled()) && (Object_2.IsEnabled()) Object_3.Disable(true) elseIf (Object_1.isDisabled()) && (Object_2.isDisabled()) Object_3.Disable(true) endIf endEvent Приведи скрипт полностью, на какой объект ты его крепишь?
CISCO.:i:..:i:. Опубликовано 2 октября, 2018 Опубликовано 2 октября, 2018 01.10.2018 22:44:14, Vitalyudin сказал(-а): Приведи скрипт полностью, на какой объект ты его крепишь? так это и есть весь скрипт - креплю его на сторонний активатор - который прячу под землёй.
werr Опубликовано 2 октября, 2018 Опубликовано 2 октября, 2018 01.10.2018 22:18:18, CISCO.:i:..:i:. сказал(-а):Спасибо за идеи - но ни при каком раскладе не пашет. может я не правильно пояснил изначально. Object_3 - должен менять своё положение Enable/Disable в зависимости от положения Object_2 и Object_1 (которые в свою очередь меняют своё положение Enable/Disable путём активации другого скрипта - там всё нормально работает - Object_2 и Object_1 появляются и исчезают при выполненных условиях)Зачем тебе OnLoad event?? Куда разумнее кинуть в мир Xmarker и на него скрипт с OnCellAttach ивентом. Ну это так, просто сходу "что не так". Если предположить, что ты ждешь срабатывания именно при прогулке по миру (пытаюсь угадать идею твоего кода). В таком случае флаг true в командах Enable(), Disable() теряет какой-либо смысл.Не понял, что там должно менять положение? Двигать предмет на глазах у игрока - это вообще не к Enable/Disable(). Просто не так понял, наверное.Мне кажется, ты сам не до конца понимаешь, что пытаешься сделать. Весьма вероятно, что дело не только в неработающем скрипте, но в самом предлагаемом тобой решении, оно может быть неверно. Поэтому лучше опиши задачу более ясно и подробно: что чем как активируется и при каких условиях? С картинками из редактора желательно. Тогда можно будет что-то дельное посоветовать. A Random Dude's Story
CISCO.:i:..:i:. Опубликовано 3 октября, 2018 Опубликовано 3 октября, 2018 02.10.2018 20:16:07, werr сказал(-а): Мне кажется, ты сам не до конца понимаешь, что пытаешься сделать Не совсем так - точнее совсем не так. 02.10.2018 20:16:07, werr сказал(-а):Весьма вероятно, что дело не только в неработающем скрипте, но в самом предлагаемом тобой решении, оно может быть неверно. а вот тут вы 100 % правы. Я попытаюсь объяснить чего я хочу добиться - надеюсь у меня это получится не слишком витиевато. существуют два меча Душегуб и призрачный клинок (Object_1 & Object_2) - я для них сделал нечто типа пьедестала на который эти мечи можно положить с помощью скриптаСкриптscriptName _0000_HMD_Weapon_Holder_Script extends ObjectReference ;-- Properties -------------------------------------- Bool property isPlaced = false auto hidden weapon property ClawToPlace auto {The claw we want to place} message property FailMessage auto {The message to show if the player dont have the claw in their inventory} ;-- Variables --------------------------------------- ;-- Functions --------------------------------------- function OnActivate(ObjectReference akActivator) if isPlaced == false if akActivator.getItemCount(ClawToPlace as form) >= 1 isPlaced = true self.getLinkedRef(none).enable(false) (akActivator as actor).removeItem(ClawToPlace as form, 1, false, none) else FailMessage.show(0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000) endIf else isPlaced = false self.getLinkedRef(none).disable(false) (akActivator as actor).addItem(ClawToPlace as form, 1, false) endIf endFunction ; Skipped compiler generated GetState ; Skipped compiler generated GotoState И мне нужно что бы после того как оба меча душегуб и призрачный клинок (Object_1 & Object_2) будут "положены" на пьедестал - появлялся третий меч - ранее не участвующий в процессе Меч Даэдра (Object_3) - по мимо этого мне необходимо что бы эффект был не единичным а повторялся бесконечно то есть - если убрать с пьедестала один из мечей (Object_1 или Object_2) - то и Меч Даэдра (Object_3) исчезал (Disable). Если же снова оба меча (Object_1 & Object_2) окажутся на пьедестале - то Меч Даэдра (Object_3) снова появиться. Проще говоря мне нужно что бы Меч Даэдра (Object_3) появлялся лишь тогда - когда на пьедестал будут положены два других меча (Object_1 & Object_2) Если убрать один из мечей (Object_1 или Object_2) - тогда Меч Даэдра (Object_3) должен исчезнуть и появиться лишь тогда когда оба меча будут на пьедестале. Вот собственно от этого и родился этот несуразный скрипт.СкриптObjectReference property Object_1 auto ObjectReference property Object_2 auto ObjectReference property Object_3 auto Event onLoad() if (Object_1.IsEnabled()) && (Object_2.IsEnabled()) Object_3.Enable(true) elseIf (Object_1.IsEnabled()) && (Object_2.isDisabled()) Object_3.Disable(true) elseIf (Object_1.isDisabled()) && (Object_2.IsEnabled()) Object_3.Disable(true) elseIf (Object_1.isDisabled()) && (Object_2.isDisabled()) Object_3.Disable(true) endIf endEvent
Azazellz Опубликовано 3 октября, 2018 Опубликовано 3 октября, 2018 03.10.2018 17:11:39, CISCO.:i:..:i:. сказал(-а):должен исчезнуть и появиться лишь тогда когда оба меча будут на пьедестале. По-моему мы что-то похожее тут уже обсуждали, нет? Тебе не нужен отдельный скрипт для контроля того, что оба объекта поставлены на место и существуют. Появление третьего объекта можно прописывать непосредственно в скрипте с установкой первых двух.
stanislavd Опубликовано 3 октября, 2018 Опубликовано 3 октября, 2018 что не так? Scriptname aaaaaVtoroyKvestDrevnegoProhoda extends ObjectReference int paukdeadA = 0 int paukdeadB = 0 Actor Property Pauk1 Auto Actor Property Pauk2 Auto ObjectReference Property startTrigger Auto bool isComplete = false event OnActivate (objectReference TriggerRef) if (isComplete == false) DeadPaukPatternA() DeadPaukPatternB() endif endevent function puzStart() startTrigger.Disable() endFunction function DeadPaukPatternA() if (Pauk1.isDead()) Debug.MessageBox("УПС!") paukdeadA += 1 else Debug.MessageBox("ПАУЧОК!") endif endFunction function DeadPaukPatternB() if (Pauk2.isDead()) Debug.MessageBox("УПС2!") paukdeadB += 1 else Debug.MessageBox("ПАУЧОК2!") endif endFunction нужно чтобы выдавал когда жив и когда мёртв паук, а он только когда жив пишет и всё
Azazellz Опубликовано 3 октября, 2018 Опубликовано 3 октября, 2018 Попробуй вместо обычного else использовать elseif Типа if (Pauk2.isDead()) Debug.MessageBox("УПС2!") paukdeadB += 1 elseif !(Pauk2.isDead()) Debug.MessageBox("ПАУЧОК2!") endif
CISCO.:i:..:i:. Опубликовано 3 октября, 2018 Опубликовано 3 октября, 2018 (изменено) 03.10.2018 18:35:37, Azazellz сказал(-а): По-моему мы что-то похожее тут уже обсуждали, нет? Тебе не нужен отдельный скрипт для контроля того, что оба объекта поставлены на место и существуют. Появление третьего объекта можно прописывать непосредственно в скрипте с установкой первых двух. Да я Вас услышал - и тогда а вот теперь дошло - пойду ваять. Изменено 3 октября, 2018 пользователем CISCO.:i:..:i:.
CISCO.:i:..:i:. Опубликовано 3 октября, 2018 Опубликовано 3 октября, 2018 03.10.2018 18:35:37, Azazellz сказал(-а):Появление третьего объекта можно прописывать непосредственно в скрипте с установкой первых двух. Да что бы я ещё раз тебя не послушал и пошел изобретать велосипед - да не в жизни)))) Просто скопировал то что ты писал ранее и вставил в скрипт и всё заработало. СкриптScriptname _0000_HMD_Pedestal_Karstaag_Script extends ObjectReference Bool property isPlaced = false auto hidden message property FailMessage auto weapon property ClawToPlace auto ObjectReference property Object_2 auto ObjectReference property Object_3 auto function OnActivate(ObjectReference akActivator) if isPlaced == false if akActivator.getItemCount(ClawToPlace as form) >= 1 isPlaced = true self.getLinkedRef(none).enable(false) (akActivator as actor).removeItem(ClawToPlace as form, 1, false, none) else FailMessage.show(0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000) endIf if (Object_2.IsEnabled()) Object_3.Enable(true) endIf else isPlaced = false self.getLinkedRef(none).disable(false) Object_3.disable(true) (akActivator as actor).addItem(ClawToPlace as form, 1, false) endIf endFunction
stanislavd Опубликовано 4 октября, 2018 Опубликовано 4 октября, 2018 03.10.2018 19:34:13, Azazellz сказал(-а): Попробуй вместо обычного else использовать elseif Типа if (Pauk2.isDead()) Debug.MessageBox("УПС2!") paukdeadB += 1 elseif !(Pauk2.isDead()) Debug.MessageBox("ПАУЧОК2!") endif не получается... не хочет он видеть смерть нпс((
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти