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

Вопросы по скриптам Papyrus
sansuli  Offline  Сообщение №1 написано: 31 августа 2012, 13:29 | Отредактировано: Multigone - 23 апреля 2020, 14:24


The Red Sun


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


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


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

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

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
SoraSt  Offline  Сообщение №1651 написано: 18 июня 2015, 15:06



21
Dsion, через консоль тоже не выходит. Буду думать как по другому можно его умертвить в игре не убивая. Еще раз спасибо за скрипт.

Dsion  Offline  Сообщение №1652 написано: 18 июня 2015, 15:12



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

SoraSt  Offline  Сообщение №1653 написано: 18 июня 2015, 15:19



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

Dsion  Offline  Сообщение №1654 написано: 18 июня 2015, 16:17



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

Лучшее, что пока пришло в голову, - это сделать два референса. На одном будет галочка "Starts Dead", а второй будет отключен. Экипировка кольца будет не воскрешать NPC, а отключать мертвого и включать на том же месте живого.

SoraSt  Offline  Сообщение №1655 написано: 18 июня 2015, 16:29



21
Dsion, а можно тот скрипт посмотреть? Который убивает. Просто мой актер, это волк. На него отсутствие одежды никак не скажется))

Multigone  Offline  Сообщение №1656 написано: 18 июня 2015, 16:46 | Отредактировано: Multigone - 18 июня 2015, 22:22



831
Цитата Dsion

через Mod Spell Magnitude с определенными Conditions для Target


Если в маг. эффекте не будет указан флаг Power Affect: Magnitude, то для него перк не сработает.</зануда мод>

nepewka, с НПС вроде проблем нет никаких. Хочешь мага - возьми какого-нибудь мастера-пироманта EncWarlock07TemplateFire и создай своего актера с похожими настойками Stats, AI Data, SpellList и т.д. Ничто не мешает сделать свои CombatStyle и Class на основе нужных.

Dsion  Offline  Сообщение №1657 написано: 18 июня 2015, 17:05



Multigone, чойто? А вообще, пути, как минимум два:
1. Уменьшить урон исходящих заклинаний, если цель - союзник.
2. Уменьшить входящий урон, если атака прилетела от союзника.
Хоть что-то одно должно бы сработать.

SoraSt, может, как-то так... Не знаю. Это на референс вешается:

Код
Scriptname StartsDead extends Actor

Event OnInit()
     Utility.Wait(1.0)
     KillEssential()
     MoveToMyEditorLocation()
EndEvent

SoraSt  Offline  Сообщение №1658 написано: 18 июня 2015, 17:18



21
Dsion, супер, все отлично работает. Воплотил свою идею в жизнь. Благодарю.

Gvinpin  Offline  Сообщение №1659 написано: 18 июня 2015, 17:20


Уася


вот написал скрипт -  висит сей "раритет" на активаторе 

Scriptname Ara05WarsTESTScript extends ObjectReference

GlobalVariable Property Ara09testcote  Auto                      ; глобальная переменная с параметрами Variable Type - Short , Value - 0
ObjectReference Property PlayerAra05Container Auto       ;эт контейнер куда шмот ГГ уходит
Armor Property MS02Armor  Auto                                        ; MS02/MS03/MS04 - наборы шмота выдаваемого ГГ взамен ушедшего в контейнер - 3 типа, в зависимости от тематичной матерости ГГ
Armor Property MS02Gauntlets  Auto
Armor Property MS03Armor  Auto  
Armor Property MS03Gauntlets  Auto
Armor Property MS04Armor  Auto  
Armor Property MS04Gauntlets  Auto  
ObjectReference Property Ara09MoveMarker Auto            ;маркер к которому отправляется ГГ после получения шмота

-----------------------------------------------------------------------------------------
есть определенное кол-во актёров по очереди стартующих со следующим скриптом :

Scriptname Ara09TESTboxsScript extends Actor 

GlobalVariable Property Ara09testcote  Auto ; это та самая глобальная переменная

Event OnDeath(Actor akKiller)
     Ara09testcote.value += 1     ; по задумке погибель актёра должна прибавить единицу к значению объявленной в предыдущем скрипте переменной
EndEvent

ЗЫ: поначалу вместо Ara09testcote.value += 1 было Ara09testcote.Mod(1) - компилятор компилировал но в игре увеличения значения переменной никак не отражалось, так как ГГ продолжал получать первый набор шмоток
-------------------------------------------------------------------------------------------

Event OnActivate(ObjectReference akActionRef)                                   ; ГГ активирует активатора
 If Ara09testcote.GetValue()>= 0 && Ara09testcote.GetValue()< 3      ; а вот тут начинается непонятное, эта редакция строки не работает 
-------------------------------------------------------------------------------------------
если оставляю - If Ara09testcote.GetValue()>= 0 - то работает если же меняю условие например на <3, то работа прекращается, и ГГ тупо безрезультатно жмякает активатора
-------------------------------------------------------------------------------------------
     Game.GetPlayer().removeAllItems(PlayerAra05Container) 
     Game.GetPlayer().AddItem(MS02Armor, 1)
     Game.GetPlayer().EquipItem(MS02Armor, 1)
     Game.GetPlayer().AddItem(MS02Gauntlets, 1)
     Game.GetPlayer().EquipItem(MS02Gauntlets, 1)
     Game.GetPlayer().Moveto(Ara09MoveMarker)
 ElseIf Ara09testcote.GetValue()>= 3 && Ara09testcote.GetValue()< 5  ;по задумке после ряда побед должен получать другой набор шмоток
     Game.GetPlayer().removeAllItems(PlayerAra05Container) 
     Game.GetPlayer().AddItem(MS03Armor, 1)
     Game.GetPlayer().EquipItem(MS03Armor, 1)
     Game.GetPlayer().AddItem(MS03Gauntlets, 1)
     Game.GetPlayer().EquipItem(MS03Gauntlets, 1)
     Game.GetPlayer().Moveto(Ara09MoveMarker)
 ElseIf Ara09testcote.GetValue()>= 5 && Ara09testcote.GetValue()< 9  ; и новый набор шмоток
     Game.GetPlayer().removeAllItems(PlayerAra05Container) 
     Game.GetPlayer().AddItem(MS04Armor, 1)
     Game.GetPlayer().EquipItem(MS04Armor, 1)
     Game.GetPlayer().AddItem(MS04Gauntlets, 1)
     Game.GetPlayer().EquipItem(MS04Gauntlets, 1)
     Game.GetPlayer().Moveto(Ara09MoveMarker)
 EndIf 
endEvent
как организовать увеличение значения переменной при цифровой смерти актёров ???
как организовать проверку условий текущего значения переменной для адекватной экипировки ГГ ???

Самый скромный и героический герой Скайрима!!!
Multigone  Offline  Сообщение №1660 написано: 18 июня 2015, 17:38 | Отредактировано: Multigone - 18 июня 2015, 17:39



831
Dsion, мне казалось, что флаги Power Affects вкл./откл. возможность изменять силу / продолж. эффекта с помощью перков. Сейчас проверил - похоже, они вообще ни на что не влияют.

Multigone  Offline  Сообщение №1661 написано: 18 июня 2015, 18:20 | Отредактировано: Multigone - 18 июня 2015, 18:38



831
Gvinpin, заполнил ли ты GlobalVariable Property Ara09testcote Auto во всех скриптах? Предположим, да.

Код
Ara09testcote.Mod(1)
Будет работать как с Int-глобальными, так и с Float. В обоих случаях можно писать Ara09testcote.Mod(1.0), это более лорно.

Код
If Ara09testcote.GetValue() >= 0 && Ara09testcote.GetValue() < 3
Проверка правильная. Но всегда лучше делать так:
Код
Int iGlobal = Ara09testcote.GetValueInt()
IF iGlobal >= 0 && iGlobal < 3
... поскольку значение глобальной в начале исполняемого отрезка кода и в его конце может быть разным, если эта глобальная может меняться сразу из нескольких событий / скриптов.

Вместо этого...
Код
IF iGlobal >= 0 && iGlobal < 3
         ;
ELSEIF iGlobal >= 3 && iGlobal < 5
         ;
ELSEIF iGlobal >= 5 && iGlobal < 9
         ;
ENDIF
... пиши так (почти то же самое, но без лишних проверок):
Код
IF iGlobal < 3
         ;
ELSEIF iGlobal < 5
         ;
ELSE
         ;
ENDIF

Вставляй уведомление...
Код
Debug.Notification(Ara09testcote.GetValue() as string)
... в тех участках скрипта, где, как ты считаешь, глобальная имеет неправильное значение. Иногда помогает.

Gvinpin  Offline  Сообщение №1662 написано: 18 июня 2015, 18:38 | Отредактировано: Gvinpin - 18 июня 2015, 18:39


Уася


Цитата Multigone

Проверка правильная. Но всегда лучше делать так

у меня эта проверка почему-то хронически не работает, оставляю If Ara09testcote.GetValue() >= 0 - работает, ни в каких других вариантах - нет ... где-то в этой проверке ошибка порылась, поймать её не могу, пол дня на это убил - почему-то не считывает скрипт текущее значение переменной, и работает только с - 0 (когда Ara09testcote.GetValue() >= 0) во всех остальных случаях активатор просто не срабатывает - GlobalVariable Property Ara09testcote Auto во всех скриптах - заполнены , только что на всякий случай перепроверил

ЗЫ: уйду на обязательное вечернее мероприятия, вернусь буду пробовать - в любом случае спасибо!

Самый скромный и героический герой Скайрима!!!
Dsion  Offline  Сообщение №1663 написано: 18 июня 2015, 18:44



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

Gvinpin  Offline  Сообщение №1664 написано: 18 июня 2015, 21:18


Уася


Multigone,  реально помогла проверка - Debug.Notification(Ara09testcote.GetValue() as string) ... почему-то стартовое значение переменной оказалось 100 при том что заданный параметр Value = 0 ... для проверки сделал ещё одну глобальную всё перекинул на неё, такая же засада стартовая - 100 ...  перекинув значения IF iGlobal >= 100 && iGlobal < 103 ... получил рабочий скрипт, не будь этой проверки можно было бы ещё пару дней посидеть потупить :D  ... ещё раз спасибо  good

Добавлено (19 Июня 2015, 00:18)
---------------------------------------------

Цитата Dsion

Видишь ...

 это за тебя карма говорит на которой сказалось число сообщений - три шестёрки ... после написания следующего всё наладится и будет хорошо  :)

Самый скромный и героический герой Скайрима!!!
nepewka  Offline  Сообщение №1665 написано: 19 июня 2015, 06:19 | Отредактировано: nepewka - 19 июня 2015, 06:21



255
Multigone, а как изменится скрипт на суммона, призванного моим суммоном?

призываемый мною атронах, вызывает мини атронаха, ему пропишем так же, просто уберем проверку на игрока?

Scriptname XXX extends Actor ; На базового актера призванного сущ-ва.

Keyword Property MySummonKYWD Auto ; Кейворд дать базовому актеру призв. сущ-ва.

EVENT OnMagicEffectApply(ObjectReference akCaster, MagicEffect akEffect)
IF HasKeyword(MySummonKYWD)
IgnoreFriendlyHits()
RegisterForSingleUpdate(0.5)
ENDIF
ENDEVENT

EVENT OnUpdate()
IgnoreFriendlyHits(false)
ENDEVENT

кстати, если оставлять пустые скобки в IgnoreFriendlyHits bool разве по умолчанию будет true?

Dsion  Offline  Сообщение №1666 написано: 19 июня 2015, 08:16



Цитата Gvinpin

реально помогла проверка


Вот блин. Я уже было впал в праведный гнев и хотел спросить, чем тебя не устроила консольная команда GetGlobalValue, которой я тебе посоветовал проверять эту переменную.
А потом заметил, что этого сообщения нету в исходящих. Неужели не отравилось? Я был уверен, что послал его тебе в приват. Даже точно помню, что писал.

Multigone  Offline  Сообщение №1667 написано: 19 июня 2015, 08:55



831
nepewka, ты проверял? Работает? Тут Dsion подсказывал, что можно выполнить задачу, используя перк (я, кстати, об этом не подумал). В принципе, можно любым способом, но скрипты немного более динамичны (например, можно задать игнорирование хитов для тех актеров, Actor и ActorBase которых мы изначально не знаем - теоретически, для любых актеров, в т.ч. из др. модов).
Цитата nepewka

если оставлять пустые скобки в IgnoreFriendlyHits bool разве по умолчанию будет true?

Если оставлять пустые скобки, то аргументом функции будет значение, заданное изначально для нее. Смотрим:

Код
Function IgnoreFriendlyHits(bool abIgnore = true) native
Это верно для функций с флагом Native. Для функций с флагом Global при вызове функции все аргументы должны быть указаны. Function Flags.

Dsion  Offline  Сообщение №1668 написано: 19 июня 2015, 09:39



