Français Not solved Erreur Type Array, expected Config entry

  • Auteur de la discussion Auteur de la discussion Valkentinx
  • Date de début Date de début
  • Bonjour Visiteur ! Les sujets de cette catégorie sont clos. Si vous souhaitez réouvrir, merci de nous contacter en précisant le lien du post à réouvrir !

    Hello Visiteur ! The topics in this category are closed. If you wish to reopen, please contact us with the link of the post you wish to reopen !

Valkentinx

User
10/10/22
24
1
300
Bonjour tout le monde.

J'aurai une petite question concernant un système que je suis en train de créer.

Code:
15:44:12 Error in expression <cItem = [("true" configClasses (_pnj >> _cat))] call BIS_fnc_selectRando>
15:44:12   Error position: <>> _cat))] call BIS_fnc_selectRando>
15:44:12   Error >>: Type Array, expected Config entry

que je n'arrive pas à corriger sur ma variable "cItem" suivante :
Code:
_cat = param [0, "", [""]];

_pnj = [format ["isClass(_x >> '%1')", _cat] configClasses (configFile >> "Config_PNJ")] call BIS_fnc_selectRandom;

_cItem = ["true" configClasses (_pnj >> _cat)] call BIS_fnc_selectRandom;

Voici mon fichier de config utilisé (Config_PNJ)

Code:
class Config_PNJ {
    class npc_millf {
        displayName="Robert";
        class vendeur {
            class MonItem {
                type="primaryWeapon";
                price=12000;
            };
        };
    };
};

Mon système doit récupérer la catégorie du PNJ si c'est un "vendeur" ou un "acheteur" et il va en choisir de manière random les pnj qui ont la fameuse catégorie en question (la variable _pnj) Ensuite le _cItem doit m'afficher une liste d'items de manière aléatoire parmi tous ceux présent dans la classe "vendeur" ou "acheteur" de la classe de mon pnj

Est-ce que vous auriez une idée par hasard? Je ne comprend pas pourquoi il me renvoi un Array

Merci à vous
 
Hello ! Je pense que tu devrais simplifier ton config.

La proposition de Yuri Zoko Yuri Zoko sur discord semble ok :
Code:
class Config_PNJ {
    class npc_millf {
        displayName = "Robert";
        type = "vendeur";
        items[] = {{"primaryWeapon",12000}};
    };
};
Code:
_cat = param [0, "", [""]];
private _pnj = [];
private _type = "";

{
  _type = getText (_x >> "type");
  if (_type isEqualTo _cat) then {_pnj pushBack _x};
} forEach (configFile >> "Config_PNJ");

_cItem = selectRandom _pnj;
 
  • Like
Les réactions: Yuri Zoko
Hello ! Je pense que tu devrais simplifier ton config.

La proposition de Yuri Zoko Yuri Zoko sur discord semble ok :
Code:
class Config_PNJ {
    class npc_millf {
        displayName = "Robert";
        type = "vendeur";
        items[] = {{"primaryWeapon",12000}};
    };
};
Code:
_cat = param [0, "", [""]];
private _pnj = [];
private _type = "";

{
  _type = getText (_x >> "type");
  if (_type isEqualTo _cat) then {_pnj pushBack _x};
} forEach (configFile >> "Config_PNJ");

_cItem = selectRandom _pnj;

Hello :)
En effet, j'aurai pu simplifier la chose comme ça. Sauf que j'ai pas mal de systèmes qui fonctionne avec la config actuelle (il y a plein d'autres d'attributs en plus que je n'ai pas mis étant donné qu'ils ne sont pas en rapport avec mon problème actuel)
Je pense que refaire l'architecture de la config avec tous mes items/pnj + modifié les scripts existants l'utilisant, me prendrai plus de temps que de corriger ce problème :/
Et puis, je suis curieux de savoir d'où viens de problème, je n'ai jamais rencontré ça, et je pense que ça me permettrai d'en apprendre un peu plus là dessus :D
Merci pour ton message :)
 
