Модератор форума: 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? Пиши не в ЛС, а в эту тему.
Multigone  Offline  Сообщение №2161 написано: 27 июля 2016, 15:53



832
nepewka, идеи есть, только не понял, зачем это тебе вообще. Куда стреляет пушка? Похоже, маркер цели задается на основе того, куда смотрит актер с этим маг. эффектом.

Чтобы один скрипт создал сразу 5 пушек, нужно, во-первых, избавиться от обновления, т.к. оно задает новую точку стрельбы (в одной форме может быть только одно обновление onupdate()). Вместо него использовать While. Оформить все в виде функции, которая будет вызвана при старте эффекта 5 раз.

Или: в основное заклинание добавить еще 4 доп. эффекта. Каждый доп. эффект должен являться копией основного, и у него должен быть этот скрипт.
Как-то так, в общем.

nepewka  Offline  Сообщение №2162 написано: 27 июля 2016, 19:26 | Отредактировано: nepewka - 27 июля 2016, 19:30



255
Цитата Multigone

только не понял, зачем это тебе вообще


в первую очередь для личного пользования и удобства , никаких модов я не делаю. Так , для себя. Понравилась какая-нибудь механика , записал её для себя , сохранил. В этом списке , кстати , уже не малый вклад от тебя))

В идеале хотелось бы , чтобы все 5 или сколько там угодно пушек , работали и стреляли посредством одного скрипта без дубликатов MGEF.
А в двойном идеале , чтобы потом при добавлении второго эффекта в заклинание вызова пушки (с таким же MGEF как и у первого эффекта на вызов 5 пушек), они стакались и работали так , чтобы вызывалось в конечном счёте 10.

Короче говоря , хочется удобства и вариативности, поэтому обращаюсь к тебе)

Добавлено (27 Июля 2016, 22:26)
---------------------------------------------
попробовал действовать по твоему совету , убрал апдейт , поставил While.
стрельба действительно задавалась в апдейте , как итог у меня получилось так , что из 1 пушки теперь вылетает 5 снарядов.
при добавлении второго такого эффекта с этим же MGEF в спелл , работает только один из них/

Вообщем-то почти получилось сделать то, чего я и хотел изначально. Ведь за 1 апдейт тайм вылетает 5 снарядов , что равносильно 5 пушкам. Но при вызове этого заклинания ещё раз - пушка пропадает , а хотелось бы , чтобы она оставалась и работала как Fire and Forget и чтобы одинаковые MGEF стакались

Multigone  Offline  Сообщение №2163 написано: 27 июля 2016, 19:35 | Отредактировано: Multigone - 27 июля 2016, 19:40



832
nepewka, если тебе очень нужно, я подумаю и напишу нужную версию, но не сейчас. Терпение, спокойствие.

Цитата nepewka

стакались

Чтобы это происходило, нужно убрать архетип Scripts, и вместо него поставить ValueMod (параметр Morality, к примеру).

nepewka  Offline  Сообщение №2164 написано: 28 июля 2016, 12:36



255
Конечно , как всегда буду рад увидеть твой вариант в действии)

Добавлено (28 Июля 2016, 10:39)
---------------------------------------------

Цитата Multigone

Чтобы это происходило, нужно убрать архетип Scripts, и вместо него поставить ValueMod (параметр Morality, к примеру).


не знаю о каком Morality была речь в effect archetype (это же вроде что-то там из Actor , не?) , но , действительно помогло.
Теперь всё стакается и через многократный каст и через одинаковый MGEF)
всё стало в разы удобнее, спасибо  ok good

пол дела сделано , осталось победить скрипт  :D

Добавлено (28 Июля 2016, 15:36)
---------------------------------------------
дошло о чём ты, у меня в параметер здоровье там стоит , но я не заметил что оно какой-то эффект оказывает на меня (в эффекте прописано на себя) , можно None поставить в принципе


Multigone  Offline  Сообщение №2165 написано: 28 июля 2016, 14:35 | Отредактировано: Multigone - 28 июля 2016, 17:45



832
nepewka, проверь в игре (2).


Код
Scriptname _MySCRIPT3 extends activemagiceffect

