Модератор форума: 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? Пиши не в ЛС, а в эту тему.
grumpos  Offline  Сообщение №2251 написано: 8 ноября 2016, 11:08



24
Есть ли скриптовая команда, позволяющая установить курсор (камеру) на указанную цель?  После диалога применяется функция Spell.Cast (Player, Target1), Spell.Cast (Player, Target2) и т.д. на несколько рядом стоящих целей, но срабатывает только на спикере, так как остальные спеллы пролетают тупо мимо своих целей (все летят в спикера, т.к. на него сфокусирована камера). Или можно как-то по-другому это реализовать?

Multigone  Offline  Сообщение №2252 написано: 8 ноября 2016, 15:06 | Отредактировано: Multigone - 8 ноября 2016, 15:16



815
grumpos, если заклинание модное и известно, можно поменять его Delivery на Target Actor, тогда Cast() будет накладывать заклинание на указанную цель, а не туда, куда смотрит игрок.

А по сути, есть вот что:

; Sets this actor's head tracking target, optionally forcing it as their pathing look-at target
Function SetLookAt(ObjectReference akTarget, bool abPathingLookAt = false) native


Код
Actor1.SetLookAt(Ref1)
Actor1.SetLookAt(none)
Не работает с оружием в руках (?) или в режиме от первого лица.

Еще в Dialogue Scene Action есть отделение с 3 настройками Headtracking, но не знаю, будет ли в этом случае вращаться камера. Для примера можно посмотреть квест DB09.

Еще можно попробовать (не проверял, не уверен) установить угол камеры игрока функцией SetAngle(), если игрок находится в режиме первого лица, но думаю, выглядеть это будет не очень (если вообще будет работать).

Еще можно (?) заставить игрока творить заклинание пакетом UseMagic.

Aksyonov  Offline  Сообщение №2253 написано: 19 ноября 2016, 15:27



937
Всем привет нужен срочно скрипт - если тело затаскивается в тригер внутри дома -
оно исчезает и появляется точно такое же тело на другом тригере снаружи дома
возможно кому нибудь будет не трудно написать для меня подобный скрипт.

Lexo  Offline  Сообщение №2254 написано: 20 ноября 2016, 07:47


Всепознающий мододел


223
Народ, в есть команда в скрипте, которая проверяет заполненость Звезды Азуры? Т.е., если в ней есть душа - то одно, а если нет души - то другое...

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Multigone  Offline  Сообщение №2255 написано: 20 ноября 2016, 08:20



815
Lexo, можно лишь с помощью SKSE узнать, содержал ли камень душу изначально, т.е. что было указано в строке "Soul" этой формы. Если камень изначально пуст, нельзя вообще никак узнать, заполнен ли он, когда:
1) он содержит душу меньшей величины, чем камень, или...
2) он содержит душу соотв. величины, но форма не имеет ссылки на изначально полную версию (Linked to).

Артефакт Азуры всегда подходит под один из этих случаев, значит, определить величину души, или факт содержания души, невозможно.

Crunatus  Offline  Сообщение №2256 написано: 23 ноября 2016, 11:03



69
Есть ли функция, закрывающая текущее открытое меню?
А конкретней, можно ли скриптом закрыть открытый инвентарь?

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

Dsion  Offline  Сообщение №2257 написано: 23 ноября 2016, 16:58



