Bienvenue !

TTK, la team type des teams top

en quelque sorte


publicVariable et localité

Pour les Masochistes Éditeurs de missions

publicVariable et localité

Messagede =[TTK]= Yourry » Mer 23 Fév 2011, 21:18

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 de l’utilisateur
=[TTK]= Yourry
Grand Scriptou
Grand Scriptou
 
Age: 24
Messages: 731
Localisation: Parmis les Quenelles.
Inscription: 17 Mar 2010

Cash: 160.00 Chaislongs

Publicité

Re: Variable et localité

Messagede =[TTK]= Memphis007 » Mer 23 Fév 2011, 22:18

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 !
Pour halloween, un vrai g33k met un masque de sous réseau.
Le g33k ne sort pas du métro, il libère de la ram.

Image

C.Caz : Combien de chaislongs à celui qui arrive le premier ?
Avatar de l’utilisateur
=[TTK]= Memphis007
Gripsou
Gripsou
 
Age: 31
Messages: 1368
Localisation: /dev/null
Humeur: Born to be wild
Inscription: 13 Jan 2010

Cash: 127.10 Chaislongs

Re: Variable et localité

Messagede =[TTK]= Yourry » Jeu 24 Fév 2011, 00:10

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 de l’utilisateur
=[TTK]= Yourry
Grand Scriptou
Grand Scriptou
 
Age: 24
Messages: 731
Localisation: Parmis les Quenelles.
Inscription: 17 Mar 2010

Cash: 160.00 Chaislongs

Re: Variable et localité

Messagede =[TTK]= Freshmeat » Jeu 24 Fév 2011, 08:47

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 de l’utilisateur
=[TTK]= Freshmeat
Grand Manitou
Grand Manitou
 
Messages: 497
Inscription: 01 Mar 2010

Cash: 92.00 Chaislongs

Re: Variable et localité

Messagede =[TTK]= Memphis007 » Jeu 24 Fév 2011, 10:31

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

Comment transmettre des variables d'un client vers le serveur ?
Pour halloween, un vrai g33k met un masque de sous réseau.
Le g33k ne sort pas du métro, il libère de la ram.

Image

C.Caz : Combien de chaislongs à celui qui arrive le premier ?
Avatar de l’utilisateur
=[TTK]= Memphis007
Gripsou
Gripsou
 
Age: 31
Messages: 1368
Localisation: /dev/null
Humeur: Born to be wild
Inscription: 13 Jan 2010

Cash: 127.10 Chaislongs

Re: Variable et localité

Messagede =[TTK]= Freshmeat » Jeu 24 Fév 2011, 11:56

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 de l’utilisateur
=[TTK]= Freshmeat
Grand Manitou
Grand Manitou
 
Messages: 497
Inscription: 01 Mar 2010

Cash: 92.00 Chaislongs

Re: Variable et localité

Messagede =[TTK]= Yourry » Jeu 24 Fév 2011, 12:09

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 de l’utilisateur
=[TTK]= Yourry
Grand Scriptou
Grand Scriptou
 
Age: 24
Messages: 731
Localisation: Parmis les Quenelles.
Inscription: 17 Mar 2010

Cash: 160.00 Chaislongs

Re: Variable et localité

Messagede =[TTK]= Freshmeat » Jeu 24 Fév 2011, 14:02

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 de l’utilisateur
=[TTK]= Freshmeat
Grand Manitou
Grand Manitou
 
Messages: 497
Inscription: 01 Mar 2010

Cash: 92.00 Chaislongs

Re: Variable et localité

Messagede =[TTK]= Yourry » Jeu 24 Fév 2011, 19:00

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 de l’utilisateur
=[TTK]= Yourry
Grand Scriptou
Grand Scriptou
 
Age: 24
Messages: 731
Localisation: Parmis les Quenelles.
Inscription: 17 Mar 2010

Cash: 160.00 Chaislongs

Re: Variable et localité

Messagede =[TTK]= Memphis007 » Jeu 24 Fév 2011, 19:59

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

Ah les joies de la syntaxe !
Pour halloween, un vrai g33k met un masque de sous réseau.
Le g33k ne sort pas du métro, il libère de la ram.

Image

C.Caz : Combien de chaislongs à celui qui arrive le premier ?
Avatar de l’utilisateur
=[TTK]= Memphis007
Gripsou
Gripsou
 
Age: 31
Messages: 1368
Localisation: /dev/null
Humeur: Born to be wild
Inscription: 13 Jan 2010

Cash: 127.10 Chaislongs

Re: Variable et localité

Messagede =[TTK]= Yourry » Jeu 24 Fév 2011, 22:13

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 de l’utilisateur
=[TTK]= Yourry
Grand Scriptou
Grand Scriptou
 
Age: 24
Messages: 731
Localisation: Parmis les Quenelles.
Inscription: 17 Mar 2010

Cash: 160.00 Chaislongs

Re: Variable et localité

Messagede =[TTK]= Memphis007 » Ven 25 Fév 2011, 00:31

=[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
Pour halloween, un vrai g33k met un masque de sous réseau.
Le g33k ne sort pas du métro, il libère de la ram.

Image

C.Caz : Combien de chaislongs à celui qui arrive le premier ?
Avatar de l’utilisateur
=[TTK]= Memphis007
Gripsou
Gripsou
 
Age: 31
Messages: 1368
Localisation: /dev/null
Humeur: Born to be wild
Inscription: 13 Jan 2010

Cash: 127.10 Chaislongs

Re: Variable et localité

Messagede =[TTK]= Freshmeat » Ven 25 Fév 2011, 09:17

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 de l’utilisateur
=[TTK]= Freshmeat
Grand Manitou
Grand Manitou
 
Messages: 497
Inscription: 01 Mar 2010

Cash: 92.00 Chaislongs

Re: Variable et localité

Messagede =[TTK]= Memphis007 » Ven 25 Fév 2011, 10:04

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...
Pour halloween, un vrai g33k met un masque de sous réseau.
Le g33k ne sort pas du métro, il libère de la ram.

Image

C.Caz : Combien de chaislongs à celui qui arrive le premier ?
Avatar de l’utilisateur
=[TTK]= Memphis007
Gripsou
Gripsou
 
Age: 31
Messages: 1368
Localisation: /dev/null
Humeur: Born to be wild
Inscription: 13 Jan 2010

Cash: 127.10 Chaislongs

Re: publicVariable et localité

Messagede =[TTK]= Freshmeat » Ven 25 Fév 2011, 11:38

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
Avatar de l’utilisateur
=[TTK]= Freshmeat
Grand Manitou
Grand Manitou
 
Messages: 497
Inscription: 01 Mar 2010

Cash: 92.00 Chaislongs

Suivante


  • Publicité

Retourner vers Edition ArmA II / OA

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


cron