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

Тонкости скриптов


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

Есть возможность подсказать, на какую функцию MWSE смотреть? :/

Вот сюды?

Насколько я понимаю, скрипты MWSE можно сохранять прямо в стандартный раздел TES CS "Редактировать скрипты"?

Т.е. оставить скрипт на контейнере неизменным, а отредактировать только тот скрипт, который отвечает за предметы, которые должны оказаться в этом контейнере?

 

Да, это похоже на правду. Но я рекомендую делать это через Lua, ибо старый MWSE-функционал - неудобные костыли.

 

Вот эта функция разместит под ногами игрока мешок с id sack_id и перенесет в него все предметы из инвентаря. Сам мешок нужно предварительно создать в КС.

local function transferItems
	local cell = tes3.getPlayerCell()
	local sack = tes3.createReference{object="sack_id", position=tes3.player.position, orientation=tes3.player.orientation, cell=cell}
	for _, stack in pairs(tes3.player.inventory) do
		tes3.transferItem{from=tes3.player, to=sack, item=stack.object, count=stack.count, playSound=true}
	end
end

Остается только зарегистрировать функцию на нажатие какой-нибудь клавиши, в данном случае на backspace:

 

local function initialized(e)
    event.register("keyUp", transferItems, { filter = tes3.scanCode.backspace } )
end

event.register("initialized", initialized)

 

 

 

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Изображения в теме

А этот скрипт перенесет вещи только из инвентаря или надетые тоже? А, все, разобрался. Только то, что не надето.

Изменено пользователем Муурн Шепард
Ссылка на комментарий
Поделиться на другие сайты

Для истории.

Вот с таким LUA-скриптом и предварительно созданным контейнером sack_id весь инвентарь персонажа (кроме денег) перемещается в этот самый sack_id:

local function transferItems(e)
    local cell = tes3.getPlayerCell()
    local sack = tes3.createReference{object="sack_id", position=tes3.player.position, orientation=tes3.player.orientation, cell=cell}
    for _, stack in pairs(tes3.player.object.inventory) do
        tes3.transferItem{from=tes3.player, to=sack, item=stack.object, count=stack.count, playSound=true}
    end
end

local function initialized(e)
    event.register("keyUp", transferItems, { filter = tes3.scanCode.backspace } )
end

event.register("initialized", initialized)
Изменено пользователем -=ChieF=-
Ссылка на комментарий
Поделиться на другие сайты

  • 3 месяца спустя...

Как сделать оружие, наносящее повышенный урон определённым существам? Как научить скрипт отличить одно существо от другого, в какую сторону копать?

Изменено пользователем РЕДМЕНЪ
Ссылка на комментарий
Поделиться на другие сайты

Либо использовать расширенные скрипты или вешать скрипты на нужные существа.

Если скрипт висит на крысе, то он должен обрабатывать действия для крысы.

Изменено пользователем olol
Ссылка на комментарий
Поделиться на другие сайты

А насколько безопасно (для игры) вешать скрипты на существ? Я глянул - вроде на тех, кого хочется "обидеть", скрипты не висят; т.е. такой вариант можно попробовать.

Ссылка на комментарий
Поделиться на другие сайты

Если в скрипте нет ошибок, то может быть только конфликт с другим модом добавляющим к ним скрипты.

Больших проблем я не вижу.

Ссылка на комментарий
Поделиться на другие сайты

может быть только конфликт с другим модом добавляющим к ним скрипты

Вот в этом и закавыка.

Хорошо, спасибо, буду искать способы.

 

Ссылка на комментарий
Поделиться на другие сайты

Как сделать оружие, наносящее повышенный урон определённым существам? Как научить скрипт отличить одно существо от другого, в какую сторону копать?

Повесить на оружие скрипт, отслеживающий его в руках. Повесить на существо скрипт, наносящий допурон при получении урона.

Ссылка на комментарий
Поделиться на другие сайты

Вот были у меня развешаны на оригинальные двери такие скрипты, и всё вроде работало нормально. А тут вот добавил ещё квартиру, и в оригинальном муравьинде дверь не исчезает при получении журнальной записи, а в ОпенМВ всё норм. Мож совет какой дадите...

Begin AOV_C1

short doonce

