• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Изменение репутации для пользователя frodo01
frodo01Offline
Сообщение №2941
написано: 6 июля 2020, 20:05
| Отредактировано: frodo01 - 8 июля 2020, 09:51
Скрипт никак не хочет работать А так я хотел связать свой скрипт с чужим То есть в чужом скрипте проделывалось одно действие и мой скрипт срабатывал параллельно, вот и хотел ухватиться за анимацию
Здравствуйте, коллега Майпризм! К теме "Дверь, по прозвищу Зверь (вылет из поместий). Как Вы помните, из переписки ранеее по этой теме, мне тогда помогло грубое силовое решение. Я вынес внутренню дверь, соединявшую бывший вестибюль поместья, с главным залом, и вылеты прекратились. Но хотелось бы докопаться до причин. И я докопался! Многочисленные жалобы на форумах, на тот же баг, причем связанный именно с манекенами, привели к источнику конфликта. Им оказался скрипт манекенов МанекенАктиваторСкрипт. Подскажите, есть ли у Вас концептуальные идеи, о причине странной нелюбви модифицированных манекенов - к внутренней двери? Мод на манекены - не только их оживлял, превращая в анимированных людей, он ещё и запрещал им гулять свободно по всему поместью, и избавляться от надетой на них броньки. Интересно, в чём тут проблема, как это всё взаимосвязанно? Ваши подсказки, как всегда, сильно сэкономили бы мне время на дальнейший самостоятельный анализ и устранение проблемы. Заранее благодарен.
yakor77, не представляю себе, как манекены могут конфликтовать с дверью. В принципе, я делал мод на манекены, но достаточно давно https://modgames.net/load....0-22302 Он выложен для Skyrim SE, но скрипты от этого не должны зависеть. Кажется, я его встраивал и в другие свои моды, в том числе и под LE. Точно не помню, а разбираться сейчас нет времени, завтра я уже буду у подножия Эльбруса
Изменение репутации для пользователя yakor77
yakor77Offline
Сообщение №2944
написано: 23 июля 2020, 12:02
| Отредактировано: Multigone - 26 июля 2020, 19:19
Здравствуйте, Майпризм! Прежде всего, приятного, надежного и успешного Вам восхождения на Эльбрус! Что же касается манекенов, то тут простая логика. 1) Вылеты были при установленных модах на манекены, из-за двери, когда я дверь вынес, вылеты прекратились. 2) В сохранении, где старая ванильная дверь была на месте, после вычистки всех доп. модов по манекенам до ванили - вылеты так же прекратились. 3) Более нигде, кроме трёх поместий, конфликтов модов на манекены с помещениями - не было. Ни для ванильных помещений, ни для модовских. 4) Вывод: моды на манкены конфликтуют с дверьми поместий, и более - ни с чем. Причем конфликт шёл в части манекенных скриптов. То есть, имеется какой-то баг, именно в поместьях, и связанный именно с манекенами. В силу того, что ванильные манекены сильно забагованы и зело глюкавы (бродят по поместю, прячут одежду, и пр.), доп. моды на манекены - крайге необходимы. Отказаться от них не хочется. 5) Опять есть грубое силовое решение: вынести все манекены из всех поместий. В принципе, они мне там и не нужны. Скорее всего, я так и сделаю. Но всё же, интересно докопаться до причины, и написать патч. Неофициальные патчи от Бетесды - эту проблему не лечат. Так что, буду разбираться, это интересная логическая задачка. Но Ваши советы приму с благодарностью. Это экономит труд и время.
Добавлено (26 Июля 2020, 05:40) --------------------------------------------- Здравствуйте, коллега Майпризм! Продолжаю рассказывать о решении проблемы, связанной с вылетами в пеместьях, манекенами и дверьми. Как вернётесь из тпуска - продолжим беседу. Я локализовал данную проблему. Вылеты "обеспечивал" один-единственный хулиганский скрипт на манекены. Другие скрипты, от других модов, работают нормально, стабильно с игрой, и совместно между собой. Обзор по этим сторонним модамдам чуть позже. А пока расскажу про этого хулигана. Этот файл называется MannequinActivatorSCRIP.pex, размер файла 17065 байт, дата создания 04.10.2013. Привожу описание скрипта дословно и полностью. Сетевую ссылку не даю, здесь это нарушение, но гуглится на раз. "MannequinActivatorSCRIPT - скрипт взамен дефолтного скрипта манекена. Автор: AleksTirex
Возможности: 1. Манекен рассчитан на 32 слота одежды, поэтому можно собрать совершенно любой комплект одежды, всё будет зависеть от совместимости самой одежды. 2. На манекен можно так же надевать оружие и стрелы. 3. Стрелы будут экипироваться только при экипированном луке. 4. Скрипт поддерживает работу с SKSE, при этом он полностью работоспособен и без него. При использовании SKSE одежда меняется без задержек, как это на дефолте. Так же с SKSE манекен может использовать парное оружие с соответствующей анимацией. 5. Манекен имеет разные анимации, и боевую стойку тоже. Анимация выбирается в случайном порядке автоматически. Есть кнопка для сманы анимации. В режиме с оружием кнопка работает как переключение боевой стойки и стойки "вольно". 6. В режиме сника (скрытности) при активации манекена будет возможность менять расу манекена на несколько дефолтных рас. Т.к. ESP не используется, то названия сообщения и кнопок будут от основного режима. При этом средняя кнопка - выбор расы, при нажатии на неё в верхнем левом углу появится сообщение о выбранной расе, и окно/сообщение закроется. При следующем нажатии - следующая раса, и т.д. Левая кнопка - активация выбранной расы. После смены расы все дефолтые манекены будут этой расы. В случае удаления этого скрипта, надо ОБЯЗАТЕЛЬНО поменять расу манекена на дефолтную, т.к. смена расы - процесс необратимый и игра сама расу не вернёт, иначе манекены так и останутся с этой расой (в этом случае при первой же перезагрузке игры у манекенов появится проблема с отображением головы, это дефолтный баг игры, а данный скрипт умеет с этим багом бороться) 7. Поддерживаются манекены из модов и со своими собственными расами. 8. Это манекен, а не сундук для хранения вещей и не просто актёр, поэтому не стоит требовать и ждать, что и без того достаточно глючная анимация Скайрима отрабатывала с исключительной точностью.
Установка простая - положить файл скрипта в папку Scripts. В архиве имеется исходник, но для работы самого скрипта в игре он не нужен. Удаление: вернуть манекенам дефолтную расу, если её меняли, и удалить файл скрипта."
Вот с этим краксом-пексом, чтобы сделать фикс, я сейчас и разбираюсь. Потому, как этот скрипт - хорошо работает везде, но только за пределами домов трёх поместий.
Добавлено (26 Июля 2020, 05:47) --------------------------------------------- Чтобы наш разговор был предметным, привожу полный текст этого скрипта.
Scriptname MannequinActivatorSCRIPT extends Actor
import debug import utility import game
idle Property Pose01 Auto idle Property Pose02 Auto idle Property Pose03 Auto
Form Property ArmorSlot01 auto hidden Form Property ArmorSlot02 auto hidden Form Property ArmorSlot03 auto hidden Form Property ArmorSlot04 auto hidden Form Property ArmorSlot05 auto hidden Form Property ArmorSlot06 auto hidden Form Property ArmorSlot07 auto hidden Form Property ArmorSlot08 auto hidden Form Property ArmorSlot09 auto hidden Form Property ArmorSlot10 auto hidden
Form Property EmptySlot auto hidden
Message Property MannequinActivateMESSAGE Auto {Message that appears upon activating the mannequin}
Message Property MannequinArmorWeaponsMESSAGE Auto {Message that appears when you attempt to place a non-armor item}
int Property CurrentPose =1 Auto {The pose the Mannequin starts in, and is currently in. DEFAULT = 1}
;----------------;
Form[] kArmor
Race akBaseRace Form kWeapon Form kWeaponL Form kAmmo bool bAlertDone bool bAlert bool bNoMessage bool bSKSE int ihpc int iNewRace float fTime
;-----------------;
Event OnInit() if GetState() != "StateStart" gotoState("StateStart") endif endEvent
Event OnCellAttach() if GetState() != "StateDefault" gotoState("StateStart") endif endEvent
Event OnCellLoad() if GetState() != "StateDefault" gotoState("StateStart") endif endEvent
auto State StateStart
Event OnBeginState() ; Notification("Start New Script Mannequin!") gotoState("StateDefault") StartScript() EndEvent
Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) if akBaseItem as Armor if aiItemCount > 1 && akSourceContainer == GetPlayer() RemoveItem(akBaseItem, aiItemCount - 1, true, GetPlayer()) endif AddToArmorSlot(akBaseItem) elseif akBaseItem as Weapon if ValidWeapon(akBaseItem) if GetEquippedWeapon() == none kWeapon = akBaseItem EquipItem(akBaseItem) elseif GetEquippedWeapon(true) == none && ValidWeapon(GetEquippedWeapon()) kWeaponL = akBaseItem EquipItemEx(akBaseItem, 2) else if kWeapon RemoveItem(kWeapon, GetItemCount(kWeapon), true, GetPlayer()) endif kWeapon = akBaseItem EquipItem(akBaseItem) endif else if kWeapon RemoveItem(kWeapon, GetItemCount(kWeapon), true, GetPlayer()) kWeapon = none endif if kWeaponL RemoveItem(kWeaponL, GetItemCount(kWeaponL), true, GetPlayer()) kWeaponL = none endif kWeapon = akBaseItem EquipItem(akBaseItem) endif elseif akBaseItem as Ammo if kAmmo && kAmmo != akBaseItem UnequipItem(kAmmo) RemoveItem(kAmmo, GetItemCount(kAmmo), true, GetPlayer()) endif kAmmo = akBaseItem EquipCurrentWeapon(false) else MessageBox("This item not for a Mannequin.") RemoveItem(akBaseItem, aiItemCount, true, GetPlayer()) endif if bSKSE QueueNiNodeUpdate() endif endEvent
Event OnObjectUnequipped(Form akBaseObject, ObjectReference akReference) WaitMenuMode(0.2) if akBaseObject as Armor RemoveFromArmorSlot(akBaseObject) RemoveItem(akBaseObject, GetItemCount(akBaseObject), true, GetPlayer()) endif if akBaseObject as Weapon if akBaseObject != kWeapon && akBaseObject != kWeaponL RemoveItem(akBaseObject, GetItemCount(akBaseObject), true, GetPlayer()) endif endIf endEvent
Event OnObjectEquipped(Form akBaseObject, ObjectReference akReference) if akBaseObject as Weapon EquipCurrentWeapon(false) endIf endEvent
Event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer) if akBaseItem as Ammo EquipCurrentWeapon(false) EquipCurrentArmor() endIf if akBaseItem as Weapon EquipCurrentArmor() endIf endEvent
Event OnEndState() if bSKSE QueueNiNodeUpdate() endif endEvent
endState
Event OnAnimationEvent(ObjectReference akSource, string asEventName) if akSource == self if asEventName == "WeaponDraw" int iNext bAlert = false While (GetAnimationVariableBool("IsEquipping") || GetAnimationVariableBool("IsUnequipping")) && iNext < 45 Wait(0.1) iNext += 1 endWhile if !GetAnimationVariableBool("IsEquipping") && !GetAnimationVariableBool("IsUnequipping") EnableAI(false) endif endif if asEventName == "Unequip_Out" || asEventName == "Magic_UnEquip_Out" int iNext bAlert = false While (GetAnimationVariableBool("IsEquipping") || GetAnimationVariableBool("IsUnequipping")) && iNext < 40 Wait(0.1) iNext += 1 endWhile if !GetAnimationVariableBool("IsEquipping") && !GetAnimationVariableBool("IsUnequipping") EnableAI(false) endif endif endIf endEvent
;-----------------;
Function RegisterAnimation() RegisterForAnimationEvent(self, "WeaponDraw") RegisterForAnimationEvent(self, "Unequip_Out") RegisterForAnimationEvent(self, "Magic_UnEquip_Out") endFunction
Function PlayDefaultPose() if CurrentPose == 1 PlayIdle(Pose01) elseif CurrentPose == 2 PlayIdle(Pose02) elseif CurrentPose == 3 PlayIdle(Pose03) endif endFunction
Function EquipCurrentArmor() int index While index < 32 if kArmor [index]!= none Form kArmorTemp = kArmor [index]if GetItemCount(kArmorTemp) if !IsEquipped(kArmorTemp) EquipItem(kArmorTemp) endif else kArmor [index]= none endif endif index += 1 endWhile if bSKSE QueueNiNodeUpdate() endif endFunction
Function EquipCurrentWeapon(bool bWP = true) if kAmmo if GetItemCount(kAmmo) if !IsEquipped(kAmmo) && GetEquippedItemType(1) == 7 EquipItem(kAmmo) elseif IsEquipped(kAmmo) && GetEquippedItemType(1) != 7 UnequipItem(kAmmo) endif endif endif if kWeapon && bWP if GetItemCount(kWeapon) if !IsEquipped(kWeapon) EquipItem(kWeapon) endif else kWeapon = none endif endif if kWeaponL && bWP && IsEquipped(kWeapon) if GetItemCount(kWeaponL) if !IsEquipped(kWeaponL) && ValidWeapon(kWeaponL) EquipItemEx(kWeaponL, 2) endif else kWeaponL = none endif endif endFunction
bool Function ValidWeapon(Form akItem) bool bValid if bSKSE && akItem as Weapon if (akItem as Weapon).GetWeaponType() >= 1 && (akItem as Weapon).GetWeaponType() < 5 bValid = true endif endif return bValid endFunction
Function AddToArmorSlot(Form akBaseItem) int index = 0 if akBaseItem as Armor index = kArmor.Find(none) if index > -1 kArmor [index]= akBaseItem EquipItem(akBaseItem) else RemoveItem(akBaseItem, 1, true, GetPlayer()) Notification("Inventar is Full, no empty clote!") endif endif endFunction
Function RemoveFromArmorSlot(Form akBaseItem) int index = kArmor.Find(akBaseItem) if index > -1 kArmor [index]= none endif endFunction
Function RemoveEmptySlot() int index While index < 32 if kArmor [index]!= none if !IsEquipped(kArmor[index]) kArmor [index]= none endif endif index += 1 endWhile endFunction
Function FindRace() if bNoMessage == false MessageBox("В режиме 'сник' менется раса манекена. 'Средняя кнопка' - выбор расы, её название в верхем левом углу. При каждом нажатии кнопки меняется выбор расы и окно закрывается. 'Левая кнопка' - старт замены на выбранную расу. 'Правая кнопка' - отмена." ) bNoMessage = true endif int buttonPressed = MannequinActivateMESSAGE.Show() if buttonPressed == 0 ChengRace() elseif buttonPressed == 1 iNewRace += 1 if iNewRace == 1 Notification("Manakin Race") elseif iNewRace == 2 Notification("Nord Race") elseif iNewRace == 3 Notification("Orc Race") elseif iNewRace == 4 Notification("Argonian Race") elseif iNewRace == 5 Notification("Khajiit Race") elseif iNewRace == 6 Notification("HighElf Race") elseif iNewRace == 7 Notification("Imperial Race") else Notification("Default Race") iNewRace = 0 endif endif endFunction
Function ChengRace() Race akNewRace if iNewRace == 1 akNewRace = GetFormFromFile(0x0010760A, "Skyrim.esm") as Race elseif iNewRace == 2 akNewRace = GetFormFromFile(0x00013746, "Skyrim.esm") as Race elseif iNewRace == 3 akNewRace = GetFormFromFile(0x00013747, "Skyrim.esm") as Race elseif iNewRace == 4 akNewRace = GetFormFromFile(0x00013740, "Skyrim.esm") as Race elseif iNewRace == 5 akNewRace = GetFormFromFile(0x00013745, "Skyrim.esm") as Race elseif iNewRace == 6 akNewRace = GetFormFromFile(0x00013743, "Skyrim.esm") as Race elseif iNewRace == 7 akNewRace = GetFormFromFile(0x00013744, "Skyrim.esm") as Race else akNewRace = akBaseRace Notification("Current my Default Race") endif if akNewRace UnequipAll() RemoveEmptySlot() kWeapon = none SetRace(akNewRace) AllowPCDialogue(false) HeadReset() EnableAI() Wait(0.3) EnableAI(false) endif endFunction
Function HeadReset() if GetRace() != akBaseRace Race akCurrentRace = GetRace() Race akTempRace = GetFormFromFile(0x00013748, "Skyrim.esm") as Race Wait(0.1) if akTempRace SetRace(akTempRace) endif Wait(0.1) SetRace(akCurrentRace) Wait(0.1) SetRace(akCurrentRace) endif endFunction
Здравствуйте, форумчане! Возникла проблема с отладкой скрипта. Мне нужно, чтобы после создания ObjectReference в мире, его RefID (а-ля 4201B14D) отобразился на экране. Следующая команда:
Код
Debug.Notification(myRef)
выводит мне такой текст: "[ObjectReference". Аналогично и с NPC: "[Actor". Как отобразить RefID предмета, также как в консоли при выборе? Edit 1: Нашел причину, символ "<" перед самим RefID, но по прежнему не знаю решение. Edit 2: MessageBox решил проблему, хотя это и дико неудобный способ
И вторая проблема, которую я как раз пытаюсь отладить. Выброшенный и перемещенный командами
объект не виден в игре (пробовал на книгах и парагонах, скрипт размещен на NPC, которому я через GiftMenu передаю этот предмет). Может быть кто-то знает в чем дело? Edit 2: Когда заменил подсчет нужных координат непосредственно в вызове функции на переменные, содержащие посчитанные перед вызовом координаты, всё стало нормально. До этого предмет оказывался за пределами досягаемой области локации (было видно, но долететь было нельзя, телепортировало обратно). В общем какой-то бред с этим Папирусом Edit 3: Снова то же самое. Ошибка была вообще в чем-то другом, пересоздал скрипт и персонажа, на котором он висит. Теперь всё работает, хотя скопировал текст в точности с того скрипта
В общем, может кому-то поможет тоже
Изменение репутации для пользователя yakor77
yakor77Offline
Сообщение №2946
написано: 28 июля 2020, 00:08
| Отредактировано: yakor77 - 28 июля 2020, 01:00
Здравствуйте, Андрей! Вы просите помочь: [quote=Andrey059918;1336689]Мне нужно, чтобы после создания ObjectReference в мире, его RefID (а-ля 4201B14D) отобразился на экране.[/quote] Согласен, видеть ID сразу, без заморочек с inv и сундуками - было бы очень удобно. В стиле "Капитана Очевидность", предлагаю простое, грубое, надежное, но... очень скучное и трудоёмкое решение. Ручками, в редакторе Tes5Edit, для каждой позиции номенклатуры, прописываем ID, сразу после первого значимого слова названия этой позиции. Например: "Даэдрическая булава 000139b8". Чтобы не было так скучно, можно, под Виндовз, написать простой макрос, цикл "Пока", который берет в редакторе ID, и добавляет его в номенклатуру, по всем строчкам базы данных, пока не закончатся все позиции в списке. Почему в конец названия? Чтобы не нарушить алфавитный порядок сортировки в редакторе (я обычно юзаю расширенный UI редактор). Да, файлы игры частично перестанут быть совместимыми, станут уникальными. Но ведь Вы же играете - для себя? Зачем Вам эта "совместимость"? Есть решение более изящное, но тоже трудоемкое. Изменить скрипт редактора UI. Добавить в него колонку с ID. Но это надо глубоко изучить скрит данного редактора, лично мне лениво и некогда это делать.
[b]Добавлено[/b] (28 Июля 2020, 03:39) --------------------------------------------- Здравствуйте, коллега Майпризм! Продолжаю рассказывать о решении проблемы, связанной с вылетами в поместьях, манекенами и дверьми. Роясь в мусорном ящике Инета (в мусорном, ибо форумы - засраны срачами), наткнулся на коммент по данному скрипту, на который ранее - не обращал внимания. Он оказался очень любопытен. Во-первых, не мне одному данный скрипт причинял вылеты. А, во-вторых, автор коммента, возможно, эмпирически нащщупал причину вылетов.
Цитирую коммент дословно. "Roiloor 25.11.2015 18:03 Очень не рекомендую этот скрипт, потому-что лично я очень пожелел, т.к. у меня данный скрипт вызывал стабильный вылет игры при входе в дом и даже город после покупки первого дома в Маркарте и Рифте и, видимо любого другого ванильного дома с манекенами (на НЕ ванильных проблемы не было), в конфигурации: лиц. Скайрим, последней версии, последний оф. апдейт, Неоф. патч, позапрошлая версия, вроде. Предыдущие версии SKSE и SkyUI. Довольно долго мучился ища причину, хорошо Интернет помог, ато никогда на него ни подумал бы. После удаления скрипта вылеты прекратились сразу-же, больше его не ставил, с новыми версиями примочек не тестил. Не знаю хотя, для кого я это пишу- стараюсь, может это только у меня так было? Ну может кому-то пригодится, если такие-же проблемы будут. Или, может Alex пофиксит что-то, хотя теперь уж навряд-ли." И, далее, "Roiloor 02.12.2015 16:32 Вообщем так... Потестил я тут на днях с дефолтным чистым конфигом и со своим, на: Skyrim ver. 1.9.32 лиц., последний офф. апдейт, SKSE 1.7.03, Не-офф. патч 2.1.3a. Вылетает он, видимо, только при первом входе в дом, после покупки ванильного дома с манекенами. Возможно это связано с ванильными скриптами, которые выполняются при первом входе в ванильные дома. Так-что, если у кого тоже вылетает так, сначала прикупите ванильный дом/дома, которые хотели, войдите в них, потыркайте там манекен, можете дать ему что-нибудь, сохранитесь, а потом уже ставьте скрипт. А если будете потом еще докупать ванильные дома, то удалите временно скрипт, перед покупкой. Можете, на всякий случай, забрать свои вещички со всех манекенов перед этим, если, вдруг, что пропадет, хотя, вроде, не должно, проверьте сразу. Кстати, этот скрипт не позволяет менять пол манекена. ( Просто потому, что в игре нет женской модели манекена. Спасибо Беседке.. Блин, хочу манекены из белого мрамора, как античные статуи чтоб такие были, где есть такие а, подскажите кто-нить, ато уж больно в Скайриме манекены эти деревянные страшные, особенно рожи их."
Что из этого для меня следует? 1) Да, у меня этот скрипт уже стоял, когда я начал строить новые дома в поместьях. Сейчас они так обставлены и наполнены вручную, что крайне лениво начинать всё сначала. 2) И, да, проблема с ванильными манекенами в поместьях - реальна. Я сейчас перепробовал с десяток сторонних модов на манекены. Текстуры и меши они прописывают, но... деревянные тупые рожи ванильных манекенов, как и их мужской пол - как были, так и остаются. Со сторонними модами - всё норм, там всё меняется.
Есть гипотеза. Что дверь - была только активатором. (Каким образом? Как только заканчивалась постройка вестибюля, он же малый дом, а заканчивалась она именно с установкой двери - сразу после этого активировались скрипты на ванильные манекены, как и всякое другое наполнение поместья через верстаки.) И что проблема была не в двери, как таковой, а в ванильных манекенах поместья. (Или, возможно, дверь обеспечивала вылеты независимо от проблемы с манекенами, сама по себе, как вторая причина, пока не знаю.) Задача самому себе мною же изменена: найти, где именно ванильный скрипт на постройку поместий - жёстко прописывает ванильные манекены, и изменить его. Самое простое и грубое решение - удалить нафиг вообще установку всяких манекенов в поместья, из этого ванильного скрипта. Тружусь...
Здравствуйте, Непевка! Вы пишете, цитирую: [quote=nepewka;1336721]День добрый, есть кто живой ? Нужна помощь по адаптации мода https://www.nexusmods.com/skyrim/mods/60750 а конкретно скрипта в нём готов кто помочь ? не за бесплатно[/quote] конец цитаты. Посмотрел я по Вашей ссылке этот мод на Нексусе. Мультимагический разрушительный мод, с использованием трёх вспомогательных шаров, для стрельбы заклинаниями. Так в чём конкретно у Вас с ним проблема? Чего Вы хотите от скрипта? Поподробнее, плиз.
Вот мне интересно, чо будет, если непешка реально во всех подробностях расскажет якорю, чего хочет от мода. Якор-то ничего сделать не может. Либо притворится, что ушел, либо задвинет длинную бесполезную философскую речь, в которой между любой парой строк будет видно, что он нифига не шарит в вопросе.
Изменение репутации для пользователя myav
myavOffline
Сообщение №2951
написано: 4 августа 2020, 11:03
| Отредактировано: myav - 4 августа 2020, 11:28
Всем хай. Смотрю, у вас тут как всегда))) философские толкания мыслей от якоря)
Ладно, я не из-за этого сюда зашел.
В общем, 4 месяца я делал огромный ИИ мод под стелларис, всё сделал, всё работает, выложил. И для себя пришел к выводу, что менять ИИ в скайриме это самый сложный моддинг :-Р а всё остальное - в разы проще (так как - там всё просто и работает. А тут - не хочет работать и всё).
Я столкнулся с очередной "непонятной" проблемой. Может кому-то будет не лень догадаться и помочь.
В общем, у меня есть функция которая проверяет имя НПС. А потом вторая функция берет базу НПС + имя и меняет имя, если баба)
И я столкнулся с проблемой...
Если призвать НПС через консоль player.placeatme (код НПС)
То всё работает, игра распознает что бандит, распознает что баба и меняет имя на женское. Например: меняет бандит на бандитка.
Но если я встречаю этого же бандита в игре - игра распознает что это бандит, распознает имя, но НЕ распознает секс (баба или мужик).
Может кто-то сталкивался с этим ?
OneffectStart .... CheckWho() ....
Код
Function CheckWho () ActorBase UCM_TempBase = selfactor.GetActorBase() string TempName=selfactor.GetDisplayName() int MySex = UCM_TempBase.GetSex() if(selfactor.IsInFaction(BanditFaction)) CheckName() debug.notification("checkname launched")
if (FinalName=="-63z-32z-19z-28z-24z-14z0z0z0z0z0z0") debug.notification("bandit detected, now check sex") if MySex == 1 debug.notification("sex female detected and name changed") TempName="Бандитка" else debug.notification("sex female NOT detected") endif
Если я призываю через консоль то всё всегда работает и получаю сообщения:
checkname launched bandit detected, now check sex sex female detected and name changed
Но если я встречаю этих же бандитов где угодно в мире, я получаю сообщения:
checkname launched bandit detected, now check sex sex female NOT detected
Они что.. БЕЗПОЛЫЕ ? :-Р
Или я не учел какой-то прикол ? Помогите кто знает, что не так с актор.базой в мире, и почему всё работает через консоль.
myav, секс персонажа может не соответствовать базовому актёру. В игре часто (и особенно у бандитов) базовый актёр является мужиком, который служит заготовкой для ряда левельных актёров, часть их которых становятся женщинами. Твой код проверяет пол базового актёра и он, естественно, оказывается мужиком.
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №2953
написано: 5 августа 2020, 08:08
| Отредактировано: Dsion - 5 августа 2020, 08:58
Доброго дня. Подскажите пожалуйста, усли у меня есть стадия квеста, которую можно получить в любой момент, подобрав определенный предмет, как должен выглядеть скрипт, который выяснит текущую задачу и закроет именно ее? Спамить десять строк objectivecomplete не хочется, но кроме того, что в скрипте должна быть функция getstage больше ничего в голову не приходит.
Ezalor, ну, если при перемещении предмета в инвентарь игрока текущая задача квеста должна быть завершена, и при условии, что CompleteAllObjectives() завершает только отображенные сейчас задачи (эт я не знаю), то вот:
Код
Scriptname _TESTTEST61 Extends ObjectReference ; На базовую форму или референс предмета.
Quest Property MyQuest Auto ; Заполнить своим квестом.
EVENT OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer) IF akNewContainer == Game.GetPlayer() GoToState("Stopped") ; Для базовой формы перевод в пустое состояние, предотвращающее повторные срабатывания события, может не работать. MyQuest.CompleteAllObjectives() ENDIF ENDEVENT
STATE Stopped EVENT OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer) ENDEVENT ENDSTATE
Вариант, если это квестовый предмет и он принадлежит этому же квесту:
Код
Scriptname _TESTTEST61 Extends ReferenceAlias ; На алиас предмета.
Myprism, Dsion спс что направили мой взор в нужную сторону. Я про эти leveled списки вообще забыл. GetLeveledActorBase() - сегодня тестил - работает, правда иногда попадаются бандиты которых даже такое не берет и мои дебуг сообщения не могут определить кого встретили (может еще один lvl-список внутри списка).
Ezalor, а создать переменную temp и автоматом её менять после каждой выполненной задачи? И чтобы выяснить стадию, просто чекнуть temp.
Изменение репутации для пользователя Ezalor
EzalorOffline
Сообщение №2957
написано: 6 августа 2020, 00:30
| Отредактировано: Ezalor - 6 августа 2020, 00:38
Multigone, честно говоря, вариант для новичка страшный и непонятный, к тому же я нашел уже более простой, но все равно большое спасибо) И к слову об остановке события, для меня это как раз стало актуально. Если мне нужно чтобы скрипт на контейнере сработал только один раз, хотя сам контейнер можно открывать на разных стадиях (скрипт активирует 10 разных стадий в зависимости от текущей), его можно заморозить после срабатывания через state stopped? Или я не так понимаю принцип работы функции?
Майпризм, с благополучным возвращением с гор! А я тут трудился над манекенами. Проверил очередное "самое простое и грубое решение". Слил, в Тес5Едит, все три поместья, точнее, их моды- модификаторы (стены, двор, подвалы, охрана, манекены, и пр.) - в единый файл. Все ID при этом поменялись (естественно, кроме ванильных). Скайрим стал воспринимать поместья, как единый сторонний мод, типа подвала. Ну а в стороннем моде - модификация манекенов всегда проходила успешно. Ну, и сейчас прошла. Ванильных деревянных рож у манекенов - больше нет, стоят нормальные голые мужики. Не вылетает. Всё хорошо. (Но пришлось после этого поработать ручками, перенастроить внутреннее убранство, позаполнять сундуки барахлом, поодевать манекены и слуг, и пр. рутиннная работа.)
С уважением. Маг Иридий.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №2959
написано: 6 августа 2020, 08:49
| Отредактировано: Multigone - 6 августа 2020, 09:03
Ezalor, STATE дает возможность создавать несколько версий событий или функций. В одном скрипте может быть множество STATE с произвольными именами. GoToState() переводит скрипт в указанное. По умолчанию любой скрипт стартует в пустом STATE (объявлять это состояние не нужно, перевод в него осуществляется так: GoToState(""), события и функции в пустом состоянии являются основными и работают всегда, если в текущем-не-пустом состоянии нет их версий). Чтобы исключить к.-л. событие из работы, нужно в текущем-не-пустом состоянии указать такое же событие, в котором ничего нет). Без команды скрипт состояние не меняет. Состояние записывается в сохранении.
Пример:
Код
; Пустое состояние по умолчанию.
EVENT MyEvent_1() ; Код 1. ENDEVENT
EVENT MyEvent_2() ; Код 2. ENDEVENT
FUNCTION MyFun_1() ; Код 3. ENDFUNCTION
FUNCTION MyFun_2() ; Код 4. ENDFUNCTION
; В этом состоянии будут работать MyEvent_2 (Код 2), MyFun_1 (Код 3), MyFun_2 (Код 4), MyEvent_1 (Код 10) STATE MyState_1 EVENT MyEvent_1() ; Код 10. ENDEVENT ENDSTATE
; В этом состоянии будут работать MyEvent_2 (Код 2), MyFun_2 (Код 4), MyEvent_1 (пусто), MyFun_1 (пусто) STATE MyState_2 EVENT MyEvent_1() ENDEVENT
FUNCTION MyFun_1() ENDFUNCTION ENDSTATE
; В этом состоянии будут работать MyEvent_1 (Код 1), MyEvent_2 (Код 2), MyEvent_3 (Код 5), MyFun_1 (Код 3), MyFun_2 (Код 4) STATE MyState_3 EVENT MyEvent_3() ; Код 5. ENDEVENT ENDSTATE
; В этом состоянии будет работать все из пустого, при входе в это состояние сработает код 6, при выходе из него сработает код 7. STATE MyState_4 EVENT OnBeginState() ; Код 6. ENDEVENT
EVENT OnEndState() ; Код 7. ENDEVENT ENDSTATE
; Auto переводит скрипт в это состояние при старте скрипта. STATE MyState_5 Auto ENDSTATE
Событие OnUpdate() имеет баг, поэтому его можно использовать только в пустом состоянии. Если его надо использовать в нескольких состояниях, делать так:
Код
EVENT OnUpdate() MyFun_3() ENDEVENT
FUNCTION MyFun_3() ; Код 100. ENDFUNCTION
STATE MyState_101 FUNCTION MyFun_3() ; Код 101. ENDFUNCTION ENDSTATE
STATE MyState_102 FUNCTION MyFun_3() ; Код 102. ENDFUNCTION ENDSTATE
Функции, объявляемые в скрипте, прежде всего должны иметь версию в пустом состоянии, и опционально - в других, но не наоборот.
Вместо состояний можно пользоваться переменными, чтобы определять пути выполнения кода, это более гибкий способ, но и более громоздкий / ресурсоемкий.
Код
Int iSwitch = 0
EVENT OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer) IF iSwitch == 0 iSwitch = 1 ; Код 1 ELSEIF iSwitch == 1 iSwitch = 2 ; Код 2 ELSEIF iSwitch == 2 iSwitch = 3 ; Код 3 ELSE iSwitch = 0 ; Код 4 ENDIF ENDEVENT
Изменение репутации для пользователя myav
myavOffline
Сообщение №2960
написано: 6 августа 2020, 11:18
| Отредактировано: myav - 6 августа 2020, 11:33
Закончил с бандитами... Перешел к волкам, и снова проблема.
Я реализовал, что каждый волк во время effect start кастует на себя спел с радиусом поражения (чтобы задело всех остальных волков рядом), чтобы определить сам волк или не сам
Код
Event OnEffectStart (...) UCM_Wolf_Pack_Spell.Cast(selfactor as objectreference, selfactor as objectreference) debug.notification("Pack Casted") ....
if (akSource As Spell) debug.notification("ONHIT spell detected") if !(akSource As Spell).IsHostile() if (akSource As Spell).GetNthEffectMagicEffect(0) == UCM_Wolf_Pack debug.notification("ONHIT pack detected") ....
и не проходит хит даже не появляется надпись ONHIT spell detected... 2 волка 3 волка.. сколько бы их не было. Друг друга не задевают спелом, чтобы прошел OnHit. Хоть радиус поражения 15 метров.
Пишет дебуг сообщение что спел кастонут, но что хит прилетел - не пишет.
Я пробовал менять stagger архетип на другие варианты (включая скрипт), пробовал ставить галочку не recovery, пробовал добавить magnitude. Но OnHit не регистрирует даже сам по себе (в spell.cast я же указал как цель selfactor as objectreference)
Onhit aksource as spell не проходит, хоть убей...
Опять я что-то упускаю... Если кто-то заметит что именно - хелп плз. Что нужно поменять чтобы onhit зарегистрировался по всем волками, без нанесения урона (если с уроном то всё просто, я бы просто скопировал любой эффект FFAimedArea).
Изменение репутации для пользователя Ezalor
EzalorOffline
Сообщение №2961
написано: 6 августа 2020, 15:36
| Отредактировано: Multigone - 10 августа 2020, 14:28
Ezalor, добавь Debug.MessageBox("Текст") в нужные строки и посмотри результат.
myav,
1) Area < 15 в игре не работает.
2) Эффект Self с действием по площади работает только для других целей, но не для источника. Если нужно и для источника, в заклинании должно быть 2 эффекта: Self - Area и Self без Area.
3) Area в СК не всегда включается с первого раза (т.е. все вроде как сделано, но в игре нет). Попробуй так: после того, как эффект настроен и добавлен в заклинание, сними флаг AutoCalculate, сохрани, поставь, сохрани.
и цель заклинания (delivery) не "self" а "on target". Или ты про что-то другое говоришь ?
Там в русифицированной версии есть несколько "на цель", тогда как в англ. все четко и понятно. К тому же ты пишешь "кастует на себя спел". Ну ладно, неважно, в любом случае, п.2) относится не только к Self, а вообще к любому типу доставки, включая Target Actor (я прост подзабыл, ща проверил). Переделывай. Не забудь про п.3).
Здравствуйте. Существует ли скриптовая команда, с помощью которой можно проверить количество одних и тех маг. эффектов на цели ? К примеру скастовал на цель 3 заклинания с мгновенным уроном и каким-то уроном на 5 сек например. Все эти 5 сек на цели будут висеть 3 одинаковых маг эффекта. Как скриптом сделать проверку на них в количестве 3 ?
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №2967
написано: 25 августа 2020, 12:59
| Отредактировано: Multigone - 27 августа 2020, 11:37
nepewka, если это неизвестные эффекты, то никак. Если это твой эффект, при старте даешь актеру неигровой предмет, при финише удаляешь его. Кол-во предметов у актера в опред. момент времени равно кол-ву навешенных на него эффектов. Если несколько актеров в один промежуток времени не проверяются, вместо предмета использовать переменную.
Спасибо А если идти от обратного, я могу же использовать способ с предметами и на уникальных актёрах ? Вообщем выдал я в скрипте маг.эффекта тагрету предметы, какой командой сделать проверку на количество этих N предметов?
Добрый день, уважаемы мастера, помогите пожалуйста с такой проблемой. Хочу сделать так чтобы при испитии зелья у моего ГГ менялся цвет глаз и добавилось несколько пассивных эффектов. Можете подсказать как это сделать?
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)