nepewka, формально да. Но маркер, создающий заклинание, располагается высоко в небе. В подземельях он будет выше потолка, в результате метеорит никуда не прилетит. Ну, мне так кажется.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №752
| Тема: Вопросы по скриптам Papyrus
написано: 30 июля 2016, 15:47
| Отредактировано: Multigone - 23 апреля 2020, 15:12
Нарада, если перк только для игрока, то можно выдать через маг. эффект (Perk to apply), можно скриптом в любом месте (Game.GetPlayer().AddPerk(MyPerk)).
Нарада, при каждой активации чего угодно будет обрабатываться скрипт. Если скрипт пустой, то никакого контекстного действия при нажатии кнопки активации не будет происходить.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №756
| Тема: Вопросы по скриптам Papyrus
написано: 1 августа 2016, 10:11
| Отредактировано: Multigone - 1 августа 2016, 10:18
взрыв ведь вызвать можно через placeatme, а заклинание ?
Не понял вопрос - заклинание что? Взрыв может существовать сам по себе, а заклинание может только накладываться на актеров. Способ, которым оно будет доставлено актеру, зависит от его типа. Как частный случай, можно выбрать снаряд.
idle property IdlePickup_ground auto miscobject property IgnotGold auto int property count = 8 auto int property myresourceCount = 8 auto bool property dayly = true auto int property multiRes = 8 auto int property multHour = 24 auto String property String01="Вы забрали" auto String property String02=" золотых слитков. Готово к отправке еще " auto String property Warning="Шахтеры еще не добыли достаточно руды для переплавки, вернитесь позже." auto int count01 int hours
nepewka, а что нужно-то? Чтобы объект творил заклинание? Если в Cast() не указать цель, объект-не-актер должен стрелять заклинанием Aimed куда-то в одну точку (думаю, по направлению одной из его осей). Чтобы указать цель, нужно знать ее референс. В маг. эффекте это может быть Caster \ Target, в др. скрипте - по обстоятельствам, смотря, какие задачи требуются от объекта. Цель можно найти через Find(), GetCombatTarget(), ну и через прочие функции, способные вернуть Actor или ObjectReference.
nepewka, кому, как не тебе, знать, что требуется от твоего мода. Но раз просишь подсказать "что-нибудь", вот эти идеи реализовывал в тестовом "фейерверке":
- объект стреляет снарядами в произвольном направлении, но не ниже плоскости горизонта. - объект стреляет снарядами, первый снаряд направлен вертикально вверх, затем угол Z плавно уменьшается, а снаряды летят все более полого (по кругу). Получается, как будто он раскручивается. Последние снаряды летят горизонтально. Процесс можно обратить в др. сторону.
Одновременно снаряды не могут вылетать, для обработки каждого следующего направления требуется время порядка 0.1 с.
nepewka, подозреваю, частично это зависит от вычислительной мощности процессора. Если создать одновременно много объектов с тяжелыми скриптами на них, обработка каждой копии должна быть замедлена. Я не знаю, короче. Умозрительные выводы бывают ошибочны.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №760
| Тема: Вопросы по скриптам Papyrus
написано: 2 августа 2016, 11:12
| Отредактировано: Multigone - 3 августа 2016, 07:03
Myprism, ничего не произойдет. По-моему, даже рецепт не появится в списке. Я пробовал.
DarkVetal, вот примерная версия для присоединения к фальшивому misc-объекту, который указать в качестве результата крафта по рецепту. Для каждого рецепта, дающего несколько предметов, нужно делать новый misc. Их можно называть "разбор такого-то предмета" или как-нибудь еще.
Код
Scriptname _TESTTEST14 extends ObjectReference ; Крафт нескольких разных предметов. Заполняются только нужные переменные.
MiscObject Property myBase Auto ; Базовая форма, к которой прикреплен этот скрипт. Заполняется всегда.
Potion Property ToAddPotion1 Auto ; Получаемые зелья. Potion Property ToAddPotion2 Auto Potion Property ToAddPotion3 Auto
Ingredient Property ToAddIngredient1 Auto ; Получаемые ингредиенты. Ingredient Property ToAddIngredient2 Auto Ingredient Property ToAddIngredient3 Auto
MiscObject Property ToAddMisc1 Auto ; Получаемое барахло. MiscObject Property ToAddMisc2 Auto MiscObject Property ToAddMisc3 Auto
Int Property PotionCount1 Auto ; Кол-во получаемых зелий. Int Property PotionCount2 Auto Int Property PotionCount3 Auto
Int Property IngredientCount1 Auto ; Кол-во получаемых ингредиентов. Int Property IngredientCount2 Auto Int Property IngredientCount3 Auto
Int Property MiscCount1 Auto ; Кол-во получаемого барахла. Int Property MiscCount2 Auto Int Property MiscCount3 Auto
evil_spirit, еще можно настроить Combat Style актера. Махание руками - это, наверное, какая-то из анимаций расы (Gameplay -> Animations -> Actors/TrollBehavior/ActionIdleWarn). Если снизить вероятность ее проигрывания, то это применится ко всем троллям вообще.
AlexeyVN, я правильно понимаю, что при активации алтаря должно появляться меню, где игрок может подарить зачарованный предмет? Вот только кому, самому себе, что ли? Непонятно. Я же просил описать подробности.
Ладно, предположим, нам нужно, чтобы игрок мог перемещать только зачарованный(-ые) предмет(-ы) из своего инвентаря в некий контейнер при активации алтаря через GiftMenu. Нам понадобится: любой актер как посредник (кому будем отдавать предметы через меню, спрятан в любом месте), скрипт на алтаре. При активации алтаря перебираем все до единого предмета в инвентаре игрока и формируем лист из подходящих предметов, открываем меню подарков с НПС. После закрытия меню отправляем все предметы из инвентаря НПС в конечный контейнер.
AlexeyVN, не совсем понял, что происходит с предметом после того, как будет помещен в меню подарков. Меню закрывается, он возвращается (?) игроку, и...?
Вот примерные версии (названия другие, т.к. тестировал на компиляцию). См. комменты:
_TESTTEST16 Property L Auto ; Важно! Вместо _TESTTEST16 указать реальное название скрипта, который прикреплен к алиасу игрока, иначе не будет компилировать. ;В СК заполнить эту переменную прикрепленным скриптом из алиаса! FormList Property DisenchantList Auto
Event OnActivate(ObjectReference akActivator) GoToState("S") ; Пока не будет обработан текущая активация, все следующие пропускаются. If akActivator == Game.GetPlayer() DisenchantList.Revert() Int iC = akActivator.GetNumItems() - 1 WHILE iC >= 0 Form xF = akActivator.GetNthForm(iC) if (xF as Weapon && (xF as Weapon).GetEnchantment()) || (xF as Armor && (xF as Armor).GetEnchantment()) DisenchantList.AddForm(xF) endIf iC -= 1 ENDWHILE IF DisenchantList.GetAt(0) L.bL = true (akActivator AS Actor).ShowGiftMenu(True, DisenchantList) ELSE Debug.Notification("Игрок не имеет зачарованных предметов!") ENDIF EndIf GoToState("") EndEvent
STATE S Event OnActivate(ObjectReference akActivator) EndEvent ENDSTATE
ObjectReference Property DisenchantAltar Auto Message Property AlexDisenchantMessage Auto Bool Property bL Auto Hidden ; Упрощает проверку и предупреждает срабатывание скрипта при любом открытом меню подарков.
Event OnItemRemoved(Form akBaseItem, Int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer) if bL ; Определяем, был ли активирован алтарь, ибо меню подарков может быть открыто во многих случаях. akItemReference = akDestContainer.DropObject(akBaseItem, 1) ; Используем имеющуюся переменную вместо создания новой. if !AlexDisenchantMessage.Show(1, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000) input.TapKey(1) akItemReference.SetMotionType(akItemReference.Motion_Keyframed) akItemReference.SetAngle(DisenchantAltar.GetAngleX() + 80.0, DisenchantAltar.GetAngleY(), DisenchantAltar.GetAngleZ()) Else Game.GetPlayer().AddItem(akBaseItem, 1, true) ; ? endIf endIf endEvent
Lexo, проблема в том, что 1) в инвентаре предметы не имеют референсов, 2)сворованные и "чистые" предметы складываются как попало в один стек, 3) никак нельзя определить, что предмет, уже находящийся в инвентаре, сворован.
Есть вариант с побочными эффектами. Основывается на следующем: исследуются условия, при которых в инвентарь игрока попадают предметы. Когда обстановка потенциально соответствует краже (т.е. игрок непосредственно перед этим смотрел на чей-то предмет или контейнер, или открыто контейнер-меню с живым персонажем), все предметы такой же базовой формы, что и добавленный, удаляются из инвентаря игрока и ему возвращаются новые в таком же количестве. Недостаток же, что могут удалиться: заточенные предметы, заполненные камни душ, предметы, зачарованные игроком.
Вот примерная версия (на алиас игрока, не проверял, нужен СКСЕ):
Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) IF akSourceContainer AS Actor IF (akSourceContainer AS Actor).IsDead() || !ui.IsMenuOpen("ContainerMenu") RETURN ENDIF ELSEIF !bD RETURN endIf Actor xA = GetActorRef() Int iC = xA.GetItemCount(akBaseItem) xA.RemoveItem(akBaseItem, iC, true) xA.AddItem(akBaseItem, iC, true) endEvent
Есть вариант с OnStoryAddToPlayer, который позволяет более точно установить, каким образом предмет попал в инвентарь игрока, но там все печально.
VUG, AbsorbChance - характеристика актера, отвечающая за шанс поглощения враждебных заклинаний. В ванильной игре используется в одном из перков изменения и в камне атронаха.
Наверное, СК при своей загрузке просто сбрасывает значение в этом поле на первое по списку. Пока не нажата кнопка "Ок" в перке, это не должно отражаться на действительных данных, которые были указаны ранее. Еще можно посмотреть в списке "Perk Entries" в столбце "Data 3", скорее всего, там будет показана настоящая характеристика.
GlobalVariable Property MyGlobal Auto FormList Property MyAllActorsList Auto ; Заполняется нужными актерами (не ActorBase). FormList Property MyEmptyList Auto ; Изначально пустой.
IF MyAllActorsList.HasForm(akSpeakerRef) && !MyEmptyList.HasForm(akSpeakerRef) MyEmptyList.AddForm(akSpeakerRef) MyGlobal.Value += 1.0 ENDIF
Dsion, там перед тем, как дать подарок, создается лист из зачарованных вещей, находящихся в инвентаре игрока. Проблема в том, что при переборе вещей те из них, что зачарованы самостоятельно, не могут определиться как имеющие чары через GetEnchantment().