N'hésiter pas à me corriger, faire des remarques dans le but de faire évoluer rapidement ce poste dans le wiki.
Bonne lecture
Voici enfin le vrai, le véritable briefing qui fonctionne en solo, en multi, en JIP, etc…
Je ne reviens pas sur la création du briefing, des postes dans le fofo traitent de cela. Cette technique (il y en a d’autre) va nous permettre de compléter le briefing « basic »
Pour bien saisir le fonctionnement de ce briefing, il est essentiel de lire mon article wiki sur le script init.sqf et le jip.sqf
Ces deux scripts sont essentiels pour un bon fonctionnement des briefings.
En réalité, rien de complexe par rapport à avant. Les briefings ont toujours la même tête. La seule différence est le rajout de quelques petites lignes qui vont guider les JIP
Pour rappel, les JIP (Join In Progress) sont des joueurs qui arrivent en cours de jeu alors que la mission a déjà commencée. Si les changements (échec, suppression, validation, etc) sont antérieurs à leur connexion, ceux-ci n’auront pas les briefings à jour. A l’inverse, si le briefing est mis à jour après leur venue, il n’y a pas de souci de mise à jour.
Concrètement, pour les JIP, il va falloir organiser des sessions de rattrapage dans lesquelles nous allons, uniquement pour eux (pas pour les joueurs en jeu), leur mettre à jour le briefing et éventuellement le changement de couleurs de marqueurs (en fait tout ce qui va être modifié par rapport au début du jeu).
Voilà pour ce qui est de la théorie, dans les faits les choses sont simples :
J’ai pour habitude de créer et nommée mes variables de la façon suivantes :
Code : Tout sélectionner
obj1 = objectif 1
v_obj1 = validation de l’objectif 1
d_obj1 = échec de l’objectif 1
c_obj1 = création de l’objectif 1
Les variables si dessus sont à mettre dans l’init et le jip.sqf (cf wiki init et jip)
Ensuite la création du briefing reste inchangée par rapport au standard :
Code : Tout sélectionner
Numéro obj = player createSimpleTask["Mon objectif"];
Numéro obj setSimpleTaskDescription["Description de l’obj", " Mon objectif ", " Mon objectif "];
Maintenant, après la création du briefing, nous allons nous occuper de cette session de rattrapage, avec le code suivant (il faut bien sûr changer les numéros d’objectifs et des variables). Il faut placer cette ligne de code juste après les commandes de création d'objectif (cf exemples), pour chaque objectifs:
Code : Tout sélectionner
if (!isNil "v_obj2" ) then {//On vérifie que cette variable existe
if(v_obj2) then //On ne donne que ce qui est entre les " { } " que si ma variable v_obj2 est vrai
{
obj2 setTaskState "Succeeded";//On valide l'objectif
//"" setMarkerColor "colorGreen"; //On peut mettre le marqueur à la couleur verte
};
};
if (!isNil "d_obj2" ) then {//Idem on vérifie quelle existe
if(d_obj2) then //On ne donne que ce qui est entre les " { } " que si ma variable d_obj6 est vrai
{
obj2 setTaskState "Failled";
//"" setMarkerColor "colorRed"; //On peut mettre le marqueur à la couleur rouge
};
};
En jeu, dans un déclencheur, dans un script, le changement de statue de l’objectifs se fait de façon classique avec :
Code : Tout sélectionner
obj2 setTaskState "SUCCEEDED";
nul=[objNull, objNull, obj2,"SUCCEEDED"] execVM "CA\Modules\MP\data\scriptCommands\taskHint.sqf";
Code : Tout sélectionner
v_obj2 = true, publicVariable " v_obj2 ";
Si on veut le faire échouer :
Code : Tout sélectionner
obj2 setTaskState "FAILLED";
nul=[objNull, objNull, obj2,"FAILLED"] execVM "CA\Modules\MP\data\scriptCommands\taskHint.sqf";
d_obj2 = true, publicVariable « d_obj2 » ;
On comprend bien lorsque les JIP arriveront, ils auront connaissance de l’état de la variable (soit vrai ou fausse) et donc si l’objectif a été rempli ou non, au quels cas, avec le bout de code en haut juste après les objectifs, on oriente le statu de l’objectifs et la couleur des marqueurs etc.
Voilà une série d'exemple concret:
Ici un exemple de briefing avec 2 objectifs:
Dans mon init.sqf (extrait):
Code : Tout sélectionner
if (isServer) then
{
//Les variables du jeu:
v_obj2 = false;
publicVariable "v_obj2";
v_obj1 = false;
publicVariable "v_obj1";
d_obj2 = false;
publicVariable "d_obj2";
d_obj1 = false;
publicVariable "d_obj1";
};
Code : Tout sélectionner
//Les variables publics a récupérer
v_obj2 = v_obj2;
publicVariable "v_obj2";
v_obj1 = v_obj1;
d_obj2 = d_obj2;
publicVariable "d_obj2";
d_obj1 = d_obj1;
publicVariable "d_obj1";
Et le briefing en question:
Code : Tout sélectionner
//Fait par =[TTK]= Yourry
//Briefing adapté aux JIP !
waitUntil {!(isNull player)};
waitUntil {player==player};
//Notes
//Briefing
obj2=player createSimpleTask ["Nettoyer la mine"];
obj2 setSimpleTaskDescription ["Depuis trop longtemps, <marker name='Mine'>la mine</marker> est le vivier des insurgés. Ils exploitent des pierres précieuses issues de la mine pour financer l'achat d'armes. Il faut prendre les lieux pour stopper leur finance","Nettoyer la mine","Nettoyer la mine"];
if (!isNil "v_obj2" ) then {
if(v_obj2) then
{
obj2 setTaskState "Succeeded";
"Mine" setMarkerColor "colorGreen";
};
};
if (!isNil "d_obj2" ) then {
if(d_obj2) then
{
obj2 setTaskState "Failled";
"Mine" setMarkerColor "colorRed";
};
};
obj1=player createSimpleTask ["Aider l'ONU"];
obj1 setSimpleTaskDescription ["L'ONU cONU pour sa légendaire force d'intervention, souhaite que vous les aidiez en participant à l'assault du village <marker name='Militia'>Hazar Bagh</marker>.<br/>Lorsque vous pensez être prêt à soutenir l'assaut, vous pourrez alors demander l'attaque via le canal radio","Aider l'ONU","Aider l'ONU"];
if (!isNil "v_obj1" ) then {
if(v_obj1) then
{
obj1 setTaskState "Succeeded";
"Militia" setMarkerColor "colorGreen";
};
};
if (!isNil "d_obj1" ) then {
if(d_obj1) then
{
obj1 setTaskState "Failled";
"Militia" setMarkerColor "colorRed";
};
};
//Pas besoin puisque le respawn base ne perd pas le briefing => Uniquement valable si on est en respawn group
/*Section qui permet de renvoyer le briefing si on meurt
if ( isNil{player getVariable "mk_killedEHadded"} ) then
{
player addEventHandler ["killed",
{
[] spawn {
waitUntil { alive player };
execVM "briefing.sqf";
};
}];
player setVariable ["mk_killedEHadded", true];
};
if (true) exitWith {};
*/
Ici un autre exemple, avec un architecture semblable mais un peu différents car l'objectif 2 est caché au début de la mission.
Le fonctionnement est le même:
Dans mon init.sqf (extrait):
Code : Tout sélectionner
if (isServer) then
{
//Les variables du jeu:
//Pour le briefing
v_obj2 = false;
publicVariable "v_obj2";
v_obj1 = false;
publicVariable "v_obj1";
//création des objectifs cachés
c_obj2 = false;
publicVariable "c_obj2";
d_obj2 = false;
publicVariable "d_obj2";
d_obj1 = false;
publicVariable "d_obj1";
};
Code : Tout sélectionner
//Les variables publics a récupérer
v_obj2 = v_obj2;
publicVariable "v_obj2";
v_obj1 = v_obj1;
publicVariable "v_obj1";
c_obj2 = c_obj2;
publicVariable "c_obj2";
c_obj1 = c_obj1;
publicVariable "c_obj1";
d_obj2 = d_obj2;
publicVariable "d_obj2";
d_obj1 = d_obj1;
publicVariable "d_obj1";
Code : Tout sélectionner
waitUntil { !isNil {player} };
waitUntil { player == player };
bj1 = player createSimpleTask["Attaquer le bastion"];
obj1 setSimpleTaskDescription["Attaquer <marker name='le bastion ennemi'>le bastion ennemi</marker> afin d'empêcher les Insurgés de monter une attaque sur la raffinerie.<br/>Un Hélico est disponoble à l'exterieur du complexe pour vos déplacements.", "Attaquer le bastion", "Attaquer le bastion"];
obj1 setSimpleTaskDestination (getMarkerPos "le bastion ennemi");
player setCurrentTask obj1;
//Section des objectifs cachées: pour les JIP
if (!isNil "c_obj2") then {
if (c_obj2) then {
obj2 = player createSimpleTask["Attaquer le convoi"];
obj2 setSimpleTaskDescription["Il faut détruire les camions d'essence du <marker name='markerlkwwest_1'>convoi</marker> avant qu'ils ne puissent pas faire le plein à la raffinerie et par la même occasion détruisez tous les véhicules du convoi pour leur faire comprendre que on plaisante pas.", "Attaquer le convoi", "Attaquer le convoi"];
if (!isNil "v_obj2" ) then {//On vérifie que cette variable existe
if(v_obj2) then //On ne donne que ce qui est entre les " { } " que si ma variable v_obj2 est vrai
{
obj2 setTaskState "Succeeded";//On valide l'objectif
//"" setMarkerColor "colorGreen"; //On peut mettre le marqueur à la couleur verte
};
};
if (!isNil "d_obj2" ) then {//Idem on vérifie quelle existe
if(d_obj2) then //On ne donne que ce qui est entre les " { } " que si ma variable d_obj6 est vrai
{
obj2 setTaskState "Failled";
//"" setMarkerColor "colorRed"; //On peut mettre le marqueur à la couleur rouge
};
};
};
};
//Pour le respawn group
if ( isNil{player getVariable "mk_killedEHadded"} ) then
{
player addEventHandler ["killed",
{
[] spawn {
waitUntil { alive player };
execVM "briefing.sqf";
};
}];
player setVariable ["mk_killedEHadded", true];
};
if (true) exitWith {};
Il est sage de mettre ce code en première ligne dans les briefing:
Code : Tout sélectionner
waitUntil {!(isNull player)};
waitUntil {player==player};
Dans le cas particulier (et uniquement lui), du respawn group ou 3, on perd le briefing. Pourquoi ?
Très simple, tout dépend de votre commande pour le briefing; si on a:
Code : Tout sélectionner
obj8 =player createSimpleTask ["Sécuriser les lieux"];
soit à la fin du briefing on met (je préfère cette méthode car elle permet de garder le briefing multi-camps):
Code : Tout sélectionner
if ( isNil{player getVariable "mk_killedEHadded"} ) then
{
player addEventHandler ["killed",
{
[] spawn {
waitUntil { alive player };
execVM "briefing.sqf";
};
}];
player setVariable ["mk_killedEHadded", true];
};
if (true) exitWith {};
A venir très prochainement l'article sur les fichiers init.sqf et jip.sqf