if ( doonce == 1 )
Return
endif

if ( GetJournalIndex AOV_Elmussa < 100 )
if ( GetDisabled == 1 )
Enable
Return
endif
endif

if ( GetJournalIndex AOV_Elmussa >= 100 )
if ( GetDisabled == 0 )
Disable
set doonce to 1
Return
endif
endif

End

 

Ссылка на комментарий
Поделиться на другие сайты

Вот были у меня развешаны на оригинальные двери такие скрипты, и всё вроде работало нормально. А тут вот добавил ещё квартиру, и в оригинальном муравьинде дверь не исчезает при получении журнальной записи, а в ОпенМВ всё норм. Мож совет какой дадите...

 

Begin AOV_C1

short doonce

if ( doonce == 1 )

Return

endif

if ( GetJournalIndex AOV_Elmussa < 100 )

if ( GetDisabled == 1 )

Enable

Return

endif

endif

if ( GetJournalIndex AOV_Elmussa >= 100 )

if ( GetDisabled == 0 )

Disable

set doonce to 1

Return

endif

endif

End

 

Переменную зря завел

 

if ( GetJournalIndex AOV_Elmussa >= 100 )

Disable

Endif

 

Вот и весь скрипт.

Ссылка на комментарий
Поделиться на другие сайты

Переменную зря завел

 

if ( GetJournalIndex AOV_Elmussa >= 100 )

Disable

Endif

 

Вот и весь скрипт.

Вообще я подозревал, но ленился разобраться.

Спасибо! Пошёл сушить скрипты и вообще переписывать плагин.

Ссылка на комментарий
Поделиться на другие сайты

Begin AOV_C1

if ( GetJournalIndex AOV_Elmussa >= 100 )
if ( GetDisabled == 0 )
Disable
Return
endif
endif

End

Правильней будет так, чтобы не вызывать команду Disable каждый фрейм, когда объект уже отключен.

 

Ссылка на комментарий
Поделиться на другие сайты

??

Getdisabled тоже команда.

Исходя из того, что во всех скриптах, написанных разработчиками, применяется такой подход, я смею предположить, что команда GetDisabled занимает меньше времени, чем команда Disable.

Изменено пользователем Муурн Шепард
Ссылка на комментарий
Поделиться на другие сайты

Исходя из того, что во всех скриптах, написанных разработчиками, применяется такой подход, я смею предположить, что команда GetDisabled занимает меньше времени, чем команда Disable.

Разработчики из Беседки пишут как угодно.

Изменено пользователем Larkin
Ссылка на комментарий
Поделиться на другие сайты

??

Getdisabled тоже команда.

Смысл, как я понимаю, в том, чтобы не удалять бесконечно УЖЕ удалённый объект. Должно быть одноразовое условие, и Getdisabled как раз и есть одно из них.

 

Дополнительно: Disable делает объект невидимым, но не удаляет его из игры, и все скрипты, повешенные на данный объект, продолжают исполняться. Таковых объектов могут быть десятки/сотни и все вместе они отнимают ресурсы игры. Следовательно, если объект не предполагается использовать далее, для полного удаления желательно использовать SetDelete 1.

 

 

==========

Поэкспериментировал с оружием, наносящим доп. урон.

 

Повесить на оружие скрипт, отслеживающий его в руках. Повесить на существо скрипт, наносящий допурон при получении урона.

Это можно сделать одним скриптом, а не двумя.

HitOnMe отлично справляется с задачей. При попытке атаковать существо определённым оружием включается флаг, позволяющий "сделать что-то необычное", в т.ч. нанести доп.урон.

 

Поскольку для отнятия здоровья неважно, будет урон физический или магический, я пока сделал добавление проклятия с последующим удалением через 1 сек.

(в сжатом виде):

 

short keeningHit ; объявление переменной обязательно

 

If ( status == 0 )

Set keeningHit to HitOnMe Keening

Set status to 1

endif

 

If ( status == 1 )

if ( "ID существа"->HitOnMe, "ID уникального оружия" )

"ID существа"->AddSpell "ID заклинания"

Set status to 2

endif

endif

 

