Jump to content

[Tuto] Les Scripts


Vectoriel

Recommended Posts

Très bon tuto (même s'il arrive un peu tard à mon goût, j'ai déjà découvert la plupart des trucs en façonnant – à 80 % – mon script de duel).une question : apparament certaines fonctions/commandes/blogtypes ne marchent tjrs selon que le script est script quest, effect ou object. il serait bien de parlait de çà.

Link to comment
Share on other sites

Tu pourrais donner des exemple? Je sais juste que les Blocktypes:-ScriptEffectStart-ScriptEffectUpdate-ScriptEffectFinishNe sont employable que dans des Script Effect (Et d'ailleurs, ce sont les seuls qui devraient être employés dans ce cas!).Sinon, toutes les fonctions/blocktypes (hormis les ScriptEffect..), sont utilisables pour les scripts de Quete ou d'Objet selon moi. J'ai jamais vraiment eu de problème avec ca. Donc je veux bien un exemple ^^.

Link to comment
Share on other sites

Voila une liste de toutes les fonctions de FO3:http://fose.silverlock.org/Fallout3Commands.htmlOu en version .rar que j'ai ajouté en fin de post.Sinon, j'ai fais des test pour les Blocktypes, et j'ai vu que tous les BlockTypes fonctionnent pour les Scripts d'Effet et les Scripts d'Objet.Par contre, pour les Scripts de Quete, les seuls Blocktypes qui fonctionnent sont les blocktypes MenuMode et GameMode.C'est tout ce qu'il y a comme contrainte de Blocktype.

Link to comment
Share on other sites

Guest MoiToto

Salut,Il y aurait un moyen simple de tester directement les scripts dans le jeu. Ne pas faire :- créer le script- lancer le jeu- sortir du jeu- modifier le script- relancer le jeu- ...MerciSinon - existe-t-il des boucles de style While/EndWhile ou For/Next ?- peut-on créer ses propres fonctions ? Avec envoie/retour de paramètre ?Merci d'avance

Link to comment
Share on other sites

Salut.1) Non, Malheuresement, tu dois tester ton script en jeu... Mais bon, la plupart du temps c'est pas le script qui foire, si tu es pas débutant (enfin pour mon cas, c'est toujours les autres choses qui posent problème...).Pour ce qui est des erreurs un peu con, l'éditeur de scripts te le dit quand tu sauve ton script: référence non existante, oubli de endif, etc etc...2)**Je crois qu'il y avait des boucle while dans le TESCS d'oblivion, mais je crois qu'elles n'ont pas été reprises pour le GECK. De toute façon, les scripts sont tous écrit de manières à palier ce déficit... La fonction IF est presque considérée comme une boucle, car dans le jeu, un script de type Objet par exemple, est executé toute les 1 seconde... Du coup, si une variable reste au même état après avoir réalisé ce qui doit être réalisé sous sa condition, la seconde d'après, elle executera la même chose.Exemple 1:

do{    //faire ca    i++;}while (i<=3);
est exactement la même chose que :
if (i<=3)    ;faire ça    set i to (i + 1)endif
Car le script est refait toute les secondes.Exemple 2:Tu peux aussi utiliser cette méthode si a chaque seconde tu ne dois pas faire la meme chose:Au lieu de:
for(i=0, i<=3, i++)    ;faire ça
Tu fais:
if doOnce == 0    ;faire ce qui doit etre fait au premier cran 0    set doOnce to 1elseif doOnce == 1    ; faire ce qui foit etre fait au deuxieme cran 1    set doOnce to 2elseif doOnce = 2    etc......    set doOnce to 3endif
Avec doOnce une variable déclarée.**On ne peut pas créer ses propres fonctions, sauf dans une sorte de simulacre de fonction. Par exemple, un script a un moment met la variable toto a 1, lorsqu'il doit appeler la fonction toto. Cette fonction toto peut alors être écrite comme cela:
if (toto==1)    ;faire ceci    ;faire cela    set toto to 2endif
Attention, cette partie de code doit être placée dans un BlockType GameMode ou MenuMode, pour être exécutée toute les secondes.
Link to comment
Share on other sites

III) Script plus compliqué

Je l'ai mis ici car sur la première page, le post dépassait la taille maximale ^^.

FINI




Dans cette troisième partie du tutorial nous allons voir comment:
-Initialiser une rencontre scriptée contre des forces de l'Enclave
-Faire déposer des soldats de l'Enclave par un Vertibird
-Utiliser des Triggers
-Utiliser des Timers
-Faire mourir les personnages de ceux qui testent votre mod