Crunatus, пробовал галочку Quest Item в настройках алиаса? Это единственный не кривой способ.
Чтоб закрыть меню без SKSE ничего что-то не припоминаю :( А с SKSE наверняка есть, но я его не использую.

Multigone  Offline  Сообщение №2258 написано: 23 ноября 2016, 18:37 | Отредактировано: Multigone - 23 ноября 2016, 18:38



815
Crunatus, нужен SKSE:


Код
IF UI.IsMenuOpen("InventoryMenu") || UI.IsMenuOpen("ContainerMenu")
    Input.TapKey(0x1)
    ; Input.TapKey(Input.GetMappedKey("Pause")) ; ?
ENDIF

Aksyonov  Offline  Сообщение №2259 написано: 26 ноября 2016, 08:06 | Отредактировано: Aksyonov - 26 ноября 2016, 08:09



937
Всем привет, вопрос такой - как выглядит скрипт который бы выводил сообщение если в тригер занесли труп NPC?

Подобный код компилируется но в игре ничего не происходит:

Event OnTriggerEnter(ObjectReference akActionRef) ;- Произошло событие - вход в зону триггера
If ( akActionRef != Game.GetPlayer() && (akActionRef as Actor).IsDead() )

И ещё - нужно запустить стадию квеста №26 когда игрок зайдет в тригер но сделать это
только если игрок уже дошел до стадии №25, по поводу стадии правильно ли я понимаю
мне подсказали что нужно написать что то вроде:

If (QuestName.GetStage() == 26) и в проперти указать на нужный квест? проверил но
почему то не декомпилируется - со скриптами всё ещё не знаком достаточно хорошо,
планирую заняться этим в ближайшее время после завершения квеста, что бы не
надоедать людям, но сейчас очень нужно ваша помощь.

Kepper  Offline  Сообщение №2260 написано: 26 ноября 2016, 11:42 | Отредактировано: Kepper - 26 ноября 2016, 11:43



860
Да вроде более менее правильно.
If (QuestName.GetStage() == 26) -> If (QuestName.GetStage() == 25)
Я в этих делаю полную трассировку, чтобы посмотреть в логе папируса по какому извилистому пути идёт выполнение кода.
Если не использует SKSE то замени GetName() на GetFormID()

Quest Property QuestName auto

Event OnTriggerEnter(ObjectReference akActionRef)
Debug.Notification("Ахтунг! В меня попал инородный предмет "+akActionRef.GetName())
Debug.Trace("Marker_1 "+akActionRef.GetName())

If ( akActionRef != Game.GetPlayer() && (akActionRef as Actor).IsDead() )
Debug.Trace("Marker_2 "+akActionRef.GetName())
EndIf

Debug.Trace("Marker_3 "+akActionRef.GetName() +" "+QuestName.GetStage())
If akActionRef == Game.GetPlayer() && (QuestName.GetStage() == 25)
QuestName.SetStage(26)
Debug.Trace("Marker_4 Это ты вовремя пришёл "+akActionRef.GetName())
endif
Debug.Trace("Marker_5 "+akActionRef.GetName() +" "+QuestName.GetStage())

EndEvent

AlexeyVN  Offline  Сообщение №2261 написано: 27 ноября 2016, 08:04 | Отредактировано: AlexeyVN - 27 ноября 2016, 08:07



52
Здравствуйте, у меня  вопрос не совсем по скриптам.  Идея такая: После того как NPC упал на колени- начался разговор. Вопрос: Можно ли это реализовать через SM Event Node?

Aksyonov  Offline  Сообщение №2262 написано: 6 декабря 2016, 09:52 | Отредактировано: Aksyonov - 6 декабря 2016, 09:53



937
Всем привет пожалуйста подскажите как можно заставить давакина (игрока) следовать по
пути ( может нужно назначить AI пакет ) а как это делается? Нужно ли использовать сцены?

Создавал вот по типу с NPC AI пакет назначал пакет игроку NPC (PLAYER) указывал в пакете что работает пакет только на
стадии 91, саму стадию назначал через диалог в квесте, а в итоге давакин никуда не идет, что делать, пересмотрел многое но видимо
не там ищу.

AeoAmiball  Offline  Сообщение №2263 написано: 7 декабря 2016, 17:09



5
Цитата Aksyonov

Всем привет пожалуйста подскажите как можно заставить давакина (игрока) следовать попути ( может нужно назначить AI пакет ) а как это делается? Нужно ли использовать сцены?

Создавал вот по типу с NPC AI пакет назначал пакет игроку NPC (PLAYER) указывал в пакете что работает пакет только на
стадии 91, саму стадию назначал через диалог в квесте, а в итоге давакин никуда не идет, что делать, пересмотрел многое но видимо
не там ищу.


Привет, дружище) На самом деле это легко. Используй эту ФУНКЦИЮ в скрипте. Как точно сделать все это - посмотри в начальном квесте (когда в Хелгене ГГ выходит из повозки, или следует за капитаном после успешного выбора своей рассы).

Так же, по моему, нужно указать обязательно нужный IDLE, с которым ГГ будет двигаться. Но опять же, у меня в данный момент нет доступа к конструктору, потому изучи указанный мной выше квест.

Удачи.

Aksyonov  Offline  Сообщение №2264 написано: 9 декабря 2016, 02:09 | Отредактировано: Aksyonov - 9 декабря 2016, 02:12



937
Вопрос такой теперь:

1. Нашел скрипт который запускает стандартное интро от BETHESDA когда начинается игра, Bethesda Preset и так далее.
2. Нашел ссылку в самом файле sfx на объект типа Sequence1 Sequence2 на 2d картинку, но ссылку в Flash изменить нельзя.
3. Вопрос можно ли запустить sfx анимацию в игре на прямую, указав на файл через Property? как изменить ссылку на Sequence1?
4. Я хотел в Flash создать новую форму типа Sequence 10 и указать в sfx ссылку на новый элемент, но параметры ссылок _root.Sequence1.gotoEndStop(1); не меняются в sfx.

5. В sfx мне не понятно каким образом игра понимает что строка _root.Sequence1.gotoEndStop(1); относиться к форме под номером 1 а не скажем 12 которая есть в sfx.



4. Хочется создать такое же начало как и у разработчиков в своём квесте, но пока что таким способом как у Bethesda сделать ничего не получается.
5. Буду рад любым мыслям на этот счет, заменить элементы текста в интро не проблема, но мне нужно не портить существующую заставку при начале игры а добавить свою.

Lexo  Offline  Сообщение №2265 написано: 15 декабря 2016, 05:24


Всепознающий мододел


223
Не помню, задавался ли тут такой вопрос, но... возможно ли проверить, какой тип оружия экипирован? Конкретно, проверить, экипирован ли боевой молот? Пытался сделать эффект отбрасывания, как при Безжалостной силе, но... молоты почему-то вообще не хотят воспринимать никакие эффекты через Apply Combat Hit Spell... вот я и подумал сделать эффект через скрипт... не подскажете способ, как это сделать?

Добавлено (15 Декабря 2016, 08:24)
---------------------------------------------
Опа...
заметил, что проблемы с молотами возникли только в моём моде, потому что без него всё работает... надо понять, что я натворил с молотами...

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


"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Dsion  Offline  Сообщение №2266 написано: 15 декабря 2016, 08:10



Lexo, ничё он не интересный... Можно использовать на акторе метод GetEquippedItemType - возвращает число, соответствующие типу оружия. Можно вызывать на акторе GetEquippedWeapon - возвращает оружие и проверить наличие на оружии кейворда, обозначающего тип. Наверняка так же можно вызывать WornHasKeyword - проверяет, надето ли на акторе что-то с указанным кейвордом. Любой новичок это всё видел на
creationkit.com

AlexeyVN  Offline  Сообщение №2267 написано: 15 декабря 2016, 14:56



52
Здравствуйте. Подскажите как сделать чтобы VisualEffect играл на оружие а не на игрока?
в оригинале так
      TargetVFX.Play(NPC,4.7, ГГ)              
CasterVFX.Play(ГГ,5.9,NPC)
а надо чтобы так
      TargetVFX.Play(NPC,4.7, Оружие)              
CasterVFX.Play(Оружие,5.9,NPC)
Оружие = экипированный лук

