publicVariable et localité

Pour les Masochistes Éditeurs de missions
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 !

publicVariable et localité

Message par =[TTK]= Yourry »

Voilà LE sujet qui me rend dingue !

Après plusieurs années sur Arma, je dois le reconnaître, j'ai toujours rien compris.

Quelques exemples:

si on déclare une variable "test" dans l'init, avec l'execution du serveur:

Code : Tout sélectionner

if(isserver) then {test=true; publicvariable"test";};
Que j'utilise ma variable dans un script, lancé sur tous les postes, c'est la cata:
La variable est inconnue pour les joueurs, donc le scripts ne peut ce lancer, mais pas pour le serveur .... :mrgreen:
A quoi il sert le publicvariable ?

Idem, les joueurs en Join in progres (JIP) ont connaissance de la variable d'origine, si elle change durant la mission de valeur et que eux viennent après le changement, c'est mort pour eux !

J'ai lu des kilomètres de posts sur le fofo de BIS, sur les wiki, toujours pas trouver la chose magique:

Une variable lancé par le serveur (comme mon code ci-dessus) et qui est redistribuée aux joueurs.
L'énorme avantage, est que tous les joueurs et même JIP auront la variable actualisée.

J'ai cru au truc de BIS, le machin missionscoop dans la logique de jeu, avec la commande:

Code : Tout sélectionner

BIS_missionScope setVariable ["mavariable",valeur,TRUE];
Mais que dalle ! Rien compris à quoi cela sert, sauf à rendre archi locale une variable...

Des questions sur les variables, j'en ai des kilomètres !
Et je me suis dit, qu'il faudrait peut être des kilomètres de réponses...
"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]= Memphis007
Grand TranKilou
Grand TranKilou
Âge : 43
Messages : 3351
Enregistré le : mer. 13 janv. 2010, 15:29
Humeur : Binaire
Localisation : 127.0.0.1
Contact :

Re: Variable et localité

Message par =[TTK]= Memphis007 »

Je te renverrai bien au post qu'a fait Freshmeat sur notre beau wiki, mais moi non plus j'y capte que dalle !

Je pense que le jour ou tu piges ça à 100% tu obtiens ton diplôme officiel d'éditeur de mission arma, et tu deviens le boss du script !
Si ya pas de shell, ya pas de plaisir...
Image

Fingers in the noise. Maxime verdâtre.

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: Variable et localité

Message par =[TTK]= Yourry »

Je suis allé aussi le wiki, c'est intéressant, mais cela reste des généralités.
J'ai trouvé une chose, qui peut résoudre certain problème avec le JIP:

Code : Tout sélectionner

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 {
	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;
	};
};
Cela permet de d'attribuer des variables selon la localité et de s'en servir pour exclure ou inclure les concernées dans les scripts:

-Pour exclure les JIP du script:

Code : Tout sélectionner

  if(X_JIP) exitwith{};
-Les joueurs:

Code : Tout sélectionner

  if(X_Client) exitwith{};
-etc....


Je prépare pour bientôt l'arme imparable du briefing, Multiplayer Framework.
Là plus de problème avec les JIP ! Il faut que je peaufine la chose, notament en multi camp....

Mais bon, cela ne m'indique toujours pas comment faire une VRAI variable publique...
"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]= Freshmeat
Retraité
Retraité
Messages : 474
Enregistré le : lun. 1 mars 2010, 13:49

Re: Variable et localité

Message par =[TTK]= Freshmeat »

Dans l'init de ta mission tu dois mettre :

Code : Tout sélectionner

if (isserver) then {
          test = "toto";
          publicvariable "test";
} else {
          if (isnil("test")) then {test = "toto";};
};
Il faut comprendre :
si on est le serveur, on crée la variable test et on envoie "test" aux clients.
Si on est client et que test n'existe pas encore, alors on crée la variable en l'initialisant.

"Publicvariable" renvoie la variable avec sa valeur aux clients. Les JIP récupèrent cette variable lorsqu'ils se connectent. C'est pour cela que pour le côté client, il ne faut initialiser la variable que si elle n'existe pas encore, puisque dans le cas d'un JIP, elle sera déjà créée avec la valeur donnée par le serveur.
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 : 43
Messages : 3351
Enregistré le : mer. 13 janv. 2010, 15:29
Humeur : Binaire
Localisation : 127.0.0.1
Contact :

