Vicolaships Posté(e) le 26 août 2008 Signaler Partager Posté(e) le 26 août 2008 Création d'une mission simple: Ce tutorial est la suite du tutorial "Le language SCM". Il est conseillé de l'avoir lu pour pouvoir faire ce tutorial. 1. Création du SCM Démarrez SannyBuilder puis créez un SCM Basic (cf: tuto précédent). Il va falloir ajouter une mission, c'est à dire un marqueur rouge de début de mission, mais aussi du contenu et une fin. 2. Création de la mission 2.1 Pour créér une mission, nous n'allons pas utilisez la ligne "DEFINE MISSIONS 0" et créé une mission comme dans le jeu, car pour certaines choses le jeu bug (je ne sais pas pourquoi), le genre de bug peut être par exemple lors de la création d'un personnage, on veut en créer un seul et le jeu en créer 3 (Ce qui entraine des bugs si vous dites à celui de monter dans un véhicule) 2.2 Nous allons tout simplement mettre notre mission (ou script) juste derrière le main et entre le "end_thread" qui signale la fin de lecture (si la mission est mise après elle ne sera pas lue). Mais on ne va pas mettre notre mission comme ca, entre 2 paragraphes, il va falloir créé ce que l'on appelle un "Label". Pour le créer, rien de plus simple > ":Nomdulabel123" (Lettres et chiffres acceptées). Pour une meilleur relecture on l'appellera : ":Mission01" 2.3 Pour créer une mission avec un marqueur il faut chercher l'ocpode qui permet de créer un marqueur, on pourrait chercher "marker" qui serait logique mais dans cas ce n'est pas logique, il faut chercher dans "sphere" jusqu'à trouver la ligne : "03BC: 20@ = create_sphere 2009.0 -1491.30 3.45 5.0" Note: Pour chercher un Opcode, soit vous faites la combinaison Ctrl + Alt + 2 dans SannyBuilder soit vous faites la recherche dans le bloc note en ouvrant le fichier des Ocpodes (contenu dans le dossier de Sanny Builder) Nous allons transformer l'ocpode , le principe est simple, transformer toutes les valeurs numériques en lettres pour mieux comprendre : Ce qui donne : "03BC: X'@ = create_sphere X Y Z B" X' = Numéro du marqueur (/de la sphere) X Y Z = Coordonnées du marqueur B = Rayon de la sphere Note: Les coordonnées sont toujours notées X, Y et Z qui correspondent au 3 axes qui permettent de placer un objet dans un espace par rapport à un repère 0 Nous allons maintenant transformer l'opcode pour qu'il puisse marcher dans le jeu, un opcode littéral permet seulement d'y voir plus clair quand on ne le comprend pas. On prendra: X'= 1 X Y Z = 2485.5 -1658.86 12.88 B = 2.0 Il faut ensuite insérer cette ligne derrière (et à la ligne) ":Mission01" mais avant "end_thread" On rajouteras aussi un "wait 100" entre le label et l'opcode, dès fois sans le wait le jeu bug... Note: Pour créér des coordonnées, j'utilise Ctrl + Alt + 1 (jeu lancé) dans SannyBuilder. 2.4 Nous avons créé notre marqueur, si vous démarrez le jeu (Coordonnées de création de CJ :2480.0 -1658.86 12.88) et que vous allez dans le marqueur, rien ne se passe, logique... Nous allons maintenant créer une condition, c'est un point essentiel pour coder, si vous ne savez pas créer une condition vous n'arriverez pratiquement à rien... Voici le mode de fonctionnement d'une condition : :X if CONDITION jf @X EXECUTIONX= Nom du label On créé toujours un nouveau label pour une condition. (on le met à la suite). Si le nom de label est "C123" alors la ligne "jf @Label" deviendra "jf @C123" En fait si je traduis en français "compréhensible" cela donne : Si la condition est remplie, alors passer à l'exécution/ Si la condition est remplie, alors faire les actions. Un exemple : Si le joueur marche, alors donner au joueur 100$. 2.5 Maintenant, il faut adapter ce "script" pour qu'il fonctionne sous San Andreas, notre but (ce que vous ne savez pas encore) c'est de créer : Si le joueur est arrêté sur le marqueur (a pied), alors démarrer une mission. Mais "démarrer une mission" c'est un peu simple, cela se traduit par : Fondu vers le noir, destruction du marqueur pendant le fondu, et fondu vers le transparent. Cela donne en cherchant dans les opcodes (J'ai pas tout mis en littéral) :Label wait 100 if 0101: actor A stopped_near_point X Y Z radius B B B' sphere 1 jf @Label wait 250 fade 0 500wait 1000 03BD: destroy_sphere X@ wait 1000 fade 1 500A= Acteur dont la condition dépendra X Y Z = C'est les coordonées ou on à créé le marqueur B B B' = Là vous me direz que c'est bizarre un diamètre avec 3 coordonnées. En fait les 2 premières on met la même chose, le dernier ce sera le plan Z (la hauteur) on met donc 10 comme ca même si la coordonnée Z qu'on à prise est pas très précise ca marchera. Passons aux valeurs numériques : (Même s'il y en avait déjà avant) :ConditionMission wait 100 if 0101: actor $PLAYER_ACTOR stopped_near_point 485.5 -1658.86 12.88 radius 2.0 2.0 10.0 sphere 1 jf @ConditionMission wait 250 fade 0 500 wait 1000 03BD: destroy_sphere 1@ wait 1000 fade 1 500 2.6 Voilà qui est fait, on insère le label avant le "end_thread" et après le label "Mission01". Du début jusqu'ici on obtient le petit (très petit) script suivant : Mission01 wait 100 03BC: 1@ = create_sphere 2485.5 -1658.86 12.88 radius 2.0 :ConditionMission wait 100 if 0101: actor $PLAYER_ACTOR stopped_near_point 2485.5 -1658.86 12.88 radius 2.0 2.0 10.0 sphere 1 jf @ConditionMission wait 250 fade 0 500 wait 1000 03BD: destroy_sphere 1@ wait 1000 fade 1 500 3. Contenu de la mission 3.1 Maintenant que nous avons notre début de missions il faut y ajouter du contenu, je vous propose quelque chose de très simple: Un personnage est créé et on doit se battre contre lui, si le joueur tue l'ennemi il remporte 500$ et un Uzi et s'il se fait tuer il réapparait avec seulement 50 de vies. 3.2 Tout d'abord il va falloir créer l'ennemi, on va le créer pendant le fade pour ne pas le voir se créé, voilà la suite d'opcodes : Model.Load(#X) 038B: load_requested_models wait 10 009A: $A = create_actor 23 #X at X Y Z Pour savoir quel personnage prendre on va utiliser le fichier peds.ide (GTA SA > Data). On choisira le piéton BALLAS1. Ce qui nous donnera la suite d'ocpodes : Model.Load(#BALLAS1) 038B: load_requested_models wait 10 009A: $ENNEMI = create_actor 23 #BALLAS1 at 2485.5 -1650.0 13.0 3.3 Maintenant il faut donner à l'acteur une arme et lui dire d'attaquer, pour donner une arme on utilisera la suite d'ocpode suivante : Model.Load(#X) 038B: load_requested_models wait 10 01B2: give_actor $ENNEMI weapon X ammo Z On charge le modèle de l'arme avant de l'utiliser sinon l'arme n'apparaitra pas et dès que le joueur essayera de l'utiliser le jeu bugera. Pour savoir les noms d'armes on utilise le fichier "[sA] Weapon numbers.txt" fourni avec SannyBuilder (Dossier help) On donnera a l'ennemi une batte : Model.Load(#BAT) 038B: load_requested_models wait 10 01B2: give_actor $ENNEMI weapon 5 ammo 1 3.4 Autant regrouper le tout pour faire plus court et plus lisible, ce qui donne : Model.Load(#BALLAS1) Model.Load(#BAT) 038B: load_requested_models wait 10 009A: $ENNEMI = create_actor 23 #BALLAS1 at 2485.5 -1650.0 13.0 01B2: give_actor $ENNEMI weapon 5 ammo 1 3.5 Maintenant nous allons dire à cet ennemi d'attaquer le joueur car pour l'instant il ne fait rien. On créera aussi un marker sur celui-ci pour voir la cible On utilisera l'opcode :05E2: AS_actor $ENNEMI kill_actor $PLAYER_ACTOR Il est préférable de le placer après le fade pour ne pas se faire attaquer pendant que l'écran est noir On utilisera l'opcode : 0187: $MARKER_ENNEMI = create_marker_above_actor $ENNEMI On le met avant ou après le fade, comme on veut... > Ne pas oublier de mettre des "wait 10" ou sinon le jeu buggera 3.6 Maintenant il va falloir faire 2 conditions en même temps, c'est là que ce compliquent les choses... Si le joueur tue l'ennemi alors mission accomplie et le joueur gagne 500$ et un UZI et s'il se fait tuer il réapparait avec seulement 50 de vies. On va utiliser la suite d'opcode ci-dessous : ... Create_thread @Joueur_gagne Create_thread @Joueur_perd :Joueur_gagne 03A4: name_thread 'GAGNE' wait 100 if Actor.Dead($ENNEMI) jf @Joueur_gagne wait 10 Marker.Disable($MARKER_ENNEMI) wait 1000 Model.Load(#MICRO_UZI) 038B: load_requested_models wait 10 01B2: give_actor $PLAYER_ACTOR weapon 28 ammo 1000 jump @Fin :Joueur_perd 03A4: name_thread 'PERD' wait 100 if Actor.Dead($PLAYER_ACTOR) jf @Joueur_perd wait 10 Marker.Disable($MARKER_ENNEMI) 00BA: text_styled 'M_FAIL' 5000 ms 1 // Mission ratée ! wait 10000 0223: set_actor $PLAYER_ACTOR health_to 50 wait 500 jump @Fin :Fin wait 100 end_thread_named 'GAGNE' wait 100 end_thread_named 'PERD' wait 100 05BE: AS_kill_actor $ENNEMI Le create_thread sert à lire plusieurs labels en même temps (d'habitude ils sont lus à la suite). C'est à dire que les labels Joueur_gagne et Joueur_perd seront lus en même temps Le jump @Fin sert à ce que si le label Joueur_gagne est activé le label Joueur_perd ne soit pas lu 2 fois. Et le label @Fin désactive les deux labels précédents grâce à la fonction end_thread_label Par Vicolaships Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Rejoindre la conversation
Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.