Добро пожаловать в сборник готовых вопросов и ответов к ним. Многие вещи, которые Вы здесь увидите в сущности своей могут являться детским лепетом на полянке, банальщиной, а еще ценной информацией, особенно для новичков, в той или иной сфере модостроения. Хотя и старичкам порой полезно узнать что-нибудь новенькое. Что не пишется, то к лучшему.
Использовать эту маленькую программку. Совместима с ХР и Win7. (Не знаю как на других осях). Прикручивает окошко для скроллинга сбоку экрана в случаях, когда появляется негабаритное окно.
При начале работы, во время выбора подключаемых файлов, нажать "set as active file" после выбора своего файла.
В: Как скрыть мешающие объекты в окне рендера?
Ответ
Выделить нужные объекты (для выделения нескольких удерживать Ctrl) и нажать клавишу с цифрой 1 (единожды для создания "прозрачности", дважды для полного сокрытия объектов).
Обратная визуализация либо через перезагрузку локации на F5, либо через Alt + 1.
В: Как сделать так, чтобы в книгах можно было использовать имя игрока?
<Alias=Player> = имя игрока
<Alias.PronounPosObj=Player> = его\её
<Alias.Pronoun=Player> = он\она
Например "её величество Вырвиглазка Вторая." будет в редакторе выглядеть как "<Alias.PronounPosObj=Player> величество <Alias=Player>."
P.S. Проследите, чтобы имя алиаса игрока (Player) совпадало потом с тем, на который вы ссылаетесь <Alias=Player>
В: Как существо, не предназначенное для призыва заклинанием, сделать призываемым?
Ответ
Открыть окно нужного NPC, выставить галку на "summonable"(надо убрать если отмечены "unique" и "essential")
Далее создать маг. эффект для призыва и само заклинание.
В: При окрашивании земли, некоторые участки стали черными, как исправить?
Ответ
Слишком много текстур для одной ячейки, каждая ячейка имеет ограничение в 6 текстур, нажмите I при редактирование и удалите лишние текстуры из квадрата(ов).
В: При прокладке освещения некоторые части моделей стали черными, в чем дело?
Ответ
Превышен лимит источников освещения на один нод модели. Лимит - 7 лампочек. Решается оптимизацией, иногда разрезкой моделей на составные части.
В: Как сделать переходные (зеленые зоны при прокладке навмешей?)
Ответ
Подвести навигационную сетку как можно ближе к краю ячейки, затем финализировать ячейку.
В: После создания лица персонажу, в игре оно отображается не так, как планировалось.
Ответ
Нажать ctrl+F4 в object window на нужном персонаже, отметить "да" в сплывающем окне export face gen data for all selected NPC?.
В: Необходима невидимая преграда, как сделать?
Ответ
На панели инструментов использовать кнопки Create a Collision Plane\Cube\Sphere
В: При изменении ландшафта осталась висящая в воздухе трава, как ее убрать?
Ответ
Покрыть местность текстурой NO GRASS
В: Как сделать так, чтобы лежащую книгу можно было прочесть, но невозможно забрать с собой?
Ответ
В редакторе, в окне book поставить галочку напротив Can't be Taken.
В: Как сделать так, чтобы при повышении уровня выносливости не увеличивался лимит по весу инвентаря?
Ответ
Gameplay - Settings... - fLevelUpCarryWeightMod
Значение выставить "0"
В: Как изменить шанс NPC увернуться от стрел?
Ответ
В fCombatDodgeChanceMax поменяйте значение на 0.0000.
В: Как отредактировать уровни сложности в игре?
Ответ
D поле Filter ghjgbcfnm FDiffMult, останутся нужные 12 значений.
Значения типа fDiffMultHPByPC отвечают за урон наносимый игроком.
Значения типа fDiffMultHPToPC за урон наносимый неписями игроку.
Буквы в конце-уровень сложности. E (easy) легко, VE очень легко, N нормально, H (hard) тяжело, VH очень тяжело и L легендарный.
По умолчанию на легендарном уровне стоит 0,2500, то есть урон составляет 25% от нормы. 1.0000-это 100%, стоит по умолчанию на нормальном уровне сложности.
В: Как увеличить количество ячеек подгружаемых редактором?
Ответ
На панели инструментов кнопка Preferences (третья слева) там во владку MIsc, Grids to load - указать кол-во ячеек для загрузки. (Не больше 11)
В: Для чего нужны Plane маркер и BlackPlane?
Ответ
PlaneMarker нужен для оптимизации, скрывает объекты, находящиеся за ним в worldspace
PlackPlane размещать выше статиков, он скрывает их под собой при просмотри карты локации
В: При создание квеста перехожу на вкладу Dialogue Views. Всплывает окно Error а после Warrning
Ответ
Нужно зарегистрировать flowchartx32.dll в системе. Подробнее.
В: Как заставить NPC стоять в том месте, где мне нужно?
Ответ
DefaultStayAtCurrentLocation - это пакет с действием "где НПС находится в данный момент, там и будет стоять". При этом, движок практически никогда не ставит актёров на те точки, где они прописаны в редакторе, разброс до 10-15 метров.
Для точного положения НПС в нужном месте, надо давать свой пакет Travel на XMarkerHeading с радиусом желательно 32 (это 1/4 роста NPC).
В: Как заставить игрока пойти в заданное место, отключив управление?
Ответ
Если надо ГГ только дойти до маркера и всё, то тут сцена не нужна (сцена нужна будет, если потом должны произойти другие действия ГГ и/или каких-то НПС).
Для такого одноразового действия достаточно:
1. В своём квесте делается незаполненный алиас с Specific Reference и галочкой Optional.
2. На этот алиас вешается скрипт и пакет:
Пакет типа Travel с целью маркер (куда должен дойти ГГ).
Скрипт:
Package Property akCurrentPackage Auto ; пакет ГГ Travel
ReferenceAlias Property AliasPlayerTravel Auto ; ваш созданный алиас
; Quest Property myQuest Auto ; ваш созданный квест, для № стадии, если надо.
auto State StateDefault
Event OnTriggerEnter(ObjectReference akActionRef)
if akActionRef == Game.GetPlayer() && стадия квеста == № ; чтобы ГГ раньше времени не активировал действие
if Game.GetPlayer().IsInCombat()
Game.GetPlayer().StopCombatAlarm()
endif
Game.DisablePlayerControls()
Game.SetPlayerAIDriven()
AliasPlayerTravel.ForceRefTo(Game.GetPlayer())
AliasPlayerTravel.TryToEvaluatePackage()
gotoState("DoneState")
endif
EndEvent
endState
state DoneState
;
endState
4. Если надо, то добавить ещё условий и/или действий.
В: Как сделать автопереход к следующей стадии квеста при достижении определенного штрафа игрока в любом из владений?
Ответ
В квесте создать алиас игрока.
На алиас игрока повесить следующий скрипт:
;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
;----- StartQuestPlayerAliasSCRIPT.psc --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Scriptname StartQuestPlayerAliasSCRIPT extends ReferenceAlias ;- Скрипт на алиасе игрока
FormList Property CrimeFactionsList Auto ;- Список фракций (присвоить значение свойству в СК)
Event OnInit() ;- Событие вызывается при инициализации
if GetOwningQuest().GetStage() < 10 ;- Если стадия квеста < 10
RegisterForUpdate(60) ;- Для события OnUpdate устанавливаем запуск - каждые 60 секунд
EndIf
EndEvent
Event OnPlayerLoadGame() ;- Событие вызывается при загрузке игры
if GetOwningQuest().GetStage() < 10 ;- Если стадия квеста < 10
RegisterForUpdate(60) ;- Для события OnUpdate устанавливаем запуск - каждые 60 секунд
EndIf
EndEvent
Event OnUpdate() ;- Событие обновления (вызывается автоматически через заданный промежуток времени)
int iCount = CrimeFactionsList.GetSize() ;- Определяем количество фракций в форм-листе
int iGold = 0 ;- Счётчик награды за голову
While iCount > 0 ;- Цикл
iCount -= 1
iGold = iGold + (CrimeFactionsList.GetAt(iCount) as Faction).GetCrimeGold() ;- Подсчитываем общую награду за голову во всех фракциях
EndWhile
if iGold > 5000 ;- Если общая награда за голову больше 5000
GetOwningQuest().SetStage(10) ;- Устанавливаем стадию квеста
UnRegisterForUpdate() ;- Отключаем событие обновления
EndIf
EndEvent
;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Время обновления для процедуры OnUpdate() можно изменить, но нежелательно делать его слишком маленьким, чтобы излишне не загружать систему.
И не забыть присвоить в CK значение свойству CrimeFactionsList (можно в свойствах скрипта нажать [ Auto-Fill All ] и свойство назначится автоматически).
В: Как заставить NPC напасть на игрока после завершения диалога?
Ответ
Использовать в скрипте:
StartCombat(game.getplayer())
Вызывается от актера, который будет атаковать.
В: Как сделать так, чтобы после выполнения определенное количество раз каких-то действий, в игре что-нибудь произошло?
Ответ
Например: Игрок убил 15 волков, на экран вывелось сообщение "Убито 15 волков".
Сделать квест с запуском по событию Kill Actor Event, все галочки снять, сохранить.
Создать глобальную переменную типа Short, например aMyGlobalCountWolf.
Открыть квест, последнюю вкладку, добавить новый скрипт, например aPlayerKillWolfQuestScript. В него записать скрипт:
GlobalVariable Property aMyGlobalCountWolf auto
Event OnStoryKillActor(ObjectReference akVictim, ObjectReference akKiller, Location akLocation, int aiCrimeStatus, int aiRelationshipRank)
aMyGlobalCountWolf.SetValue(aMyGlobalCountWolf.value + 1)
if aMyGlobalCountWolf.value >= 15
Debug.Notification("Player killed 15 wolf")
; делаем необходимое
else
Stop()
endif
endEvent
Свойству aMyGlobalCountWolf назначить свою глобалку (можно просто нажать Auto-Fill). Сохранить.
Открыть раздел SM Event Node, далее Kill Actor Event. Там создать новый Quest Node, например aSMPlayerKillWolfQuest. В него создать\назначить свой квест. В Quest Node сделать два условия типа Event Data. Один на киллера (Killer) - Player, второй на жертву (Victim) - раса волка.
Всё сохранить.
Теперь при убийстве 15-го волка квест запустится и уже не выключится (и повторно не будет срабатывать), делать всё, что надо. В скрипте есть место для запуска нужных команд.
****
Все ID указаны как пример, можно делать свои какие угодно.
В: Как узнать, что Игрок посажен в тюрьму?
Ответ
В скрипте:
event OnStoryArrest()
В: Часто компаньоны имеют при себе лук, как от него избавиться?
Ответ
В разделе Items -> Weapon находим FollowerHuntingBow. Открываем и редактируем. Снимаем галочку Can't drop и отмечаем Playable. Так-же можно удалить стрелы. Items -> Ammo -> FollowerIronArrow отмечаем Playable.
Идем в раздел Character -> Quest. Находим и открываем DialogueFollower, переходим на вкладку Quest Aliases, редактируем Follower. В окне Alias Inventory удаляем все содержимое, а именно Лук Охотника и Стрелы.
Теперь Охотничий лук и Стрелы появятся в инвентаре напарника, их можно удалить раз и на всегда.
В: Как избавиться от наборов брони у компаньонов, выданных разработчиками?
Ответ
Первое, что нужно сделать, это в разделе Actors отыскать вашего напарника, например Лидия (HousecarlWhiterun). Затем в окне Inventory установить значение Default Outfit - NONE.
Далее переходим в раздел Quest и находим DialogueFollower. Открываем. Переходим на вкладку Scripts. Редактируем скрипт DialogueFollowerScript (правая кнопка мыши, Edit Source). Заменяем строку DismissedFollowerActor.SetPlayerTeammate(false) на DismissedFollowerActor.SetPlayerTeammate(true, false). Компилируем скрипт.
Теперь ваш напарник будет носить то, что вы ему предложите. (И он не будет шляться на людях в чем мать его родила).
В: Как сделать звук громче, если источником является выбранный NPC?
В: Как создать зависимость какой-либо переменной из GameSettings к примеру от уровня персонажа?
Ответ
Можно это сделать с SKSE:
1. Перк можно без условий.
2. В Perk Entries создать Entry Point - Activate с галочкой Run Immediately и условие PL GetLevel >= 3 && PL GetLevel < 5 (для следующего PL GetLevel >= 5 && PL GetLevel < 8 и т.д.)
3. Таких позиций делать согласно дискретности, если надо изменение на каждом уровне, то 100 позиций.
4. В графе Papyrus Fragment прописать нужные изменения, например Game.SetGameSettingInt("iMaxPlayerRunes", 5)
5. Далее перк даёте ГГ (если не для ГГ, то такое почти не имеет смысла)
Принцип такой: ведь ГГ постоянно что-нибудь активирует/трогает, и в этот момент в фоновом режиме происходит перезапись параметров согласно уровня ГГ.
Получается один перк и один скрипт.
* Функции SKSE:
Game.SetGameSettingInt(String setting, int value)
Game.SetGameSettingFloat(String setting, float value)
Game.SetGameSettingBool(String setting, bool value)
В: Как при активации лошади, вместо ее использования вызвать диалог?
Ответ
Можно сделать через перк.
1. Нужен квест (для диалога), в нём создаётся алиас типа Specific Reference с галочкой Optional.
2. Этому алиасу даётся пакет на разговор или делается сцена (зависит от потребностей и предпочтений автора).
3. Делается перк с Entry Point - Activate с галочками Run Immediately и Replace Default.
4. В графе Papyrus Fragment прописываешь команды akAlias.ForceRefTo(akTargetRef) и aScene.Start() (если нужна сцена), предварительно создав свойство алиас (akAlias) и инициализировав его.
5. В условиях Entry Point на вкдадке Perk Owner - PL GetSiting == 0 (чтобы ГГ смог слезть с лошади), на вкладке Target - Subject HasKeyword - ActorTypeHorse == 1 (чтобы перк работал только на лошадь).
По желанию автора делается нужный тип диалогов (пакет/сцена), где в финальной части прописывается команда akAlias.GetActorRef().Activate(Game.GetPlayer()) - для скрипта сцены, или akSpeaker.Activate(Game.GetPlayer()) - для скрипта диалога (akSpeaker - это свойство назначать не надо, оно присутствует в любом диалоговом скрипте по умолчанию и отдаёт референс говорящего.)
По окончании всего процесса желательно (но не обязательно) очистить алиас.
Чтобы любой конь мог говорить (и не только конь), надо сперва создать своего непися с нужным пипом голоса (это определяет, где будут лежать файлы озвучки). Далее в диалогах лошади в верхнем правом углу есть окошечко "Speaker:", вот там выбирается свой созданный непись, чьим голосом будет говорить конь.
Принцип работы: при активации коня запускается диалог (пакет/сцена) и по результатам (разрешили сесть или нет) срабатывает команда Activate или нет, если да, то ГГ садится на лошадь. При следующей активации (стандартная E) ГГ слезает с коня.
Это работает на любом коне.
В: Как изменить количество очков (мана\здоровье\сила) получаемых игроком при повышении уровня?
Ответ
Функция SKSE:
Game.SetGameSettingInt("iAVDhmsLevelup")
В: В меню (в том числе диалог) при использовании функции wait(), она не работает.
Ответ
Никогда не применяйте utility.Wait(1) в режиме меню(диалог - это меню), т.к. эта функция там не работает, она будет ждать окончания режима меню, и последующие за ней команды выполнятся только после выхода из меню. Если надо обязательно там сделать задержку, то Utility.WaitMenuMode().
В: Как приглушить, а потом вернуть громкость в исходное положение какой-либо музыке\звуку?
Ответ
AudioCategoryMUS.mute()
AudioCategoryMUS.unmute()
В: Можно ли изменять размер объекта через скрипт?
Ответ
Масштаб - SetScale(0.5) - в данном случае уменьшение в 2 раза.
Вспомогательные программы (TES5Edit, NifScope и др.)
В: Как назначить новый\изменить слот для нового оружия\брони
Ответ
В CreationKIt и NIF файле модели должны быть указаны одинаковые слоты.
30 \ 31 - слот шлема, 35 - слот амулета.
В: Как изменить дизайн главного меню игры?
Ответ
Все, без исключения, меню Скайрима сделаны вне игры, в виде флеш файлов swf. Вы можете увидеть их в папке Data\Interface или в сжатыми - Skyrim - Interface.bsa
Их можно, и успешно (например SkyUI) декодируют, а после редактирования обратно компилируют в флешки.
Декодирование - например Flash Decompiler Trillix
Компилирование - только Adobe Flash Professional не ниже 5-ой
В: При ретекстурировании эффекта пламени оно всё равно осталось оранжевым. (Правки в NifScope)
Ответ
Красным выделены ноды, в которых есть только одно - BSValueNode. У этих нод нету ни эффектов, ни текстур.
BSValueNode - это действительно кость, на которую в игре автоматически вешается нужны эффект. В BlockDetails к этому самому BSValueNode есть такой пункт, как Value в котором прописывается определённая цифра (в случае с заклинанием "Пламя" это цифры 5 и 34). Эти самые цифры обозначают Ноды, которые мы можем найти в Крейшен Ките в разделе AddOnNode
Ищем по индексам то, что нам нужно, копируем, изменяем индексы, ретекстурим, в нашем меше переписываем индексы на те, которые мы создали и всё - Пламя полностью ретекстурованно.