Re: Variable et localité

Message par =[TTK]= Memphis007 »

Et le briefing alors ? ou qu'il est exécuté ? coté client ?

Comment transmettre des variables d'un client vers le serveur ?
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: Variable et localité

Message par =[TTK]= Freshmeat »

A propos de briefing :
Je prépare pour bientôt l'arme imparable du briefing, Multiplayer Framework
J'ai essayé et j'en suis revenu.
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]= Yourry
Grand Scriptou
Grand Scriptou
Âge : 36
Messages : 1634
Enregistré le : mer. 17 mars 2010, 16:39
Localisation : Dans le reblochon !

Re: Variable et localité

Message par =[TTK]= Yourry »

Comment transmettre des variables d'un client vers le serveur ?
Et bien simplement en mettant rien avant l'attribution de ta variable.

S'i n'y a pas d'attribution de localité (comme if(isserver),if(player) etc.) le script serra lu par les joueurs et le serveur à condition qu"il y est une une déclaration de publicvariable et le script ne soit pas passé en local (avec un addaction, une commande spawn, etc...)

Si j'ai dit une bêtise, n'hésite pas à me corriger Freash, car c'est encore flou...

----- =[ EDIT DU Jeu 24 Fév, 12:09 ]= -----
si on est le serveur, on crée la variable test et on envoie "test" aux clients.
Faux, une variable déclarée dans un if(isverser), elle n'est pas renvoyée aux clients. Même s'il y a un publicvariable. Elle reste interne au serveur.

Oui le MPF c'est quand même pas évident, mais bon j'ai déjà des briefing en solo qui fonctionne, des exemples tirés de mission MP. Je me penche aussi sur la chose, en espérant que cela aboutisse.
"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]= Freshmeat
Retraité
Retraité
Messages : 474
Enregistré le : lun. 1 mars 2010, 13:49

Re: Variable et localité

Message par =[TTK]= Freshmeat »

Je crois que tu compliques beaucoup les choses Yourry.
A mon avis, une variable est connue localement (donc sur un client comme sur le serveur) dès lors qu'elle est initialisée.

Code : Tout sélectionner

if (isserver) then {
     test1 = 1;          // test1 ne sera connu que sur le serveur
} else {
     test2 = 2;         // test2 ne sera connu que sur les clients
};
test3 = 3;              // test3 sera connu de toutes les machines
if (isserver) then {
     test3 = 4;                        // test3 prend la valeur 4 uniquement sur les serveur
     publicvariable "test3";      // la nouvelle valeur de test3 est envoyée aux autres postes 
     publicvariable "test1";      // là je ne sais pas ce que ça fait exactement au niveau des clients
};
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]= Yourry
Grand Scriptou
Grand Scriptou
Âge : 36
Messages : 1634
Enregistré le : mer. 17 mars 2010, 16:39
Localisation : Dans le reblochon !

Re: Variable et localité

Message par =[TTK]= Yourry »

Faut dire que BIS n'a pas fait dans le simple...

Prenons un exemple tout simple:

Une variable: compteBLUFOR;

Dans l'init de la mission:

Code : Tout sélectionner

if (isServer) then
{
//Lancement des variables de comptages des points
//Variable pour le temps restant de jeu
compteBLUFOR = 0;
publicvariable "compteBLUFOR";
};
//Script pour le compte à rebourd mission
execVM"scripts\temps.sqf";	

J'ai donc une initialisation de ma variable au début du jeu, elle vaut 0. Elle devrait être envoyé au joueur puisqu'il y a "publicvariable"

Mon script de temps, lui est exécuter par tous, serveur et joueur, avec dedans:

Code : Tout sélectionner

hint format ["Les scores bleu %1",compteBLUFOR];
Et bien dans cette configuration, j'ai:
Error position: <compteBLUFOR>
Error Variable indéfinie dans une expression: compteblufor
Avec le hint qui affiche any....

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

Re: Variable et localité

Message par =[TTK]= Memphis007 »

déjà je serai vous j'essaierai avec publicVariable, au lieu de publicvariable...

Ah les joies de la syntaxe !
Si ya pas de shell, ya pas de plaisir...
Image

Fingers in the noise. Maxime verdâtre.

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: Variable et localité

Message par =[TTK]= Yourry »

Ah les joies de la syntaxe !
:?:


:arrow:
Icemotoboy
Be sure to place your variable name in quotation marks. This may sound awfully simple, but many times I have forgotten to do this, and it has resulted in no end of headaches for me.
C'est un commentaire sur la page "publicVariable" du wiki bis

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

Re: Variable et localité

Message par =[TTK]= Memphis007 »

=[TTK]= Memphis007 a écrit :Ah les joies de la syntaxe !
tu oublies le "V" majuscule de publicVariable ==> ta commande elle marche pas

Icemotoboy
Be sure to place your variable name in quotation marks. This may sound awfully simple, but many times I have forgotten to do this, and it has resulted in no end of headaches for me.
oui faut bien respecter la syntaxe comme donnée sur le wiki bis :
publicVariable "CTFscoreOne"
c'est à dire mettre la variable entre guillemets double pour que ça fonctionne
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: Variable et localité

Message par =[TTK]= Freshmeat »

Dans le cas de ton dernier exemple, il est beaucoup plus simple de mettre directement dans l'init, puisque d'après ce que j'ai compris, compteBLUFOR est utilisée sur le serveur et sur les clients :

Code : Tout sélectionner

if (isnil("compteBLUFOR")) then {compteBLUFOR=0;};
execVM"scripts\temps.sqf"; 
De façon générale, si une variable doit-être utilisée sur un poste, client ou serveur, il faut l'y déclarer.

Ensuite, il faut être conscient que les commades à effet global ont besoin d'un peu de temps pour affecter toutes les machines.
Dans l'exemple suivant, il y aura toujours une message d'erreur sur le client :

Code : Tout sélectionner

if (isserver) then {
          compteBLUFOR = 0;
          publicvariable "compteBLUFOR";
};
hint format["Score : %1",compteBLUFOR];
Parce qu'en supposant que l'exécution de ce script soit parfaitement synchro sur le client et le serveur, il y aura :
En deuxième ligne sur le client, on passe directement au hint puisqu'il ne s'agit pas du serveur or à ce moment là, on en est seulement à initialiser la variable compteBLUFOR sur le serveur.

De plus, je le répète, mais je ne suis pas certain que Publicvariable "compteBLUFOR" crée la varible sur le client.

Code : Tout sélectionner

    SERVEUR                                         CLIENT
------------------------------------------------------------------------------------------
if (isserver) then {                             if (isserver) then {
compteBLUFOR = 0;                                hint format["Score : %1",compteBLUFOR];
publicvariable "compteBLUFOR";                   erreur "compteBLUFOR" inconnue
hint format["Score : %1",compteBLUFOR];
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 : 43
Messages : 3351
Enregistré le : mer. 13 janv. 2010, 15:29
Humeur : Binaire
Localisation : 127.0.0.1
Contact :

Re: Variable et localité

Message par =[TTK]= Memphis007 »

C'est ça dont il faudrait être sur, que ça créé la variable, une chose est sure ça la diffuse, peut être préférer faire :

Code : Tout sélectionner

compteBLUFOR = 0;
if (isserver) then {
          compteBLUFOR = compteBLUFOR + 1;
          publicvariable "compteBLUFOR";
};
hint format["Score : %1",compteBLUFOR];
dans ce cas la variable doit bien être envoyé au client dans sa version modifiée, quoique chez BIS ils indiquent une limitation :
BIS a écrit :The only limitation is you cannot transfer references to entities which are local, like scripts, displays, or local objects.
Ce qui rend encore les choses un peu moins simple...
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: publicVariable et localité

Message par =[TTK]= Freshmeat »

Je pense qu'il faut comprendre 'References' dans son sens 'informatique', à savoir 'pointeurs sur'. Et dans ce cas c'est parfaitement logique car il s'agirait d'une adresse mémoire contenant un objet, or il est certain que selon la machine, cette même adresse ne contiendra pas la même chose.
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

Répondre