Aller au contenu

Bienvenue sur le site de l'escadron 131st VFS 'Death Vipers', unité virtuelle évoluant sur le simulateur DCS World

De l'usage de MIST pour gagner du temps


13 réponses à ce sujet

#1

White-sky

    Nobilium vulgari

  • Lieutenant Colonel
  • Moniteur KA-50

Posté 04 novembre 2017 - 19:51

Salut à tous,

Lien de téléchargement : https://github.com/m...nScriptingTools

Bon, on va s’intéresser à un tabou au sein de l’escadron : l’écriture d’un script. PAPAPAPA Te tire pas de suite tu vas voir que d’une c’est ultra simple, de deux ça va te faire passer ton temps moyen d’édition de 4h à 20 minutes. Enfin je compte pas dans les 20 minutes le temps qu’il va te falloir à lire tout ça, mais le comprendre si t’es pas aussi con que t’en as l’air, ça devrait être assez (assez) rapide.

Bon déjà MIST c’est quoi ?

MIST c’est une bibliothèque de fonctions. Ces fonctions ne sont ni plus ni moins que des triggers déguisés. Les mêmes que ceux que tu utilises sur DCS. Sauf que là où pour une opération, quelconque, il te faudra faire 50 triggers. MIST lui, se contentera de le faire en 3 lignes de code… Que tu copie-colleras dans DCS. Alors, heureux ? Moi aussi je t’aime.



I) Introduction.



Bon, déjà, commençons par le commencement. L’utilisation de MIST dans une mission est la suivante. On charge la K-7 MIST dans DCS (oui je sais que t’es un peu gâteux du coup j’utilise ton vocabulaire), et ensuite on peut aller puiser dans son contenu via des triggers.

Du coup, prérequis : On crée un trigger :

UNE FOIS/TEMPS SUP À 3/EXECUTER FICHIER SCRIPT : MIST.lua

Voilà la K-7 est chargée. Maintenant, on va ouvrir ensemble le superbe pdf qui t’est livré avec ton nouvel achat. (Mais nan c’est gratuit). Et on va s’intéresser, de prime abord, aux premières pages, qui définissent les différentes manières que l’on pourra utiliser pour inclure des unités dans nos triggers scriptés.

L’idée est simple, on va utiliser une fonction de MIST qui va exécuter un trigger, par exemple, activer un marker quand une unité est dans la zone. Mais il faut pour ce faire lui dire quelles unités prendre. Et c’est là la différence fondamentale avec l’éditeur de DCS. Tu peux par exemple lui dire de ne compter que les véhicules rouges. Ou les hélicoptères bleus, ou les navires rouges, etc etc. Tu peux lui dire de compter les navires bleus ainsi que les hélicoptères rouges… Bref tu peux tout lui dire. Tout est affaire de sémantique.

On va trouver une manière assez simple de décomposer le « nom » de pareille catégorie. Pour les navires rouges par exemple, on l’appelera dans notre script comme ceci :

[red][ship]

Voilà. Si j’ai envie de retirer de la table les navires rouges, je me contente de mettre un – devant le red : [-red][ship] Voilà. Tu trouveras dans la première page tous les moyens de nommer une unité dans ton trigger, par pays, par type d’unité, tu peux tous les sélectionner via [all] aussi. Bref, tu peux tout faire, c’est ça qu’est beau.

En bref : [Sac dans lequel je veux puiser mon unité][Type d'unité]

Donc jusqu’ici, rien de compliqué. Alors on va mettre ça en pratique.



II) Application pratique.



Je vais donner deux exemples d’une fonction, j’en développerai d’autres sur les prochaines pages.

Exemple type : Je crée une mission multi avec mettons 20 hélicos joueurs. Je veux un trigger qui fasse que si un hélico joueur rentre dans une zone, ça déclenche un marker. La coalition est la coalition rouge.

La solution par trigger est la suivante : créer une zone, créer les appareils, et ensuite créer le trigger où je vais lister les 20 appareils. Et si y’a d’autres zones pour d’autres triggers plus tard, rebelotte. C’est chiant et ça prend 3 plombes à faire.

Avec MIST, ça prend 3 lignes, en un trigger.

Je crée ma zone de déclenchement que j’appelle « Z1 », et un trigger :

UNE FOIS/TEMPS SUP À 5/EXÉCUTER SCRIPT.

Je vais utiliser la fonction « mist.flagFunc.units_in_zones » page 15.

Dans la case je marque :

mist.flagFunc.units_in_zones{
units = {'[red][helicopter]'},
zones = {'Z1'},
flag = 1

}


Et voilà. Tout hélicoptère rouge entrant dans la zone Z1 activera le marker 1.
Je n’ai plus qu’à faire des copier-coller si j’envisage une zone Z2 avec un marker 2, une zone Z3 avec un marker 3 etc.


Ça m’a pris 30 secondes à copier-coller et à remplir. Si je veux qu'il y'ait tous les hélicos et tous les avions, ma seconde ligne sera la suivante :

units = {'[red][helicopter]','[red][plane]'}



Allez, second exemple, plus compliqué : je veux créer dans une mission le cas suivant :

Un Huey transporte des troupes. Il doit déposer ses troupes dans un village. Si le Huey est endommagé et qu’il parvient malgré tout à se poser, je veux que l’on considère que les passagers ont été tués, et qu’il ne peut plus dans ces conditions déposer les troupes.

Décomposons en chaine logique :

On a 1 Huey. Ce Huey doit aller dans une zone et déclencher un marker 1. Si ce Huey est endommagé je déclenche un marker 2, et le marker 1 ne doit pas se déclencher.

Là, si tu es un missionmaker expérimenté, tu saisis l’embrouille : Tu ne peux pas dire à DCS de ne pas déclencher un marker 1 si un marker 2 est activé, tu ne peux que lui dire de déclencher un marker 1 si un marker 2 est activé. DCS ne connaît pas la négation.

Donc tu ne peux pas le faire. Et si, avec MIST, tu pouvais ?

Intéressons nous de nouveau à la fonction « mist.flagFunc.units_in_zones »
On crée la zone de posé Z1. On appelle notre Huey bob (nom de l’unité).
On crée un trigger qui dit que le marker 2 est activé si le Huey est endommagé.

On crée notre trigger :

UNE FOIS/TEMPS SUP À 5/EXÉCUTER SCRIPT.

Dans la case on marque :

mist.flagFunc.units_in_zones{
units = {'[g]bob'},
zones = {'Z1'},
flag = 1,
stopflag = 2

}


La ligne « stopflag = 2 » signifie tout simplement que si le marker 2 est actif, le marker 1 ne pourra pas s’activer.

On a résolu notre problème.

Bon, tu vois, c’est pas très compliqué.

La fonction de la page d’après : « mist.flagFunc.units_in_moving_zones » permet de faire exactement ce qu’on vient de faire sur une zone mobile cette fois-ci. Tu as juste à remplir les lignes qui sont données dans la description et à t’inspirer des exemples. Egalement, autre point intéressant de cette fonction, et de bien d'autres, il est possible d'ajouter la ligne :



zone_type = sphere


Qui, comme son nom l'indique, permet de transformer notre zone de trigger qui est par défaut un cylindre qui monte à une altitude infinie en une sphère ayant pour diamètre celui de la zone, plutôt cool non pour les notions de plancher et les trainings face aux SAM !



Voilà, c’est tout pour ce premier post de tutoriel sur MIST. On se revoit prochainement pour une utilisation plus complexe de l’ensemble. Disons que ça t’aura donné une idée du potentiel de simplification de ce système.
Image IPBImage IPBImage IPBImage IPB

#2

White-sky

    Nobilium vulgari

  • Lieutenant Colonel
  • Moniteur KA-50

Posté 04 novembre 2017 - 19:53

Erreur de ma part sur cette fonction, le plancher ne marchera pas, le reste est valide.

Exemple :

Je veux faire une mission d'infiltration. J'ai placé des chars bleus dans la zone. Je suis coalition rouge. Je ne veux qu'ils soient autorisés à tirer que si je rentre dans leur ligne supposée de visée. En l'occurence, je vais passer par derrière une forêt, je prévois que pour que l'IA puisse me voir, il faudrait que je grimpe au dessus des arbres, à une altitude mettons de 30 m/Sol. Si tel est le cas, alors l'ennemi engagera.

Décomposons cela en termes logiques. Un Kamov-50 nom d'unité "ka", doit traverser une zone sans être vu. Il ne doit pas dépasser une altitude de 30 mètres par rapport à chaque unité présente sur zone (et non par rapport au niveau de la mer) à distance mettons de 1000 m de chaque véhicule. Sinon, on active un marker 1 qui a pour effet de mettre l'IA en tir autorisé.

Inutile de décrire le calvaire que ce serait à faire, au cas par cas pour chaque char, sur une zone vaste et accidentée, via les triggers classiques, j'estime sans exagérer qu'il faudrait 2 à 3 triggers par char, et les renommer chacun individuellement, à raison d'au moins 5 minutes par char. Un calvaire.

On va à la page 22 chercher la fonction "mist.flagFunc.units_LOS "

On crée comme d'hab notre trigger pour exécuter MIST, et le trigger pour exécuter un script. On peut mettre comme condition pour exécuter le script que le ka soit dans la zone d'infiltration. On met également un second trigger activant un marker 2 si le kamov parvient à traverser la zone.