Activator Property FXEmptyActivator Auto
Activator Property ORD_Smh_DwarvenAutocannon_Activator Auto
Float Property ORD_ShootZ Auto
Float Property ORD_DistanceInFront Auto
Float Property ORD_UpdateRate Auto
Float Property ORD_DistanceZ Auto
Spell Property ORD_Smh_DwarvenAutocannon_Spell_Proc Auto
Sound Property ORD_Smh_DwarvenAutocannon_Marker_Deploy Auto
Sound Property ORD_Smh_DwarvenAutocannon_Marker_Destroyed Auto

Perk Property ORD_Smh30_RemoteControl_Perk_30 Auto
Activator Property ORD_Smh_DwarvenAutocannon_Activator_RemoteControl Auto
Float Property ORD_RemoteControlDist Auto

Int Property ORD_Electrobolt Auto
Spell Property ORD_Smh_DwarvenAutocannon_Spell_Proc_Electrobolt Auto
Explosion Property ORD_Smh_DwarvenAutocannon_Explosion_Electrobolt Auto
Perk Property ORD_Smh50_Electrobolt_Perk_50 Auto

Perk Property ORD_Smh80_SpinUp_Perk_80 Auto
Float Property ORD_SpeedUpDelta Auto

Perk Property ORD_Smh70_FiringLine_Perk_70 Auto
Float Property ORD_AngleDelta Auto
Float Property ORD_Min Auto

MiscObject Property ORD_Smh_DwarvenAutocannon_Misc Auto

Actor TargetActor
Int iC = 5                     ; Количество пушек.
Bool bF

Event OnEffectStart(Actor akTarget, Actor akCaster)
    TargetActor = akTarget
    RegisterForSingleUpdate(0.0)
EndEvent

Event OnEffectFinish(Actor akTarget, Actor akCaster)
    bF = true
EndEvent

EVENT OnUpdate()
    IF !iC
        RETURN
    ENDIF
    iC -= 1
    RegisterForSingleUpdate(0.1)
    Bool SpinUp
    Int ShotCount
    ObjectReference TheCannon
    Bool IsRemoteControl
    Float CharacterAngle
    Float ShootRate = ORD_UpdateRate
    If TargetActor.HasPerk(ORD_Smh50_Electrobolt_Perk_50)
        ShotCount = 0
    Else
        ShotCount = -9999
    EndIf
    ORD_Smh_DwarvenAutocannon_Marker_Deploy.Play(TargetActor)
    If TargetActor.HasPerk(ORD_Smh30_RemoteControl_Perk_30)
        IsRemoteControl = true
        If TargetActor.HasPerk(ORD_Smh70_FiringLine_Perk_70)
            CharacterAngle = TargetActor.GetAngleZ() + ORD_AngleDelta
        Else
            CharacterAngle = TargetActor.GetAngleZ()
        EndIf
        TheCannon = TargetActor.PlaceAtMe(ORD_Smh_DwarvenAutocannon_Activator_RemoteControl)
        TheCannon.MoveTo(TargetActor,ORD_DistanceInFront*Math.Sin(CharacterAngle),ORD_DistanceInFront*Math.Cos(CharacterAngle),ORD_DistanceZ)
        TheCannon.SetAngle(0,0,CharacterAngle)
    Else
        IsRemoteControl = false
        If TargetActor.HasPerk(ORD_Smh70_FiringLine_Perk_70)
            CharacterAngle = TargetActor.GetAngleZ() + ORD_AngleDelta
        Else
            CharacterAngle = TargetActor.GetAngleZ()
        EndIf
        TheCannon = TargetActor.PlaceAtMe(ORD_Smh_DwarvenAutocannon_Activator)
        TheCannon.MoveTo(TargetActor,ORD_DistanceInFront*Math.Sin(CharacterAngle),ORD_DistanceInFront*Math.Cos(CharacterAngle),ORD_DistanceZ)
        TheCannon.SetAngle(0,0,CharacterAngle)
    EndIf
    ObjectReference ShootStart = TheCannon.PlaceAtMe(FXEmptyActivator)
    ShootStart.MoveTo(TheCannon, 0, 0, ORD_ShootZ)
    ObjectReference ShootAim = TheCannon.PlaceAtMe(FXEmptyActivator)
    ShootAim.MoveTo(TheCannon, 0, 0, ORD_ShootZ)
    TargetActor.RemoveItem(ORD_Smh_DwarvenAutocannon_Misc, 1, true)
    If TargetActor.HasPerk(ORD_Smh80_SpinUp_Perk_80)
        SpinUp = true
    Else
        SpinUp = false
    EndIf
    WHILE !bF
        Utility.Wait(ShootRate)
        If IsRemoteControl || TheCannon.GetDistance(TargetActor) <= ORD_RemoteControlDist
            ShotCount += 1
            ShootAim.MoveTo(ShootStart,ORD_DistanceInFront*Math.Sin(TargetActor.GetAngleZ()),ORD_DistanceInFront*Math.Cos(TargetActor.GetAngleZ()),(ORD_DistanceInFront*Math.Tan(-TargetActor.GetAngleX()) + 0))
            If ShotCount >= ORD_Electrobolt
                ShotCount = 0
                ShootStart.PlaceAtMe(ORD_Smh_DwarvenAutocannon_Explosion_Electrobolt)
                ORD_Smh_DwarvenAutocannon_Spell_Proc_Electrobolt.RemoteCast(ShootStart, TargetActor, ShootAim)
            Else
                ORD_Smh_DwarvenAutocannon_Spell_Proc.RemoteCast(ShootStart, TargetActor, ShootAim)
            EndIf
        EndIf
        If SpinUp == true && ShootRate > ORD_Min
            ShootRate -= ORD_SpeedUpDelta
        EndIf
    ENDWHILE
    ORD_Smh_DwarvenAutocannon_Marker_Destroyed.Play(TheCannon)
    TheCannon.Disable(true)
    TheCannon.Delete()
    ShootStart.Delete()
    TargetActor.AddItem(ORD_Smh_DwarvenAutocannon_Misc, 1, true)