Aksyonov  Offline  Сообщение №2268 написано: 15 декабря 2016, 15:33



937
Цитата Lexo

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


Думаю да, мне на ум приходит использовать уникальные editor id
предметов, открываем настройки предмета там есть ID их что то вроде:

Armor Boots - Armor Curas, потом в скрипте нужно написать проверку
по этим ключевым словами всё, я уже так делал и всё успешно работало,
но правда я не писал прямо в скрипте - а делал это через условия в
заклинаниях но всё же в направлении в этом стоит копать.

Lexo  Offline  Сообщение №2269 написано: 21 декабря 2016, 06:57 | Отредактировано: Lexo - 21 декабря 2016, 08:12


Всепознающий мододел


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

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Multigone  Offline  Сообщение №2270 написано: 24 декабря 2016, 19:25



815
Lexo, есть 2 способа:

1) На примере маг. эффекта.


Код
Event OnEffectStart(Actor xT, Actor xC)
    RegisterForAnimationEvent(xT, "weaponSwing")
    RegisterForAnimationEvent(xT, "weaponLeftSwing")
ENDEVENT

Event OnAnimationEvent(ObjectReference akSource, string asEventName)
    IF asEventName == "weaponSwing"
        ; удар правой
    ELSE
        ; удар левой
    ENDIF

;   Debug.Notification(asEventName)

EndEvent

2) Используя SKSE:


Код
Event OnEffectStart(Actor xT, Actor xC)
    RegisterForActorAction(0)

; ActionTypes
; 0 - Weapon Swing (Melee weapons that are swung, also barehand)
; 1 - Spell Cast (Spells and staves)
; 2 - Spell Fire (Spells and staves)
; 3 - Voice Cast
; 4 - Voice Fire
; 5 - Bow Draw
; 6 - Bow Release
; 7 - Unsheathe Begin
; 8 - Unsheathe End
; 9 - Sheathe Begin
; 10 - Sheathe End

ENDEVENT

Event OnActorAction(int actionType, Actor akActor, Form source, int slot)
    IF slot == 1
        ; удар правой
    ELSE
        ; удар левой
    ENDIF

; Slots
; 0 - Left Hand
; 1 - Right Hand
; 2 - Voice

EndEvent

Lexo  Offline  Сообщение №2271 написано: 2 января 2017, 21:49


Всепознающий мододел


223
Ну вот получилось что-то в этом роде:


Создал постоянный эффект на себя. Но не работает... что-то не так?

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Multigone  Offline  Сообщение №2272 написано: 3 января 2017, 12:14 | Отредактировано: Multigone - 23 апреля 2020, 09:44



815
Lexo, на алиас игрока:


Код
Scriptname _TESTTEST26 extends ReferenceAlias

Keyword property _LEXO_Agni Auto
Spell Property _LEXO_FireWave auto

Actor xP
Bool bL

EVENT OnInit()
    xP = GetActorReference()
ENDEVENT

EVENT OnRaceSwitchComplete()
    xP = GetActorReference()
ENDEVENT

EVENT OnObjectEquipped(Form xF, ObjectReference xR)
    IF xF AS Weapon && xF.HasKeyword(_LEXO_Agni) && !bL
        bL = true
        Utility.Wait(0.001)
;        IF xP.GetEquippedWeapon(0).GetEnchantment().HasKeyword(_LEXO_Agni) || WornObject.GetEnchantment(xP, 1, 0).HasKeyword(_LEXO_Agni) ; Если чары оружия имеют кейворд (SKSE).
        IF xP.GetEquippedWeapon(0).HasKeyword(_LEXO_Agni) ; Если оружие имеет кейворд.
            RegisterForAnimationEvent(xP, "weaponSwing")
        ELSE
            UnRegisterForAnimationEvent(xP, "weaponSwing")
        ENDIF

