Вверх Вниз


Модератор форума: Kris†a™, Multigone  
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Вопросы по скриптам Papyrus
sansuli  Offline Сообщение №1 написано: 31 Августа 2012 в 17:29 | Отредактировано: Multigone - Четверг, 23 Апреля 2020, 17:24


The Red Sun


193
Уроки по скриптованию на языке Papyrus
Прежде чем задать вопрос просмотрите вышеуказанные уроки.
ok


Тема регламентирована.


• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней.
• Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней.
• При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС.
• При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "
+" полезного сообщения.

Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Dsion  Offline Сообщение №2821 написано: 01 Февраля 2020 в 21:39



1279
Чо-то ты тупишь. Проверь вот так:

Код
string TempName=selfactor.GetDisplayName()
string TempName2=selfactor.GetDisplayName()
debug.notification("имя нпс: " + TempName)
if TempName == TempName2
    debug.notification("Проверка что бандит - успешна")
endif

myav  Offline Сообщение №2822 написано: 01 Февраля 2020 в 21:51 | Отредактировано: myav - Суббота, 01 Февраля 2020, 21:57


Странник


26
Dsion, это нужно проверять именно так.

Чтобы не создавать глобальных переменных, в коде идут проверки: if == "разбойник", if == "снежный троль", if == "колдун-новичек".

А если я буду сравнивать с переменными, то придется создавать List невероятных размеров, пока всё туда всунется.

Но, я раньше делал эксперименты и с другими вариантами проверки

Код
string TempName1 = selfactor.getdisplayname()
string TempName2 = "Разбойник"
if (TempName1 == TempName2)


это тоже не работает

yakor77, наличие ЧЕГО-ЛИБО лишнего у ванили, чревато перезаписыванием другими модами. А потом будет проверка, а кольцо - перезаписалось, и результат - сбой.

БЗОПАСНО, можно добавлять "кольца" и другие вещи только через "cloak". В этом случаю, нам будет до одного места, что другие моды поназаписывали.

Dsion  Offline Сообщение №2823 написано: 01 Февраля 2020 в 22:11



1279
myav, в StringUtil есть следующие функции:
1. получение длины строки
2. получение конкретной буквы по её индексу
3. получение коды буквы (цифра)

Можно проверить, какие коды (и сколько) выдаются для кириллицы. Для имени, возвращаемого по GetDisplayName и для статического имени. Если там есть какая-то разумная логика, то получится сделать функцию сравнения строк и использовать её как-то так:
string TempName = selfactor.getdisplayname()
if (strcmp(TempName, "Разбойник"))

Но, разумеется, ты этого проверять не будешь, да? Ты будешь сраться на форуме.

myav  Offline Сообщение №2824 написано: 01 Февраля 2020 в 23:26 | Отредактировано: Multigone - Вторник, 21 Апреля 2020, 23:53


Странник


26
Dsion, разбирать каждую букву на код, а потом слепить все коды в одно целое mellow , и сделать проверку на абракадабру как имя - работает.

Фух... наконец-то вопрос решился. Без 5и тысяч ActorBase в FormList.  Хоть один человек, в своих комментариях: показывал и предлагал проверять коды.

Хоть теперь бандита звут -63z-32z-19z-28z-24z-14z0,  а разбойника -48z-32z-25z-31z-18z-23z-19.  Но уже прогресс! :-Р можно чекать имя, тратя всего 20-30 символов на проверку и обойтись вообще "без" глобальных переменных.

Dsion-у - спасибо за идею, которую я развил и сработало.

yakor77  Offline Сообщение №2825 написано: 02 Февраля 2020 в 21:31 | Отредактировано: Multigone - Вторник, 21 Апреля 2020, 23:54


Странник


19

С уважением.
Маг Иридий.
Dsion  Offline Сообщение №2826 написано: 04 Февраля 2020 в 22:20



1279
По-моему, таким постам в теме не место...

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

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

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

Бывает, хороший организатор хочет создать игру. Он создает кампанию на кикстартере, пиарит проект, нанимает людей, выгрызает инвестиции. И он работает.

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

Добавлено (04 Февраля 2020, 22:39)
---------------------------------------------
А, еще мододелов забыл. Много раз слышал истории о том, как моддеры попадали в серьезный геймдев.


s1t1s  Offline Сообщение №2827 написано: 09 Февраля 2020 в 12:40 | Отредактировано: s1t1s - Воскресенье, 09 Февраля 2020, 13:03


Странник


4
Есть скрипт, который спавнит NPC после того, как пройден квест. (Например Ветреный Пик)?

Dsion  Offline Сообщение №2828 написано: 09 Февраля 2020 в 13:12



1279
s1t1s, в общем-то, можно добавить включение (или спавн) НИП в скрипт последней стадии завершаемого квеста. Но, если это ванильный квест, а не твой собственный, то лучше так не делать.

Момент завершения другого квеста особо и не поймаешь (не могу вспомнить сповобов его поймать).

Можно сделать через SM Event: Change Location Event. И там выполнять проверку завершенности другого квеста.

Ну или поэкспериментировать со скриптами на самом НИП. Если для "отключенных" (невидимых) НИП вызываются ивенты типа OnCellAttach() , то это вообще зашибись.
Когда игрок заходит в локацию с "отключенным" НИП, то на НИП вызывается OnCellAttach, выполняется проверка завершенности другого квеста и, если квест завершен, НИП "включается" и становится видимым.

Myprism  Offline Сообщение №2829 написано: 09 Февраля 2020 в 14:37


Физик


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

Dsion  Offline Сообщение №2830 написано: 10 Февраля 2020 в 22:07



1279
Истинно надежный способ предусматривал бы возможность того, что квест будет завершен командой в консоль :-P

yakor77  Offline Сообщение №2831 написано: 11 Февраля 2020 в 14:57 | Отредактировано: Multigone - Вторник, 21 Апреля 2020, 22:38


Странник


19
Цитата Dsion ()
Истинно надежный способ предусматривал бы возможность того, что квест будет завершен командой в консоль :-P

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

С уважением.
Маг Иридий.
Dsion  Offline Сообщение №2832 написано: 11 Февраля 2020 в 21:44



1279
Если чертов игрок хочет завершить ванильный квест из консоли или если он подключает наш мод уже после завершения квеста, это не должно поломать нафиг наш мод.
Кстати, кроме двух вариантов, что я уже предложил, вот еще простенький, но без костылей. Вешаем на НИП пакет с двумя ветками:
1. (если другой квест завершен) стоять там, где нужно стоять
2. (если другой квест еще не завершен) стоять в каком-то целле, в который игрок не может попасть.
Не обязательно же, чтоб НИП именно спавнился и именно в момент завершения квеста? Пусть он туда просто приходит.

myav  Offline Сообщение №2833 написано: 13 Февраля 2020 в 11:15 | Отредактировано: Multigone - Вторник, 21 Апреля 2020, 22:39


Странник


26
Вопрос: НПС хоть убей, не хочет подчинится в одному месте :)

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

Это я про анимации)))

А вот заставить НПС блочиться - ХОТЬ УБЕЙ не послушные.
Код
Debug.SendAnimationEvent(selfactor as objectreference, "blockStart")

НПС слушает эту команду, но только ЕСЛИ до игрока больше чем 2 шага дистанции. Тогда он - блочится, после этой команды.

Но вот вплотную к врагу, НПС с высоким AttackRate (combatstyle) полностью игнорят скрипт-команду блока и продолжают атачить.

Я пробовал их встряхнуть..

attackStop
staggerStop
recoilStop

чтобы после этих команд (которые отменяют атаку либо встряхивают нпс) сразу же запустить блок-команду. Но.... Даже после встряски! нпс предпочитает и запускает атаку, игнорируя скрипт-команду блока.

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

И я уже потерялся.. Что только не пробовал (сотни экспериментов). И комбатстили менял, но потом понял что в данном случаю, их трогать не нужно (нужен блок 2 секунды а не постоянный) + стиль во время боя лочится, и команды stopcombat - не помогают поменять, и читал про флаги Package - игнорировать бой, но так и не нашел, как их можно поменять, во время боя. Уже вплоть до временного отключения или ослабления АИ дошел, но тоже не то (( если отключить аи.. нпс зависает в неестественных позах, после удара.

Как заставить не начинать атаки и начать блок, вплотную к игроку?

myav  Offline Сообщение №2834 написано: 14 Февраля 2020 в 22:26 | Отредактировано: Multigone - Вторник, 21 Апреля 2020, 22:36


Странник


26
yakor77, отвечу по всем твоим пунктам:

1. В скайриме нету никакого "перехвата управления на критической дистанции". ВСЕ команды (если они вообще рабочие) - делаются, на любой дистанции. Вплотную делаются и доджи, и блоки, и атаки, что прикажешь то и СДЕЛАЕТ.

Но, прикол блока в том, что его МАЛО - просто запустить. Его нужно еще и поддерживать активным. Вот потому у меня и появилась эта проблема.

blockStart - работает и вплотную, но нету команд, которые бы заставляли его постоянно работать 2 сек. Запустился блок, и сразу же закончился и дальше => идут атаки, а для нашего глаза кажется, что блок не произошел вообще (миллисекунды его срабатывания - не замечаем).

Запускать каждых 0.1 - 0.3 сек его заново - тоже не дают постоянного эффекта (заметного для глаз). И как вариант - не годится, я это попробовал в самую первую очередь... Запустить блок 10 раз за 2 сек.

2. Отойти от противника (чтоб потом включить блок), я пытался заскриптовать еще перед новым годом (когда надо было отойти и сделать провокацию). перебрал все до единой команды, и в финале не нашел адекватного, работающего варианта.

animation - moveBackward/ startMoving - срабатывают на миллисекунду и сразу же заканчивают свое действие, на глаз это не заметно и кажется что они не работают вообще
SetDontMove - после этой команды НПС бежит на одном месте, что ломает правдоподобность и сильно бросается в глаза.
Follow / Escord команды заставляют НПС следовать, но они не могут заставить отдалиться.

Единственный "Рабочий" вариант отдалиться - сделать додж назад. Но это уворот, а не блок. Увороты я уже все заскриптовал, а сейчас нужен именно БЛОК. У меня НПС, когда у них высокий уровень контр-атаки + опытности + концентрации + ловкости: читают анимации своих противников и контр-атакуют еще до получения удара.

И по скрипту, НПС выставляет щит, чтобы заблочить летящий в него удар, и сразу же портит жизнь, серией комбо-ударов. Реакции с уворотами/отскоками, я уже заскриптовал. А сейчас нужен именно БЛОК удара. А не отскоки/кувырки/пляски.

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

3. Если НПС станет дружественным, это ничего не поменяет. Во время боя - игнорируется, друга ты валишь или врага. Если бой УЖЕ начался, НПС будет бить и друга. А если отменить бой, то НПС спрячет оружие, а без оружия в руке: все команды на атаки оружием - игнорируются.

4. Если НПС не будет видеть игрока, эта команда в скайриме называется LOS, он перейдет в режим "поиск пропавшего врага". Команда блока - запускается, но сразу же заканчивается, так как нету CombatTarget в поле обзора, чтобы держать перед ним блок. Кроме того, даже за секунду (не видения врага) НПС может развернуться боком или спиной к тебе, и пойти "искать".

5. какой смысл абсолютной брони? Я когда тестирую скрипты, ставлю вообще tgm (god mode) где ничто тебя не пробивает. Нужно чтоб нпс именно ЗАБЛОЧИЛ удар, а потом контр-атака. А не - игнорировать его атаки.

6. совмещать 2 фигурки в одно целое а потом мерять критические дистанции? :-Р Зачем? Все и так знают дистанции доставания обычной атаки. НПС будет атаковать на расстоянии 0-220 (для атак с тагом forward - там дистанция в разы больше, но эти атаки - редко выбираются).

Multigone  Offline Сообщение №2835 написано: 15 Февраля 2020 в 00:33



631
myav, можно попробовать закинуть актера в алиас высокоприоритетного квеста, имеющий пакет с CombatStyle, в котором все атаки сведены к 0, а защита к 1. Чтобы пакет подействовал немедленно, EvaluatePackage(). Правда, неясно, как это будет выгдядеть в динамике боя.

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

Indiamagic
myav  Offline Сообщение №2836 написано: 15 Февраля 2020 в 00:36 | Отредактировано: myav - Суббота, 15 Февраля 2020, 01:32


Странник


26
Multigone,

Во время боя, CombatStyle - залочен. Если сделать ForceRef или Evaulate - то обновится всё, кроме стиля)

Кстати, EvaulatePackage даже по задумке - не затрагивает обновление инфы по бою.

StopCombat+Evaulate - тоже не помогает снять блокировку.

Я в ноябре, хотел дать нпс перепады характера, написал спелл и скрипт "надменности". Что в начале боя есть шанс что нпс тебя не воспримет всерьез, будет показывать "провокации", и не будет тебя атаковать. Но после пары пинков игрока, чтобы нпс приходил в чувства и возвращался к своему обычному стилю.

И... Получилось заставить работать всё (провокации, смена настроения после пинка, шансы на надменность), но не смена комбатстиля (( Пол месяца убил. И на нексусе много людей писало советы, перепробовали всё...

Скажу коротко результат - ты не сможешь поменять стиль во время боя. Ни через квэст, ни через  stopcombat, ни через другие методы.

Сам стиль - ПОМЕНЯЕТСЯ, GetOffensive будет показывать что цифры уже поменяны. Но именно до МОЗГОВ НПС - эти изменения не доходят, по неизвестной причине (стиль поменян, но нпс игнорит новые числа).

А ResetAI - крашит игру.

Чтобы "АИ" подхватил и начал использовать новые числа с нового комбат стиля, нужна другая команда (вместо EvaulatePackage, которое не обновляет в ИИ изменения по бою). Но, я просмотрел все команды в Actor Script и ObjectReference Script, и не нашел таковой. Вся надежда была на ResetAI, но он оказался нестабильным, либо им нужно пользоваться как-то по особенному. Программисты Скайрима быстрее всего просто забили на это дело, и решили что модерам такая команда не понадобится.

И по поводу отхода назад, если бой УЖЕ начался - актеры игнорят следование/преследование + команды на ходьбу и спринт. Точней, не игнорят а запускают их всего на миллисекунду и отменяется эффект, если есть возможность "ударить".

дописал:

через заднее место, но после миллионного моего эксперимента, блок вплотную таки заработал:

Код
Debug.SendAnimationEvent(selfactor as objectreference, "staggerStop")
SelfActor.SetAV("Confidence", 0 as Float)        
SelfActor.EvaluatePackage()
Debug.SendAnimationEvent(selfactor as objectreference, "blockStart")
Utility.Wait(0.3000000)
Debug.SendAnimationEvent(selfactor as objectreference, "blockStart")    
Utility.Wait(0.3000000)
Debug.SendAnimationEvent(selfactor as objectreference, "blockStart")    
Utility.Wait(0.3000000)
Debug.SendAnimationEvent(selfactor as objectreference, "blockStart")
Utility.Wait(0.3000000)    
SelfActor.SetAV("Confidence", 4 as Float)        
SelfActor.EvaluatePackage()

Но... Появились новые проблемы.

1. нпс пытается убежать 1 секунду. Эту проблему я решил через selfactor.SetDontMove(true). После чего, он топчется на месте, но уже не бежит и БЛОЧИТСЯ.. и более менее правдоподобно выглядит.

2. с SelfActor.SetAV("Confidence", 0 as Float)  - НПС слишком вопят СДАЮСЬ, хватит, пощады, и т.д.

Как заставить персонажа не произносить стандартные фразы, после удара?

Можно как-то прервать стандартную фразу либо заменить пустой фразой ?

Только не надо теорию, мне от нее уже ...плохо.
Кто может помочь с фрагментом КОДА, как заткнуть персонажа (чтоб он молчал после удара)?

Multigone  Offline Сообщение №2837 написано: 15 Февраля 2020 в 04:05



631
myav, кхм.


Цитата
EvaluatePackage()

Неплохо бы понимать, что это делает. А делает оно следующее: выбирает из списка всех возможных для этого актера AI-пакетов (Packages) один подходящий по условиям (первый сверху по списку либо в листе актера, либо в одном из алиасов, заполненных этим актером; алиасы сортируются по приоритету квестов) и применяет его немедленно. В твоем коде он явно не нужен.


Код
ты не сможешь поменять стиль во время боя

Вообще-то можешь, согласно проверке, делая в точности то, что и написано выше.
1) Создать новый квест c флагами Start Game Enabled, Run Once (хз, может, и без них будет работать)
2) Создать пустой алиас Specifiс Ref c флагом Optional.
3) Создать новый стиль боя (General - первые 4 ползунка на 0, за исключением Defensive = 1) (Melee - все на 0)
4) Создать пустой пакет (Type = Package, Template = none, Public Package Data - все удалить) (Combat Style = п. 3)
5) Пакет внести в алиас п. 2.
6) Код активации:
   
Код
MyCreatedAlias.ForceRefTo(MyDarlingActor)
    Utility.Wait(0.25)
    MyDarlingActor.EvaluatePackage()

Думаю, можно обойтись и SetCombatStyle(), просто проверял по старинке.
Маги все равно атакуют, но вроде бы реже.
Драугры с 2H не блокируют от слова совсем.
Как вернуть прежний стиль, расписывать не буду.

Indiamagic
s1t1s  Offline Сообщение №2838 написано: 15 Февраля 2020 в 21:08


Странник


4
Кто может написать скрипт, чтобы после окончания диалога NPC становился агрессивным?

yakor77  Offline Сообщение №2839 написано: 17 Февраля 2020 в 10:46 | Отредактировано: Multigone - Вторник, 21 Апреля 2020, 22:31


Странник


19
Цитата s1t1s ()
Кто может написать скрипт, чтобы после окончания диалога NPC становился агрессивным?
- коллега, а зачем его писать, он уже есть! В ванильной версии есть диалоги, например, о кабацкой дуэли на кулачках, или тренинги по обучению владению холодным оружием. Обычный условный оператор. Если договор заключен, то противники начинают драться. Драка прекращается так же при выполнении заявленного условия.

С уважением.
Маг Иридий.
myav  Offline Сообщение №2840 написано: 18 Февраля 2020 в 17:17 | Отредактировано: myav - Вторник, 18 Февраля 2020, 17:20