On marque :

mist.flagFunc.units_LOS{

unitset1 = {'[g]ka'}

altoffset1 = 0,

unitset2 = {'[blue][vehicle]'},

altoffset2 = 30,

flag = 1,

stopflag = 2,

radius = 1000,

interval = 5

}


Voilà. Allez je traduis en un petit paragraphe en suivant le code : Si le centre de l'unité ka (d'où l'altitude = 0) passe dans la ligne de visée des chars bleus qui commence 30 mètres au dessus de leur tête et s'étend sur 1000 mètres, en se rafraichissant toutes les 5 secondes, alors on active le marker 1. Si le marker 2 est activé, alors le marker 1 ne pourra jamais s'activer.

En mission, ce que ça donnera :

Si je vole sous les 30 m/sol ou à plus de 1000 mètres de chaque char, alors je passerai inaperçu. Si je vole au dessus de 30m/sol à moins de 1000 mètres d'un char, alors il me verra et donnera l'alerte. Le marker 1 sera activé, et ce marker 1 que j'ai configuré a pour effet de régler tout le monde en tir libre. Si je parviens à traverser la zone et à rentrer dans une seconde zone de triggers, alors le marker 2 sera activé et j'ai réussi le pari.

L'intérêt sur nos missions : ben déjà je trouve cet exemple assez stylé. En prime ça nous permettrait de moduler la capacité de détection des SAM radar par exemple, les mettre selon les modèles de 5 à 50 mètres là où DCS les colle tous à 10 mètres.

Bref, c'est assez con non ?
Image IPBImage IPBImage IPBImage IPB

#3

White-sky

    Nobilium vulgari

  • Lieutenant Colonel
  • Moniteur KA-50

Posté 04 novembre 2017 - 19:53

Exemple :

Je veux créer une mission où je dois détruire un bâtiment dans une ville. Ce bâtiment n'a pas été posé par mes soins, il s'agit d'un bâtiment présent de base sur la carte.

Décomposons cela en termes logiques. Je veux que lorsqu'un bâtiment présent dans une zone de trigger Z1 soit détruit, un marker 1 s'active.

Je mets comme toujours en place tous mes triggers pour éxécuter MIST etc.

Je crée une zone Z1 qui englobe un bâtiment, ou un village, bref tout dépend de ce que je veux : rendre compte de la destruction d'un bâtiment en particulier ? Ou de dommages collatéraux sur tout un village suite à une frappe ratée ?

J'utilise la fonction page 13 "mist.flagFunc.mapobjs_dead_zones "

J'écris :


mist.flagFunc.mapobjs_dead_zones {

zones = {'Z1'},

flag = 1

}


Je pense pas avoir besoin de traduire. Mettons maintenant que je veuille que le marker ne se déclenche que si 3 bâtiments sont détruits dans la zone Z1, peu m'importe lesquels.

Je rajoute la ligne :

req_num = 3


Image IPBImage IPBImage IPBImage IPB

#4

White-sky

    Nobilium vulgari

  • Lieutenant Colonel
  • Moniteur KA-50

Posté 04 novembre 2017 - 19:53

Explication de la manière d'écrire un code script.

Prenons pour ce faire l'exemple du script suivant :

mist.flagFunc.units_in_zones{
units = {'[g]bob', '[red][helicopter]', '[-c][helicopter]france'},
zones = {'Z1', 'Z2', 'Z3'},
flag = 1,
stopflag = 2

}



Bon, déjà, première étape, expliquer le but de ce script :

On utilise la fonction Mist.flagFunc.units_in_zones. C'est la fonction du premier post qui permet de d'activer un marker lorsque des unités rentrent dans une zone.

Un script commence toujours par l'appel de la fonction mère, donc en première ligne Mist.flagFunc.units_in_zones.

Ensuite on ouvre une accolade { . Cette accolade se referme à la toute dernière ligne. Cela signifie que l'ensemble des paramètres de fonctionnement de la fonction sont compris au sein de cette accolade. L'accolade sert de manière générale à créer une liste, que ce soit une liste de paramètres, d'unités, de zones de triggers, de WP etc.

Chaque ligne qui suit correspond à un paramètre. Il ne vous faudra jamais oublier entre 2 lignes la virgule " , ". Cette virgule permet de séparer les paramètres entre eux, il est vital de la mettre sinon le script lira tous les paramètres comme un seul et même terme et il ne comprendra pas. La dernière ligne n'a pas de virgule car elle est immédiatement suivie de la dernière accolade.

Au sein de la ligne 2, on a un listing d'unités. units = {'[g]bob', '[red][helicopter]', '[-c][helicopter]france'},

D'abord le nom du paramètre : Units. Suivi d'un =. Ensuite on ouvre une accolade pour faire comprendre que l'on va établir une liste, une "table" des unités présentes dans ce paramètre. On oublie surtout pas les ' autour de chaque unité, et la virgule les séparant, et on laisse toujours un espace après chaque virgule.

Dans ce paramètre, on trouve : un groupe ([g]) nommée bob, Les hélicoptères rouges (mettons que la coalition rouge comprenne Russie et France), et enfin ce truc : [-c][helicopter]france

Décomposons le.

Par défaut [c] signifie ajouter. [-c] signifie donc retirer. On retire donc quelque chose. [helicopter] signifie le type d'unité que l'on retire. On retire donc des hélicoptères. NE JAMAIS MARQUER [-helicopter], ça ne veut rien dire. Enfin on trouve <france>, ce qui correspond au pays France.

Donc pour retraduire totalement la ligne : Dans le paramètre unités, je liste : bob, les hélicoptères rouges, auxquels je retire les hélicoptères français.

La ligne zones = {‘Z1’, 'Z2', 'Z3'}, voit la création d'une nouvelle liste pour le paramètre zones. On a 3 zones de trigger nommées Z1, Z2, et Z3. J'insiste encore une fois sur la nécessité des apostrophes autour de chaque zone, de la virgule, et de l'espace après chaque virgule.

Pour les deux lignes suivantes, on ne crée pas de liste. En effet, on ne peut pas marquer (du moins je ne pense pas) :

flag = {'1', '2', '3'},

Pour la simple et bonne raison que ce paramètre ne peut qu'actionner un seul marker. Idem pour le suivant. Il faudra créer une autre fonction avec un autre marker pour pouvoir faire un "effet combiné".


Enfin, dans mon script, plutôt que de copier coller 40 triggers d'exécution de script avec à chaque fois une fonction, je peux tout à fait marquer sur un seul et même trigger :




mist.flagFunc.units_in_zones{
units = {'[g]bob', ‘[red][helicopter]', '[-c][helicopter]france'},
zones = {‘Z1’, 'Z2', 'Z3'},
flag = 1,
stopflag = 2

},


mist.flagFunc.units_LOS{

unitset1 = {'[g]ka'}

altoffset1 = 0,

unitset2 = {'[blue][vehicle]'},

altoffset2 = 30,

flag = 1,

stopflag = 2,

radius = 1000,

interval = 5

},


mist.flagFunc.mapobjs_dead_zones {

zones = {'Z1'},

flag = 1,

req_num = 3

}



Le jeu se contentera du coup d'enchainer les fonctions d'un coup en un seul et même trigger. Notez encore une fois la présence d'une virgule cette fois-ci à la fin de chaque fonction, et son absence pour la dernière car ben... Y'a rien qui suit. ;)

Modifié par Dimitriov, 09 novembre 2017 - 20:44 .

Image IPBImage IPBImage IPBImage IPB

#5

White-sky

    Nobilium vulgari

  • Lieutenant Colonel
  • Moniteur KA-50

Posté 04 novembre 2017 - 19:53

Allez on va faire un cas pratique particulièrement dur. Il va falloir suivre.

Je veux qu’un convoi de blindé choisisse une destination au hasard entre 3 choix possibles. Je veux qu’en cours de route il modifie au hasard à nouveau son choix. Je veux que s’il rencontre un hélicoptère hostile, un groupe de défense anti-aérienne présent sur sa base de départ le rejoigne. Je veux également qu’un avion de chasse le rejoigne. Je veux enfin que si le groupe blindé perde plus de la moitié de ses unités, il se replie sur la base.

Accrochez vous, cet exemple sera très complet et très dur.

Configurons notre carte ensemble.

- J’ai un convoi nommé Viking. Il part du camp « D1 ».
- J’ai un second convoi anti-aérien qui reste par défaut sur D1, il se nomme AAA.
- J’ai un avion qui est posé sur la base aérienne proche, en démarrage à froid, case non contrôlée cochée.
- J’ai 3 destinations possibles pour Viking. Les zones Z1, Z2, et Z3.
- Lorsque Viking part pour un de ses choix, il doit passer dans une zone Val1, Val2, ou Val3 permettant d’activer un marker spécifique et de garder ainsi une trace de son choix.
- Au milieu de chaque itinéraire, j’ai les zones C1, C2, et C3. Lorsque Viking passera dedans, il devra à nouveau changer d’itinéraire.
- Suite à ces zones C1, C2, et C3, j’ai de nouvelles zones pour valider le second choix : Val11 et Val12 pour C1, Val21 et Val22 pour C2, Val31 et Val32 pour C3.
- J’ai une zone nommée Viking que je placerai dans un trigger en tant que zone mobile, afin qu’elle soit en permanence centrée sur Viking.
- Dans les actions avancées, Viking et AAA ont en « temps de dispersion » la valeur 5.

Essayez de trouver.

Vous y arrivez pas ? C’est normal. On va procéder par étape.

- Etape 1 : Configurer le repli de Viking. (Simple)
- Etape 2 : Configurer le premier choix d’itinéraire. (Simple)
- Etape 3 : Configurer la validation du premier choix d’itinéraire. (Simple)
- Etape 4 : Configurer le second choix d’itinéraire. (Moyen)
- Etape 5 : Configurer la validation du second choix d’itinéraire. (Moyen)
- Etape 6 : Configurer le fait que Viking alerte en voyant un hélico. (Simple)
- Etape 7 : Configurer AAA pour qu’il rejoigne Viking s’il est avant son second choix d’itinéraire. (Moyen)
- Etape 8 : Configurer AAA pour qu’il rejoigne Viking s’il est après son second choix d’itinéraire. (Dur)
- Etape 9 : Configurer AAA pour qu’il s’arrête une fois avoir rejoint Viking. (Simple)
- Etape 10 : Configurer l’avion pour qu’il rejoigne Viking. (Dur)


10 étapes. Accrochez vous les gars ça va être pénible et vous allez être perdus plus d’une fois.

Etape 1 : Le repli de Viking.

Je veux que Viking se replie s’il perd 50% ou plus de ses forces sur le camp de base D1. Simple.

Je crée un trigger :

UNE FOIS / GROUPE VIVANT INF A : 50 / ACTIVER MARKER 666

Je crée un second trigger :

UNE FOIS / MARKER 666 VRAI / EXECUTER SCRIPT

Je vais chercher la fonction mist.groupToRandomZone page 43.

J’écris :

mist.groupToRandomZone('Viking', 'D1', nil, nil, 80, true)

La fonction veut dire que le groupe Viking se rend dans la zone D1 sans tenir une formation particulière (nil signifie rien), ni n’aura un cap final particulier, mais se tire par contre à 80 km/h en passant par la route (Prend il la route ? Oui ou non. True ou false.)

Voilà la question est règlée.

Etape 2 : Le premier choix de l’itinéraire de Viking.

Il doit choisir entre Z1, Z2, et Z3.

On crée un trigger :

UNE FOIS / TEMPS SUR À 5 / EXECUTER SCRIPT.

On réutilise la même fonction, avec une différence cette fois :

mist.groupToRandomZone('Viking', {'Z1', 'Z2', 'Z3'}, nil, nil, 40, true)

J’ai crée une liste de choix possibles, d’où l’accolade, et oui accessoirement je lui ai dit d’aller à 40 à l’heure, mais vous mettez ce que vous voulez, vous pouvez mettre nil même on s’en branle.

Voilà qui est fait, au bout de 5 secondes il fait son choix.

Etape 3 : Valider l’itinéraire.

Il est vital pour plus tard que je puisse dire quel itinéraire il a choisi, sinon je ne pourrai jamais dire à AAA quel chemin prendre pour le rejoindre. J’ai donc mes zones Val1, Val2, Val3 qui sont placées au début de chaque itinéraire.

Je peux donc rajouter sur mon script précédent le code suivant :

mist.flagFunc.units_in_zones{
units = {'[g]Viking'},
zones = {'Val1'},
flag = 1

},

mist.flagFunc.units_in_zones{
units = {'[g]Viking'},
zones = {'Val2'},
flag = 2

},

mist.flagFunc.units_in_zones{
units = {'[g]Viking'},
zones = {'Val3'},
flag = 3

}


Voilà, à ce stade, vous devez comprendre ce que ça fait. Bon juste le [g]<Viking> alors. Cette fonction demande à désigner de base une unité. Mais Viking n’est pas une unité, c’est un groupe. Donc j’utilise la désignation spéciale [g] qui signifie groupe suivie du nom du groupe entre les <>.

Etape 4 : Configurer le second choix d’itinéraire.

Ok, donc il va changer d’itinéraire arrivé dans les zones C1, C2, ou C3.

On reprend encore notre trigger de départ, on rajoute :

mist.flagFunc.units_in_zones{
units = {'[g]Viking'},
zones = {'C1'},
flag = 11

},

mist.flagFunc.units_in_zones{
units = {'[g]Viking'},
zones = {'C2'},
flag = 12

},

mist.flagFunc.units_in_zones{
units = {'[g]Viking'},
zones = {'C3'},
flag = 13

}

Voilà.

Maintenant on crée les triggers :
( a ) UNE FOIS / MARKER 11 VRAI / EXECUTER SCRIPT
( b ) UNE FOIS / MARKER 12 VRAI / EXECUTER SCRIPT
( c ) UNE FOIS / MARKER 13 VRAI / EXECUTER SCRIPT

Avec en ( a ) :

mist.groupToRandomZone('Viking', {'Z2', 'Z3'}, nil, nil, 40, true)

En ( b ) :

mist.groupToRandomZone('Viking', {'Z1', 'Z3'}, nil, nil, 40, true)

En ( c ) :

mist.groupToRandomZone('Viking', {'Z1', 'Z2'}, nil, nil, 40, true)

En bref, à chaque fois il refait un choix entre les deux destinations restantes.

Etape 5 : Valider le second choix.

Il est également vital de garder une trace du second choix. Je place donc mes zones de trigger Val11 et Val12 derrière C1 sur la route que Viking prendra selon s’il va en Z2 ou en Z3. Idem pour Val21 et Val22 pour C2, Val31 et Val32 pour C3.

On reprend maintenant notre trigger du début qui est géant maintenant.

On marque :

mist.flagFunc.units_in_zones{
units = {'[g]Viking'},
zones = {'Val11'},
flag = 1000

},

mist.flagFunc.units_in_zones{
units = {'[g]Viking'},
zones = {'Val12'},
flag = 1001

},

mist.flagFunc.units_in_zones{
units = {'[g]Viking'},
zones = {'Val21'},
flag = 2000

},

mist.flagFunc.units_in_zones{
units = {'[g]Viking'},
zones = {'Val22'},
flag = 2001

},

mist.flagFunc.units_in_zones{
units = {'[g]Viking'},
zones = {'Val31'},
flag = 3000

},

mist.flagFunc.units_in_zones{
units = {'[g]Viking'},
zones = {'Val32'},
flag = 3001

}

Et voilà le choix sera gardé en mémoire.

Etape 6 : Faire en sortes que Viking donne l’alerte s’il voit un hélico.

Tu dois connaître la réponse.

Allez je te la file quand même, on reprend la fonction page 22 mist.flagFunc.units_LOS.

On rajoute toujours sur notre trigger de départ :

mist.flagFunc.units_LOS{
unitset1 = {'[red][helicopter]'}
altoffset1 = 0,
unitset2 = {'[g]Viking'},
altoffset2 = 20,
flag = 100,
radius = 4000,
interval = 5
}

Voilà, là il détectera tout hélico ennemi volant plus de 20 m au dessus de sa tête dans un rayon de 4000 m. J’ai mis ça au pif. Ça activera un marker 100. C’est tout ce dont on a besoin.

Etape 7 : Configurer AAA pour qu’il rejoigne Viking lorsque celui-ci n’a pas encore fait son second choix d’itinéraire.

C’est maintenant que tous les markers qu’on a créé vont être utiles.

Viking vient de donner l’alerte, le marker 100 est donc actif.

On crée les 3 triggers suivants :

( a ) UNE FOIS / MARKER 100 VRAI ET MARKER 1 VRAI / EXECUTER SCRIPT
( b ) UNE FOIS / MARKER 100 VRAI ET MARKER 2 VRAI / EXECUTER SCRIPT
( c ) UNE FOIS / MARKER 100 VRAI ET MARKER 3 VRAI / EXECUTER SCRIPT

En ( a ) on marque :

mist.groupToRandomZone('AAA', 'Z1', nil, nil, 80, true)

En ( b ) on marque :

mist.groupToRandomZone('AAA', 'Z2', nil, nil, 80, true)

En ( c ) on marque :

mist.groupToRandomZone('AAA', 'Z3', nil, nil, 80, true)

On met 80 km/h pour qu’ils se bougent le cul.

Dans le même temps, on prend Viking, on va dans les actions avancées déclenchées par trigger, on fait « Effectuer la tache – Maintenir position ». On met comme condition d’arrêt le marker 666 afin qu’il puisse quand même se replier en cas de pertes.

On crée un trigger :

UNE FOIS / MARKER 100 VRAI / TACHE IA EXECUTER : Maintenir position.

Comme ça Viking s’est arrêté.

Voilà AAA part pour le rejoindre.

Etape 8 : Configurer AAA pour rejoindre Viking lorsque celui-ci a fait son second choix.

Allez on est partis, pour l’instant AAA se rend sur le premier choix d’itinéraire de Viking, une fois qu’il arrivera dans la zone C1, C2, ou C3, il faudra qu’il fasse le même choix que lui.

On crée les triggers suivants :

Pour C1 :

( a ) UNE FOIS / GROUPE AAA DANS ZONE C1 ET MARKER 1000 VRAI / EXECUTER SCRIPT
( b ) UNE FOIS / GROUPE AAA DANS ZONE C1 ET MARKER 1001 VRAI / EXECUTER SCRIPT :

Avec pour ( a ) :

mist.groupToRandomZone('AAA', 'Z2', nil, nil, 80, true)

Pour ( b ) :

mist.groupToRandomZone('AAA', 'Z3', nil, nil, 80, true)

Pour C2 :

( a ) UNE FOIS / GROUPE AAA DANS ZONE C2 ET MARKER 2000 VRAI / EXECUTER SCRIPT
( b ) UNE FOIS / GROUPE AAA DANS ZONE C2 ET MARKER 2001 VRAI / EXECUTER SCRIPT :

Avec pour ( a ) :

mist.groupToRandomZone('AAA', 'Z1', nil, nil, 80, true)

Pour ( b ) :

mist.groupToRandomZone('AAA', 'Z3', nil, nil, 80, true)

Pour C3 :

( a ) UNE FOIS / GROUPE AAA DANS ZONE C3 ET MARKER 3000 VRAI / EXECUTER SCRIPT
( b ) UNE FOIS / GROUPE AAA DANS ZONE C3 ET MARKER 3001 VRAI / EXECUTER SCRIPT :

Avec pour ( a ) :

mist.groupToRandomZone('AAA', 'Z1', nil, nil, 80, true)

Pour ( b ) :

mist.groupToRandomZone('AAA', 'Z2', nil, nil, 80, true)



Voilà. Allez on a presque fini.


Etape 9 : Configurer AAA pour qu’il s’arrête lorsqu’il aura rejoint Viking.


C’est de la pisse de chat ça.

Allez hop, on met comme action déclenchée sur trigger pour AAA :

Effectuer tâche – Maintenir position.

On crée un trigger :

UNE FOIS / GROUPE AAA EN PARTIE DANS ZONE MOBILE VIKING DU GROUPE VIKING / TACHE IA EXECUTER : Maintenir position.

Et voilà !

Etape 10 : Faire en sortes que l’avion rejoigne Viking.

Pfff que du trigger, pas de script ici.

Bon déjà on crée un WP sur chaque zone D1, C1, C2, C3 et Z1, Z2, Z3.

On règle dans les actions avancées l’appareil sur : radar on en permanence, tirer partout bref faut qu’il asmathe.

On va dans les actions avancées déclenchées sur trigger :
En premier : Exécuter tâche : démarrage.
Ensuite : Exécuter tâche (je crois de mémoire) – basculer sur WP.

Et on crée autant d’actions avancées qu’il n’y a de WP.

Ensuite ben c’est très simple. On va lui faire remonter la piste !

Vlà les triggers en vrac.

UNE FOIS / MARKER 100 VRAI / TACHE IA EXECUTER : démarrage.
UNE FOIS / TEMPS DEPUIS MARQUEUR 100 : 15 / TACHE IA EXECUTER : basculer sur WP « D1 ».
UNE FOIS / TEMPS DEPUIS MARQUEUR 100 : 25 ET MARKER 1 VRAI / TACHE IA EXECUTER : basculer sur WP « C1 ».
UNE FOIS / TEMPS DEPUIS MARQUEUR 100 : 25 ET MARKER 2 VRAI / TACHE IA EXECUTER : basculer sur WP « C2 ».
UNE FOIS / TEMPS DEPUIS MARQUEUR 100 : 25 ET MARKER 3 VRAI / TACHE IA EXECUTER : basculer sur WP « C3 ».

Ensuite,

UNE FOIS / TEMPS DEPUIS MARQUEUR 100 : 300 ET MARKER 1000 VRAI / TACHE IA EXECUTER : basculer sur WP « Z2 ».
UNE FOIS / TEMPS DEPUIS MARQUEUR 100 : 300 ET MARKER 1001 VRAI / TACHE IA EXECUTER : basculer sur WP « Z3 ».
UNE FOIS / TEMPS DEPUIS MARQUEUR 100 : 300 ET MARKER 2000 VRAI / TACHE IA EXECUTER : basculer sur WP « Z1 ».
UNE FOIS / TEMPS DEPUIS MARQUEUR 100 : 300 ET MARKER 2001 VRAI / TACHE IA EXECUTER : basculer sur WP « Z3 ».
UNE FOIS / TEMPS DEPUIS MARQUEUR 100 : 300 ET MARKER 300 VRAI / TACHE IA EXECUTER : basculer sur WP « Z1 ».
UNE FOIS / TEMPS DEPUIS MARQUEUR 100 : 300 ET MARKER 3001 VRAI / TACHE IA EXECUTER : basculer sur WP « Z2 ».

À noter que les délais sont susceptibles d’être modifiés pour améliorer le comportement et le timing des changements de cap.

Voilà, notre exercice est terminé.

Alors, Chaud hein !
Image IPBImage IPBImage IPBImage IPB

#6

Alias

    Pilote

  • Capitaine
  • Moniteur F-18C

Posté 09 novembre 2017 - 11:37

Hello, t'es en vacances ou quoi ? :D

C'est réalisable sans script ? il y a juste l'histoire des 80km en cas de replis qui pose problème.

Moi le seule truc que je reproche au script, c'est les éventuels crach. ca vie très mal les mises à jours.

Mais tu t'es bien amusé ^^ :gg:
Image IPB Image IPBImage IPBImage IPB

#7

White-sky

    Nobilium vulgari

  • Lieutenant Colonel
  • Moniteur KA-50

Posté 09 novembre 2017 - 14:14

Nope dans le cas pratique rien n'est réalisable par trigger ;) Tu ne peux pas demander à un groupe sol de changer de wp, encore moins de le faire de manière aléatoire. Tu ne peux pas non plus lui demander de ne repérérer les hélicos rouges que s'ils s'approchent à moins de 4000 m et au dessus de 20m/au toit des chars. Idem pour le repli, il faudrait que je puisse lui dire de basculer sur un wp, je ne peux pas le faire sans script. D'autant que pardon mais les triggers aléatoires dans DCS c'est une vraie pigne de pain dans le cul ^^

Ensuite les autres fonctions oui tu peux les faire par trigger, c'est juste que là c'est un copier coller si tu regardes sur un seul et même trigger de 15 fois la même fonction avec une lettre à changer, ça veut dire simplement que tu peux tout préparer avant même de lancer DCS. Et si j'ai mis un exemple avec un seul convoi, j'aurais tout à fait pu faire la même chose avec 15 convois, toujours un en seul trigger et avec autant de fonctions.

Bref, je trouve les scripts nettement plus pratiques. Ensuite ces fonctions là sont "basiques", donc a priori elles ne souffrent pas des maj.

Ensuite s'il vous plait les remarques par mp parce-que j'aimerais garder ce fil aussi propre que possible.
Image IPBImage IPBImage IPBImage IPB

#8

Alias

    Pilote

  • Capitaine
  • Moniteur F-18C

Posté 09 novembre 2017 - 20:48

A oui, c'est juste, c'est seulement avec les avions le changement de WP. :gg:
Dans le cas pratique c'est vrai que tu économises des 100ène de copié collé de trigger.

Une fois que tu as lu ce message, efface les 3 derniers.
Image IPB Image IPBImage IPBImage IPB

#9

White-sky

    Nobilium vulgari

  • Lieutenant Colonel
  • Moniteur KA-50

Posté 09 novembre 2017 - 20:51

Idiot j'ai pas les droits pour effacer :ptdr:
Image IPBImage IPBImage IPBImage IPB

#10

Alias

    Pilote

  • Capitaine
  • Moniteur F-18C

Posté 09 novembre 2017 - 21:17

Même pas avec un scrip ? :P :ph34r:

:sorry: je sors

Mais sympa ton topic et explication :gg: et si je me trompe dans la stabilité, alors vraiment la classe
Image IPB Image IPBImage IPBImage IPB

#11

Flo

    Captain Lorraine

  • Capitaine

Posté 21 décembre 2017 - 09:25

Une question: je veux que les unités d'une coalition qui se trouvent dans une zone et au dessus d'une certaine altitude soient immortelles seulement si les deux conditions précédentes sont réunies, quelqu'un aurait une idée ? J'ai en tout 50 avions et hélicos pour lesquels je voudrait que cette fonction soit dispo, seulement si je passe par des triggers j'y suis encore la semaine prochaine :ptdr:
Image IPB Image IPB

#12

Flo

    Captain Lorraine

  • Capitaine

Posté 21 décembre 2017 - 10:55

J'ai essayé ça mais ça donne rien:

if mist.flagFunc.units_in_zones {
units = {'[blue][plane]', '[blue][helicopter]'}
zones = {'invincible'}
flag = 100,
stopflag = 200} then

SetImmortal = {
id = {'[blue][plane]', '[blue][helicopter]'}
params = {
value = true
}
}
end
Image IPB Image IPB

#13

White-sky

    Nobilium vulgari

  • Lieutenant Colonel
  • Moniteur KA-50

Posté 21 décembre 2017 - 11:39

L'accolade autour d'invincible ne sert à rien. Et remplace id par units, groupname ou group voir si ça marche ?
Image IPBImage IPBImage IPBImage IPB

#14

Flo

    Captain Lorraine

  • Capitaine

Posté 21 décembre 2017 - 14:50

Bon je sais pas ce qui ne vas pas, j'ai posté un message sur les forums d'ED des fois que...
Par contre ça y est mes cibles mobiles détruites réapparaissent ET se mettent à rouler :-D
Image IPB Image IPB



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)