;        IF xP.GetEquippedWeapon(1).GetEnchantment().HasKeyword(_LEXO_Agni) || WornObject.GetEnchantment(xP, 0, 0).HasKeyword(_LEXO_Agni)
        IF xP.GetEquippedWeapon(1).HasKeyword(_LEXO_Agni)
            RegisterForAnimationEvent(xP, "weaponLeftSwing")
        ELSE
            UnRegisterForAnimationEvent(xP, "weaponLeftSwing")
        ENDIF
        bL = false
    ENDIF
ENDEVENT

EVENT OnObjectUnequipped(Form xF, ObjectReference xR)
    OnObjectEquipped(xF, xR)
ENDEVENT

Event OnAnimationEvent(ObjectReference akSource, string asEventName)
    _LEXO_FireWave.Cast(xP)
EndEvent

Для НПС эти анимации не регистрируются (событие не срабатывает). Я пробовал эти, тоже нет:

RegisterForAnimationEvent(xT, "AttackWinStart")
RegisterForAnimationEvent(xT, "tailCombatState")
RegisterForAnimationEvent(xT, "attackStartLeftHand")
RegisterForAnimationEvent(xT, "attackStart")

Проверил, вроде работает.

Если найдешь события, которые будут срабатывать на неписях: в любом случае, можно отслеживать либо экипирование конкретного оружия любым актером (скрипт на базовое оружие и заклинание), или экипирование любого оружия конкретным актером (скрипт на алиас / заклинание - как здесь). Сделать, чтобы отслеживание анимации было связано только с зачарованием (например, снимаемые чары, позволяющие любому оружию кидать фаербол при махании), таким методом нельзя.

Lexo, еще проверь:

- вешается на алиас игрока.
- квест алиаса должен быть запущен.
- заполняются Property (для проверки можно взять Firerball).
- у экипированного оружия должно быть это ключ. слово (для проверки WeapMaterialIron).

Lexo  Offline  Сообщение №2273 написано: 8 января 2017, 19:38 | Отредактировано: Lexo - 8 января 2017, 19:56


Всепознающий мододел


223
Народ, простите мою тупость, но я уже 2 дня голову себе ломаю, никак не могу добиться желаемого результата...

Заклинание должно убирать из инвентаря предмет, кидать прожектайл. Когда прожектайл взрывается, на месте взрыва должен появиться тот самый предмет (желательно реф, а не базовый).

Примерно так делаю:


Прожектайл этого заклинания создаёт взрыв. Взрыв создаёт активатор.


Но у меня всё время проблема... либо он не хочет компилировать - проблема в "ActivatorRef = _LEXO_PlacedActivator.Getref()".

А если что-то и закомпилируется, то не работает. Заклинание кидается, предмет удаляется, но валяться на месте не хочет... подскажите, пожалуйста, что не так...

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

PitrPokir  Offline  Сообщение №2274 написано: 8 января 2017, 21:39 | Отредактировано: PitrPokir - 8 января 2017, 21:40



26
Господа, подскажите, почему в игре указанный предмет пропадает у Caster'a, а не у Target'a? Более того, предмет в обоих вариантах удаляется у игрока из инвентаря, а не у цели, на ком бы функция не работала.
Весь день ковыряюсь в этих строчках, ума не приложу в чем беда.


Код
Scriptname NecroReanimateNPCScript extends ActiveMagicEffect

MagicEffect Property NecroReanimateEffect  Auto
Ingredient Property IngrVampDust  Auto

Event OnEffectStart(Actor akTarget, Actor akCaster)
    akTarget.RemoveItem(IngrVampDust, 1, false)
EndEvent

Dsion  Offline  Сообщение №2275 написано: 9 января 2017, 03:08



Lexo, можешь повесить на активатор вот такое и всё:

Код
Scriptname SionActScript extends ObjectReference

Actor Property PlayerRef Auto;
Weapon Property IronSword Auto;

