Перейти к содержимому


Фотография

Вопросы по скриптам

papyrus help скрипты вопросы

  • Авторизуйтесь для ответа в теме

#521 Ссылка на это сообщение Potatoider

Potatoider
  • Знаменитый оратор


  • 4 348 сообщений
  •    

Отправлено

Тема для вопросов по скриптингу.

Функции папируса:

На английском

На русском (не все, но базис)



 




  • Авторизуйтесь для ответа в теме
Сообщений в теме: 804

#522 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено

Невидимый "взрыв" с большим радиусом и скриптовой командой StopCombat, например.

Изменить AV Aggression.

Добавить игрока во фракцию союзника этих врагов.

Юзнуть такой же невидимый спелл Pacify (успокоение), как в первом пункте.

Много вариантов.

Вот было бы совсем хорошо если бы я ещё чего понял из этого. Всё что получилось это вот

тык

 

 

Но мне это не подходит - у меня там 34 рыбы убийцы и даже если их всех указать в Property типа Actor_1, Actor_2, Actor_3, и т.д. - не факт что сработает. Подскажи чего прописать в Property или же что написать перед StopCombat() что бы Главный герой пропал с радаров рыб и они у него не отображались как враги - но только на время пока они его вновь не заметят.



#523 Ссылка на это сообщение Azazellz

Azazellz
  • Тактик
  • 1 876 сообщений
  •    

Отправлено

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

На вход в триггер ставишь команду на каст спелла. Делаешь сам спелл - с огромным рейнджем, но без внешних визуальных эффектов. Посмотри, как спеллы типа Pacify сделаны (успокоение, гармония, дружба с животными...).

Длительность небольшую поставь, секунд 5. Должно хватить.

Дополнительно в эффект спелла можно еще скрипт с тем самым StopCombat прописать на ивенте OnEffectStart.



#524 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено

Спасибо Azazellz! - как я и подозревал - без эффектов и заклинаний не обойтись - а жаль. Придётся делать.



#525 Ссылка на это сообщение Azazellz

Azazellz
  • Тактик
  • 1 876 сообщений
  •    

Отправлено

Не, ну без баффов тоже можно, но это имхо самый простой способ.

Когда тебе нужно "собрать" много актеров и сделать с ними чего-нибудь - спелл это самый рабочий метод.

Но можно запилить квест с n алиасов в нем, которые будут автозаполняться твоими рыбами (по кондишнам), и уже на эти алиасы StopCombat скриптом выдать.

Можно непосредственно скриптом через проперти рыб, массив или через формлист что-то сделать.

Вариантов то масса.


Сообщение отредактировал Azazellz: 12 апреля 2019 - 11:44


#526 Ссылка на это сообщение Haxop

Haxop
  • Скиталец
  • 37 сообщений
  •  

Отправлено

Всех с Пасхой. Никто не знает, как в скрипте можно сделать проверку на то, убегает ли НПС? IsFleeing не работает в папирусе, а akTarget.GetCurrentPackage() == FleeForm - не дает нужной реакции.



#527 Ссылка на это сообщение elrian2

elrian2
  • Скиталец
  • 61 сообщений
  •    

Отправлено

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

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

 

Проверка расы цели не срабатывает, так как скрипт не видит объект 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

 

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

 

 

 

 



#528 Ссылка на это сообщение Azazellz

Azazellz
  • Тактик
  • 1 876 сообщений
  •    

Отправлено

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

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

#529 Ссылка на это сообщение elrian2

elrian2
  • Скиталец
  • 61 сообщений
  •    

Отправлено

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

 

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

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



#530 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено

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

скрипт



#531 Ссылка на это сообщение Azazellz

Azazellz
  • Тактик
  • 1 876 сообщений
  •    

Отправлено

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

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

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

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



#532 Ссылка на это сообщение Azazellz

Azazellz
  • Тактик
  • 1 876 сообщений
  •    

Отправлено

Как я понимаю нужна какая то проверка на это - но не понимаю как это прописать.

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

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

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


Сообщение отредактировал Azazellz: 06 июня 2019 - 08:37


#533 Ссылка на это сообщение I.L.Pron

I.L.Pron
  • Авантюрист
  • 157 сообщений
  •    

Отправлено

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

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

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

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

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

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



#534 Ссылка на это сообщение elrian2

elrian2
  • Скиталец
  • 61 сообщений
  •    

Отправлено

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

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

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

 

 

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

 

 

ck4.jpg - Размер: 293,52К, Загружен: 146



#535 Ссылка на это сообщение Azazellz

Azazellz
  • Тактик
  • 1 876 сообщений
  •    

Отправлено

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

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

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

 

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

Хех.



#536 Ссылка на это сообщение elrian2

elrian2
  • Скиталец
  • 61 сообщений
  •    

Отправлено

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

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

 

Хех.

 

 

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

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 работает стабильно только на ГГ, видимо придется искать обходной путь: через смену расы или подмену актера



#537 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено

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

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

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

 

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

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

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

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



#538 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено

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

 

скрипт



#539 Ссылка на это сообщение Azazellz

Azazellz
  • Тактик
  • 1 876 сообщений
  •    

Отправлено

как сюда запихнуть wait на 10 секунд
utility.wait (10.0)


#540 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено

utility.wait (10.0)

Спасибо всё гуд!



#541 Ссылка на это сообщение T1m0n

T1m0n
  • Следопыт
  • 86 сообщений
  •    

Отправлено

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







Темы с аналогичным тегами papyrus, help, скрипты, вопросы

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых