Добро пожаловать в сборник готовых вопросов и ответов к ним. Многие вещи, которые Вы здесь увидите в сущности своей могут являться детским лепетом на полянке, банальщиной, а еще ценной информацией, особенно для новичков, в той или иной сфере модостроения. Хотя и старичкам порой полезно узнать что-нибудь новенькое. Что не пишется, то к лучшему.
Использовать эту маленькую программку. Совместима с ХР и Win7. (Не знаю как на других осях). Прикручивает окошко для скроллинга сбоку экрана в случаях, когда появляется негабаритное окно.
При начале работы, во время выбора подключаемых файлов, нажать "set as active file" после выбора своего файла.
В:Какскрытьмешающиеобъектывокнерендера?
Ответ
Выделить нужные объекты (для выделения нескольких удерживать Ctrl) и нажать клавишу с цифрой 1 (единожды для создания "прозрачности", дважды для полного сокрытия объектов).
Обратная визуализация либо через перезагрузку локации на F5, либо через Alt + 1.
Слишком много текстур для одной ячейки, каждая ячейка имеет ограничение в 6 текстур, нажмите I при редактирование и удалите лишние текстуры из квадрата(ов).
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%, стоит по умолчанию на нормальном уровне сложности.
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 ] и свойство назначится автоматически).
Например: Игрок убил 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 указаны как пример, можно делать свои какие угодно.
В разделе 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). Компилируем скрипт.
Теперь ваш напарник будет носить то, что вы ему предложите. (И он не будет шляться на людях в чем мать его родила).
Можно это сделать с 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) ГГ слезает с коня.
Это работает на любом коне.
Никогда не применяйте utility.Wait(1) в режиме меню(диалог - это меню), т.к. эта функция там не работает, она будет ждать окончания режима меню, и последующие за ней команды выполнятся только после выхода из меню. Если надо обязательно там сделать задержку, то Utility.WaitMenuMode().
В CreationKIt и NIF файле модели должны быть указаны одинаковые слоты.
30 \ 31 - слот шлема, 35 - слот амулета.
В:Какизменитьдизайнглавногоменюигры?
Ответ
Все, без исключения, меню Скайрима сделаны вне игры, в виде флеш файлов swf. Вы можете увидеть их в папке Data\Interface или в сжатыми - Skyrim - Interface.bsa
Их можно, и успешно (например SkyUI) декодируют, а после редактирования обратно компилируют в флешки.
Декодирование - например Flash Decompiler Trillix
Компилирование - только Adobe Flash Professional не ниже 5-ой
Красным выделены ноды, в которых есть только одно - BSValueNode. У этих нод нету ни эффектов, ни текстур.
BSValueNode - это действительно кость, на которую в игре автоматически вешается нужны эффект. В BlockDetails к этому самому BSValueNode есть такой пункт, как Value в котором прописывается определённая цифра (в случае с заклинанием "Пламя" это цифры 5 и 34). Эти самые цифры обозначают Ноды, которые мы можем найти в Крейшен Ките в разделе AddOnNode
Ищем по индексам то, что нам нужно, копируем, изменяем индексы, ретекстурим, в нашем меше переписываем индексы на те, которые мы создали и всё - Пламя полностью ретекстурованно.