Event OnInit()

    If (PlayerRef.GetItemCount(IronSword) > 0)
        Debug.Notification("Placing sword!");
        PlayerRef.RemoveItem(IronSword, 1);
        PlaceAtMe(IronSword);
    Else
        Debug.Notification("You have no swords!");
    EndIf

    Disable();
    DeleteWhenAble();

EndEvent

Kepper  Offline  Сообщение №2276 написано: 9 января 2017, 06:49



860
PitrPokir, у Magic Effect, на котором висит твой скрипт, в свойстве Delivery указано что эффект накладывается на себя или на цель?
Надо чтобы был на цель.

Multigone  Offline  Сообщение №2277 написано: 9 января 2017, 09:25 | Отредактировано: Multigone - 9 января 2017, 09:28



815
Цитата Lexo

желательно реф


Чтобы управлять референсом предмета, нужно его знать. Значит, предмет должен быть в алиасе. На активатор:


Код
Scriptname _TESTTEST27 extends objectReference ; если предмет создается алиасом (или находится там).

ReferenceAlias Property ItemAlias auto

Event OnLoad()
    objectReference ItemRef = ItemAlias.GetReference()
    IF Game.GetPlayer().GetItemCount(ItemRef)
        ItemRef.MoveTo(Self, 0.0, 0.0, 25.0) ; располагает предмет на 25 юнитов выше активатора.
        while !ItemRef.is3dloaded()
            utility.wait(0.05)
        endwhile
        ItemRef.setMotionType(Motion_Keyframed) ; если нужно, чтобы предмет не улетел куда-нибудь.
    ENDIF
endEvent

Активатор должен иметь модель, можно Effects\FXEmptyObject.nif.

Dsion, если накрутить много действий на oninit (или просто вставить ожидание), он сработает несколько раз. Проверь свой скрипт через debug.notification(utility.randomfloat()), и там спавнится 3-4 меча. У меня это так работает для всех oninit.

PitrPokir  Offline  Сообщение №2278 написано: 9 января 2017, 11:56 | Отредактировано: PitrPokir - 9 января 2017, 14:12



26
Kepper, у меня выбрано "при касании", так разве нельзя?

Kepper  Offline  Сообщение №2279 написано: 9 января 2017, 16:50



860
PitrPokir, можно.
Только что проверил. Повесил скрипт на зачарованный кинжал.
Код
Scriptname NecroReanimateNPCScript extends ActiveMagicEffect

MagicEffect Property NecroReanimateEffect  Auto
Ingredient Property IngrVampDust  Auto

Event OnEffectStart(Actor akTarget, Actor akCaster)
    Debug.Trace("TEST  akTarget="+akTarget+"   akCaster="+akCaster)
    akTarget.RemoveItem(IngrVampDust, 1, false)
EndEvent

Выдало в лог папируса вполне адекватное сообщение:
TEST akTarget=[Actor < (000B6CE1)>] akCaster=[Actor < (00000014)>]
akCaster - главный герой
akTarget - какой-то актёр, которому ты хочешь облегчить карманы.

Добавь в свой скрипт
Debug.Trace("TEST akTarget="+akTarget+" akCaster="+akCaster)
и посмотри.

PitrPokir  Offline  Сообщение №2280 написано: 10 января 2017, 00:20 | Отредактировано: PitrPokir - 10 января 2017, 00:22



26
Kepper, у меня в логах папируса почему-то одинаковый ID и у цели, и у кастера. В чем может быть проблема? Скрипт лежит в эффекте "Оживление трэлла". Я его дублировал, назвал по-своему и добавил этот скрипт. Спелл тоже почти не менял, разве что оставил только этот маг.эффект и длительность урезал, что бы не убивать раз за разом оживленный труп.
Игру и СК переустанавливал, плагин заново создавал, всё тоже самое.
P.S.Может дело в самом маг.эффекте? Трэлл же типа принадлежит игроку, может поэтому и ссылается на него. Но даже если так, я не знаю что с этим делать  :(
P.P.S. игра чистая, только официальные DLC

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





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