ENDEVENT

nepewka  Offline  Сообщение №2166 написано: 29 июля 2016, 14:43



255
Multigone, а что в твоём коде значит восклицательный знак перед int'ом ?
    IF !iC
        RETURN
    ENDIF

Добавлено (29 Июля 2016, 17:43)
---------------------------------------------
это же логическое "не" ?


Multigone  Offline  Сообщение №2167 написано: 29 июля 2016, 14:57



832
nepewka,

(IF !iC) эквивалентно (IF iC == 0)
(IF iC) эквивалентно (IF iC != 0)

nepewka  Offline  Сообщение №2168 написано: 29 июля 2016, 16:17



255
Multigone, спасибо. 
Встречался с заклинаниями , которые вызывают какой-либо шторм и снаряды при этом кастуются с неба ? (метеоритный дождь или вызов шторма (такой крик вроде в оригинальной игре есть)

так вот , вопрос.
такие заклинания , как правило , работают только Outdoor , то есть на открой площади , вне подземелий и строений. (также как и вызов дракона , работает только на улице)

Можно ли как-нибудь сделать , чтобы они работали везде , в том числе и в подземельях ?

Multigone  Offline  Сообщение №2169 написано: 29 июля 2016, 20:45



832
nepewka, формально да. Но маркер, создающий заклинание, располагается высоко в небе. В подземельях он будет выше потолка, в результате метеорит никуда не прилетит. Ну, мне так кажется.

Нарада  Offline  Сообщение №2170 написано: 30 июля 2016, 11:29 | Отредактировано: Нарада - 30 июля 2016, 11:44



129
Здравствуйте, у меня назрел такой вопрос.
Пытаюсь сделать, чтобы дерево нельзя было срубить без топора. Выбрал для этого случая объект Flora, там есть поле для скрипта. Написал простенький активатор, но не тут-то было.
Активатор работает, но первой срабатывает обработка Flora - мол "бревно" добавлено, а потом появляется надпись, об отсутствии инструмента. Кто-нибудь знает, как перехватить обработку Flora или обмануть ее?

Написал вот такой код через блокировку, но не помогло




Multigone  Offline  Сообщение №2171 написано: 30 июля 2016, 15:47 | Отредактировано: Multigone - 23 апреля 2020, 15:12



832
Нарада, попробуй перк Activate. В последнее время что-то все через него делается. Там в Fragments что-то такое будет:

Код
Flora Property Brevno Auto
Weapon Property Topor Auto

IF akTargetRef.GetBaseObject() != Brevno || akActor.GetItemCount(Topor)
    akTargetRef.Activate(akActor)
ELSE
    Debug.Notification("Бери топор, руби хардкор!11")
ENDIF

Оба флага в Entry отметить.

nepewka  Offline  Сообщение №2172 написано: 31 июля 2016, 08:44



255
Multigone, привет
понравилась тут одна механика в моде перма.

заклинание, которое при активации "оживляет" экипированный на нас меч в правой руке (а если есть ещё один перк, то и в левой)
как это работает: через скрипт вызывается невидимой расы Actor и ему присваивается наше оружие.

визуально это выглядит как: просто появляется летающий меч , который летает и атакует врагов.

что мне не нравится в суммонах-мечниках (например дремора) , что если их вызвать 10 штук , из-за своего большого размера ,  3-4 из них окружат одну цель и будут её атаковать , а другие 6-7 будут бегать вокруг и тупить, так вот , вопрос:

в случае с этой механикой и невидимой расой actor , можно ли сделать так , чтобы эти мечи накладывались друг на друга (как например двемерские автопушки из твоего скрипта) и атаковали все сразу и многократно ???

 а не так как дреморы: несколько атакуют , остальные тупят. То есть в идеале хотелось бы так , чтобы сколько угодно этих невидимых actorov-мечей я бы не вызывал , все из них могли бы одновременно наносить удары

Multigone  Offline  Сообщение №2173 написано: 31 июля 2016, 09:51



832
nepewka, в одной точке не может стоять несколько актеров, насколько я знаю. Значит, нет.

Нарада  Offline  Сообщение №2174 написано: 31 июля 2016, 12:37



129
Цитата Multigone

Нарада, попробуй перк Activate. В последнее время что-то все через него делается.


Извиняюсь за глупый вопрос, но к чему прикрутить созданный перк? Я этого понять никак не могу.

Multigone  Offline  Сообщение №2175 написано: 31 июля 2016, 12:49



832
Нарада, если перк только для игрока, то можно выдать через маг. эффект (Perk to apply), можно скриптом в любом месте (Game.GetPlayer().AddPerk(MyPerk)).

Нарада  Offline  Сообщение №2176 написано: 31 июля 2016, 13:34



129
То есть, перк нужно запустить и он уже будет отрабатывать при каждой последующей активации (независимо чего) и сработает только на той, которая определена скриптом  у него. Так?

Multigone  Offline  Сообщение №2177 написано: 31 июля 2016, 22:04



832
Нарада, при каждой активации чего угодно будет обрабатываться скрипт. Если скрипт пустой, то никакого контекстного действия при нажатии кнопки активации не будет происходить.

nepewka  Offline  Сообщение №2178 написано: 1 августа 2016, 07:57 | Отредактировано: Multigone - 23 апреля 2020, 14:51



255
Multigone, привет

а какие эвенты для кастов спеллов мы можем использовать в Activator'e ?

Допустим есть заклинание , оно вызывает взрыв , взрыв в свою очередь вызывает Placed Object (допустим коробку, которая будет во вкладке Activator)
Какие скрипты можно использовать на этой коробке ?

Видел , как в перме для кастов спеллов подобным образом использовался Event OnHit

Код
Scriptname xMAALTSpellPrismScript extends ObjectReference
int toDestruct = 10

explosion property xMAALTSpellPrismCreateExplosion auto
explosion property xMAALTSpellPrismDestroyExplosion auto

Activator Property FXEmptyActivator Auto

spell property xMAALTSpellPrismDestructionspell Auto
spell property xMAALTSpellPrismAlterationspell Auto
spell property xMAALTSpellPrismConjurationspell Auto
spell property xMAALTSpellPrismRestorationspell Auto
spell property xMAALTSpellPrismIllusionspell Auto

Event OnLoad()
placeatme(xMAALTSpellPrismCreateExplosion)
;setAngle(90,0,0)
EndEvent

Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)

