init.sqf et jip.sqf made in TTK

Pour les Masochistes Éditeurs de missions
Répondre
Avatar du membre
=[TTK]= Yourry
Grand Scriptou
Grand Scriptou
Âge : 36
Messages : 1634
Enregistré le : mer. 17 mars 2010, 16:39
Localisation : Dans le reblochon !

init.sqf et jip.sqf made in TTK

Message par =[TTK]= Yourry »

Nous allons voir ensemble comment faire un init.sqf qui tient la route (compatible avec les JIP) et expliquer l’intérêt d’un init pour les JIP : jip.sqf.

Avant toute chose, en lisant la le texte ci-dessous, je suppose que vous savez ce qu’est l’init.

L'init.sqf va être en 4 gros morceaux. Chaque morceaux a son utilité :

1ère section :
On y introduit quelques informations prioritaires lues par tous.

2nd section :
Réservé au serveur.

3ème section :
Réservé à l’attribution des localités

4ème section :
Tout le reste.

---------------------------------

Première section :

Dans cette partie, relativement courte on peut y mettre quelques bricoles comme :

Code : Tout sélectionner

diag_log format ["########################## %1###############################", missionName]; 
(affiche le nom de la mission dans le fichier .rpt)

Un script :

Code : Tout sélectionner

BIS_Effects_Burn=compile preprocessFile "\ca\Data\ParticleEffects\SCRIPTS\destruction\burn.sqf"; 
Une initialisation:

Code : Tout sélectionner

waitUntil {!isNil "bis_fnc_init"}; 
Etc…

Puis un gros bloc (à copier tel quel):

Code : Tout sélectionner

//Teste qui permet de d'attribuer de savoir si on est serveur, joueur, jip ,etc.
X_inIT = false;
X_Server = false;
X_Client = false;
X_JIP = false;
X_SPE = false;
X_MP = (if (playersNumber east + playersNumber west + playersNumber resistance + playersNumber civilian > 0) then {true} else {false});
 
Quésaco ?
Ce bloc va permettre de nous dire si on est en solo, en MP, et définie quelques variables.

Exemple :

Code : Tout sélectionner

/*Fait par [TTK] Yourry
init pour la mission =[TTK]= Au clair de la lune .*/

diag_log format ["########################## %1 ################################", missionName];

//Teste qui permet de savoir si on est en solo, en MP, etc..
X_inIT = false;
X_Server = false;
X_Client = false;
X_JIP = false;
X_SPE = false;
X_MP = (if (playersNumber east + playersNumber west + playersNumber resistance + playersNumber civilian > 0) then {true} else {false});
waitUntil {!isNil "bis_fnc_init"}; 
BIS_Effects_Burn=compile preprocessFile "\ca\Data\ParticleEffects\SCRIPTS\destruction\burn.sqf";
 


Deuxième section :

Comme j’ai dit, cette section doit être réservée au serveur. Pourquoi ?
Le serveur a besoin d’un peu de temps pour ingurgiter certaines commandes. De plus c’est lui qui centralise, il est donc logique que cela soit lui qui soit prioritaire par rapport aux joueurs.

On y met tous ce qui doit être lu par le serveur avec :

Code : Tout sélectionner

if(isServer) then
{
     Blala
}; 
Exemple :

Code : Tout sélectionner

if (isServer) then
{   //init UPSMON scritp
    call compile preprocessFileLineNumbers "upsmon\init_UPSMON.sqf";

    //Les variables du jeu:
    v_obj3 = false;
    publicVariable "v_obj3";    
    v_obj2 = false;
    publicVariable "v_obj2";
    v_obj1 = false;
    publicVariable "v_obj1";
    d_obj2 = false;
    publicVariable "d_obj2";
    d_obj1 = false;
    publicVariable "d_obj1";
    blablaok = false;
    publicVariable "blablaok";
    leplein = false; 
    publicVariable "leplein";
    moteur = false; 
    publicVariable "moteur";
}; 

Troisième section :

On y copie telle quel la série de commande suivantes :

Code : Tout sélectionner

//Test qui permet de reconnaître les localités
if (isServer) then 
{
    X_Server = true;
    if (!isDedicated) then 
    {
        X_Client = true;
        X_SPE = true;
    };
    X_inIT = true;
} else {
    X_Client = true;
    if (isNull player) then 
    {
        X_JIP = true;
        [] spawn {waitUntil {!(isNull player)};X_inIT = true};
    } else {
        X_inIT = true;
    };
}; 

Hein ?
Cette fois –ci, en lien avec ce l’on a mit dans la première section, les localités vont être indentifiable avec des variables :
X_Server le serveur (hôte ou dédié)
X_Client le joueur present au depart de la mission
X_JIP le joueur qui arrive en cours de mission
X_SPE le serveur dédié
Chaque machine qui lit cette série de commande aura une valeur (vrai ou fausse) de variable propre à sa localité :
Si la machine est le serveur dédié elle aura les valeurs suivantes

Code : Tout sélectionner

X_Server = true; 
X_Client = false; 
X_JIP = false; 
X_SPE = true; 
Un JIP

Code : Tout sélectionner

X_Server = false;
X_Client = false; 
X_JIP = true; 
X_SPE = false; 
Etc.

Grâce à cela nous allons pouvoir orienter facilement les localités dans les scripts.
Une section de script qui ne doit être lu que par les joueurs aura :

Code : Tout sélectionner

if(X_Client == true) then
{
    blabla
};  
Que pour les JIP:

Code : Tout sélectionner

if(X_JIP == true) then
{
    blabla
};  
Etc…


C’est bien beau mais à quoi cela sert ?
A gérer les localités qui peuvent poser problème.

Un exemple tout simple : une intro de mission :

On met une petite vidéo sur une armée qui envahit un village au début de la mission.
Un JIP qui se pointe, plutôt vers le milieu de la mission quant on a repoussé l’ennemi.

Le JIP aura la vidéo de quelqu’un (la cible de la caméra) que vous aurez peut être tué. La vidéo d’intro n’a donc plus d’intérêt !


Et bien grâce aux localités, nous pourrons dire que la vidéo ne doit être jouée que pour les joueurs présents au début de la mission grâce aux variables :

Code : Tout sélectionner

if(X_Client == true) then 
{
    execVM "intro.sqf";
};
 
Ici on aura l’exécution du script que pour les machines qui ont X_Client égale à vrai (les joueurs)





Quatrième section :

Tout le reste qui doit être lu par les joueurs, les JIP, le serveur, etc….

Mais qui doit commencer par ça :


//On attend que le serveur est bien lu la partie ci dessus afin d'éviter les problèmes de désynchronisation entre le joueur et le serveur
waitUntil {X_INIT};








Voilà un exemple (tiré de ma mission Au clair de la lune) complet d'init.sqf:

Code : Tout sélectionner

/*Fait par [TTK] Yourry
init pour la mission =[TTK]= Au clair de la lune .*/


diag_log format ["########################## %1 ################################", missionName];

//Teste qui permet de d'attribuer de savoir si on est serveur, joueur, jip ,etc.
X_inIT = false;
X_Server = false;
X_Client = false;
X_JIP = false;
X_SPE = false;
X_MP = (if (playersNumber east + playersNumber west + playersNumber resistance + playersNumber civilian > 0) then {true} else {false});
waitUntil {!isNil "bis_fnc_init"}; 
BIS_Effects_Burn=compile preprocessFile "\ca\Data\ParticleEffects\SCRIPTS\destruction\burn.sqf";
if (isServer) then
{    //init UPSMON scritp
    call compile preprocessFileLineNumbers "upsmon\init_UPSMON.sqf";
    //Les variables du jeu:
    v_obj3 = false;
    publicVariable "v_obj3";    
    v_obj2 = false;
    publicVariable "v_obj2";
    v_obj1 = false;
    publicVariable "v_obj1";
    d_obj2 = false;
    publicVariable "d_obj2";
    d_obj1 = false;
    publicVariable "d_obj1";
    blablaok = false;
    publicVariable "blablaok";
    leplein = false; 
    publicVariable "leplein";
    moteur = false; 
    publicVariable "moteur";
};

//Test qui permet de reconnaître les localités
if (isServer) then
{
    X_Server = true;
    if (!isDedicated) then 
    {
        X_Client = true;
        X_SPE = true;
    };
    X_inIT = true;
} else {
    X_Client = true;
    if (isNull player) then
    {
        X_JIP = true;
        [] spawn {waitUntil {!(isNull player)};X_inIT = true};
    } else {
        X_inIT = true;
    };
};

//On attend que le serveur est bien lu la partie ci dessus afin d'éviter les problèmes de désynchronisation entre les joueurs et le serveur
waitUntil {X_inIT};    
    
//Trucage des couleurs pour augmenter la vision de nuit    
"colorCorrections" ppEffectAdjust[ 1, 1, 0.01, [0, 0, 0, 0.12],[1.8, 1.8, 0.3, 1.18],[0.2, 0.59, 0.11, 3.14]];
"colorCorrections" ppEffectCommit 0;
"colorCorrections" ppEffectEnable true;

// Test si on est JIP, au quel cas, le joueur éxecute le script ci-dessous
if(X_JIP) then 
{
    onPlayerConnected "[_id, _name] execVM ""jip.sqf""";
};

//Lancement des quelques scripts perso
call compile preprocessFileLineNumbers "scripts\cam_functions.sqf";
//execution du script pour le début de la mission seulement pour les joueurs présent au démarage de la mission
if ((X_Client) && !(X_JIP)) then {execVM "scripts\intro.sqf";execVM "scripts\insertion.sqf";};

execVM "briefing.sqf";
execVM "R3F_revive\revive_init.sqf";

//Un script de débug pour aider à éditer et corriger "online" certaine erreur (il faut être logué sous le nom exacte de =[TTK]= Yourry pour avoir accès au débug.
if (local player and (name player == "=[TTK]= Yourry")) then {execVM"Debug\initdebug.sqf";};

//-----------Présentation mission-----------//
// Affiche le logo de la team
sleep 10; 
cutRsc["TitrePresentation", "PLAin", 1];  


Un autre init de la mission de Camille ; la fameuse bataille de Groschino:

Code : Tout sélectionner

//Pour le  grand Gourou

diag_log format ["########################## %1 ################################", missionName];

//Teste qui permet de d'attribuer de savoir si on est serveur, joueur, jip ,etc.
X_inIT = false;
X_Server = false;
X_Client = false;
X_JIP = false;
X_SPE = false;
X_MP = (if (playersNumber east + playersNumber west + playersNumber resistance + playersNumber civilian > 0) then {true} else {false});

if (isServer) then
{    
    //Les variables du jeu:
    //Les variables pour les objectifs
    v_obj2 = false;
    publicVariable "v_obj2";    
    v_obj1 = false;
    publicVariable "v_obj1";    
    d_obj2 = false;
    publicVariable "d_obj2";
    d_obj1 = false;
    publicVariable "d_obj1";
};

//Test qui permet de reconnaître les localités
if (isServer) then 
{
    X_Server = true;
    if (!isDedicated) then 
    {
        X_Client = true;
        X_SPE = true;
    };
    X_inIT = true;
} else {
    X_Client = true;
    if (isNull player) then 
    {
        X_JIP = true;
        [] spawn {waitUntil {!(isNull player)};X_inIT = true};
    } else {
        X_inIT = true;
    };
};

//On attend que le serveur est bien lu la partie ci dessus afin d'éviter les problèmes de désynchronisation des variables    
waitUntil {X_inIT};    

// Test si on est JIP, au quel cas, le joueur éxecute le script ci-dessous
if(X_JIP) then 
{
     onPlayerConnected "[_id, _name] execVM ""jip.sqf""";
};

//Lancement des quelques scripts perso et reste:
execVM "briefing.sqf";
groupttk= group leader player; 



Voilà avec ce style d’init, on a les outils nécessaires pour gérer les localités et éviter les problèmes.





Maintenant, plus simple le script jip.sqf

C’est un script qui peut être lancé (je vous le conseil) par l’init de la mission. Celui à pour rôle de mettre à jour les changements qui ont eu lieu pendant la mission pour les JIP :

Le statu d’un objectif
La couleur d’un marqueur
Une intro particulière
Liste des variables
Etc.

Je conseil d’appelé le script dans la 4ème section de mon init juste après la commande waitUntil {X_INIT}; ; comme ceux-ci :

Code : Tout sélectionner

//On attend que le serveur est bien lu la partie ci dessus afin d'éviter les problèmes de désynchronisation des variables    
waitUntil {X_inIT};    

// Test si on est JIP, au quel cas, le joueur expaTtErNécute le script ci-dessous
if(X_JIP) then 
{
     onPlayerConnected "[_id, _name] execVM ""jip.sqf""";
}; 
Le JIP qui se connecte, et lui seul, exécute le script ci-dessus


C’est l’endroit dans le fichier où il faut mettre tout ce qui peut changer d’état ou de valeur.
Par exemple, les variables :

Code : Tout sélectionner

v_obj3 = v_obj3;
publicVariable "v_obj3";    
v_obj2 = v_obj2;
publicVariable "v_obj2";
v_obj1 = v_obj1;
publicVariable "v_obj1";
 
La couleur d’un marqueur :

Code : Tout sélectionner

if(v_obj1) then {"Base" setMarkerColor "colorGreen";};  
La réussite d’un objectif:

Code : Tout sélectionner

if(vobj1) then {obj1 setTaskState “succeeded”}; 
Un message de bienvenu pour le JIP:

Code : Tout sélectionner

hint « Bienvenu chez les futurs roi du monde » ; 
ou

Code : Tout sélectionner

hint « Attention, lit bien le briefing et met toi à jour sur la tâche en cours »

Ou alors pour tous les joueurs :

Code : Tout sélectionner

//indication à tous les joueurs qui sont en jeux qu'il y a un nouveau joueur
_nic = [nil,nil,rhint,format["1% vient de se connecter",name player]] call RE; 

Etc…

Des exemples :

Jip de la mission Au clair de la lune :

Code : Tout sélectionner

/*Fait par =[TTK]= Yourry
Script permettant aux JIP de récupérer les variables publiques en cours. 
On peut aussi introduire dans le script les infos complémentaires qui peuvent changer en cours de jeu comme la couleur des marqueurs, etc.
Ce script n'est expaTtErNécuter que par les JIP.*/

//On attend que le joueur est pris son corps
waitUntil {player == player}; 

