#1
Posté 23 avril 2012 - 21:09
Alors voilà mon problème : j'essaie de faire apparaître un boss. J'ai bien évidemment créé l'acteur. Après, j'ai essayé tout un tas de façons de le faire apparaître en bidouillant le CK mais je ne parviens à rien.
Mon désir est simple : Je voudrais que, à la fin de la quête de Gauldur, au moment où on [spoiler=]prend l'amulette[/spoiler], ce nouveau boss apparaisse dans la salle, prêt à combattre. Peu m'importe comment il apparaît, du moment qu'il n'était pas visible ni actif auparavant et que tout d'un coup il est là. Je suppose que c'est une affaire de script, mais après avoir fait la comparaison avec la façon dont les [spoiler=]frères Gauldurson apparaissaient[/spoiler], je dois avouer que je n'y comprends rien. Et je ne cherche pas particulièrement une apparition sur le même modèle qu'eux.
Merci.
#2
Posté 23 avril 2012 - 22:33
je pense que le moyen le plus simple est d'ajouter un script sur l'amulette qui doit faire apparaitre le boss quand le joueur l’acquière pour la première fois ...
Pour résumer, il faut créer un NPC hostile ( le boss), placer un marqueur à l'endroit ou on veut que le boss apparaisse ( de préférence avant la sortie de la salle pour que le joueur soit quasiment obligé de passer par lui )
ajouter un petit script comme celui-ci à l'amulette
Scriptname ScriptApparitionBossSiAquisition extends ObjectReference {script d'apparition du boss lors de l'aquisition.} Actor property MonBoss auto {Acteur de base qui va apparaitre lors de la 1ère aquisition de l'objet} ObjectReference property MarqueurDeSpawnDuBoss auto {renseigner avec la référence du marqueur à l'emplacement ou le boss doit apparaitre} auto State waiting Event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer) if (Game.GetPlayer() == akNewContainer) objectReference MonBossRef = MarqueurDeSpawnDuBoss.PlaceAtMe(MonBoss) GoToState("inactive") endif EndEvent EndState State inactive EndStateCompiler le script.
Mettre à jour les 2 propriétés du script qu'on vient d'ajouter à l'amulette, en choisissant le Boss et la référence du marqueur qu'on vient de placer.
Et ça devrait fonctionner...
Bon courage
Modifié par Le Magicien, 23 avril 2012 - 22:38.
#3
Posté 25 avril 2012 - 17:54
J'ai cependant deux petites questions quant à cette méthode :
- Le marqueur que je dois utiliser, c'est de type Idle Marker ?
- Il existe déjà un script dans la quête qui se déclenche quand on s'empare de l'amulette, pourrais-je intégrer mon script à celui-là ? Qui se présente ainsi (c'est le queststage 255) :
Citation
Function Fragment_18()
;BEGIN CODE
;Player takes the Gauldur Amulet
(PedestalManager as dunReachwaterRockPedestalManager).DisableBeams()
SetObjectiveCompleted(150)
CompleteAllObjectives()
CompleteQuest()
(AchievementsQuest as AchievementsScript).IncSideQuests()
Stop()
;END CODE
EndFunction
;END FRAGMENT
Modifié par Spitoven, 07 août 2012 - 23:57.
#4
Posté 25 avril 2012 - 20:05
Spitoven, le 25 avril 2012 - 17:54, dit :
Spitoven, le 25 avril 2012 - 17:54, dit :
Pour éviter de modifier et compiler un script de quête existant, qui pourrait être déjà actif sur certaines sauvegardes et qui pourrait poser problème si le mod n'est pas activer ( car le script compilé reste présent dans le dossier ).
En suite, mon exemple peut s'appliquer pour cette quête en particulier mais également pour une quête perso, ( il faut juste changer le stage après la commande placeatme pour mettre à jour la quête et le tour est joué)
Et enfin je savais pas trop si la quête était donnée comme exemple ou si l'objectif de ton module était de la modifier elle.
Cela dit rien ne t’empêche de modifier les scripts de quête déjà existants, mais ce n'est, à mon avis, pas la meilleur chose à faire. notamment si la quête est déjà active dans ta sauvegarde ou dans la sauvegarde de ceux qui utiliseront ton module.
Bon courage
Modifié par Le Magicien, 25 avril 2012 - 20:11.
#5
Posté 25 avril 2012 - 21:02
Alors du coup j'ai essayé d'intégrer la ligne dont il me semble que c'est celle-là qui devrait faire apparaître le boss même si j'avoue ne pas très bien tout comprendre :
Citation
(PedestalManager as dunReachwaterRockPedestalManager).DisableBeams()
SetObjectiveCompleted(150)
CompleteAllObjectives()
objectReference Alias_HaraldLichRef = Alias_LichMarker.PlaceAtMe(Alias_HaraldLich)
CompleteQuest()
(AchievementsQuest as AchievementsScript).IncSideQuests()
Stop()
Et j'ai ce message d'erreur qui s'affiche :
Citation
Compiling "QF_dunGauldursonQST_000E4D31"...
e:\program files\steam\steamapps\common\skyrim\Data\Scripts\Source\temp\QF_dunGauldursonQST_000E4D31.psc(441,55): PlaceAtMe is not a function or does not exist
No output generated for QF_dunGauldursonQST_000E4D31, compilation failed.
Batch compile of 1 files finished. 0 succeeded, 1 failed.
Failed on QF_dunGauldursonQST_000E4D31
Modifié par Spitoven, 25 avril 2012 - 21:02.
#6
Posté 26 avril 2012 - 11:25
Si tu comptes définir l'alias du du boss ne t'embêtes pas avec un marqueur... et encore moins avec une commande de type placeatme.
Place simplement une référence de ton boss à l'endroit ou il doit apparaitre ( disons que son alias dans ta quête est Alias_HaraldLichRef ) assures-toi que la référence placée soit "Initially Disabled" .
dans ton script "QF_dunGauldursonQST_000E4D31.psc" ( celui de la quête en question il me semble ) ajoute simplement une ligne pour le passer au statut Enable. ce qui donne :
... ;BEGIN FRAGMENT Fragment_18 Function Fragment_18() ;BEGIN CODE ;Player takes the Gauldur Amulet (PedestalManager as dunReachwaterRockPedestalManager).DisableBeams() SetObjectiveCompleted(150) CompleteAllObjectives() Alias_HaraldLichRef.GetReference().Enable() CompleteQuest() (AchievementsQuest as AchievementsScript).IncSideQuests() Stop() ;END CODE EndFunction ;END FRAGMENT ...
Edit:
Spitoven, le 25 avril 2012 - 21:02, dit :
et
akNewContainer est l'objet qui reçoit l'objet appelant. utile pour savoir qui vient de prendre ou de recevoir l'objet.
dans le cas de mon script je vérifiait si le joueur venait de prendre l'objet... si oui spawn du boss et fin de la surveillance de changement de possesseur.
Bon courage
Modifié par Le Magicien, 26 avril 2012 - 13:34.
#7
Posté 26 avril 2012 - 18:50
Je ne sais pas ce que j'ai mal fait... Je t'ai uploadé mon mod dans son état actuel, si tu veux bien avoir l'extrême gentillesse de regarder ce qui cloche : Voir le Fichier : mod.rar
Je précise que c'est normal que le boss soit essentiel. C'est le piège : un boss qu'on ne peut pas tuer, qu'il faut fuir
#8
Posté 26 avril 2012 - 19:28
Avant cela, pour tester ton module as-tu recommencé une partie ou as-tu utilisé une sauvegarde déjà existante ?
car dans beaucoup de cas( si ce n'est tous), pour que les modification des alias de quête soient pris en compte il faut recommencer une partie.
C'est aussi pour cela que je te conseillais de ne pas modifier la quête.
#9
Posté 26 avril 2012 - 20:47
Effectivement, il va falloir que je reteste avec un nouveau perso alors.
Mais ça le fait aussi avec les alias des nouvelles quêtes ? Ça veut dire qu'on ne peut effectuer des quêtes ajoutées par un mod que dans une nouvelle partie ?
Modifié par Spitoven, 26 avril 2012 - 20:48.
#10
Posté 26 avril 2012 - 23:16
Le Magicien, le 26 avril 2012 - 19:28, dit :
Avant cela, pour tester ton module as-tu recommencé une partie ou as-tu utilisé une sauvegarde déjà existante ?
car dans beaucoup de cas( si ce n'est tous), pour que les modification des alias de quête soient pris en compte il faut recommencer une partie.
C'est aussi pour cela que je te conseillais de ne pas modifier la quête.
En faisant un stop et un start de la quête (via la console pour une quête ou deux, via un script qui détecte un changement de version (via une variable globale) s'il y en a plusieurs), les alias me semblaient prendre en compte les modifications (les properties des scripts attachés, c'est sûr. Les sorts attachés aussi)...Je ne touchais qu'au joueur et à des alias de type find closest matching reference in loaded area.
J'ai bossé quelques semaines sur un mod utilisant une dizaine de quêtes pour placer des scripts et autres joyeusetés en utilisant le plus souvent des sauvegardes à suivre sans problème (du moment que les quêtes étaient réinitialisées).
Cependant, ce n'étaient que des quêtes "simples" destinées à placer des scripts, des effets et des objets...
Par contre, dans un mod ne contenant qu'une seule quête (une quête "classique" avec objectifs et la totale), les alias ne se mettaient pas à jour.
Même en arrêtant et en démarrant la quête...
Nouvelle partie quasi-obligatoire à chaque mise à jour (deux alias font référence à des objets présents dans le donjon d'Helgen)..
Il me semble, sans avoir testé sur plus de deux sauvegardes, que les alias faisant référence à des objets présents dans la cellule de chargement (donc celle sauvegardée) ne soient pas mis à jour...(un peu comme pour les properties d'un script).
Penses-tu que cela soit la ou une des raisons, ô grand magicien?
#11
Posté 28 avril 2012 - 20:52
Je n'ai pas eu l'occasion de faire autant de tests sur les quêtes et leurs alias que toi, et je n'ai pas d'explication la-dessus malheureusement.
Dans le cas de la quête "Une légende interdite" je ne suis pas sûr qu'un simple arrêt et redémarrage de la quête suffise... mais ça coute rien d'essayer.
Spitoven, le 26 avril 2012 - 20:47, dit :
#13
Posté 28 avril 2012 - 23:22
Le Magicien, le 28 avril 2012 - 20:52, dit :
Je n'ai pas eu l'occasion de faire autant de tests sur les quêtes et leurs alias que toi, et je n'ai pas d'explication la-dessus malheureusement.
Dans le cas de la quête "Une légende interdite" je ne suis pas sûr qu'un simple arrêt et redémarrage de la quête suffise... mais ça coute rien d'essayer.
Je testerai donc en profondeur et demanderai à Thanatos (qui passe aussi par des quêtes pour placer ses scripts et qui a sans doute plus d'expérience là-dessus) ce qu'il en pense par MP après les tests.
Un petit topic avec les résultats devrait intéresser pas mal de moddeurs.
#14
Posté 29 avril 2012 - 16:41
après test in-game ton boss apparait une fois que j'ai pris l'amulette ...
je t'ai envoyé un mp avec un peu plus de détails ...
mais pour faire court, ton script fonctionne.
Bon jeu
#16
Posté 07 août 2012 - 10:53
A présent, j'essaie de faire apparaître un second boss à la mort d'un premier.
J'ai ainsi créé le script suivant dans ce but, selon ce que j'ai cru comprendre des instructions anglophones disponibles sur le site officiel dédié au Creation Kit :
Citation
;BEGIN ALIAS PROPERTY ChaurusGiant0
;ALIAS PROPERTY TYPE ReferenceAlias
ReferenceAlias Property Alias_ChaurusGiant0 Auto
;END ALIAS PROPERTY
;BEGIN ALIAS PROPERTY ChaurusGiant4
;ALIAS PROPERTY TYPE ReferenceAlias
ReferenceAlias Property Alias_ChaurusGiant4 Auto
;END ALIAS PROPERTY
Event OnDeath(Alias_ChaurusGiant0 killer)
Alias_ChaurusGiant4.GetReference().Enable()
EndEvent
Mais il ne fonctionne pas :
Citation
Compiling "QF_dunGauldursonQST_SuperChaurus"...
e:\program files\steam\steamapps\common\skyrim\Data\Scripts\Source emp\QF_dunGauldursonQST_SuperChaurus.psc(13,34): unknown type alias_chaurusgiant0
No output generated for QF_dunGauldursonQST_SuperChaurus, compilation failed.
Batch compile of 1 files finished. 0 succeeded, 1 failed.
Failed on QF_dunGauldursonQST_SuperChaurus
Pourriez-vous m'aider une fois encore ?
Merci d'avance.
Modifié par Spitoven, 07 août 2012 - 10:59.
#17
Posté 07 août 2012 - 11:03
c'est normal que la compilation ne passe pas ...
Scriptname QF_dunGauldursonQST_SuperChaurus extends Quest Hiddenindique qu'il s'agit d'un script de quête
alors que l'event OnDeath est un événement pour un script d'acteur...
Une solution serait d'ajouter un script au boss avec cet event OnDeath et à sa mort, soit faire avancer la quête, soit passer le boss suivant au status Enable, soit les deux.
Bon jeu, à bientôt
Edit : pour reprendre l'exemple du script, ça donnerait quelque chose comme ça :
Modifié par Le Magicien, 07 août 2012 - 11:44.
#18
Posté 07 août 2012 - 13:50
En revanche, du coup, si je me doute bien que je ne dois pas le laisser attaché simplement à la quête de Gauldur, je n'ai pas bien compris où je dois le mettre.
Dans l'acteur de ChaurusGiant0 ?
Dans l'alias de ChaurusGiant0 ?
Dans l'acteur de ChaurusGiant4 ?
Dans l'alias de ChaurusGiant4 ?
Merci.
Modifié par Spitoven, 07 août 2012 - 13:50.
#19
Posté 07 août 2012 - 22:22
par contre l'acteur ou son alias, je pense que les deux conviennent.
personnellement j'aurais opté pour le schéma suivant:
sur l'acteur ( 1er boss ) un script avec un événement OnDeath qui si la quête est à un certain stage fait passer la quête au stage suivant...
et au niveau de la quête lors qu'elle atteint le stage en question elle passe l'autre acteur ( 2ème boss ) en Enable.
ça permet de mettre à jour le journal de quête avec des info pour le joueur, et éventuellement de décaler l'apparition du second boss pourquoi pas une fois une autre porte un peu plus loin franchie...
mais là c'est juste mon avis.
Bon jeu, à bientôt
#20
Posté 07 août 2012 - 23:50
Et je me heurte à un autre problème : le second boss est trop gros pour que je puisse lui trouver une place dans la cell sans qu'il se retrouve parachuté dix mètres plus loin
Du coup, je vais abandonner les alias pour en faire un script générique sur l'acteur du premier boss, comme tu me l'as conseillé. Et je vais faire apparaître le second boss par un bon vieux placeatme. Et même un Player.placeatme, pour l'effet de surprise et parce qu'en principe (si j'ai bien observé) ça le fera apparaître derrière le joueur, ce qui devrait me dispenser de devoir ajouter un effet visuel
En ce qui concerne ta suggestion, en fait tout ceci se déroule une fois la quête terminée, je n'ai donc pas besoin d'introduire de queststages. D'autant plus que ce ne sont pas des boss qu'il faut obligatoirement tuer pour parvenir à quoi que ce soit. C'est juste qu'ils sont gros et qu'ils bouchent le passage vers la sortie
Voici donc l'ébauche du nouveau script :
Citation
{Event OnDeath(Actor Tueur)
if ( self ) ;
Player.placeatme 03086AF2 ;
endif
EndEvent}
Comme il est tard et que je suis sûr à 98% qu'il va encore ne pas fonctionner, je ne l'ai pas encore testé. Je le ferai demain matin si tu n'es pas repassé entretemps pour me remettre en évidence le fait suravéré que j'ai encore fait n'importe quoi (D'autant que l'ordre de chargement des mods devrait tout me chambouler mon ID ingame... )
Quoi qu'il en soit, merci infiniment pour ton aide et ton soutien continus
Modifié par Spitoven, 07 août 2012 - 23:59.
#21
Posté 08 août 2012 - 10:48
juste quelques petites précisions :
Si le script a été appliqué sur l'alias de ton boss, il faut faire les tests avec une sauvegarde ou la quête n'a pas encore été lancée sous peine d'avoir les "anciens" alias et non pas ceux modifiés...
En suite pour la syntaxe de la commande PlaceAtMe je pense qu'il y a eu une petite confusion avec la commande console du même nom, dans un script ça se présente sous la forme :
... ;Partie déclaration ObjectReference MonBoss ... ;partie code et/ou event Game.GetPlayer().PlaceAtme(MonBoss) ...donc pas besoins de connaitre l'ordre du mod ni l'ID de base du boss, il faut juste renseigner les propriétés du script.
Et enfin l'ébauche du script :
Spitoven, le 07 août 2012 - 23:50, dit :
{Event OnDeath(Actor Tueur)
if ( self ) ;
Player.placeatme 03086AF2 ;
endif
EndEvent}
la partie entre accolades indique une zone de texte qui est affichée dans le CK pour donner des informations sur le script. en gros en passant la souris sur le nom du script dans le CK, on aura le texte "Event OnDeath(...Blabla..." qui s'affichera mais c'est tout.
Donc au final l'ébauche de script devrait plus ressembler à ça :
Bon jeu, à bientôt
Modifié par Le Magicien, 08 août 2012 - 10:57.
#22
Posté 08 août 2012 - 11:44
De manière générale, il faut que ce qui suit le extends corresponde à ce à quoi est attaché le script.
Pour agir sur la référence qui a rempli l'alias, on passera pas une variable de type objectreference ou l'on remplira à l'aide d'un getreference() sur l'alias dans l'event oninit().
En clair, quand on veut appliquer un script sur un referencealias, il faut que la première ligne se termine par "extends referencealias". Si on le met sur une référence, "extends objectreference". S'il est placé dans la partie "scripts" d'une quête, il faut "extends quest".
#24
Posté 08 août 2012 - 23:07
Oui et non.
"MonDeuxiemeBoss" est juste le nom d'une variable ( mettre n'importe quoi d'autre à la place dans le script ne change absolument rien si ce n'est la compréhension de celui-ci).
C'est ici une propriété de script qu'il faudra renseigner avec l'ID du deuxième boss ( celui qui doit apparaitre quand le premier meure ) une fois le script compilé et placé sur l'acteur ( premier boss).
Bon jeu
0 utilisateur(s) li(sen)t ce sujet
0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)