Скрипт вещается на любое живое существо (не пробовал вешать на активаторы, но по идее, должно работать; например, ударил молотом по скале - скала разлетелась вдребезги и расчистила проход). Это полностью рабочий вариант: при ударе оружием существо получает доп. урон магией на 1 с. При следующем ударе всё повторяется.

Если не удалять проклятие, оно будет висеть на существе до конца боя. Если оружием ударить другое существо, ничего не будет.

 

Но что касается доп. физического урона, я опять затупил.

Вроде как я понимаю, что оно должно выглядеть примерно как "set Damage to Damage + 10" ; но... как переменная/функция пишется в Морре? Как шифруется физ. урон? - пока не могу найти, туплю.

 

 

==========

Вариант с HitOnMe полностью рабочий, но меня немножко смущает, что скрипт вешается на существо и, следовательно, затрагивает все копии. Если кто-то напишет на существо другой скрипт, конфликт неизбежен.

 

Можно ли скрипт повесить на оружие (чтобы избежать конфликтов)? Экспериментирую.

Рабочий вариант сжато выглядит прим. так:

 

If ( status == 0 )

if ( OnPCEquip == 1 )      ; чтобы работало только когда оружие экипировано; если оружие в инвентаре, работать не будет

Set status to 1

endif

endif

 

If ( status == 1 )

If ( Player->GetTarget "ID существа" == 1 )

"ID существа"->AddSpell "ID заклинания"

Set status to 2

endif

endif

 

Скрипт вешается на оружие. GetTarget как раз работает только на определённом существе. Если этим оружием ударить другое существо, ничего не будет.

Недостаток (серьёзный, на мой взгляд) этого варианта в том, что проклятие будет висеть до конца боя. Можно один раз ударить существо и потом бегать от него кругами, пока оно не умрёт. Отнять проклятие не получится. Скорее всего то же самое будет с физ. уроном.

Следовательно, надо искать другие условия; например, отслеживать один-единственный удар. Но как? - я пока не нашёл.

Предположительно, будет работать отслеживание по звуку удара (-?), но не могу найти, какие звуки прикручены к разным типам оружия.

 

Кто-нибудь подскажет?

Изменено пользователем РЕДМЕНЪ
Ссылка на комментарий
Поделиться на другие сайты

Скрипт вешается на оружие. GetTarget как раз работает только на определённом существе. Если этим оружием ударить другое существо, ничего не будет.

Недостаток (серьёзный, на мой взгляд) этого варианта в том, что проклятие будет висеть до конца боя. Можно один раз ударить существо и потом бегать от него кругами, пока оно не умрёт. Отнять проклятие не получится. Скорее всего то же самое будет с физ. уроном.

Следовательно, надо искать другие условия; например, отслеживать один-единственный удар. Но как? - я пока не нашёл.

А может, проще не скриптовать на существе дополнительный урон, а баффать атаку игрока?
Ссылка на комментарий
Поделиться на другие сайты

Смысл, как я понимаю, в том, чтобы не удалять бесконечно УЖЕ удалённый объект. Должно быть одноразовое условие, и Getdisabled как раз и есть одно из них.

 

Дополнительно: Disable делает объект невидимым, но не удаляет его из игры, и все скрипты, повешенные на данный объект, продолжают исполняться. Таковых объектов могут быть десятки/сотни и все вместе они отнимают ресурсы игры. Следовательно, если объект не предполагается использовать далее, для полного удаления желательно использовать SetDelete 1.

 

 

==========

Поэкспериментировал с оружием, наносящим доп. урон.

 

 

Это можно сделать одним скриптом, а не двумя.HitOnMe отлично справляется с задачей. При попытке атаковать существо определённым оружием включается флаг, позволяющий "сделать что-то необычное", в т.ч. нанести доп.урон.

 

Поскольку для отнятия здоровья неважно, будет урон физический или магический, я пока сделал добавление проклятия с последующим удалением через 1 сек.

(в сжатом виде):

short keeningHit ; объявление переменной обязательно

If ( status == 0 )

Set keeningHit to HitOnMe Keening

Set status to 1

endif

If ( status == 1 )

if ( "ID существа"->HitOnMe, "ID уникального оружия" )

"ID существа"->AddSpell "ID заклинания"

Set status to 2

endif

endif

Скрипт вещается на любое живое существо (не пробовал вешать на активаторы, но по идее, должно работать; например, ударил молотом по скале - скала разлетелась вдребезги и расчистила проход). Это полностью рабочий вариант: при ударе оружием существо получает доп. урон магией на 1 с. При следующем ударе всё повторяется.

Если не удалять проклятие, оно будет висеть на существе до конца боя. Если оружием ударить другое существо, ничего не будет.

Но что касается доп. физического урона, я опять затупил.

Вроде как я понимаю, что оно должно выглядеть примерно как "set Damage to Damage + 10" ; но... как переменная/функция пишется в Морре? Как шифруется физ. урон? - пока не могу найти, туплю.

 

 

==========

Вариант с HitOnMe полностью рабочий, но меня немножко смущает, что скрипт вешается на существо и, следовательно, затрагивает все копии. Если кто-то напишет на существо другой скрипт, конфликт неизбежен.

Можно ли скрипт повесить на оружие (чтобы избежать конфликтов)? Экспериментирую.

Рабочий вариант сжато выглядит прим. так:

If ( status == 0 )

if ( OnPCEquip == 1 )      ; чтобы работало только когда оружие экипировано; если оружие в инвентаре, работать не будет

Set status to 1

endif

endif

If ( status == 1 )

If ( Player->GetTarget "ID существа" == 1 )

"ID существа"->AddSpell "ID заклинания"

Set status to 2

endif

endif

Скрипт вешается на оружие. GetTarget как раз работает только на определённом существе. Если этим оружием ударить другое существо, ничего не будет.

Недостаток (серьёзный, на мой взгляд) этого варианта в том, что проклятие будет висеть до конца боя. Можно один раз ударить существо и потом бегать от него кругами, пока оно не умрёт. Отнять проклятие не получится. Скорее всего то же самое будет с физ. уроном.

Следовательно, надо искать другие условия; например, отслеживать один-единственный удар. Но как? - я пока не нашёл.

Предположительно, будет работать отслеживание по звуку удара (-?), но не могу найти, какие звуки прикручены к разным типам оружия.

Кто-нибудь подскажет?

Disable скрывает объект. Беседка спокойно вызывает disable в каждом кадре, что говорит о том, что там есть защита от скрывания уже скрытого объекта. Это вообще не то о чем нужно париться.

===

У второго варианта еще недостаток, что нельзя обратится к другой копии существа. Ну собственно решение есть как для первого варианта так и для вторго, главные вопросы это у тебя несколько копий существ? Скрипт точно неохота вешать на них? Почему бы не создать копию существ и уже на них повешать скрипт?

Ссылка на комментарий
Поделиться на другие сайты

Disable скрывает объект. Беседка спокойно вызывает disable в каждом кадре, что говорит о том, что там есть защита от скрывания уже скрытого объекта. Это вообще не то о чем нужно париться.

Да я незнай, у меня ход мыслей простой: раз учебники рекомендуют Getdisabled/SetDelete, то я делаю.

 

 

==========

У второго варианта еще недостаток, что нельзя обратится к другой копии существа. Ну собственно решение есть как для первого варианта так и для второго, главные вопросы это у тебя несколько копий существ? Скрипт точно неохота вешать на них? Почему бы не создать копию существ и уже на них повешать скрипт?

Это должны быть дефолтные существа (их несколько копий, тех же крыс 137), а не новый уникальный монстр. Не очень хочется изменять дефолтных существ, поэтому пробую повесить скрипт на оружие - оно в любом случае будет уникальное и конфликтовать ни с чем не будет.

 

У второго варианта еще недостаток, что нельзя обратится к другой копии существа.

 

Не совсем понял, о чём именно речь. Нельзя обратиться к другой копии? - дак это и нужно. Когда я сражаюсь с одной крысой, доп.урон должен проходить только по ней, а вторая крыса вооон на том пригорке пострадать не должна.

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

 

 

А может, проще не скриптовать на существе дополнительный урон, а баффать атаку игрока?

А я уже делал так, в обеих вариантах - это рабочие способы.

Можно увеличить атаку ГГ/повысить силу/навык, в результате физ.урон увеличится. Пусть ненамного, но увеличится. Но я  тут плохо понимаю механику; например, я повысил атаку на 20n - а на сколько именно вырос урон, в цифровом выражении? Я увеличил силу/навык на 20n - а на сколько именно вырос урон, в цифровом выражении?

Когда я вешаю доп. магический урон, я сразу вижу чёткие цифры и могу отредактировать спеллы/скрипт так, чтобы доп.урон не был бы слишком большим. В варианте "повысить атаку/силу/навык" итоговый результат мне не совсем понятен.

 

 

 

 

Ссылка на комментарий
Поделиться на другие сайты

Да я незнай, у меня ход мыслей простой: раз учебники рекомендуют Getdisabled/SetDelete, то я делаю.

 

 

==========

 

Это должны быть дефолтные существа (их несколько копий, тех же крыс 137), а не новый уникальный монстр. Не очень хочется изменять дефолтных существ, поэтому пробую повесить скрипт на оружие - оно в любом случае будет уникальное и конфликтовать ни с чем не будет.

 

 

Не совсем понял, о чём именно речь. Нельзя обратиться к другой копии? - дак это и нужно. Когда я сражаюсь с одной крысой, доп.урон должен проходить только по ней, а вторая крыса вооон на том пригорке пострадать не должна.

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

 

 

А я уже делал так, в обеих вариантах - это рабочие способы.

Можно увеличить атаку ГГ/повысить силу/навык, в результате физ.урон увеличится. Пусть ненамного, но увеличится. Но я тут плохо понимаю механику; например, я повысил атаку на 20n - а на сколько именно вырос урон, в цифровом выражении? Я увеличил силу/навык на 20n - а на сколько именно вырос урон, в цифровом выражении?

Когда я вешаю доп. магический урон, я сразу вижу чёткие цифры и могу отредактировать спеллы/скрипт так, чтобы доп.урон не был бы слишком большим. В варианте "повысить атаку/силу/навык" итоговый результат мне не совсем понятен.

 

Ну раз точно неохота вешать скрипты, то урон и спелл повешать нельзя. Ты ни как не обратишься к конкретной крысе из скрипта на оружии, ни которую бьют, ни на пригорке. Просто rat->modcutrenthealth не будет работать с несколькими объектами. Тогда нужно придумывать другое, например увеличить атаку игроку, что повлияет на вероятность атаки, или силу. Можно спавнить перед игроком невидимый объект, который магией надамажит вокруг себя.

Навык, эффект увел атаку на урон не влияют. Сила влияет на урон сложно, подробней тут:

https://youtu.be/DFDmi_z1DPM

Изменено пользователем Larkin
Ссылка на комментарий
Поделиться на другие сайты

Ну раз точно неохота вешать скрипты, то урон и спелл повешать нельзя.

Неохота вешать скрипты на дефолтных существ (только если других вариантов не будет), а на оружие/шмотки - запросто.

 

Ты ни как не обратишься к конкретной крысе из скрипта на оружии, ни которую бьют, ни на пригорке.

 

Не согласен. GetTarget именно так и работает; я же писал несколько часов назад.

 

Просто rat->modcutrenthealth не будет работать с несколькими объектами.

 

Я ещё не трогал ModCurrentHealth; в чём её преимущества перед другими способами?

И, напомню, мне не надо работать с несколькими копиями зараз. Или я, или ты чего-то недопонимаем. Или оба сразу :-).

За видео спасибо, а... в письменном виде есть где почитать?

Ссылка на комментарий
Поделиться на другие сайты

 

 

Не согласен. GetTarget именно так и работает; я же писал [url=https://www.fullrest.ru/forum/topic/3058-tonkosti-skriptov/

Вот ты спорщик а. Расскажешь потом, что вышло.

 

Где то есть письменный вид, на тиаруме скорей всего.

Ссылка на комментарий
Поделиться на другие сайты

Джентльмеры, подскажите. Реально ли заблокировать действие на игрока одного конкретного магического эффекта? Например, восстановления магии. Пьёт игрок зелье пополнения маны - ничего не происходит. Пьёт другое - снова ничего. Кастует амулетом - тоже ничего. Остальные эффекты действуют как положено.

Ссылка на комментарий
Поделиться на другие сайты

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

Вы сможете оставить комментарий после входа в



Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...