Цитата Multigone

но скрипты немного более динамичны


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

Dsion  Offline  Сообщение №1669 написано: 19 июня 2015, 09:43



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

nepewka  Offline  Сообщение №1670 написано: 19 июня 2015, 10:10



255
Multigone, да вот проблема в том, что не дома пока и проверить толком не могу ((

кстати да, Dsion, то может прав  IgnoreFriendlyHits вполне может означать только то, что актер не будет агриться при получении урона от союзника, но это также можно флаг hostile убрать в MGEF. проверки требует данный способ.. Как работает эта функция...

Dsion, разве про перк говорил? помоему что то про книгу или нет?
Дайте айдишник или хотя бы название...

Multigone  Offline  Сообщение №1671 написано: 19 июня 2015, 10:31



831
Dsionnepewka, а, ну да, тогда хз. Я совсем забыл, что у меня НПС с помощью перка еще инвертирует урон от огня.

Multigone  Offline  Сообщение №1672 написано: 19 июня 2015, 10:37 | Отредактировано: Multigone - 19 июня 2015, 10:40



831
Можно попробовать так:


Но перком будет лучше все же.

nepewka  Offline  Сообщение №1673 написано: 19 июня 2015, 10:47



255
Multigone, да что за перк то? )

Multigone  Offline  Сообщение №1674 написано: 19 июня 2015, 10:58 | Отредактировано: Multigone - 19 июня 2015, 11:06



831
nepewka, я не знаю. Скорей всего, там используется:

Entry -> Mod Spell Magnitude -> SetValue (0.0)
Target -> (S) (GetFactionRelation) (PlayerRef) (>) (1.0) (AND)

nepewka  Offline  Сообщение №1675 написано: 19 июня 2015, 11:00



255
Multigone,  ух я в этих Condition'сах не силен, как там правильно условия ставить.

дождемся Dsion

Multigone  Offline  Сообщение №1676 написано: 19 июня 2015, 11:12 | Отредактировано: Multigone - 19 июня 2015, 11:15



831
nepewka,




nepewka  Offline  Сообщение №1677 написано: 19 июня 2015, 11:33



255
Multigone, также всем проставляем кейворд INVALID ? 

а как насчет урона суммонам, моих суммонов ? То есть от атронаха до мини атронаха и обратно

Multigone  Offline  Сообщение №1678 написано: 19 июня 2015, 13:21 | Отредактировано: Multigone - 19 июня 2015, 13:24



831
nepewka, нет, конечно, тот кейворд, который ты дашь атронахам (мне лень было загружать .esm).

Насчет урона от одних другим, я не уверен. Можно было бы воспользоваться комбо из следующих проверок, если бы они работали (перк для НПС):

Perk Owner:
(S) (GetFactionRelation) ([TARGET]) (>) (1.0) (AND) ; Вот насчет этой не знаю, передается ли инфа о цели в перк. В маг. эффекты передается.

Target:
(S) (GetIsID) (Player) (==) (1.0) (OR)
(S) (HasKeyword) (KYWD) (==) (1.0) (AND)

Multigone  Offline  Сообщение №1679 написано: 19 июня 2015, 13:33 | Отредактировано: Multigone - 19 июня 2015, 13:49



831
Кстати, снижение магнитуды до нуля перком вовсе не означает, что к НПС не будет применяться эффект вовсе. Если он имеет Hostile, то НПС может перестать быть другом и начать становиться недругом. Просто в битве, в которой участвуют 1) враги 2) игрок 3) НПС на стороне игрока, НПС игнорирует любые атаки игрока до момента, пока битва не закончится. Просто к сведению.

Еще поделюсь следующим наблюдением: у игрока есть FF заклинание с 2 эффектами. Первый лечит всех живых существ, второй наносит урон нежити (и является враждебным). Так вот, если это заклинание применяется к живому, он станет врагом. Казалось бы, раз негативный эффект не применяется, т.к. ему не дает его условие, то заклинание не должно являться враждебным. Однако, если в заклинании в любом эффекте есть Hostile, то все заклинание является Hostile, даже если остальные его эффекты не враждебные.

nepewka  Offline  Сообщение №1680 написано: 19 июня 2015, 13:49



255
Multigone,  ну да беседа тут не продумала конечно, насчет урона по своим. Приходится самим как то дорабатывать

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





Ответ на жалобу смотрите в разделе жалоб