De mon côté j'ai testé avec cette config :
Code:
class Config_PNJ {
    class npc_millf {
        displayName="Robert";
        class vendeur {
            class MonItem {
                type="primaryWeapon";
                price=12000;
            };
            class MonItem2 {
                type="primaryWeapon2";
                price=12000;
            };
        };
    };

    class npc_millf2 {
        displayName="Robert2";
        class vendeur {
            class MonItem3 {
                type="primaryWeapon3";
                price=12000;
            };
            class MonItem4 {
                type="primaryWeapon4";
                price=12000;
            };
        };
    };

    class npc_millf3 {
        displayName="Robert3";
        class acheteur {
            class MonItem5 {
                type="primaryWeapon5";
                price=12000;
            };
        };
    };
};
Et ce code :
Code:
_cat = param [0, "", [""]];
_type = "";
_price = "";

_pnj = selectRandom ((format ["isClass(_x >> '%1')", _cat]) configClasses (configFile >> "Config_PNJ"));

if (isClass _pnj) then {
    _cItem = selectRandom ("true" configClasses (_pnj >> _cat));

    if (isClass _cItem) then {
        _type = getText (_cItem >> "type");
        _price = getNumber (_cItem >> "price");
    };
};

_type;
ça me semble bon, j'ai pas changé grand chose par rapport au tiens
 
De mon côté j'ai testé avec cette config :
Code:
class Config_PNJ {
    class npc_millf {
        displayName="Robert";
        class vendeur {
            class MonItem {
                type="primaryWeapon";
                price=12000;
            };
            class MonItem2 {
                type="primaryWeapon2";
                price=12000;
            };
        };
    };

    class npc_millf2 {
        displayName="Robert2";
        class vendeur {
            class MonItem3 {
                type="primaryWeapon3";
                price=12000;
            };
            class MonItem4 {
                type="primaryWeapon4";
                price=12000;
            };
        };
    };

    class npc_millf3 {
        displayName="Robert3";
        class acheteur {
            class MonItem5 {
                type="primaryWeapon5";
                price=12000;
            };
        };
    };
};
Et ce code :
Code:
_cat = param [0, "", [""]];
_type = "";
_price = "";

_pnj = selectRandom ((format ["isClass(_x >> '%1')", _cat]) configClasses (configFile >> "Config_PNJ"));

if (isClass _pnj) then {
    _cItem = selectRandom ("true" configClasses (_pnj >> _cat));

    if (isClass _cItem) then {
        _type = getText (_cItem >> "type");
        _price = getNumber (_cItem >> "price");
    };
};

_type;
ça me semble bon, j'ai pas changé grand chose par rapport au tiens

Hello,

Merci ! Pour ton aide! Ca fonctionne à peu près.. Un peu plus loin dans mon code j'ai un if en fonction de la catégorie de mon pnj (vendeur ou acheteur)


Code:
if (_cat isEqualTo "vendeur") then {
    _id = [getText(_pnj >> "pays")] call ValServ_fnc_CrateID;
} else {
    _id = [getText(_pnj >> "pays")] call ValServ_fnc_OffreID;
};

Sauf que dans les logs, j'ai désormais une erreur qui m'indique que la variable _pnj est indéfinie à la ligne des vars _id de mon if juste au dessus.. Je ne comprend pas vraiment
 
ça me semble bon pourtant. Est-ce que tu peux envoyer le fichier SQF en entier ?
Tu peux essayer de le mettre dans le if (isClass _pnj) then { aussi


En le mettant dans le if (isClass _pnj) then {

J'ai un soucis similaire, cette fois c'est dans mon switch ou _cItem est indéfini :/
 
Dernière édition:
Est-ce que tu peux tester comme ceci ?
Code:
private _cat = param [0, "", [""]];

private _type = "";
private _price = "";
private _pnj = selectRandom ((format ["isClass(_x >> '%1')", _cat]) configClasses (configFile >> "Config_PNJ"));
private _cItem = configNull;

if (isClass _pnj) then {
    _cItem = selectRandom ("true" configClasses (_pnj >> _cat));

    if (isClass _cItem) then {
        _type = getText (_cItem >> "type");
        _price = getNumber (_cItem >> "price");
    };
};

private _name = "";
private _picture = "";
private _description = "";
private _content = [];
private _price = 0;
private _id = "";

if (_cat isEqualTo "vendeur") then {
    _id = [getText(_pnj >> "pays")] call ValServ_fnc_CrateID;
} else {
    _id = [getText(_pnj >> "pays")] call ValServ_fnc_OffreID;
};

switch (_type) do {
    case "item": {
        _info = [configName _cItem] call ValServ_fnc_fetchItemInfo;
        if (_category isEqualTo "acheteur") then {
            _name = _info#1;
            _content = [configName _cItem];
            _price = getNumber(_cItem >> "price");
        } else {
            _items = [configName _cItem];
            _quantity = round(random getNumber(_cItem >> "max")) max getNumber(_cItem >> "min");
            _count = [_quantity];
            if isClass(_cItem >> "perItem") then {
                {
                    _rand = round(random getNumber(_x >> "max")) max getNumber(_x >> "min");
                    if (_rand > 0) then {
                        _items pushBack (configName _x);
                        _count pushBack (_rand * _quantity);
                    };
                } forEach (("true" configClasses (_cItem >> "vendeur")) call BIS_fnc_selectRandom);
            };

            _name = format ["%1x %2", _quantity, _info#1];
            _content = [_items, _count];
            _price = getNumber(_cItem >> "price") * _quantity;
        };
        _picture = _info#2;
        _description = _info#3;
    };
    case "vehicle": {
        _cfg = configFile >> "CfgVehicles" >> (configName _cItem);

        if (_category isEqualTo "acheteur") then {
            _content = [configName _cItem];
        } else {
            _content = [configName _cItem, [] call ValClient_fnc_createVehiclePlate];
        };
        _name = format ["1x %1", getText(_cfg >> "displayName")];
        _picture = getText(_cfg >> "picture");
        if (_picture isEqualTo "") then {
            _picture = getText(_cfg >> "editorPreview");
        };
        _description = getText(_cfg >> "displayName");
        _price = getNumber(_cItem >> "price");
    };
    case "object": {
        _cfg = configFile >> "CfgVehicles" >> (configName _cItem);

        _name = format ["1x %1", getText(_cfg >> "displayName")];
        _picture = getText(_cfg >> "picture");
        if (_picture isEqualTo "") then {
            _picture = getText(_cfg >> "editorPreview");
        };
        _description = getText(_cfg >> "displayName");
        _content = [configName _cItem];
        _price = getNumber(_cItem >> "price");
    };
};

[
    _id,
    _content,
    _type,
    round(_price),
    getText(_pnj >> "pays"),
    getText(_pnj >> "displayName"),
    _name,
    _description,
    _picture
];
 
Est-ce que tu peux tester comme ceci ?
J'ai exactement le même soucis qu'avant au meme endroit

Code:
21:14:14 Error in expression <_CrateId;
} else {
_id = [getText(_pnj >> "pays")] call ValServ>
21:14:14   Error position: <_pnj >> "pays")] call ValServ>
21:14:14   Error Undefined variable in expression: _pnj

Et en mettant ce if à l'intérieur du if isclass _pnj, j'obtiens ceci :

Code:
21:21:44 Error in expression <ype = "";
private _id = "";
if (isClass _pnj) then {
_cItem = selectRandom>
21:21:44   Error position: <_pnj) then {
_cItem = selectRandom>
21:21:44   Error Undefined variable in expression: _pnj
 
Dernière édition:
Maxence Maxence

J'ai bien tout sauvegardé et j'ai bien remis ma mission en pbo. Cependant j'ai localisé la source du problème. Je ne pensais pas que cela aurait pu être ça. Mais je me suis rendu compte au début du topic que je n'avais pas tout à fait envoyé la dernière version de mon fichier. Il y a juste une seule chose en plus, dont je ne soupçonnais pas la cause du bug en lui même.

la variable _pnj ressemble à ça :

Code:
private _pnj = selectRandom ((format ["isClass(_x >> '%1') && !(getText(_x >> 'pays') in pnj_mechant)", _cat]) configClasses (configFile >> "Config_PNJ"));

J'ai donc simplement rajouté ceci dans la ligne :

Code:
&& !(getText(_x >> 'pays') in pnj_mechant)

Et en enlevant justement cette partie le code fonctionne bien. J'ai donc commencé à chercher pourquoi ce problème lorsque je rajoute cette "condition", sachant que :

Dans mon fichier init j'ai bien la variable pnj_mechant qui est initialisée et qui va me récupérer des valeurs dans ma DB. Sauf que en jeu, j'ai any lorsque je fais un
hint format["%1",pnj_mechant];

Voici à quoi ressemble ma vars lorsque je veux la set :

Code:
pnj_mechant = [];
{
    pnj_mechant pushBack (_x#0);
} forEach (["SELECT pays FROM pnj", 2] call extdb3_fnc_async);
diag_log format ["%1 pnjs chargés", count(pnj_mechant)];

A savoir que le diag_log me récupère bien le bon nombre de pnj

Je ne vois donc pas trop pourquoi il me retourne any
 
Quand tu fais ce code :
Code:
hint format["%1",pnj_mechant];
il est exécuté côté client, alors que la variable est définie par le serveur : c'est pour ça que tu as "any".

Si tout tes scripts, hormis ce hint de debug, sont côté serveur, ça ne veut pas forcément dire qu'il y a un problème
 
Quand tu fais ce code :
Code:
hint format["%1",pnj_mechant];
il est exécuté côté client, alors que la variable est définie par le serveur : c'est pour ça que tu as "any".

Si tout tes scripts, hormis ce hint de debug, sont côté serveur, ça ne veut pas forcément dire qu'il y a un problème
D’accord je vois. Parce que oui tous mes scripts l’utilisent côté serveur. Par contre j’ai toujours l’erreur seulement lorsque j’utilise mon getText sur le pnj_mechant. Alors que le diaglog me ressort le bon nombre d’entrée par exemple. Et quand j’enlève ce bout de code, tout fonctionne sans erreur.

Même en déclarant la publicvariable l’erreur est la (Bon logique du coup). Mais je ne sais pas trop d’où ça pourrait venir pour le coup :/
 
Tu pourrais essayer de debug le getText ?
Code:
diag_log (getText(_pnj >> "pays"));

Alors, je viens d'essayer ce diaglog en enlevant cette partie de la variable _pnj :
Code:
 && !(getText(_x >> 'pays') IN pnj_mechant)

Il me retourne correctement la liste de tous les pays des pnjs qui sont sélectionnés

Par contre, en laissant cette partie du code dans la var _pnj, il me met

Code:
diag_log (getText(_pnj >> "pays"));
13:04:26   Error position: <_pnj >> "pays"));

(forcément, vu que y'a un pb avec elle n'est pas set)

J'ai aussi essayé de mettre un diag_log après la récupération des pays depuis ma db. (donc la variable pnj_mechant)
et il me ressort bien la liste de tous les pays concernés.

Donc étant donné que dans ma variable je recherche les PNJ avec comme pays les mêmes qui sont dans ma var pnj_mechant, et que les 2 debugs fonctionnent techniquement, je ne comprend pas pourquoi en mettant ce code dans ma vars, ça me fait tout planter :/ (enfin seulement ma variable _pnj)
Code:
 && !(getText(_x >> 'pays') IN pnj_mechant)