Français Problème de récupération de valeur par le client

ProtoMehka

User
24/4/20
6
1
2
100
Bonjour,

Actuellement, j'ai une fonction qui récupère une valeur INT en base de données. Cette valeur est bien récupérée et peut être manipuler dans des calculs pour réécrire en base. Néanmoins, quand j'essaie de l'afficher dans un hint, j'ai un affichage vide. J'ai essayé d'utiliser la commande str "des fois que", mais j'ai juste des guillemets (string dans string pour faire sale).

Voici comment je récupère ma valeur (script coté life_server) :
C++:
/*
  fnc_getReputation
  _pid    : getPlayerUID player;
  _column : "rep_patriote"|"rep_travail"|"rep_nuisible"
  return  : int (0–100)
  Exemple d'utilisation : [getPlayerUID player, "rep_nuisible"] remoteExecCall ["RPY_fnc_getReputation",RSERV]
*/
params ["_pid","_column"];
private _valid = ["rep_patriote","rep_travail","rep_nuisible"];
if !(_column in _valid) exitWith {};
private _query = format ["SELECT id, %1 FROM reputation WHERE pid='%2'", _column, _pid];
private _resArr = [_query, 2] call DB_fnc_asyncCall;
if ((count _resArr) == 0) exitWith {};
private _value = _resArr select 1;
_value

Voici comment je manipule ma valeur en base (je le précise car j'arrive bien à manipuler la donnée depuis le scope life_server) :
C++:
#include "\life_server\script_macros.hpp"
/*
  fnc_addReputation
  _pid    : getPlayerUID player;
  _column : "rep_patriote"|"rep_travail"|"rep_nuisible"
  _delta  : int (peut être négatif ou positif)
  return  : nouvelle valeur (0–100)

  Exemple d'utilisation : [getPlayerUID player, "rep_nuisible", 10] remoteExec ["RPY_fnc_addReputation",RSERV]
*/
params ["_pid","_column","_delta"];

private _valid = ["rep_patriote","rep_travail","rep_nuisible"];
if !(_column in _valid) exitWith {};

private _current = [_pid,_column] call RPY_fnc_getReputation;
private _new     = (_current + _delta) max 0 min 100;

private _existsQ = format ["SELECT id FROM reputation WHERE pid='%1'", _pid];
private _exists  = [_existsQ, 2] call DB_fnc_asyncCall;

private _sql = "";
if (count _exists == 0) then {
  _sql = format [
    "INSERT INTO reputation (pid, %1) VALUES ('%2', %3)",
    _column, _pid, _new
  ];
} else {
  _sql = format [
    "UPDATE reputation SET %1 = %2 WHERE pid = '%3'",
    _column, _new, _pid
  ];
};

[_sql, 1] call DB_fnc_asyncCall;

_new

Voici ce que je mets dans la console de debug :
C++:
column = "rep_patriote";
pid = getPlayerUID player;
query = [pid, column] remoteExec ["RPY_fnc_getReputation", 2];
poney = str query;
hint poney;

Et voici le résultat :
1746912112337.png

Est-ce que la valeur retournée ne peut pas parvenir au client ?

A savoir que j'ai déclaré mes fonctions comme suit dans CfgRemoteExec.hpp :

C++:
class CfgRemoteExec {
    class Functions {
        mode = 1;
        jip = 0;
        
        F(RPY_fnc_addReputation,SERVER)
        F(RPY_fnc_getReputation,SERVER)
    };
};

Potentiellement, dois-je créer une fonction pour me retourner la valeur et déclarer celle-ci dans mon CfgRemoteExec en client ?

Dans l'attente de vous lire, merci d'avance.
 
Solution
Ah oui pardon !

Au final, j'ai suivi les instructions que vous m'avez fourni. Côté serveur, j'ai modifié mon fichier fn_getReputation.sqf comme ceci :

C++:
/*
  fnc_getReputation
  _pid    : getPlayerUID player;
  _column : "rep_patriote"|"rep_travail"|"rep_nuisible"
  return  : int (0–100)

Exemple d'utilisation : [getPlayerUID player, "rep_nuisible", player] remoteExec ["RPY_fnc_getReputation",RSERV]
*/


params ["_pid","_column","_target"];
private _valid = ["rep_patriote","rep_travail","rep_nuisible"];
if !(_column in _valid) exitWith {};

private _query = format ["SELECT %1 FROM reputation WHERE pid='%2'", _column, _pid];
private _resArr = [_query, 2] call DB_fnc_asyncCall;
if ((count _resArr) == 0) exitWith {};
private _value =...
Ah oui pardon !

Au final, j'ai suivi les instructions que vous m'avez fourni. Côté serveur, j'ai modifié mon fichier fn_getReputation.sqf comme ceci :

C++:
/*
  fnc_getReputation
  _pid    : getPlayerUID player;
  _column : "rep_patriote"|"rep_travail"|"rep_nuisible"
  return  : int (0–100)

Exemple d'utilisation : [getPlayerUID player, "rep_nuisible", player] remoteExec ["RPY_fnc_getReputation",RSERV]
*/


params ["_pid","_column","_target"];
private _valid = ["rep_patriote","rep_travail","rep_nuisible"];
if !(_column in _valid) exitWith {};

private _query = format ["SELECT %1 FROM reputation WHERE pid='%2'", _column, _pid];
private _resArr = [_query, 2] call DB_fnc_asyncCall;
if ((count _resArr) == 0) exitWith {};
private _value = _resArr select 0;

[_column, _value] remoteExec ["SOCK_fnc_sendReputation", _target];

_value

J'ai ajouté la variable _target dans les paramètres où je renseigne 'player'. Avant de retourner la valeur (_value) pour mon script fn_addReputation.sqf, je remoteExec un nouveau script côté client avec _target (player).

J'ai donc créé un fichier côté client nommé fn_sendReputation.sqf pour récupérer la valeur et la stocker dans une playerVariable :

C++:
/*
  fnc_sendReputation.sqf
  RPY_fnc_sendReputation (client only)
  _column : string
  _value  : int
*/

params ["_column","_value"];

/*
// Debug :

private _faction = "";
switch (_column) do {
    case "rep_patriote" : {_faction = "Camarade Patriote"};
    case "rep_travail" : {_faction = "Camarade Ouvrier"};
    case "rep_nuisible" : {_faction = "Camarade Nuisible"};
};
*/

player setVariable [format ["rep_%1", _column], _value];

/*
// Debug :
hint format ["Réputation %1 = %2", _faction, _value];
*/

Je récupère ainsi une variable de type SCALAR que je vais pouvoir manipuler pour l'interface de suivi des réputation que je tâche de mettre en place.

S'il manque des précisions, fais-moi signe, je pourrai les apporter avant clôture :)
 
Upvote 0
Solution