Перейти к содержанию

Рекомендуемые сообщения

  • Ответов 840
  • Создана
  • Последний ответ

Топ авторов темы

Опубликовано
26.09.2018 20:14:25, stanislavd сказал(-а):
как правильно написать условие определения умер ли нпс?

GetDead - это получение инфы о статусе "мёртв" актёра, ты её типа получаешь, но ничего дальше не делаешь. В твой пример больше подойдёт IsDead.

Опубликовано (изменено)
26.09.2018 22:36:07, Vitalyudin сказал(-а):

GetDead - это получение инфы о статусе "мёртв" актёра, ты её типа получаешь, но ничего дальше не делаешь. В твой пример больше подойдёт IsDead.

мне и нужно получить статус, чтобы потом воскресить...

будут ещё строчки wait и воскрешение.. (кстати какой оператор это делает??? но мне нужно, чтобы не на том месте где его грохнули, а на том где он первый раз появился, т.е. стоит маркер)

и ещё одно: можно ли менять уровень сложности нпс командой?

Изменено пользователем stanislavd
Опубликовано

Здравствуйте. Рылся в интернете весь, установил Creation Kit, посмотрел пару уроков. Информации очень много и почти вся она мне не подходит. Собственно сам вопрос, мне нужно вызывать определённый скрипт на нажатию клавиши. Т.е., например я нажимаю NumPad1 и около меня спавнится какой-нибудь монстр. Думаю, сам скрипт я смогу написать, вопрос в том, как играя вызывать скрипт нажатием клавиши.

Опубликовано
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

 

Нужен СКСЕ.

Опубликовано
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 поставил. К какому объекту привязывать скрипт?

Опубликовано
27.09.2018 12:37:17, BornToNight сказал(-а):
SKSE поставил. К какому объекту привязывать скрипт?

Это уж тебе виднее.

 

Обычно такие штуки к квесту с алиасом игрока в нем привязываются.

Опубликовано

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.
Опубликовано
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
Опубликовано (изменено)
30.09.2018 15:33:16, werr сказал(-а):

Я накидал по-быстрому рабочий шаблон с комментариями:

Спойлер

Спасиииииииибо огромное! Очень вам благодарен. Код отличный и понятный. Удалил State между OnInit(), т.к. компилятор ругался.

Изменено пользователем BornToNight
Опубликовано

Доброго времени суток. подскажите почему не работает - почему объект_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
Опубликовано
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)

Опубликовано
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

Замени функцию на ивент. Нет события - нет срабатывания.

Ну, и советом выше тоже не пренебрегай.

Опубликовано (изменено)
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
Изменено пользователем CISCO.:i:..:i:.
Опубликовано
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

Приведи скрипт полностью, на какой объект ты его крепишь?

Опубликовано
01.10.2018 22:44:14, Vitalyudin сказал(-а):

Приведи скрипт полностью, на какой объект ты его крепишь?

так это и есть весь скрипт - креплю его на сторонний активатор - который прячу под землёй.

Опубликовано
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(). Просто не так понял, наверное.

Мне кажется, ты сам не до конца понимаешь, что пытаешься сделать. Весьма вероятно, что дело не только в неработающем скрипте, но в самом предлагаемом тобой решении, оно может быть неверно. Поэтому лучше опиши задачу более ясно и подробно: что чем как активируется и при каких условиях? С картинками из редактора желательно. Тогда можно будет что-то дельное посоветовать.
Опубликовано
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

Опубликовано
03.10.2018 17:11:39, CISCO.:i:..:i:. сказал(-а):
должен исчезнуть и появиться лишь тогда когда оба меча будут на пьедестале.

По-моему мы что-то похожее тут уже обсуждали, нет?

Тебе не нужен отдельный скрипт для контроля того, что оба объекта поставлены на место и существуют.

Появление третьего объекта можно прописывать непосредственно в скрипте с установкой первых двух.

Опубликовано

что не так?

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

нужно чтобы выдавал когда жив и когда мёртв паук, а он только когда жив пишет и всё

Опубликовано (изменено)
03.10.2018 18:35:37, Azazellz сказал(-а):

По-моему мы что-то похожее тут уже обсуждали, нет?

Тебе не нужен отдельный скрипт для контроля того, что оба объекта поставлены на место и существуют.

Появление третьего объекта можно прописывать непосредственно в скрипте с установкой первых двух.

Да я Вас услышал - и тогда а вот теперь дошло - пойду ваять.

Изменено пользователем CISCO.:i:..:i:.
Опубликовано
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
Опубликовано
03.10.2018 19:34:13, Azazellz сказал(-а):

 

Попробуй вместо обычного else использовать elseif

Типа

if (Pauk2.isDead()) 
			Debug.MessageBox("УПС2!")
			paukdeadB += 1
elseif !(Pauk2.isDead()) 
			Debug.MessageBox("ПАУЧОК2!")
endif

не получается... не хочет он видеть смерть нпс((  

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×
×
  • Создать...