Page 1 sur 2

publicVariable et localité

Posté : mer. 23 févr. 2011, 21:18
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...

Re: Variable et localité

Posté : mer. 23 févr. 2011, 22:18
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 !

Re: Variable et localité

Posté : jeu. 24 févr. 2011, 00:10
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...

Re: Variable et localité

Posté : jeu. 24 févr. 2011, 08:47
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.

Re: Variable et localité

Posté : jeu. 24 févr. 2011, 10:31
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 ?

Re: Variable et localité

Posté : jeu. 24 févr. 2011, 11:56
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.

Re: Variable et localité

Posté : jeu. 24 févr. 2011, 12:09
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.

Re: Variable et localité

Posté : jeu. 24 févr. 2011, 14:02
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
};

Re: Variable et localité

Posté : jeu. 24 févr. 2011, 19:00
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....

:?:

Re: Variable et localité

Posté : jeu. 24 févr. 2011, 19:59
par =[TTK]= Memphis007
déjà je serai vous j'essaierai avec publicVariable, au lieu de publicvariable...

Ah les joies de la syntaxe !

Re: Variable et localité

Posté : jeu. 24 févr. 2011, 22:13
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

Re: Variable et localité

Posté : ven. 25 févr. 2011, 00:31
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

Re: Variable et localité

Posté : ven. 25 févr. 2011, 09:17
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];

Re: Variable et localité

Posté : ven. 25 févr. 2011, 10:04
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...

Re: publicVariable et localité

Posté : ven. 25 févr. 2011, 11:38
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.