Странник


26
Multigone, сегодня на нексусе предложили потестить тоже один вариант "как заставить блочиться" - менять Package, где сделать combat override и поставить useweapon - shield.

Раз пришлось лезть в RefAllias и Packages, я заодно потестил и твой метод (что можно поменять комбат стиль через package).

Твой метод сработал ТОЛЬКО ТОГДА когда скрипт срабатывает ВНЕ боя (нпс - спокоен). Во время боя, как я и говорил - комбатстиль залочен и ему наплевать на всё, включая package. И сегодня тестирование повторилось еще раз.

Да что за жопа с этим блокированием.... Заставить говнюка 2 секунды подержать блок ===> самая большая проблема, которую я только встречал в модинге скайрима :-Р

Multigone  Offline Сообщение №2841 написано: 20 Февраля 2020 в 03:54



631
myav,


Indiamagic
myav  Offline Сообщение №2842 написано: 21 Февраля 2020 в 13:36 | Отредактировано: myav - Пятница, 21 Февраля 2020, 16:45


Странник


26
Multigone, очень плохой пример...

1. родная защита данного врага выше за атаку. Иначе нпс не ходил бы в блоке 5 сек, до каста спела. И не то что выше, а в разы выше. Только танк-стиль будет атаковать блоком, а не атакой.
2. спел кастонут не вплотную, я уже 4ю страницу на форуме пишу что проблема именно "вплотную", враг около тебя не активирует блок по команде. А ты всё проигнорировал. Если враг в 2х шагах, как на твоему видео во время каста, то он включит блок и от простой команды sendanimation(blockstart)

Тестируй как я, и увидишь, всё, что не учел:

1. возьми любого персонажа с кинжалом (нпс с кинжалом дает команды на атаки в разы чаще чем с двуручниками), мой любимый бандит: 00037bfc
2. поменяй csHumanMissile:  offensive 90%, defensive: 30%

И попробуй его заставить блочиться вплотную. Чтоб он сделал 10 ударов подряд, не включая блок. А потом, после скрипта - перестал атаковать вплотную.

Именно ТАК я тестирую, все варианты блока. Не на персонаже у которого атака ниже за блок по умолчанию, а на персонаже у которого атака в 3 раза выше. И вплотную.

Видео с пошаговыми действиями тестирования, твоего варианта:

(Первых 10 сек будет мыло, я хз почему так записало. А потом будет 1080. Поэтому прикрепляю скриншот первой вкладки на видео + в некоторых местах СК подвисает, когда ищет, так что: по 5 секунд можно перемотывать в таких местах)




Multigone, если бы твой метод заработал - я сказал бы спасибо и был бы очень рад, что наконец-то говнюки начали блочиться. Но... Ничего не работает (( Я даже сделал видео со всеми своими шагами подробно. Может где то есть маленькая ошибка, которая всё портит?

По тестированию:

1. В Package я проверял оба варианта: "Combat Override" и без него.
2. точно также, я проверял оба варианта "Owner quest": пусто, и название моего мода. Обычно я ставлю пусто, так как (по другим тестированиям), знаю что будет работать, не указывая квэста.
3. Я тестировал на НПС что атакует очень часто (не танк) и кинжалом (частота атак в 2 раза выше чем у двуручника). И на видео показал рейты атак.
4. мои скрипты очень большие (119 переменных только тут), но: когда я что-то тестирую, я всё остальное временно отключаю. Временный return стоит на ВСЕХ функциях, с самого начала (кроме броска рендома + изменения имени в effectStart, но имя - на бой не влияет).

Так что, кроме твоего кода - на "мозги" больше ничего не влияло.

Ты видишь ошибку, почему не блочится? (на видео, хорошо видны: окно - refAllias, окно - Package, и все вкладки к нему, и сам скрипт)

Я не исключаю варианта, что где-то может быть не поставлена всего одна галочка, и из-за этого всё не работает. Но.. Вроде все галочки на месте))

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

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

Этот блок у меня уже в печенках сидит. Видишь сколько у меня функций в creation kit (все начинается на UCM_) ? огромнейший мод, который меняет больше чем все боевые моды вместе взятые, и так застрять на блоку)) скоро психону и забью болта, и будут одни увороты, без блока.

Multigone  Offline Сообщение №2843 написано: 22 Февраля 2020 в 03:33



631
Цитата myav ()
очень плохой пример...
Какой бы, по твоему мнению, это плохой пример не был, он ясно показывает, что стиль боя (CSTY) менять можно. Прямо во время боя. Хотя пару постов выше кое-кто утверждал обратное.

Цитата myav ()
1. родная защита данного врага выше за атаку. Иначе нпс не ходил бы в блоке 5 сек, до каста спела. И не то что выше, а в разы выше. Только танк-стиль будет атаковать блоком, а не атакой.
Лол, это вообще что. Да наплевать, какой стиль был у НПС до смены. А вот то, кем и какого типа экипировано оружие, для целей блокирования важно не только лишь немного.

Цитата myav ()
2. спел кастонут не вплотную, я уже 4ю страницу на форуме пишу что проблема именно "вплотную", враг около тебя не активирует блок по команде. А ты всё проигнорировал. Если враг в 2х шагах, как на твоему видео во время каста, то он включит блок и от простой команды sendanimation(blockstart)
А ничего, что это два принципиально разных способа заставить НПС блокировать? При смене CSTY мы регулируем поведение боевого AI, при SendAnimationEvent мы напрямую указываем, какую анимацию играть. Так что расстояние в моем случае не играет роли, что было доказано доп. тестом.

