Bienvenue !

TTK, un genre d'espece de team

en quelque sorte


Template de briefing qui marche (presque)

Pour les Masochistes Éditeurs de missions

Template de briefing qui marche (presque)

Messagede =[TTK]= Memphis007 » Dim 28 Fév 2010, 21:24

Donc après plusieurs tests et corrections je vous donne ma solution pour le briefing dans le cas d'un respawn "GROUP".

Ce briefing résout tous les problèmes pour les joueurs connectés en début de partie (le briefing est bien présent tout au long de la mission et ce même après de multiples respawn,, les objectifs sont cochés correctement et l'objectif en cour reste bien défini.)

Le seul petit détail qui reste encore à régler est au niveau du Join In Progress, en effet, les joueurs qui se connectent en cours de partie sont susceptibles de connaitre des bugs (objectifs qui apparaissent en double puis ça disparait, problèmes de statut des objectifs)

J'essaierai de parfaire ce schéma en début de semaine prochaine, en attendant si vous avez des idées...

briefing.sqf :

Code: Tout sélectionner
//on attend que les joueurs prennent possession de leurs corps
waitUntil { !isNil {player} };
waitUntil { player == player };

// ----- Notes -----
player createDiaryRecord ["Diary", ["Renseignements", "Il se pourrait qu'il y ai des patrouilles dans les forêts qui bordent la côte nord est. Vous devrez, dans un second temps, vérifier cette information et, le cas échéant, éliminer ces buveurs de vodka."]];

player createDiaryRecord ["Diary", ["Situation", "Le Sergeant Valjeant trouve que nous nous glandons depuis bien trop longtemps, la base avançée au nord de l'île est toujours sous contrôle Russe, afin de mener à bien nos opérations dans la région Tchernarusse nous devons l'investir au plus vite. Alors, arrêtez la binouse, le pastis et Go Go Go Go !!"]];

//on définit ici autant de variables locales que d'objectifs
_tskObj1_old     = nil;
_tskObj2_old     = nil;
_tskObj3_old     = nil;

// ----- Objectifs -----

//les 3 lignes supplémentaires ici servent à cocher les objectifs de façon approprié

if (!isNil "Obj2") then {_tskObj2_old = taskstate Obj2;};

obj2 = player createSimpleTask["Prendre la base avançée"];

obj2 setSimpleTaskDescription["Prendre la base avançée <br/><br/>La <marker name='m_obj2'>base avançée</marker> est sous le contrôle Russe. Vous devez la nettoyer afin d'en prendre le contrôle", "Prendre la base avançée", "Base avançée"];

obj2 setSimpleTaskDestination (getMarkerPos "m_obj2");

if (!isNil "_tskObj2_old") then {Obj2 setTaskState _tskObj2_old;};

if (TaskState obj2 == "Assigned") then {player SetCurrentTask obj2};


if (!isNil "Obj1") then {_tskObj1_old = taskstate Obj1;};

obj1 = player createSimpleTask["Rejoindre le dépôt d'armes"];

obj1 setSimpleTaskDescription["Rejoindre le dépôt d'armes <br/><br/>Afin de vous équipper correctement vous devrez rejoindre <marker name='m_obj1'>le dépôt d'armes</marker>.", "Rejoindre le dépôt d'armes", "Rejoindre le dépôt d'armes"];

obj1 setSimpleTaskDestination (getMarkerPos "m_obj1");

if (!isNil "_tskObj1_old") then {Obj1 setTaskState _tskObj1_old;};

if (TaskState obj1 == "Assigned") then {player SetCurrentTask obj1};


// si des objectifs sont déclarés pendant la mission, il faut les rappeler ici (ob2=true; publicVariable "ob2"; lorsque obj2 est réussi)

if (!isnil "ob2") then {

  if (!isNil "Obj3") then {_tskObj3_old = taskstate Obj3;};

  obj3 = player createSimpleTask["Nettoyez les Forêts"];

  obj3 setSimpleTaskDescription["Nettoyez les Forêts <br/><br/>Faites vous plaisir maintenant, allez nettoyez les forêts qui longent la route au nord est de l'île", "Nettoyez les forêts", "Nettoyez les forêts"];

  if (!isNil "_tskObj3_old") then {Obj3 setTaskState _tskObj3_old;};

  if (TaskState obj3 == "Assigned") then {player SetCurrentTask obj3};

};


//vérifie l'état de l'objectif 1, si il n'est pas réalisé, alors on le définit comme tâche actuelle (ob1=true; publicVariable "ob1"; lorsque obj1 est réussi)
if (isNil "ob1") then {player setcurrenttask obj1};


//envoyer le briefing au respawn et au Join In Progress
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 {};
Pour halloween, un vrai g33k met un masque de sous réseau.
Le g33k ne sort pas du métro, il libère de la ram.

So Say We All ! - LCDAQFLR

Image
Avatar de l’utilisateur
=[TTK]= Memphis007
Gripsou
Gripsou
 
Age: 31
Messages: 1292
Localisation: /dev/null
Humeur: Born to be wild
Inscription: 13 Jan 2010

Cash: 131.20 Chaislongs

Publicité

Re: Template de briefing qui marche (presque)

Messagede =[TTK]= Freshmeat » Dim 28 Fév 2010, 21:25

Une autre idée à creuser serait de déclarer dans l'init du server autant de variables contenant le statut de chaque objectif et de s'en servir dans le briefing.

Dans l'init :
Code: Tout sélectionner
if (isserver)
then {
    obj1_state = "CREATED";
    Publicvariable "obj1_state";
    obj2_state = "NONE";
    Publicvariable "obj2_state";
}
else
{
    waituntil (!isnil(obj1_state));
    waituntil (!isnil(obj2_state));
};

_briefing = execvm "briefing.sqf";

Dans le briefing :

if (!isnil(obj1_state)) then {
    if (obj1_state != "NONE") then {
        // création de l'objectif 1 et affectation du statut obj1_state
    };
};
if (!isnil(obj2_state)) then {
    if (obj2_state != "NONE") then {
        // création de l'objectif 1 et affectation du statut obj1_state
    };
};

//envoyer le briefing au respawn et au Join In Progress
if ( isNil{player getVariable "mk_killedEHadded"} ) then
{
    player addEventHandler ["killed",
    {
        [] spawn {
            waitUntil { alive player };
            execVM "briefing.sqf";
        };
    }];
    player setVariable ["mk_killedEHadded", true];
};


Au changement de statut de chaque objectif ajouter :
if (isserver && obj1_state != "SUCCEEDED") then {obj1_state = "SUCCEEDED";Publicvariable "obj1_state";};


La question étant : est-ce que les variables publiques sont connues au moment lors du respawn ou de la connexion en jeu?
Les gens n'accordent guère d'importance à la vie, la preuve : quand ils la perdent, ils ne la réclament jamais.
[Jean Deluca]

Image
Avatar de l’utilisateur
=[TTK]= Freshmeat
Grand Manitou
Grand Manitou
 
Messages: 495
Inscription: 01 Mar 2010

Cash: 92.00 Chaislongs

Re: Template de briefing qui marche (presque)

Messagede =[TTK]= Memphis007 » Dim 28 Fév 2010, 21:25

je me pose la même question en ce qui concerne le JIP. pour le respawn pas de soucis

Et j'avais pensez creuser ta méthode
Pour halloween, un vrai g33k met un masque de sous réseau.
Le g33k ne sort pas du métro, il libère de la ram.

So Say We All ! - LCDAQFLR

Image
Avatar de l’utilisateur
=[TTK]= Memphis007
Gripsou
Gripsou
 
Age: 31
Messages: 1292
Localisation: /dev/null
Humeur: Born to be wild
Inscription: 13 Jan 2010

Cash: 131.20 Chaislongs

Re: Template de briefing qui marche (presque)

Messagede =[TTK]= Freshmeat » Dim 28 Fév 2010, 21:26

ben en fait, je pense que pour résoudre l'absence de variable publique, il faut un bête script qui tourne en permanance sur le serveur, par exemple lancé depuis un déclencheur avec une condition 'true', voir directement depuis l'init, après l'initialisation des variables.

Dans l'init :

Code: Tout sélectionner
if (isserver) then {
obj1_state = "CREATED";
obj2_state = "NONE";
_states = execvm "states.sqf";
};


_briefing = execvm "briefing.sqf";



states.sqf :

Code: Tout sélectionner
if (isserver) then {
while {true} do {
publicvariable "obj1_state";
publicvariable "obj2_state";
sleep 5;
};
};



Et remettre les waituntil(!isnil(obj...)) directement dans le briefing ....


Code: Tout sélectionner
waituntil (!isnil(obj1_state));
if (obj1_state != "NONE") then {
// création de l'objectif 1 et affectation du statut obj1_state
};

waituntil (!isnil(obj2_state));
if (obj2_state != "NONE") then {
// création de l'objectif 1 et affectation du statut obj1_state
};


//envoyer le briefing au respawn et au Join In Progress
if ( isNil{player getVariable "mk_killedEHadded"} ) then
{
player addEventHandler ["killed",
{
[] spawn {
waitUntil { alive player };
execVM "briefing.sqf";
};
}];
player setVariable ["mk_killedEHadded", true];
};

Au changement de statut de chaque objectif ajouter, en fonction du nouveau statut :
Code: Tout sélectionner
if (isserver) then {obj1_state = "SUCCEEDED";publicvariable "obj1_state";};


On conserver le mise à jour avec publicvariable juste après le changement de statut afin de limiter au maximum les risques de respawn entre le moment où un objectif est atteint et la mise à jour de la varibiable objX_state
Les gens n'accordent guère d'importance à la vie, la preuve : quand ils la perdent, ils ne la réclament jamais.
[Jean Deluca]

Image
Avatar de l’utilisateur
=[TTK]= Freshmeat
Grand Manitou
Grand Manitou
 
Messages: 495
Inscription: 01 Mar 2010

Cash: 92.00 Chaislongs

Re: Template de briefing qui marche (presque)

Messagede =[TTK]= Clem » Lun 1 Mar 2010, 00:03

ta essayer  en rajoutant  switch (side player) do {  };  si ca change quelque chose ?



Code: Tout sélectionner
// on attend que les joueurs prennent possession de leurs corps
waitUntil { !isNil {player} };
waitUntil { player == player };
 
 
switch (side player) do
{
   
   case WEST: // BLUFOR briefing goes here
   {
                       // ----- Notes -----
player createDiaryRecord ["Diary", ["Renseignements", "Il se pourrait qu'il y ai des patrouilles dans les forêts qui bordent la côte nord est. Vous devrez, dans un second temps, vérifier cette information et, le cas échéant, éliminer ces buveurs de vodka."]];

player createDiaryRecord ["Diary", ["Situation", "Le Sergeant Valjeant trouve que nous nous glandons depuis bien trop longtemps, la base avançée au nord de l'île est toujours sous contrôle Russe, afin de mener à bien nos opérations dans la région Tchernarusse nous devons l'investir au plus vite. Alors, arrêtez la binouse, le pastis et Go Go Go Go !!"]];

//on définit ici autant de variables locales que d'objectifs
_tskObj1_old    = nil;
_tskObj2_old    = nil;
_tskObj3_old    = nil;

// ----- Objectifs -----

//les 3 lignes supplémentaires ici servent à cocher les objectifs de façon approprié

if (!isNil "Obj2") then {_tskObj2_old = taskstate Obj2;};

obj2 = player createSimpleTask["Prendre la base avançée"];

obj2 setSimpleTaskDescription["Prendre la base avançée <br/><br/>La <marker name='m_obj2'>base avançée</marker> est sous le contrôle Russe. Vous devez la nettoyer afin d'en prendre le contrôle", "Prendre la base avançée", "Base avançée"];

obj2 setSimpleTaskDestination (getMarkerPos "m_obj2");

if (!isNil "_tskObj2_old") then {Obj2 setTaskState _tskObj2_old;};

if (TaskState obj2 == "Assigned") then {player SetCurrentTask obj2};


if (!isNil "Obj1") then {_tskObj1_old = taskstate Obj1;};

obj1 = player createSimpleTask["Rejoindre le dépôt d'armes"];

obj1 setSimpleTaskDescription["Rejoindre le dépôt d'armes <br/><br/>Afin de vous équipper correctement vous devrez rejoindre <marker name='m_obj1'>le dépôt d'armes</marker>.", "Rejoindre le dépôt d'armes", "Rejoindre le dépôt d'armes"];

obj1 setSimpleTaskDestination (getMarkerPos "m_obj1");

if (!isNil "_tskObj1_old") then {Obj1 setTaskState _tskObj1_old;};

if (TaskState obj1 == "Assigned") then {player SetCurrentTask obj1};


// si des objectifs sont déclarés pendant la mission, il faut les rappeler ici (ob2=true; publicVariable "ob2"; lorsque obj2 est réussi)

if (!isnil "ob2") then {

  if (!isNil "Obj3") then {_tskObj3_old = taskstate Obj3;};

  obj3 = player createSimpleTask["Nettoyez les Forêts"];

  obj3 setSimpleTaskDescription["Nettoyez les Forêts <br/><br/>Faites vous plaisir maintenant, allez nettoyez les forêts qui longent la route au nord est de l'île", "Nettoyez les forêts", "Nettoyez les forêts"];

  if (!isNil "_tskObj3_old") then {Obj3 setTaskState _tskObj3_old;};

  if (TaskState obj3 == "Assigned") then {player SetCurrentTask obj3};
   };
   
   
   case EAST: // REDFOR briefing goes here
   {
      
      
   };
   
   
   case RESISTANCE: // RESISTANCE/INDEPENDENT briefing goes here
   {
      
      
   };
   
   
   case CIVILIAN: // CIVILIAN briefing goes here
   {
      
      
   };
};



// run this file again when respawning (only setup the killed EH once though)
if ( isNil{player getVariable "mk_killedEHadded"} ) then
{
   player addEventHandler ["killed",
   {
      [] spawn {
         waitUntil { alive player }; // waitUntil player has respawned
         execVM "briefing.sqf";
      };   
   }];
   player setVariable ["mk_killedEHadded", true];
};
Image
Avatar de l’utilisateur
=[TTK]= Clem
Grand Manitou
Grand Manitou
 
Messages: 342
Inscription: 12 Fév 2010

Cash: 200.60 Chaislongs



  • Publicité

Retourner vers Edition ArmA II / OA

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité