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];
Un script :
Code : Tout sélectionner
BIS_Effects_Burn=compile preprocessFile "\ca\Data\ParticleEffects\SCRIPTS\destruction\burn.sqf";
Code : Tout sélectionner
waitUntil {!isNil "bis_fnc_init"};
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});
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
};
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 :
Chaque machine qui lit cette série de commande aura une valeur (vrai ou fausse) de variable propre à sa localité :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é
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;
Code : Tout sélectionner
X_Server = false;
X_Client = false;
X_JIP = true;
X_SPE = false;
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
};
Code : Tout sélectionner
if(X_JIP == true) then
{
blabla
};
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";
};
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""";
};
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";
Code : Tout sélectionner
if(v_obj1) then {"Base" setMarkerColor "colorGreen";};
Code : Tout sélectionner
if(vobj1) then {obj1 setTaskState “succeeded”};
Code : Tout sélectionner
hint « Bienvenu chez les futurs roi du monde » ;
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";
};