Цитата myav ()
возьми любого персонажа с кинжалом
Актер с кинжалом под управлением боевого AI не блокирует атаки вообще, согласно тестам. Я даже не припомню такого за все время игры. Так же, например, как и bash-атаки лучников. Так же, как нельзя поменять скорость силовой атаки парными кинжалами. И много чего еще.

Цитата myav ()
Именно ТАК я тестирую, все варианты блока. Не на персонаже у которого атака ниже за блок по умолчанию, а на персонаже у которого атака в 3 раза выше. И вплотную.
Попробуй взять в правую руку оружие, бессердечный AI безоружных атакует по возможности.

Indiamagic
myav  Offline Сообщение №2844 написано: 22 Февраля 2020 в 13:20 | Отредактировано: myav - Воскресенье, 23 Февраля 2020, 12:53


Странник


26
Multigone, ты хочешь сказать, что причина всех моих неудач, что я пытаюсь заставить блочиться именно КИНЖАЛ? dash

P.S.: ну это не так уже и безнадежно)) Confidence + разворачивать лицом к себе + запретить бегать = кинжал БУДЕТ блочиться, и даже делать баш атаки.  Уже продвижение есть)) только говорит много нпс во время этого...

Сегодня проверю и эту теорию. Может все мои функции и смена комбатстиля - работали, а на глаз не было заметно только потому что враг - кинжал. Правда это, или нет, сегодня станет ясно, во время теста.

Добавлено (23 Февраля 2020, 12:42)
---------------------------------------------
Потестил...

Multigone, твой метод - никуда не годится. Слушаются только двуручники и нпс с одноручными топорами/булавами. Тоесть, действительно ставишь forceref с комбатстилем "глухой блок" и они блочатся.

НО!  Всем остальным (у кого не только кинжалы, но и мечи) - насрать ((  даже танкам...  Вот пример 0003de87 - комбатстиль танк (тоесть дефится и так), и в руке - щит. Если он заспавнится с топором - слушается, но если с мечем - он засунет смену Package в задницу и полностью игнорит смену Package. Я думаю, что проблема в том что у него в руках меч (ножи и одноручные мечи не слушают скриптовые команды блока и только юзают свои собственные команды).

И.... НПС у которых в руках мечи/кинжалы это 60% от всех врагов в игре (все лучники с кинжалами, и каждый второй милишник с мечем).

так что, метод который срабатывает только на 40% нпс - не годится. Так как, не слушают даже танки со щитами в руке.
Вот попробуй сам, заставить блочиться через forceref(комбатстиль - глухой блок), персонажа 0003de87, если он заспавнится с мечем. Или любого другого, по аналогии.

Так что... мой вопрос всё еще открыт. Мне нужно заставить блочится ВСЕХ, а не только "избранных".

Multigone  Offline Сообщение №2845 написано: 23 Февраля 2020 в 21:27 | Отредактировано: Multigone - Воскресенье, 23 Февраля 2020, 21:32



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

Цитата myav ()
не только кинжалы, но и мечи
1) Люди с кинжалом в правой и кулаком в левой, не блокируют, потому что, вероятно, это не предусмотрено писарями AI.
2) Люди с любым 1H в правой (кроме кинжалов) и кулаком в левой, блокируют, потому что могут.
3) Люди с любым 1H, включая кинжалы, блокируют, если в левой есть щит.
4) Люди с любым 2Н блокируют.
5) Драугры с 2Н не блокируют, потому что я не знаю.
6) Драугры со щитом блокируют, как обычно.
7) Не важно, какой Combat Style был у актеров до его смены.

Единственное, актер не всегда с первого раза понимает команду Evaluate(), поэтому ее лучше повторить несколько раз. Или, может быть, времени между помещением в алиас и командой должно пройти больше.
   
Код
_MTEActor01REFA.ForceRefTo(xT)
    Utility.Wait(0.25)
    xT.EvaluatePackage()
    Utility.Wait(0.25)
    xT.EvaluatePackage()
    Utility.Wait(0.25)
    xT.EvaluatePackage()
    Utility.Wait(0.25)
    xT.EvaluatePackage()

Честно говоря, немного удивляет, как ты проводишь тестирования. Вместо того, чтобы задаться вопросом, почему у кого-то это работает, вместо того, чтобы попытаться воспроизвести показанное при таких же условиях и подумать, что влияет на разницу результатов... В конечном счете, кому из нас это нужно больше?

Indiamagic
myav  Offline Сообщение №2846 написано: 24 Февраля 2020 в 20:30 | Отредактировано: myav - Понедельник, 24 Февраля 2020, 20:44


Странник


26
Multigone, у меня creation kit и notepad++ - на первом месте в списке windows, как самые часто запускаемые программы.
Я даже игрушки реже запускаю )) Это тебе мой ответ, что я типа ленюсь проверять. Это не правда. Я все до единой идеи - долблю до посинения, пытаясь заставить работать))

По поводу твоего списка с 7 пунктов, добавлю от себя - НПС с мечами, что одноручными что с двуручными, слушают "блок приказы" намного слабее, чем те же самые нпс (тот же самый комбатстиль/package), но которые заспавнились с другим оружием. Заставить меча блочиться - это нужно просто заспамить потоком повторений attackstop+blockstart, когда булава - очень послушный, всего 1 команда - и уходит в глухой блок.

Это показали мои вчерашние множественные тесты.

P.S.: я уже запарился с этим блоком. И с сегодня - забиваю болта => добавил в код проверку, если нпс с топорами/булавами/двуручными топорами/молотами - тогда срабатывают мои блок команды и контр-атаки.

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

Multigone, за твой пример где ты расписал ForceRefto - спс. Я это применил для топоров/булав, и теперь блочат, когда приказываю). Упомяну тебя за помощь на релизе)

Всё.

ТЕМА БЛОКА - ЗАКРЫТА.

Но.... Появился еще один любительский вопрос. Кто знает, как можно использовать SKSE команду actor.ResetAI ?  без краша... Эта команда тупо крашит игру, моментально ((

Я читал на wiki что в EvaluatePackage() тоже есть => bool ResetAi = false.

Но, папирус не хочет компилировать, ни один из следующих вариантов:
Код
selfactor.EvaluatePackage(true)
selfactor.EvaluatePackage(ResetAi = true)
selfactor.EvaluatePackage(bool ResetAi = true)


а просто selfactor.resetAI() - ложит игру, если использовать его в OnHit.

Никто не пробовал заставить эти команды работать?

Я это спрашиваю, потому что через консоль - resetAI очень помогает мне обновить мозги НПС в одном месте, во время боя, где не помогает EvaluatePackage. Через консоль - работает, а через папирус - я уже описал выше результаты. Если кто-то знает, как эту команду запустить через папирус без краша - плз напишите.

Multigone  Offline Сообщение №2847 написано: 24 Февраля 2020 в 22:35



631
myav, у EvaluatePackage() нет аргументов, поэтому и не будет компилироваться.

Indiamagic
Myprism  Offline Сообщение №2848 написано: 04 Апреля 2020 в 16:32


Физик


1606
Есть желание сделать переодевание персонажей, когда они плавают. Ведь довольно странно плавать в стальной броне. Для этого мне надо в скрипте определить процесс плавания. Свойство IsSwimming в SKSE есть, т.е. проверить состояние персонажа я могу. Но как найти событие, в которое можно поставить проверку? По идее можно попытаться через магические эффекты с проверкой IsSwimming, но уж больно громоздко получается. Нет ли способа покрасивее?

Dsion  Offline Сообщение №2849 написано: 04 Апреля 2020 в 17:57



1279
Я не видело ничего такого. Разве что проверять каждую секунду по таймеру.

Multigone  Offline Сообщение №2850 написано: 05 Апреля 2020 в 13:03 | Отредактировано: Multigone - Воскресенье, 05 Апреля 2020, 13:10



631
Myprism, вход игрока в воду:

Код
RegisterForAnimationEvent(Game.GetPlayer(), "SoundPlay.FSTSwimSwim")

Код
EVENT OnAnimationEvent(ObjectReference xS, String sN)
    IF sN == "SoundPlay.FSTSwimSwim"
        ; ...

После этого апдейтом проверять, плавает или нет.

Indiamagic
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Поиск: