Template de briefing qui marche (presque)

Pour les Masochistes Éditeurs de missions
Répondre
Avatar du membre
=[TTK]= Memphis007
Grand TranKilou
Grand TranKilou
Âge : 44
Messages : 3351
Enregistré le : mer. 13 janv. 2010, 15:29
Humeur : Binaire
Localisation : 127.0.0.1
Contact :

Template de briefing qui marche (presque)

Message par =[TTK]= Memphis007 »

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 {};
Si ya pas de shell, ya pas de plaisir...
Image

Fingers in the noise. Maxime verdâtre.

Avatar du membre
=[TTK]= Freshmeat
Retraité
Retraité
Messages : 474
Enregistré le : lun. 1 mars 2010, 13:49

Re: Template de briefing qui marche (presque)

Message par =[TTK]= Freshmeat »

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 du membre
=[TTK]= Memphis007
Grand TranKilou
Grand TranKilou
Âge : 44
Messages : 3351
Enregistré le : mer. 13 janv. 2010, 15:29
Humeur : Binaire
Localisation : 127.0.0.1
Contact :

Re: Template de briefing qui marche (presque)

Message par =[TTK]= Memphis007 »

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
Si ya pas de shell, ya pas de plaisir...
Image

Fingers in the noise. Maxime verdâtre.

Avatar du membre
=[TTK]= Freshmeat
Retraité
Retraité
Messages : 474
Enregistré le : lun. 1 mars 2010, 13:49

Re: Template de briefing qui marche (presque)

Message par =[TTK]= Freshmeat »

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 du membre
=[TTK]= Clem
Retraité
Retraité
Messages : 431
Enregistré le : ven. 12 févr. 2010, 15:47

Re: Template de briefing qui marche (presque)

Message par =[TTK]= Clem »

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

Répondre