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

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

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

Доброго времени суток!

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

 

Проверка расы цели не срабатывает, так как скрипт не видит объект ElrianIorvethRace:


Scriptname ElrianIorvethShowScar extends ActiveMagicEffect  

Race Property ElrianIorvethRace Auto 

Event OnEffectStart(Actor Target, Actor Caster)

  if (Target.GetActorBase().GetRace() == ElrianIorvethRace)  
      Debug.Notification("It's Iorveth!");
  else
       Debug.Notification("Not Iorveth!");  
  endif;
endEvent    


Попробовала поэкспериментировать на ванильной расе:

Scriptname ElrianIorvethShowScar extends ActiveMagicEffect  

Race Property BretonRace auto

Event OnEffectStart(Actor Target, Actor Caster)
  Debug.Notification(BretonRace);
  Debug.Notification(Target.GetActorBase().GetRace());
endEvent    

На экран выводится: 

None

[Race

 

Помогите, пожалуйста, не могу понять, что я делаю не так

 

 

 

 

Опубликовано
05.06.2019 18:47:15, elrian2 сказал(-а):

Помогите, пожалуйста, не могу понять, что я делаю не так

Зачем тебе ActorBase?
GetRace работает на актере напрямую.
Т.е. просто Target.GetRace()
Опубликовано
05.06.2019 20:12:49, Azazellz сказал(-а):

Зачем тебе ActorBase?
GetRace работает на актере напрямую.
Т.е. просто Target.GetRace()

 

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

Debug.Notification(BretonRace) - выводит None;

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

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

скрипт
ObjectReference Property Drawbridge Auto

Event OnTriggerEnter(ObjectReference akActionRef)

if akActionRef == game.GetPlayer() as ObjectReference
Drawbridge.PlayGamebryoAnimation("Backward", TRUE)

endIf
endEvent

Event OnTriggerLeave(ObjectReference akActionRef)

if akActionRef == game.GetPlayer() as ObjectReference
Drawbridge.PlayGamebryoAnimation("Forward", TRUE)

endIf
endEvent
Опубликовано
05.06.2019 20:21:21, elrian2 сказал(-а):

Debug.Notification(BretonRace) - выводит None

Потому что ошибка в том, что ты в нотификейшн посылаешь.

Debug.Notification("Target Rase is: " + Target.GetRace())

Вот так должно сработать.

Опубликовано (изменено)
06.06.2019 05:19:54, CISCO.:i:..:i:. сказал(-а):
Как я понимаю нужна какая то проверка на это - но не понимаю как это прописать.

Сделай "счетчик", стартующий с нуля - просто int-переменную.

Каждый раз, как кто-то заходит в триггер - прибавляй к ней 1.

Каждый раз, как кто-то выходит - отнимай 1. В этом же ивенте выхода делай проверку этой переменной. Как опять будет ноль (все вошедшие - вышли) - делай свой код.

Изменено пользователем Azazellz
Опубликовано
06.06.2019 07:36:57, Azazellz сказал(-а):

Сделай "счетчик", стартующий с нуля - просто int-переменную.

Каждый раз, как кто-то заходит в триггер - прибавляй к ней 1.

Каждый раз, как кто-то выходит - отнимай 1. В этом же ивенте выхода делай проверку этой переменной. Как опять будет ноль (все вошедшие - вышли) - делай свой код.

Не оптимальное решение, которое может в некоторых случаях приводить к багу. К примеру, в тригер забегает злокрыс "счётчик" вырос на +1, ГГ убивает злокрыса и всё - твой скрипт повисает намертво, т.к. мёртвый злокрыс уже никогда из тригера не выберется и "счётчик" всегда будет на +1 больше.

Поэтому, во избежание подобной ситуации, перед тем как увеличивать/уменьшать счётчик, надо проверять принадлежность зашедшего в тригер к фракции героя. Хотя и это тоже не оптимальный вариант, т.к. если завяжется бой у моста, ГГ вполне может призвать какое-нибудь существо, которое зайдёт в тригер и там сдохнет/анигилирует, увеличив при это счётчик на единицу, т.к. принадлежит фракции ГГ.

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

Опубликовано
06.06.2019 07:27:19, Azazellz сказал(-а):

Потому что ошибка в том, что ты в нотификейшн посылаешь.

Debug.Notification("Target Rase is: " + Target.GetRace())

Вот так должно сработать.

 

 

Решила проблему: забыла в Creation Kit сделать инициализацию  объявленных в скрипте properties.

 

 

ck4.jpg

Опубликовано
06.06.2019 14:18:47, I.L.Pron сказал(-а):
Поэтому, во избежание подобной ситуации, перед тем как увеличивать/уменьшать счётчик, надо проверять принадлежность зашедшего в тригер к фракции героя.

Это как бы подразумевается априори. Иначе триггер будет срабатывать на все, что ни попадя.

Ну и левелдизайн тоже важен, да.

 

06.06.2019 14:35:01, elrian2 сказал(-а):
Решила проблему: забыла в Creation Kit сделать инициализацию  объявленных в скрипте properties.

Хех.

Опубликовано
06.06.2019 14:52:18, Azazellz сказал(-а):

Это как бы подразумевается априори. Иначе триггер будет срабатывать на все, что ни попадя.

Ну и левелдизайн тоже важен, да.

 

Хех.

 

 

Рабочий скрипт

Scriptname ElrianIorvethShowScar extends ActiveMagicEffect 
Race Property ElrianIorvethRace Auto
FormList Property ElrianIorvethHeadsList Auto

Event OnEffectStart(Actor Target, Actor Caster)
 
  if (target.GetRace() == ElrianIorvethRace) 
      Debug.Notification("It's Iorveth!");
      
      Target.ChangeHeadPart(ElrianIorvethHeadsList.GetAt(0)  as HeadPart);
      Target.RegenerateHead();
     
  else
       Debug.Notification("No Iorveth!"); 
  endif;
endEvent

Теперь другая проблема - изменения сохраняются только до перезагрузки игры. Но об этом и в документации указано - ChangeHeadPart работает стабильно только на ГГ, видимо придется искать обходной путь: через смену расы или подмену актера

Опубликовано
06.06.2019 07:36:57, Azazellz сказал(-а):

Сделай "счетчик", стартующий с нуля - просто int-переменную.

Каждый раз, как кто-то заходит в триггер - прибавляй к ней 1.

Каждый раз, как кто-то выходит - отнимай 1. В этом же ивенте выхода делай проверку этой переменной. Как опять будет ноль (все вошедшие - вышли) - делай свой код.

 

06.06.2019 14:18:47, I.L.Pron сказал(-а):

Не оптимальное решение, которое может в некоторых случаях приводить к багу. К примеру, в тригер забегает злокрыс "счётчик" вырос на +1, ГГ убивает злокрыса и всё - твой скрипт повисает намертво, т.к. мёртвый злокрыс уже никогда из тригера не выберется и "счётчик" всегда будет на +1 больше.

Поэтому, во избежание подобной ситуации, перед тем как увеличивать/уменьшать счётчик, надо проверять принадлежность зашедшего в тригер к фракции героя. Хотя и это тоже не оптимальный вариант, т.к. если завяжется бой у моста, ГГ вполне может призвать какое-нибудь существо, которое зайдёт в тригер и там сдохнет/анигилирует, увеличив при это счётчик на единицу, т.к. принадлежит фракции ГГ.

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

В общем как я понял без кучи проверок не обойтись? А жаль - сам я это не осилю (мозгов маловато) - придётся делать топорным методом - установлю задержку секунд на 10 думаю все спутники успеют за это время перебраться. Я то думал что можно это прописать как то просто - а фиг там!( В любом случае спасибо!

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

Сам не справился - кто подскажет как сюда запихнуть wait на 10 секунд - Drawbridge.PlayGamebryoAnimation("Forward", TRUE) 

 

скрипт
ObjectReference Property Drawbridge Auto

Event OnTriggerEnter(ObjectReference akActionRef)

if akActionRef == game.GetPlayer() as ObjectReference
Drawbridge.PlayGamebryoAnimation("Backward", TRUE)

endIf
endEvent

Event OnTriggerLeave(ObjectReference akActionRef)

if akActionRef == game.GetPlayer() as ObjectReference
Drawbridge.PlayGamebryoAnimation("Forward", TRUE)

endIf
endEvent
  • 3 недели спустя...
Опубликовано

Решил поизучать скрипты и столкнулся с такой проблемой. PapyrusAssembler не хочет компилировать скрипты. Причём если взять скомпилированный скрипт, декомпилировать в *.pas и снова скомпилировать, то проблем нет. А если пытаться скомпилировать *.psc, выдаёт ошибку "Cannot open store for class "...имя скрипта...", missing file?". Пробовал как в creationkit, так и батником на скриптах из разных модов. 

Опубликовано (изменено)
30.06.2019 10:33:04, T1m0n сказал(-а):

Решил поизучать скрипты и столкнулся с такой проблемой. PapyrusAssembler не хочет компилировать скрипты. Причём если взять скомпилированный скрипт, декомпилировать в *.pas и снова скомпилировать, то проблем нет. А если пытаться скомпилировать *.psc, выдаёт ошибку "Cannot open store for class "...имя скрипта...", missing file?". Пробовал как в creationkit, так и батником на скриптах из разных модов. 

Сам скрипт было бы неплохо еще показать.

Телепаты все в отпуске, считать напрямую некому.

Изменено пользователем Azazellz
Опубликовано
30.06.2019 10:33:04, T1m0n сказал(-а):

Решил поизучать скрипты и столкнулся с такой проблемой. PapyrusAssembler не хочет компилировать скрипты. Причём если взять скомпилированный скрипт, декомпилировать в *.pas и снова скомпилировать, то проблем нет. А если пытаться скомпилировать *.psc, выдаёт ошибку "Cannot open store for class "...имя скрипта...", missing file?". Пробовал как в creationkit, так и батником на скриптах из разных модов. 

Тебе нужно распаковать исходники скриптов (среди них есть и базовые, в которых находятся все native-функции, что ты вызываешь в своем коде), а также файл с флагами для папируса. Все это лежит в Scripts.rar в папке Data.

  • Нравится 1
Опубликовано
30.06.2019 11:39:20, werr сказал(-а):
Тебе нужно распаковать исходники скриптов

 

30.06.2019 11:25:53, Azazellz сказал(-а):
Сам скрипт было бы неплохо еще показать.

Похоже дело было в том, что запускал CreationKit из ModOrganizer2. Сейчас попробовал напрямую запустить и всё стало нормально компилироваться. В любом случае спасибо за помощь.

Опубликовано
30.06.2019 13:07:07, T1m0n сказал(-а):
Похоже дело было в том, что запускал CreationKit из ModOrganizer2. Сейчас попробовал напрямую запустить и всё стало нормально компилироваться. В любом случае спасибо за помощь.

Да, компиллер не работает из-под МО.

Вообще из-под него моддить - фиговая идея. VFS накладывает слишком много ограничений.

Опубликовано (изменено)

Всем доброго времени суток! Подскажите как сделать заклинание воскрешающие все трупы допустим в радиусе 200 и чтоб воскресшие сражались на стороне того кто их воскресил?  

Изменено пользователем Rh4eg4n
Опубликовано
06.07.2019 18:24:59, Rh4eg4n сказал(-а):

Подскажите как сделать заклинание воскрешающие все трупы допустим в радиусе 200 и чтоб воскресшие сражались на стороне того кто их воскресил?  

А открыть и посмотреть ванильный спелл от Камня Ритуала? Как раз это самое он и делает.

 

Яхз, нафига спрашивать то, что тебе уже дано самой игрой?

  • Нравится 2
Опубликовано
06.07.2019 18:39:47, Azazellz сказал(-а):

А открыть и посмотреть ванильный спелл от Камня Ритуала? Как раз это самое он и делает.

 

Яхз, нафига спрашивать то, что тебе уже дано самой игрой?

Извините конечно, просто я не сталкивался с ним, знал бы тогда не спрашивал и спасибо Вам!)

Опубликовано
06.07.2019 18:39:47, Azazellz сказал(-а):

Яхз, нафига спрашивать то, что тебе уже дано самой игрой?

О некоторых вещах можно не догадаться, а некоторых вообще не знать.
Но да, погуглить тоже можно.
  • Нравится 1
Опубликовано
06.07.2019 18:54:00, Rh4eg4n сказал(-а):
Извините конечно, просто я не сталкивался с ним, знал бы тогда не спрашивал и спасибо Вам!)

Нууу.

Надо ж знать, что тебе игра предлагает, прежде чем ее моддить начинать =)

 

Тем более что разработчики сами тут помогают - почти все скрипты в игре имеют комментарии, например.

  • Нравится 1
Опубликовано
06.07.2019 19:12:05, Azazellz сказал(-а):

Нууу.
Надо ж знать, что тебе игра предлагает, прежде чем ее моддить начинать =)

Это была единственная причина, по которой я прошел в свое время четвертый Фоллаут.

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

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

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

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

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

Войти

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

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

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