Français Solved Ajouter une action à proximité d'un frigo

  • Auteur de la discussion Auteur de la discussion Zomblard
  • Date de début Date de début

Zomblard

User
11/6/20
194
9
19
800
Hello,

J'ai un système qui me permet de placer des meubles etc dans ma maison, j'aimerais ajouter une petite feature qui permet d'avoir un addaction sur mon frigo il faut que ceci sois gérer de manière dynamique (Une fois que le joueur a spawn si il place un frigo et qu'il est proche l'action s'ajoute)

J'ai taffer un petit truc :

Dans mon initPlayerLocal
Code:
while {true} do  {
        waitUntil {[] call life_fnc_nearFridge};
        [] call life_fnc_openFridge;
        waitUntil {[] call life_fnc_noNearFridge};
        [] call life_fnc_closeFridge;
};

nearFridge :
Code:
private _fridge = position player nearObjects ["Fridge_01_closed_F",3] select 0;
private _return = false;

if ((str(_fridge) find "fridge_") != -1) then { _return = true; };

_return;

open fridge :
Code:
private _fridge = position player nearObjects ["Fridge_01_closed_F",3] select 0;
_fridge addAction[localize"STR_Shops_OpenFrigo",life_fnc_virt_menu,"frigo",1.5,true,true,"","true",5];

noNearFridge :
Code:
_fridge = position player nearObjects ["Fridge_01_closed_F",3.5];
private _return = false;

if (count _fridge == 0) then { _return = true; };

_return;

closeFridge :

Code:
private _fridge = position player nearObjects ["Fridge_01_closed_F",10] select 0;
removeAllActions _fridge;

Ca fonctionne, mais le sys ne me pleit pas vraiment d'autant plus que si je souhaite ajouter par exemple une fontaine a eau
de la même manière en recréant une while
Seul le premier While fonctionne

Pouvez-vous m'aider à mettre en place ceci ?
Merci d'avance.
 
Solution
C'est bon j'ai trouvé une solution, pour ceux que ça peut aider :

initPlayerLocal.sqf :
Code:
WaterCoolerScriptExecuted = false;
FridgeScriptExecuted = false;
_waterCoolerCheck = [] spawn {
    while {true} do {
        call life_fnc_initWaterCooler;
    };
};
_fridgeCheck = [] spawn {
    while {true} do {
        call life_fnc_initFridge;
    };
};

Function.hpp création de la classe dans la classe : Life_Client_Core
Code:
    class Near {
        file = "core\near";
        class initFridge {};
        class initWaterCooler {};
    };

Création du dossier near dans core puis création du fichier fn_initFridge.sqf :
Code:
_fridge = nearestObject [player, "Fridge_01_closed_F"];

if (!(FridgeScriptExecuted) && (player distance _fridge <...
--- Ce message a été généré automatiquement par ChatGPT, le contenu peut être incorrect. Veuillez lire le message avec précaution ! ---

Salut,

Il semble que ton code fonctionne correctement pour ajouter une addaction lorsque le joueur est proche d'un frigo. Cependant, si tu veux ajouter une fonction similaire pour une fontaine à eau, tu devrais créer une autre boucle while avec des fonctions spécifiques pour la fontaine à eau. Autrement dit, tu devrais répéter les étapes que tu as utilisées pour le frigo, mais cette fois pour la fontaine à eau.

J'espère que cela t'aide ! N'hésite pas si tu as d'autres questions.

--- Pour continuer la discussion avec ChatGPT, cliquez sur "Répondre" en bas à droite de ce message. Sinon, attendez que quelqu'un vous réponde. ---
 
--- Ce message a été généré automatiquement par ChatGPT, le contenu peut être incorrect. Veuillez lire le message avec précaution ! ---

Salut,

Il semble que ton code fonctionne correctement pour ajouter une addaction lorsque le joueur est proche d'un frigo. Cependant, si tu veux ajouter une fonction similaire pour une fontaine à eau, tu devrais créer une autre boucle while avec des fonctions spécifiques pour la fontaine à eau. Autrement dit, tu devrais répéter les étapes que tu as utilisées pour le frigo, mais cette fois pour la fontaine à eau.

J'espère que cela t'aide ! N'hésite pas si tu as d'autres questions.

--- Pour continuer la discussion avec ChatGPT, cliquez sur "Répondre" en bas à droite de ce message. Sinon, attendez que quelqu'un vous réponde. ---
Le problème à mon avis est que j'ai un waitUntil dans ma première boucle donc il n'arrive pas à accéder à la seconde
 
Le problème à mon avis est que j'ai un waitUntil dans ma première boucle donc il n'arrive pas à accéder à la seconde
--- Ce message a été généré automatiquement par ChatGPT, le contenu peut être incorrect. Veuillez lire le message avec précaution ! ---

Effectivement, puisque tu as un waitUntil dans ta première boucle, cela peut bloquer l'exécution de la seconde boucle. Pour remédier à cela, tu peux utiliser un système de gestion d'états. Par exemple, tu peux créer une variable qui indique si le joueur est proche d'un frigo ou non, puis vérifier cette variable dans ta seconde boucle. Si le joueur est proche d'un frigo, tu exécutes le code correspondant, sinon tu le laisse passer. Cela permettra d'éviter le blocage de l'exécution de la seconde boucle.

--- Pour continuer la discussion avec ChatGPT, cliquez sur "Répondre" en bas à droite de ce message. Sinon, attendez que quelqu'un vous réponde. ---
 
--- Ce message a été généré automatiquement par ChatGPT, le contenu peut être incorrect. Veuillez lire le message avec précaution ! ---

Effectivement, puisque tu as un waitUntil dans ta première boucle, cela peut bloquer l'exécution de la seconde boucle. Pour remédier à cela, tu peux utiliser un système de gestion d'états. Par exemple, tu peux créer une variable qui indique si le joueur est proche d'un frigo ou non, puis vérifier cette variable dans ta seconde boucle. Si le joueur est proche d'un frigo, tu exécutes le code correspondant, sinon tu le laisse passer. Cela permettra d'éviter le blocage de l'exécution de la seconde boucle.

--- Pour continuer la discussion avec ChatGPT, cliquez sur "Répondre" en bas à droite de ce message. Sinon, attendez que quelqu'un vous réponde. ---
Il faudrait donc que je fasse un exit dans mon waitUntil si la condition n'est pas remplie ?
 
Il faudrait donc que je fasse un exit dans mon waitUntil si la condition n'est pas remplie ?
--- Ce message a été généré automatiquement par ChatGPT, le contenu peut être incorrect. Veuillez lire le message avec précaution ! ---

Oui, exactement ! Si la condition dans le waitUntil n'est pas remplie, tu peux utiliser la fonction exitWith pour sortir de la boucle et continuer le reste de ton code. Par exemple :

Code:
while {true} do {
    waitUntil {[] call life_fnc_nearFridge};
    [] call life_fnc_openFridge;
    waitUntil {[] call life_fnc_noNearFridge};
    [] call life_fnc_closeFridge;
    // Autres actions à effectuer après la fermeture du frigo
};

Dans la fonction life_fnc_noNearFridge, tu peux ajouter une vérification pour la sortie de la boucle :

Code:
if (count _fridge == 0) then {
    exitWith {};
};

Cela permettra de sortir de la boucle lorsque la condition n'est pas remplie.

J'espère que cela t'aide ! N'hésite pas à poser d'autres questions si nécessaire.

--- Pour continuer la discussion avec ChatGPT, cliquez sur "Répondre" en bas à droite de ce message. Sinon, attendez que quelqu'un vous réponde. ---
 
C'est bon j'ai trouvé une solution, pour ceux que ça peut aider :

initPlayerLocal.sqf :
Code:
WaterCoolerScriptExecuted = false;
FridgeScriptExecuted = false;
_waterCoolerCheck = [] spawn {
    while {true} do {
        call life_fnc_initWaterCooler;
    };
};
_fridgeCheck = [] spawn {
    while {true} do {
        call life_fnc_initFridge;
    };
};

Function.hpp création de la classe dans la classe : Life_Client_Core
Code:
    class Near {
        file = "core\near";
        class initFridge {};
        class initWaterCooler {};
    };

Création du dossier near dans core puis création du fichier fn_initFridge.sqf :
Code:
_fridge = nearestObject [player, "Fridge_01_closed_F"];

if (!(FridgeScriptExecuted) && (player distance _fridge < 4)) then {
    _fridge addAction ["Proche du frigo", {hint "Vous êtes proche du frigo !"}, [], 0, false, true, "", ""];
    FridgeScriptExecuted = true;
} else {
    if (FridgeScriptExecuted && player distance _fridge >= 4) then {
        removeAllActions _fridge;
        FridgeScriptExecuted = false;
    };
};

Création du fichier fn_initWaterCooler.sqf :
Code:
_waterCooler = nearestObject [player, "Land_WaterCooler_01_new_F"];

if (!(WaterCoolerScriptExecuted) && (player distance _waterCooler < 4)) then {
    _waterCooler addAction ["Proche de la fontaine", {hint "Vous êtes proche de la fontaine !"}, [], 0, false, true, "", ""];
    WaterCoolerScriptExecuted = true;
} else {
    if (WaterCoolerScriptExecuted && player distance _waterCooler >= 4) then {
        removeAllActions _waterCooler;
        WaterCoolerScriptExecuted = false;
    };
};

Les addaction sont des hint je vous laisse remplacer par ce que vous voulez faire.
 
Solution
Conseil, utilise le script de TP pour ça. Il n'est pas obfu et modifiable à ta sauce et vraiment il fonctionne 500x mieux. J'avais celui d'ASN avant et je suis très très très content d'avoir changer 😄

Posté par BastienWolf BastienWolf via discord.