if (!isServer && player != player && X_JIP) then 
{ 
    _id = _this select 0;
    _name = _this select 1;

    //Les variables publics a récupérer
    v_obj3 = v_obj3;
    publicVariable "v_obj3";    
    v_obj2 = v_obj2;
    publicVariable "v_obj2";
    v_obj1 = v_obj1;
    publicVariable "v_obj1";
    d_obj3 = d_obj3;
    publicVariable "d_obj3";    
    d_obj2 = d_obj2;
    publicVariable "d_obj2";
    d_obj1 = d_obj1;
    publicVariable "d_obj1";
    blablaok = blablaok;
    publicVariable "blablaok";
    leplein = leplein; 
    publicVariable "leplein"
    moteur = moteur; 
    publicVariable "moteur"

    //indication à tous les joueurs qui sont en jeux qu'il y a un nouveau joueur
    _nic = [nil,nil,rhint,format["1% vient de se connecter",name player]] call RE; 


Jip.sqf de la mission Bataille de Groshino :

Code : Tout sélectionner

/*Fait par =[TTK]= Yourry
Script permettant aux JIP de récupérer les variables publiques en cours. 
On peut aussi introduire dans le script les infos complémentaires qui peuvent changer en cours de jeu comme la couleur des marqueurs, etc.
Ce script n'est expaTtErNécuter que par les JIP.
*/
//On attend que le joueur est pris son corps
waitUntil {player == player}; 

if (!isServer && player != player && X_JIP) then 
{ 
    _id = _this select 0;
    _name = _this select 1;

    //Les variables publics a récupérer
    v_obj2 = v_obj2;
    publicVariable "v_obj2";
    v_obj1 = v_obj1;
    publicVariable "v_obj1";
    d_obj2 = d_obj2;
    publicVariable "d_obj2";
    d_obj1 = d_obj1;
    publicVariable "d_obj1";
};   
Etc.
Modifié en dernier par =[TTK]= Yourry le lun. 28 mars 2011, 00:55, modifié 3 fois.
"Les Boches faisaient "Kamarad". Il aurait fallu commencer par ça des deux côtés, pour éviter les massacres organisés par ceux d'en haut, mais le fusil qu'ils nous avaient collé entre les mains, forcément, il a bien fallu qu'il serve et tout le reste à suivit." dixit Tardi et Verney
Image
L'autre jour, en tirant le rouleau de papier cul, toute la cloison est venue avec. dixit Camille Caz

Avatar du membre
=[TTK]= Yoda
Grand Mérou
Grand Mérou
Âge : 58
Messages : 3562
Enregistré le : jeu. 11 févr. 2010, 17:52
Humeur : bieng-bieng
Localisation : Le milieu

Re: init.sqf et jip.sqf made in TTK

Message par =[TTK]= Yoda »

... et le dernier ferme la porte ...
C’est parce que la vitesse de la lumière est supérieure à celle du son que certains ont l’air brillant avant d’avoir l’air con.

Image
" ... j'ai pas la tirelire dans le string et des tétons comme des pipettes de roues de camion ..." - Injonction Frog Pénelope 2014

Avatar du membre
=[TTK]= Yourry
Grand Scriptou
Grand Scriptou
Âge : 36
Messages : 1634
Enregistré le : mer. 17 mars 2010, 16:39
Localisation : Dans le reblochon !

Re: init.sqf et jip.sqf made in TTK

Message par =[TTK]= Yourry »

Tiens tu tombes bien Yoda.

C'est une ébauche d'un article du Wiki Trankilou.
Va falloir que tu nous fasses un peu de pub auprès des voisins.
Je n'ai pas écris tout ce bazar pour la frime mais qu'il serve sinon j'arrête.


Aller Maître va falloir s'y mettre dur:
la mise à jour de la trésorerie...
le logo...
le rôle d'ambassadeur...
....

:D
"Les Boches faisaient "Kamarad". Il aurait fallu commencer par ça des deux côtés, pour éviter les massacres organisés par ceux d'en haut, mais le fusil qu'ils nous avaient collé entre les mains, forcément, il a bien fallu qu'il serve et tout le reste à suivit." dixit Tardi et Verney
Image
L'autre jour, en tirant le rouleau de papier cul, toute la cloison est venue avec. dixit Camille Caz

Avatar du membre
=[TTK]= Clem
Retraité
Retraité
Messages : 431
Enregistré le : ven. 12 févr. 2010, 15:47

Re: init.sqf et jip.sqf made in TTK

Message par =[TTK]= Clem »

svp Yourry tu pourrais expliquer la relation entre les variable de l'init du jip et le briefing nouvelle version.
Image

Répondre