Spell s = aksource as spell
Actor caster = akaggressor as actor

toDestruct -= 1

gotoState("busy")

if s && caster
;debug.notification("spell hit")
if akprojectile
;debug.notification("projectile spell hit")
relaySpellProjectile(s, caster)
else
relaySpellNoProjectile(s,caster)
endif
endif

if aksource as weapon
toDestruct -= 1
endif

if toDestruct <= 0
placeatme(xMAALTSpellPrismDestroyExplosion)
disable()
delete()
endif

gotoState("")

EndEvent

Function relaySpellNoProjectile(Spell s, Actor caster)
;MagicEffect e = s.getNthEffectMagicEffect(0)
;Debug.notification(e)
;String skill = e.getAssociatedSkill()
;Debug.notification(skill)
EndFunction

Function relaySpellProjectile(Spell s, Actor caster)

MagicEffect e = s.getNthEffectMagicEffect(0)
String skill = e.getAssociatedSkill()

float offx = r
float offy = 0.0
int numCasts = 18

float r = 250
float offz = 100
float count = 1.0
float degree = 360 / numCasts

ObjectReference newRef = placeAtMe(FXEmptyActivator)
ObjectReference newRefTarget = placeAtMe(FXEmptyActivator)

while (numCasts > 0)

newRef.moveTo(self,offx, offy, offz)
newRefTarget.moveTo(self,offx*2, offy*2, offz)

s.remoteCast(newRef,caster,newRefTarget)

offx = r * math.cos(degree * numCasts)
offy = r * math.sin(degree * numCasts)

numCasts -= 1
endWhile

Spell secondSpell = xMAALTSpellPrismAlterationspell;

float factorZ2 = 1.0

if skill == "Destruction"
secondSpell = xMAALTSpellPrismDestructionspell
factorZ2 = 2.0
elseif skill == "Conjuration"
secondSpell = xMAALTSpellPrismConjurationspell
elseif skill == "Alteration"
secondSpell = xMAALTSpellPrismAlterationspell
elseif skill == "Restoration"
secondSpell = xMAALTSpellPrismRestorationspell
elseif skill == "Illusion"
secondSpell = xMAALTSpellPrismIllusionspell
endif

offx = r
offy = 0.0
numCasts = 3
count = 1.0
degree = 360 / numCasts

while (numCasts > 0)
newRef.moveTo(self,offx, offy, offz)
newRefTarget.moveTo(self,offx*2, offy*2, offz*factorZ2)

secondSpell.remoteCast(newRef,caster,newRefTarget)

offx = r * math.cos(degree * numCasts)
offy = r * math.sin(degree * numCasts)

numCasts -= 1
endWhile

newref.disable()
newRef.delete()
newrefTarget.disable()
newRefTarget.delete()
EndFunction

State busy
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)
EndEvent
EndState


можно ли через Event OnLoad заставить коробку кастовать спеллы ?
взрыв ведь вызвать можно через placeatme
а заклинание ?

lumistart  Offline  Сообщение №2179 написано: 1 августа 2016, 08:55 | Отредактировано: Multigone - 23 апреля 2020, 14:52



1
Доброго времени суток! Подскажите пожалуйста, как исправить ошибку, скрипт не компилирует(

Код
Scriptname _KM_ActivatorOreScript extends ObjectReference

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 hoursImport Utility
Import Mathevent onload()
Hours = floor(GetCurrentGameTime()*24)
count01=count
endevent
Event OnActivate(ObjectReference akActionRef)
BlockActivation(true)
if (hours)+multHour <= (floor(GetCurrentGameTime()*24)) && (Count01<count)
count01=count01+multiRes*(floor(GetCurrentGameTime()*24)-hours)
hours=floor(GetCurrentGameTime()*24)
endif
;debug.Messagebox(count01+" "+hours+" "+(floor(GetCurrentGameTime())*24))
if count01>0
if count01>count
count01=count
endif
dayly=true
if (akActionRef==game.getPLayer()) && dayly && (count01>=myResourceCount)
game.getplayer().PlayIdle(IdlePickup_ground)
wait(2)
game.getPLayer().additem(Resource, myResourceCount)
count01 = count01 - myResourcecount
debug.messagebox(String01+" "+myResourceCount+" "+String02+count01)
endif
elseif (count01<=0)||(count01<=myResourceCount)
dayly=false
debug.messagebox(Warning)
endif
BlockActivation(false)
endevent



Multigone  Offline  Сообщение №2180 написано: 1 августа 2016, 10:11 | Отредактировано: Multigone - 1 августа 2016, 10:18



832
Цитата nepewka

взрыв ведь вызвать можно через placeatme, а заклинание ?

Не понял вопрос - заклинание что? Взрыв может существовать сам по себе, а заклинание может только накладываться на актеров. Способ, которым оно будет доставлено актеру, зависит от его типа. Как частный случай, можно выбрать снаряд.

lumistart, попробуй:


Код
Scriptname _KM_ActivatorOreScript extends ObjectReference

Import Utility
Import Math

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

event onload()
    Hours = floor(GetCurrentGameTime()*24)
    count01=count
endevent

Event OnActivate(ObjectReference akActionRef)
    BlockActivation(true)
    if (hours)+multHour <= (floor(GetCurrentGameTime()*24)) && (Count01<count)
        count01=count01+multiRes*(floor(GetCurrentGameTime()*24)-hours)
        hours=floor(GetCurrentGameTime()*24)
    endif
    ;debug.Messagebox(count01+" "+hours+" "+(floor(GetCurrentGameTime())*24))
    if count01>0
        if count01>count
            count01=count
        endif
        dayly=true
        if (akActionRef==game.getPLayer()) && dayly && (count01>=myResourceCount)
            game.getplayer().PlayIdle(IdlePickup_ground)
            wait(2)
            game.getPLayer().additem(IgnotGold, myResourceCount)
            count01 = count01 - myResourcecount
            debug.messagebox(String01+" "+myResourceCount+" "+String02+count01)
        endif
    elseif (count01<=0)||(count01<=myResourceCount)
        dayly=false
        debug.messagebox(Warning)
    endif
    BlockActivation(false)
endevent

nepewka  Offline  Сообщение №2181 написано: 1 августа 2016, 10:42 | Отредактировано: nepewka - 1 августа 2016, 10:43



255
Цитата Multigone

Я так понял, этот скрипт заставляет некий объект, когда тот получает хит, создавать такое же заклинание (по кругу?), каким его ударили.



механика интересная.

типа да , попадаешь заклинанием в объект - он по кругу -  по всем сторонам выпускает 18 (или 21, не понял по коду скрипта?) снаряда
я вот тоже по-началу думал , что заклинания , каким его ударили , только в скрипте в properties стоят ссылки на определенные спеллы , следовательно нет...



Multigone  Offline  Сообщение №2182 написано: 1 августа 2016, 11:46 | Отредактировано: Multigone - 1 августа 2016, 11:51



832
nepewka, а что нужно-то? Чтобы объект творил заклинание?
Если в Cast() не указать цель, объект-не-актер должен стрелять заклинанием Aimed куда-то в одну точку (думаю, по направлению одной из его осей).
Чтобы указать цель, нужно знать ее референс. В маг. эффекте это может быть Caster \ Target, в др. скрипте - по обстоятельствам, смотря, какие задачи требуются от объекта. Цель можно найти через Find(), GetCombatTarget(), ну и через прочие функции, способные вернуть Actor или ObjectReference.

nepewka  Offline  Сообщение №2183 написано: 1 августа 2016, 14:01 | Отредактировано: nepewka - 1 августа 2016, 14:07



255
Цитата Multigone

а что нужно-то? Чтобы объект творил заклинание?


ну да , цель вообщем-то та же , что и раньше.

У игрока есть заклинание , которое при взрыве Placed Object'ом вызывает некий объект будь-то коробка или ещё что или же вызывает его многократно  если надо, функцией в скрипте заклинания MGEF target.placeatme(activator_korobka, 10)

этот объект/ы появляются на короткое время (30-60сек) и наводят шорох , затем исчезают. (их работу мы уже прописываем в отдельных скриптах во вкладке Activator)

как по мне прикольное заклинание  получилось бы ;)

только как бы сделать поуникальнее его , поинтереснее что ли ?
Чтобы каждая коробка кастовала 1 условный фаербол каждую секунду или же наоборот выпускала по 18 снарядов в разные стороны раз в 10 секунд ?
Предложи чего-нибудь)
Спасибо

Multigone  Offline  Сообщение №2184 написано: 1 августа 2016, 16:25



832
nepewka, кому, как не тебе, знать, что требуется от твоего мода. Но раз просишь подсказать "что-нибудь", вот эти идеи реализовывал в тестовом "фейерверке":

- объект стреляет снарядами в произвольном направлении, но не ниже плоскости горизонта.
- объект стреляет снарядами, первый снаряд направлен вертикально вверх, затем угол Z плавно уменьшается, а снаряды летят все более полого (по кругу). Получается, как будто он раскручивается. Последние снаряды летят горизонтально. Процесс можно обратить в др. сторону.

Одновременно снаряды не могут вылетать, для обработки каждого следующего направления требуется время порядка 0.1 с.

nepewka  Offline  Сообщение №2185 написано: 1 августа 2016, 17:03



255
Цитата Multigone

Одновременно снаряды не могут вылетать, для обработки каждого следующего направления требуется время порядка 0.1 с.


видимо это актуально , только когда даёшь команду стрелять по разным направлениям ?
Когда объект стреляет в одну точку - несколько снарядов визуально вылетают моментально (как было замечено мною с теми же двемерскими автопушками)

Добавлено (01 Августа 2016, 20:03)
---------------------------------------------
Multigone, кстати , а как работает скрипт обработки стрельбы ?
допустим мы заспавним в одном и том же месте 10 одинаковых коробок с одним и тем же скриптом.

Обработка стрельбы и соответственно вылет снарядов будет производиться одновременно для каждой коробки ?
То есть задержек стрельбы между 1 , 4, 7 и 10 коробки не будет ? По идее


Multigone  Offline  Сообщение №2186 написано: 1 августа 2016, 19:18



832
nepewka, подозреваю, частично это зависит от вычислительной мощности процессора. Если создать одновременно много объектов с тяжелыми скриптами на них, обработка каждой копии должна быть замедлена. Я не знаю, короче. Умозрительные выводы бывают ошибочны.

nepewka  Offline  Сообщение №2187 написано: 2 августа 2016, 07:02 | Отредактировано: Multigone - 23 апреля 2020, 14:58



255
Multigone, ну пока решил начать с самого простого:

есть заклинание (малая способность), при касте которой в цель вылетает снаряд. При соприкосновении он создает 10 коробок
(Вот здесь вопрос, как сделать ? Чтобы он размещал 10 Placed Object'ов активатором или взрывом через Placed Object в Explosion ? Я так думаю, без разницы? )
Скрипт в MGEF снаряда (Fire and Forget, aimed):
Код
scriptname aA11 extends ActiveMagicEffect

activator property OurBox auto
explosion property BoxExplosion auto

Event OnEffectStart (Actor akTarget, Actor akCaster)
   akTarget.placeatme(OurBox, 10) ; akTarget.placeatme(BoxExplosion, 10)
EndEvent

Cкрипт самого Placed Object'a в Activator.
Вот тут 2 вопроса:
нужен ли маркер, как было с двемерскими автопушками ?
и как быть с временем работы ? Я не совсем понял. В MGEF у нас есть Duration и OnEffectFinish, мы таким способом можем закрыть WHILE, а как его закрыть здесь, чтобы коробка проработала ровно 30 секунд ?
10 коробок простоят 30 секунд, выпуская по 1 фаерболлу раз в 1,5 секунды в цель, куда смотрит персонаж :
Код
scriptname aA22 extends ObjectReference

Activator Property FXEmptyActivator Auto
Actor property playerref auto

Spell property Fireball auto

int WorkTime = 0
float CharacterAngle
float ShootTime = 1.5

Event OnLoad()
   CharacterAngle = playerref.GetAnglez()
   self.SetAngle(0, 0, CharacterAngle)
   ObjectReference newRef = self.placeAtMe(FXEmptyActivator)
   newRef.moveTo(self, 0, 0, 10)
   ObjectReference newRefTarget = self.placeAtMe(FXEmptyActivator)
   newRefTarget.moveTo(self, 0, 0, 10)
   RegisterForSingleUpdate(30.0)
   WHILE WorkTime == 0
      Fireball.RemoteCast(newRef, playerref, newRefTarget)
      Utility.Wait(ShootTime)
   ENDWHILE
   disable()
   delete()
   newRef.disable()
   newRef.delete()
   newRefTarget.disable()
   newRefTarget.delete()
EndEvent

Event OnUpdate()
   WorkTime += 1
EndEvent

Multigone  Offline  Сообщение №2188 написано: 2 августа 2016, 11:12 | Отредактировано: Multigone - 3 августа 2016, 07:03



832
nepewka, а ну так попробуй:


Код
Scriptname _MySCRIPT6 extends ObjectReference

Import Math

Activator Property FXEmptyActivator Auto
Spell property Fireball auto

Event OnLoad()
    Actor xRef = Game.GetPlayer()
;    SetAngle(0, 0, xRef.GetAnglez()) ; Зачем это?
    ObjectReference xEnd = placeAtMe(FXEmptyActivator)
    ObjectReference xStart = placeAtMe(FXEmptyActivator)
    xStart.moveTo(self, 0, 0, 10)
    Int WorkTime = 20
    WHILE WorkTime
        Float pX = -xRef.GetAngleX()
        Float pZ = 90 - xRef.GetAngleZ()
        xEnd.moveTo(xStart, 200 * Cos(pX) * Cos(pZ), 200 * Cos(pX) * Sin(pZ), 200 * Sin(pX))
;        Fireball.RemoteCast(xStart, xRef, xEnd)
        Fireball.Cast(xStart, xEnd)
        Utility.Wait(1.5)
        WorkTime -= 1
    ENDWHILE
    xStart.delete()
    xEnd.delete()
    disable()
    delete()
EndEvent

nepewka  Offline  Сообщение №2189 написано: 3 августа 2016, 12:11 | Отредактировано: Multigone - 23 апреля 2020, 15:01



255
Multigone, прошарив нексус на поиск модов по рунам , не нашёл ничего интереснее , чем модов на изменение ренжа каста рун + измнение самого капера рун.

Лично мне , не нравится в рунах то , что они ставятся только по одной руне за раз(в смысле за 1 каст). Их нужно часто перекастовывать , направляя курсор на землю , что ни есть удобно.

Хотелось бы сделать заклинание , в котором за 1 каст рун , их будет ставится допустим сразу 3 , причём не в 1 месте , а как-то так:
х - 3 руна (шаг вперед)
х - 2 руна (шаг вперед)
х - 1 руна (на которую мы навели курсор)

Вообще , кастануть 3 руны сразу в принципе не проблема.
Можно воспользоваться скриптом OnSpellCast через формлист
можно даже как-нибудь через костыли: вызвать 3 взрыва через скрипт , а во взрыве поставить Projectile рун (на сколько я помню руны работают именно через Projectile > Explosion) , но тут сложнее будет.

Самое сложное конечно это сделать так , чтобы кастанув первую , другие две поставились не в 1 месте там где первая, а чуть в других

Добавлено (03 Августа 2016, 15:11)
---------------------------------------------
как-то так , всё работает, только:
1) как бы сделать так, чтобы ставились они всё же чуть подальше друг от друга , а не в 1 месте ?
2) с целью балансировки хотелось прикрутить cooldown секунд на 10 на это заклинание , это вообще возможно в редакторе ?

Код
Scriptname aa10 extends activemagiceffect

Formlist property aa auto
actor target = none

Event OnEffectStart(actor t, actor c)
   target = t
EndEvent

Event OnEffectFinish(actor t, actor c)
   target = None
EndEvent

Event onSpellCast(Form s)
   if aa.hasForm(s)
      (s as Spell).cast(target, None)
      (s as Spell).cast(target, None)
   endif
EndEvent


Multigone, можно ли вообще повесить кулдауны на обычные спеллы/зачарования в скайриме ?

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

Multigone  Offline  Сообщение №2190 написано: 4 августа 2016, 16:55



832
nepewka, тут другой вопрос - как не давать творить заклинание, если оно в этот момент перезаряжается? Я знаю следующие варианты:

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

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





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