Tout d'abord, il nous faut une base sur laquelle travailler. Pour notre recette du jour, vous aurez besoin de:

-Un gros trigger bien carré.
-4 ou 5 Soldats de l'Enclave, prenez les bien fermes.
-Un Vertibird
-Un Terrain ou placer tout ça
-Un script pour enrober le tout.

J'ai mis en fichier joint au tutorial la base du tuto(trigger + Vertibird + Cell + COCMarker), si vous n'avez pas envie de le créer vous même et que vous voulez juste travailler sur le Script. Comme vous voulez.


Pour ma part, j'ai crée une nouvelle Cell(dans Interiors), que j'ai nommé SUUTestCell, ou j'ai placé des sols de base des Facilities(FacPitFloor01) collés les uns aux autres pour faire une assez grande piste d'atterrissage. J'ai pas mis de murs, sinon le Vertibird aura un peu de mal. J'ai ajouté des lampes pour qu'on y voit quelque chose, et voila, j'ai mon terrain d'atterrissage.

On rajoute par la même occasion un COCMarkerHeading, qui permettra de se téléporter dans la Cell quand on voudra la tester (avec la commande "coc SUUTestCell").


1) Le Vertibird


Il est temps de passer aux choses sérieuses. Avant de voir le réel débarquement des troupes, on va déja faire un atterrissage et le décolage pour le Vertibird.
Qu'avons nous besoin:
-Un trigger
-Un vertibird
-Un script associé au trigger

Le Trigger:

Créons tout d'abord le trigger, grace au bouton associé: Image IPB. Quand vous aurez cliqué dessus, vous pouvez maintenir appuyer la souris sur le sol pour créer la forme de base du trigger. Une fois que vous aurez relaché le bouton, vous pourrez régler sa hauteur. Ne vous inquiétez pas, la taille et la hauteur du trigger son paramétrable apres sa création. Pour cela, vous avez juste a tirer les fleches qui composent le trigger. Modelez votre trigger de façon à qu'il couvre toute la surface où vous penseriez voir le joueur aller. Dans notre cas, le faire un tout petit peu plus grand que la largeur du sol suffira:

Image IPB


Lorsque vous avez fini de modeler votre trigger, une fenetre s'ouvre. Cochez la case New pour en faire un nouveau. Donnez lui un ID, mettez " NONE" en Script et faites OK.

Image IPB

Le Vertibird:

On va maintenant placer le Vertibird en question. Celui-ci porte le doux nom de "VertibirdEncount01". Vous pouvez également choisir le 02, tout dépends du tracé de son décollage et de son atterrissage(visible grace aux traits bleu et rouge). Ce ne sont pas des objets mais des Activateurs, qui, une fois activés, permettront de jouer des animations préconcues par les développeurs. Pour voir les animations disponibles, vous pouvez ouvrir le .nif concerné avec NifSkope, et choisir les animations en haut à droite du soft. Les noms sont les mêmes dans le GECK et dans NifSkope, et nous allons juste utiliser celles qui s'appellent Forward et Backward.
Après avoir posté le Vertibird dans la Render Window, double-cliquez dessus et cochez les cases "Persistant Reference" (pour pouvoir être utilisé dans un script), et "Initially Disabled"(Pour que ce soit le script qui le fasse apparaître).

Double-cliquez sur votre trigger, et dans l'onglet "Linked Ref", selectionnez votre Vertibird. Ca nous donnera plus de facilités pour le script. En faisant OK, vous verrez alors une flèche verte et jaune qui part du Trigger vers le Vertibird lorsque vous avez le trigger sélectionné.


Voila notre scène au final:

Image IPB


Le Script:

Passons maintenant à ce qui nous importe le plus, le script qui va permettre à cet hélico de venir se poser puis redécoller.
Analysons ce qu'on a:
-Un trigger qui va activer(enable) le Vertibird. Donc, dès que le joueur entrera dans le Trigger, le Vertibird s'activera.
-Un trajet pour le Vertibird qui est décomposé en plusieurs phases: L'atterrissage, l'attente au sol pour déposer les troupes, et le décollage.

Maintenant, plus en profondeur, nous auront besoin de plus de phases différentes(toutes orchestrées par la variable doOnce):
-Phase 1: Faire apparaitre le Vertibird
-Phase 2: Faire atterrir le Vertibird
-Phase 3: Faire attendre le Vertibird 3 secondes à terre pour déposer les troupes
-Phase 4: Faire attendre le Vertibird 2 secondes à terre après avoir déposé les troupes
-Phase 5: Faire décoller le Vertibird, s'il n'a pas été détruit
-Phase 6: Faire disparaitre le Vertibird lorsqu'il a fini son décollage et s'il n'a pas été détruit.
-Phase 7: Il n'y en a pas, mais c'est ce qu'on déterminera comme la fin du script.

Si vous commencez à vous y connaitre en Scripts, vous sauriez alors que nous avons besoin d'utiliser deux blockTypes: OnTriggerEnter et GameMode. Le premier est déclenché lorsque le joueur entre dans le Trigger, et dit au deuxieme de commencer la phase d'atterrissage.

Nous aurons aussi besoin de variables dont voila la liste:
float timer   :   Un timer pour bien mettre en place les différentes parties du Script, et que tout se passe au bon moment.short doOnce  :   Une variable d'incrémentation très importante pour bien organiser phase après phase ce que le Vertibird a à faire.short init    :   Une variable d'initialisation qui permettra de fixer les choses préliminaires à l'exécution du script.ref linkedRef :   Une référence dans laquelle on attribuera la "Linked Ref" du Trigger, autrement dit, le Vertibird.ref myself    :   Une référence dans laquelle on attribuera le trigger lui-même, pour le désactiver une fois que le joueur est passé dedans.
Nous avons parlé d'un BlockType OnTriggerEnter, qui se met en marche dès que quelqu'un entre en contact avec le trigger.

BEGIN OnTriggerEnter player     ; précisez player en flag, pour que le trigger ne s'active que si c'est le joueur, qui entre.	set doOnce to 1		; C'est l'initialisation de la première phase du Vertibird. La commande la plus importante.	set myself to Getself	; On utilise la fonction "GetSelf" pour mettre dans la variable myself la référence du Trigger.	myself.Disable		; On désactive myself(le trigger donc), pour que le joueur ne puisse pas passer 10 fois dedans.	END
Voila l'initialisation faite. Tout ce qui se passe ensuite est fait dans un BlockType GameMode, qui, rappelons-le, est exécuté toute les secondes.

BEGIN GameMode	if (init == 0)					        ; la fameuse phase d'initialisation qui nous permet de régler les premières choses		set init to 1					; On passe init a 1, sinon il fera ce qui est dans ce IF à l'infini.		set LinkedRef to getLinkedRef		        ; On place dans la variable LinkedRef le Vertibird(la "Linked Ref" du trigger), grace a la fonction getLinkedRef	endif			if (doOnce == 1)						; C'est là que tout commence		linkedRef.enable					; On active le Vertibird pour qu'il apparaisse dans le monde en 3D		set timer to 1						; On met le timer a une seconde		set doOnce to 2						; On met doOnce a 2 pour passer à la phase suivante.			elseif (doOnce == 2)		if (timer<= 0)						; Si le timer est fini(donc ici: après une seconde)			if (linkedRef.HasLoaded3D != 0)			; Si le Vertibird est chargé dans le monde				linkedRef.playgroup Forward 0		; On lui fait jouer l'animation Forward (atterrissage)				set doOnce to 3				; et on passe doOnce a 3 pour passer à la phase suivante			endif		else			set timer to (timer - GetSecondsPassed)	        ; Sinon, si le timer n'est pas a 0, on lui enleve une seconde toute les secondes.		endif			elseif (doOnce == 3)		if (linkedRef.isAnimPlaying Forward == 0)	        ; Si le Vertibird a fini son animation d'atterrissage			set timer to 3			                ; On met le timer a 3 secondes. C'est ici que les troupes sortiront!			set doOnce to 4			                ; On passe doOnce a 4 pour la phase suivante		endif		elseif (doOnce == 4)		if (timer <= 0)			if (linkedRef.getDestroyed == 0)		; Si le Vertibird n'a pas été détruit				set timer to 2				; On met le timer a 2 secondes. Dans deux secondes, il décollera.				set doOnce to 5				; On met doOnce a 5 pour la phase suivante.			else						; Sinon, s'il a été détruit				set doOnce to 7				; On finit le script (il ne se passe rien a doOnce 7)			endif		else			set timer to (timer - GetSecondsPassed)		endif	elseif (doOnce == 5)		if (timer <= 0)			if (linkedRef.getDestroyed == 0)		; Si le Vertibird n'est toujours pas détruit après les deux secondes				linkedRef.playGroup Backward 0		; On le fait décoler				set doOnce to 6				; Et on passe doOnce a 6 pour la phase suivante			else				set doOnce to 7				; S'il est détruit, on arrête le script			endif		else			set timer to (timer - GetSecondsPassed)		endif	elseif (doOnce == 6)		if (linkedRef.isAnimPlaying Backward == 0) && (linkedRef.getDestroyed == 0)     ; Si le Vertibird a fini son décollage et qu'il n'est toujours pas détruit			linkedRef.disable							; On le fait disparaitre			set doOnce to 7							        ; et on termine le script.		endif	endifEND
A ce moment la, si vous testez votre mod en jeu, lorsque vous passerez par le trigger(invisible en jeu), vous entendrez alors au loin les pâles du Vertibird, puis peu à peu vous le verrez apparaitre dans le brouillard pour se poser devant vous. Après 5 secondes en tout, vous le verrez décoller et partir au loin.


2) Le Débarquement

Passons maintenant à la deuxième partie: Le débarquement de troupes. Nous auront besoin de:
- Autant de soldats de l'Enclave que vous voulez(dans les limites du réalisme). Je vais en prendre 4.
- Un XMarker.

On va tous les placer à coté du Vertibird, si possible du côté ou le joueur ne peut pas les voir apparaitre d'un coup ;p.
Puis on place le xMarker n'importe ou a coté des Boyz de l'Enclave, en hauteur si vous voulez ça n'a pas d'importance. Puis, double-cliquez sur chacun de vos soldat et dans l'Onglet "Enable Parent", ciblez le XMarker. Une fois ceci fait sur chacun des soldat, double-cliquez sur le XMarker et mettez le en "Initially Disabled". Puis double-cliquez finalement sur le Vertibird et dans "Linked Ref", ciblez le XMarker.
Phew... Mais qu'est-ce que tout ca signifie? C'est très simple. Nous avons mis le XMarker en Initially Disabled, donc à la base, il n'est pas actif, et on voit que les quatres soldats ont dans leur Enable Parent ce meme XMarker. Cela veut dire que lorsque le XMarker sera Enabled, les soldats feront de même. Puis nous avons mis le XMarker en Linked Reference du Vertibird, pour plus de simplicité dans le Script!

Voila ce que ça donne lorsque l'on fait un Enable Parent(Vous devriez donc en avoir 4 comme cela, plus une fleche verte et jaune partant du Vertibird(Linked Ref)):
Image IPB


Passons au script. Nous avons besoin d'une nouvelle variable:
ref VertibirdLinkedRef	:	On mettra dedans la Linked Ref du vertibird, c'est a dire le XMarker.
Et voila ce que l'on ajoute au script(en rouge):

Begin gameMode	if init == 0		set init to 1		set linkedRef to getLinkedRef		set vertibirdLinkedRef to linkedRef.getLinkedRef		; on utilise la fonction getLinkedRef(comme tout à l'heure), sur la référence linkedRef(le Vertibird), ce qui nous donne le XMarker.	endif	if (doOnce == 1)		linkedRef.enable		set timer to 1		set doOnce to 2	elseif (doOnce == 2)		if (timer <= 0)			if ( linkedRef.HasLoaded3D != 0 )				linkedRef.playgroup Forward 0				set doOnce to 3			endif		else			set timer to timer - GetSecondsPassed		endif	elseif (doOnce == 3)		if (linkedRef.isAnimPlaying Forward == 0)			set timer to 3				; 3 secondes avant que le Vertibird n'active le XMarker			set doOnce to 4		endif	elseif (doOnce == 4)		if (timer <= 0)			if (linkedRef.getDestroyed == 0)				vertibirdLinkedRef.enable  		; Active le XMarker, et donc, les quatres soldats				set timer to 2					; 2 secondes avant que le Vertibird décolle				set doOnce to 5			else				set doOnce to 7			endif					else			set timer to (timer - GetSecondsPassed)		endif	elseif (doOnce == 5)		if (timer <=0)			if (linkedRef.getDestroyed == 0)				linkedRef.playgroup backward 0				set doOnce to 6			else				set doOnce to 7			endif		else			set timer to (timer - GetSecondsPassed)		endif	elseif (doOnce == 6)		if (linkedRef.isAnimPlaying Backward == 0) && (getDestroyed == 0)			linkedRef.disable			;disable the vertibird when it's done playing its backward animation			set doOnce to 7		endif			endif	End
Et voila, avec quelques commandes simplistes, vous avez votre débarquement de crée. Bien sur dans la Cell que j'ai faite, je n'ai pas fait de Navmesh, donc ils ne bougeront pas et tireront de la ou ils sont.

Idées de travail à la maison:
-Faire du Navmesh et un decors simpliste, puis mettre des XMarkersHeading a des endroits ou les soldats iront directement lorsqu'ils seront au sol, pour se mettre à couvert.
-Coordonner plusieurs attaques simultanées, ou en boucle les unes après les autres.


Voila, n'hésitez pas à poser vos questions sur n'importe quel point du tutoriel. Je joint à la fin le mod finis(avec Navmesh) si vous voulez comparer ou juste vérifier quelquechose.

Si vous avez d'autres scripts que vous voudriez voir expliqués, Vous n'avez qu'a demander.
Link to comment
Share on other sites

  • 1 month later...

Bonjour et tout d'abord merci pour ce tutorial tres instructif.Voila quelques semaines que je me suis mis au GECK et je m'intéressait dernierement aux scripts, qui donnent une vraie sensation de liberté et de controle sur le monde de bethesda.j'essaye depuis quelques jours de creer une sorte de combinaison de spiderman, qui donnerait au porteur la possibilité de faire des sauts de grande envergure et de pouvoir tomber de haut sans mal. Mais autant la console commande existe, autant je n'ai pas trouvé la commande pour le Geck. Pourriez vous m'aider s'il vous plait.Par avance merci.

Link to comment
Share on other sites

  • 1 month later...
  • 1 month later...

Désolé mais les deux premieres parties qui etaient dans mon premier poste ont tout simplement disparue, je ne sais pas pourquoi. J'ai demandé a Hawk-Eye, mais il n'en sait pas plus.Comme j'ai fait ce tuto il y a longtemps sur un autre PC que j'ai formaté maintenant, je n'ai plus les versions .txt des tutos chez moi, donc a part si quelquun veut refaire les bases du Scripting en un tutorial, qu'il ne se gene pas, mais je n'ai pas le temps personnellement. Surtout en periode d'exams.Et franchement, le script plus compliqué n'est pas si dur, et puis j'explique tout.Apres, si tu veux les bases, va sur le site du TESCS2, les bases du scripting y sont expliquées(c'est pareil pour le GECK). Mais c'est en anglais.

Link to comment
Share on other sites

En fait, j'avais du mal à comprendre pourquoi c'était des esp et pas des txt ou doc ou pdf...Maintenant; je comprends mieux :DJe jetterais un oeil à tes conseils quand j'aurais épuisé toute mes ressources. Relire des trucs en anglais.....mmhmmm, j'suis déja dedans :)Je lance donc un appel à un bon postapo man qui aurait comme de par hasartd, enregistré la page du temps où elle était entière.Merçien tt cas d'avoir répondu :D

Link to comment
Share on other sites

  • 1 month later...

Bonjour et d'abord merci pour ton tuto il est génial

mais si je veut activer l'atterissage de l'hélico une fois que j'ai fini une certaine conversation comment faire ?

Dois-je utiliser un trigger si oui comment le faire s'activer une fois la conversation finie ?

Merci de répondre rapidement !

Link to comment
Share on other sites

Salut. C'est assez simple. Au lieu de faire commencer le script par un trigger, tu le fais commencer par la fin de la conversation. Dans chaque phrase de conversation tu as un champs (en bas de la fenêtre de dialogue), qui s'appelle "Result Script". Il suffit de placer l'initialisation du script la dedans. Donc, au lieu de :

BEGIN OnTriggerEnter player	set doOnce to 1	set myself to Getself	myself.Disable	END
Tu n'as qu'a mettre dans ce result script les deux lignes :
set REFDeTonTrigger.doOnce to 1REFDeTonTrigger.Disable
En changeant REFDeTonTrigger par la référence de ton trigger que tu lui a donné dans ta scene, tu l'auras compris :). Et bien evidemment, tu vire le Blocktype OnTriggerEnter(et ce qu'il contient) du script du trigger sinon ca s'activera aussi si le joueur passe dedans. Bien sur, le trigger devient plus qu'un objet déclencheur, mais qui n'a aucune interaction directe avec le joueur(il est obligé de parler a ton PNJ pour que la fin du dialogue déclenche le trigger, qui lui a son tour,déclenchera l'action). Une autre facon plus subtile et jolie de le faire, est de lier le PNJ et le trigger (en linkedReference). Du coup, tu n'as plus qu'a mettre ces lignes dans le Result Script de fin de ta conversation :
set linkedRef to getLinkefRefset linkedRef.doOnce to 1linkedRef.disable
Ca revient presque au même mais c'est une facon plus claire et plus "professionnelle" de réaliser la même chose :P. Dis moi si tu n'as pas compris quelque chose ou si quelque chose que j'ai dis ne marche pas (ca fait + de 3 mois que j'ai pas scripté dans Fallout ^^)! Merci pour le compliment et à bientot !
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...