Français Solved Traitement pétrole en carburant via vehicules

  • 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'aurais besoin de votre aide pour mettre en place ce petit script, j'avoue ne pas totalement saisir le fonctionnement du trunk invetory du coup je bloque un peut.

Que je vous mette dans le contexte : Les joueurs ne peuvent pas porter sur eux le pétrole et les carburants (Gasoil, SP95, Kerozene) donc pour le frame je me suis basé sur l'automining du tempest matériel pour cette partie c'est tout bon
J'ai aussi bloqué le fait que le joueur puisse prendre / déposer dans la citerne donc ça c'est bon aussi

Bon ça sers a rien la pour le coup mais je vous le met a titre d'info si il y'en à qui veulent faire pareil :
Dans mon fn_vehTakeItem je fait ça :
Code:
if (_ctrl isEqualTo "oil" || _ctrl isEqualTo "gazole" || _ctrl isEqualTo "sp95" || _ctrl isEqualTo "kerosene") exitWith {["Vous ne pouvez pas porter du liquide !",true,"fast"] call life_fnc_notification_system;};
et dans mon fn_vehStoreItem :
Code:
if ((typeOf life_trunk_vehicle) == "I_Truck_02_fuel_F" || (typeOf life_trunk_vehicle) == "C_Van_01_fuel_F" || (typeOf life_trunk_vehicle) == "B_Truck_01_fuel_F") exitWith {["Vous ne pouvez par stocker cet article dans ce véhicule.",true,"fast"] call life_fnc_notification_system;};

Pour la zone de pompage et de traitement en réalité je l'autorise via la position d'un marker : je fait comme ceci (cette partie fonctionne nickel) :
fn_vInteractionMenu :
Code:
_playerPos = getPos player;
    _marqueurPos1 = getMarkerPos "RES_oil_field_1";
    _marqueurPos2 = getMarkerPos "marker_50";
    _dist1 = _playerPos distance _marqueurPos1;
    _dist2 = _playerPos distance _marqueurPos2;

    if (_dist1 < 30) then {
        if (typeOf (_curTarget) in ["C_Van_01_fuel_F","I_Truck_02_fuel_F","B_Truck_01_fuel_F"] && _curTarget in life_vehicles) then {
            _Btn3 ctrlSetText "Commencer le pompage";
            _Btn3 buttonSetAction "[life_vInact_curTarget] spawn life_fnc_deviceMine";
            if (!license_civ_refinnerie) then {
                _Btn3 ctrlEnable false;
                _Btn3 ctrlSetText "Licence raffineur requise";
            } else {
                _Btn3 ctrlEnable true;
            };
        } else {
            _Btn3 ctrlShow false;
        };
    } else {
        if (typeOf (_curTarget) in ["C_Van_01_fuel_F","I_Truck_02_fuel_F","B_Truck_01_fuel_F"] && _curTarget in life_vehicles) then {
            _Btn3 ctrlSetText "Trop loin du gisement";
            _Btn3 ctrlEnable false;
        } else {
            _Btn3 ctrlShow false;
        };
    };

    _dist2 = _playerPos distance _marqueurPos2;
    if (_dist2 < 30) then {
        if (typeOf (_curTarget) in ["C_Van_01_fuel_F","I_Truck_02_fuel_F","B_Truck_01_fuel_F"] && _curTarget in life_vehicles) then {
            _Btn4 ctrlSetText "Transformer en gasoil";
            _Btn4 buttonSetAction "[life_vInact_curTarget] spawn life_fnc_deviceProcess";
            if (!license_civ_refinnerie) then {
                _Btn4 ctrlEnable false;
                _Btn4 ctrlSetText "Licence raffineur requise";
            } else {
                _Btn4 ctrlEnable true;
            };
        } else {
            _Btn4 ctrlShow false;
        };
    } else {
        if (typeOf (_curTarget) in ["C_Van_01_fuel_F","I_Truck_02_fuel_F","B_Truck_01_fuel_F"] && _curTarget in life_vehicles) then {
            _Btn4 ctrlSetText "Trop loin du traitement";
            _Btn4 ctrlEnable false;
        } else {
            _Btn4 ctrlShow false;
        };
    };
Vous vous douterez que j'ai ré adapter le script deviceMine à mes besoin, mais la toujours aucun problème tout va bien

C'est à partir de maintenant que ça deviens galère pour moi ^^
Donc pour le process j'appel un nouveau script qui est life_fnc_deviceProcess
Globalement ce script est basé sur device mining
Code:
#include "..\..\script_macros.hpp"

private ["_vehicle","_weight","_resource","_resourceTrt","_itemIndex","_itemIndexTrt","_sum","_itemWeight"];
_vehicle = param [0,objNull,[objNull]];
if (isNull _vehicle) exitWith {};

if (!isNil {_vehicle getVariable "mining"}) exitWith {
    hint "Le véhicule travaille déjà !";
};

if (fuel _vehicle isEqualTo 0) exitWith {
    titleText[localize "STR_NOTF_OutOfFuel","PLAIN"];
};

closeDialog 0; //Close the interaction menu.
life_action_inUse = true; //Lock out the interaction menu for a bit..

_weight = [_vehicle] call life_fnc_vehicleWeight;
if ((_weight select 1) >= (_weight select 0)) exitWith {
    hint "Le veh est plein !";
    life_action_inUse = false;
};

_resource = "oil";
_resourceTrt = "gazole";

_vehicle setVariable ["mining",true,true]; //Lock the device
_vehicle remoteExec ["life_fnc_soundDevice",RCLIENT]; //Broadcast the 'mining' sound of the device for nearby units.

life_action_inUse = false; //Unlock it since it's going to do it's own thing...

for "_i" from 0 to 1 step 0 do {
    if (!alive _vehicle || isNull _vehicle) exitWith {};

    if ((isEngineOn _vehicle) || ((speed _vehicle) > 5)) exitWith {
        titleText[localize "STR_NOTF_MiningStopped","PLAIN"];
    };

    if (fuel _vehicle isEqualTo 0) exitWith {
        titleText[localize "STR_NOTF_OutOfFuel","PLAIN"];
    };

    titleText[localize "STR_NOTF_DeviceMining","PLAIN"];
    _time = time + 2;

    //Wait for 27 seconds with a 'delta-time' wait.
    waitUntil {
        if ((isEngineOn _vehicle) || ((speed _vehicle) > 5)) exitWith {
            _vehicle setVariable ["mining",nil,true];
            titleText[localize "STR_NOTF_MiningStopped","PLAIN"];
            true
        };

        if (round(_time - time) < 1) exitWith {
            true
        };

        if (fuel _vehicle < 0.1) exitWith {
            _vehicle setVariable ["mining",nil,true];
            titleText[localize "STR_NOTF_OutOfFuel","PLAIN"];
            true
        };

        sleep 0.2;
        false
    };

    if ((isEngineOn _vehicle) || ((speed _vehicle) > 5)) exitWith {
        _vehicle setVariable ["mining",nil,true];
        titleText[localize "STR_NOTF_MiningStopped","PLAIN"];
    };

    _vehicle_data = _vehicle getVariable ["Trunk",[[],0]];
    _inv = +(_vehicle_data select 0);
    _invTrt = +(_vehicle_data select 0);
    _space = (_vehicle_data select 1);
    _spaceTrt = (_vehicle_data select 1);
    _itemIndex = [_resource,_inv] call TON_fnc_index;
    _itemIndexTrt = [_resourceTrt,_invTrt] call TON_fnc_index;
    _weight = [_vehicle] call life_fnc_vehicleWeight;
    _random = 10 + round((random(10)));
    _sum = [_resource,_random,(_weight select 1),(_weight select 0)] call life_fnc_calWeightDiff; // Get a sum base of the remaining weight..

    if (_sum < 1) exitWith {
        titleText[localize "STR_NOTF_DeviceFull","PLAIN"];
        _vehicle setVariable ["mining",nil,true];
    };

    if (_itemIndex isEqualTo -1) then {
        _inv pushBack [_resource,_sum];
    } else {
        _val = (_inv select _itemIndex) select 1;
        _inv set[_itemIndex,[_resource,_val + _sum]];
    };

    if (_itemIndexTrt isEqualTo -1) then {
        _invTrt pushBack [_resourceTrt,_sum];
    } else {
        _valTrt = (_invTrt select _itemIndexTrt) select 1;
        _invTrt set[_itemIndexTrt,[_resourceTrt,_valTrt + _sum]];
    };

    if (fuel _vehicle < 0.1) exitWith {
        _vehicle setVariable ["mining",nil,true];
        titleText[localize "STR_NOTF_OutOfFuel","PLAIN"];
    };

    //Locality checks...
    if (local _vehicle) then {
        _vehicle setFuel (fuel _vehicle)-0.01;
    } else {
        [_vehicle,(fuel _vehicle)-0.01] remoteExec ["life_fnc_setFuel",_vehicle];
    };

    if (fuel _vehicle < 0.1) exitWith {
        titleText[localize "STR_NOTF_OutOfFuel","PLAIN"];
        _vehicle setVariable ["mining",nil,true];
    };

    _itemName = M_CONFIG(getText,"VirtualItems",_resource,"displayName");
    _itemNameTrt = M_CONFIG(getText,"VirtualItems",_resourceTrt,"displayName");
    titleText[format [localize "STR_NOTF_DeviceMined",_sum,(localize _itemName)],"PLAIN"];
    [format ["t'as recup %1 %2",_sum,(localize _itemName)],false,""] call life_fnc_notification_system;
    [format ["t'as recup %1 %2",_sum,(localize _itemNameTrt)],false,""] call life_fnc_notification_system;
    _itemWeight = ([_resource] call life_fnc_itemWeight) * _sum;
    _itemWeightTrt = ([_resourceTrt] call life_fnc_itemWeight) * _sum;
    _vehicle setVariable ["Trunk",[_inv,_space + _itemWeight],true];
    _vehicle setVariable ["Trunk",[_invTrt,_spaceTrt + _itemWeightTrt],true];

[format ["t'as recup %1 %2",_sum,(localize _itemName)],false,""] call life_fnc_notification_system;
    [format ["t'as recup %1 %2",_sum,(localize _itemNameTrt)],false,""] call life_fnc_notification_system;

    _weight = [_vehicle] call life_fnc_vehicleWeight;
    _sum = [_resource,_random,(_weight select 1),(_weight select 0)] call life_fnc_calWeightDiff; //Get a sum base of the remaining weight..

    if (_sum < 1) exitWith {
        _vehicle setVariable ["mining",nil,true];
        titleText[localize "STR_NOTF_DeviceFull","PLAIN"];
    };

    sleep 2;
};

_vehicle setVariable ["mining",nil,true];

Alors en l'état actuel qu'est ce qu'il se passe :
Le véhicule ne supprime pas le pétrole mais ajoute bien du diesel

En sois la ou j'aimerais bien de l'aide c'est :
  • La partie verif de si j'ai du pétrole dans la citerne
  • Si j'ai 10 pétrole alors je vais pouvoir supprimé 10 pétrole et ajouté 10 gasoil

Je compte aussi virer tout ce qui se trouve après la ligne 32 pour faire comme un vrai process avec un truc comme :
Code:
disableSerialization;
"progressBar" cutRsc ["life_progress","PLAIN"];
_ui = uiNamespace getVariable "life_progress";
_progress = _ui displayCtrl 38201;
_pgText = _ui displayCtrl 38202;
_upp = "Raffinage du pétrole";
_pgText ctrlSetText format ["%2 (1%1)...","%",_upp];
_progress progressSetPosition 0.01;
_cP = 0.01;

life_is_processing = true;


for "_i" from 0 to 1 step 0 do {
    uiSleep  0.28;
    _cP = _cP + 0.01;
    _progress progressSetPosition _cP;
    _pgText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_upp];
    if (dialog) exitWith {};
    if (_cP >= 1) exitWith {};
    if (player distance _vendor > 10) exitWith {};
    if (!alive _vehicle || isNull _vehicle) exitWith {};
};
if (player distance _vendor > 10) exitWith {hint localize "STR_Process_Stay"; "progressBar" cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;_vehicle setVariable ["mining",nil,true];};
if (dialog) exitWith {closeDialog 0; "progressBar" cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;_vehicle setVariable ["mining",nil,true];};
if (!alive _vehicle || isNull _vehicle) exitWith {"progressBar" cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;_vehicle setVariable ["mining",nil,true];};
    
//ICI JE SUPPRIME LE PÉTROLE

//ICI J'AJOUTE LE GASOIL

"progressBar" cutText ["","PLAIN"];
if (_minimumConversions isEqualTo (_totalConversions call BIS_fnc_lowestNum)) then {hint localize "STR_NOTF_ItemProcess";} else {hint localize "STR_Process_Partial";};
life_is_processing = false; life_action_inUse = false;
_vehicle setVariable ["mining",nil,true];

Et je ferais plus tard le verif si le véhicule est éteint etc etc plus tard pour le moment j'aimerais déjà réussir à faire la conversion des items ^^

Merci pour votre aide
 
Solution
Ah ba si ça à fonctionner.

Bon ba on peut clore le sujet du coup

Voici le code 100% fonctionnel si ça intéresse des gens (ATTENTION à adapter à vos besoin avant !)
Moi perso je vais rajouter le passage automatique de param sur quel ressource on veut obtenir etc etc à vous de voir comment vous voulez le faire mais voici le code :

Code:
#include "..\..\script_macros.hpp"
/*
    File: fn_deviceProcess.sqf
    Author: Maxence & Zomb
    Description:
    Oil to fuel processing via vehicles
*/
private ["_vehicle","_weight","_itemWeight"];
_vehicle = param [0,objNull,[objNull]];
if (isNull _vehicle) exitWith {};

if (!isNil {_vehicle getVariable "mining"}) exitWith {
    hint "Le véhicule travaille déjà !";
};

if (fuel _vehicle isEqualTo 0)...
--- Ce message a été généré automatiquement par ChatGPT, le contenu peut être incorrect. Veuillez lire le message avec précaution ! ---

Salut! Je vois que tu veux ajouter un script pour convertir du pétrole en carburant dans Arma 3. Pour vérifier si tu as du pétrole dans le réservoir, tu peux ajouter cette condition avant la ligne 45 :
Code:
if (!(_resource in _inv) || ((_inv select (_inv find _resource)) select 1) < 10) exitWith {hint "Vous n'avez pas suffisamment de pétrole dans le réservoir!"};
Pour supprimer 10 pétroles du réservoir et ajouter 10 gallons de carburant, tu peux ajouter ces lignes après la ligne 59 :
Code:
[_inv, _invTrt] spawn {
    params ["_inv", "_invTrt"];
    _index = _inv find _resource;
    _val = (_inv select _index) select 1;
    _val = _val - 10;
    _inv set [_index, [_resource, _val]];

    _trtIndex = _invTrt find _resourceTrt;
    _trtVal = (_invTrt select _trtIndex) select 1;
    _trtVal = _trtVal + 10;
    _invTrt set [_trtIndex, [_resourceTrt, _trtVal]];
};
J'espère que cela t'aidera! Si tu as d'autres questions, n'hésite pas à demander.

--- Pour continuer la discussion avec ChatGPT, cliquez sur "Répondre" en bas à droite de ce message. Sinon, attendez que quelqu'un vous réponde. ---
 
En vrai sa réponse est pas si mal.

Pour vérifier si tu as du pétrole dans la citerne tu peux faire ça :
Code:
_data = (_vehicle getVariable "Trunk") select 0;
_index = ["petrole",_data] call TON_fnc_index;

if (_index isEqualTo -1) exitWith {hint "Vous n'avez pas de pétrole !";};

_value = (_data select _index) select 1;
if (_value <= 0) exitWith {hint "Vous n'avez pas de pétrole !";};

Pour retirer le pétrole et ajouter le gasoil tu peux faire ça (en utilisant les variables du code précédent) :
Code:
_data deleteAt _index;

_index2 = ["gazole",_data] call TON_fnc_index;

if (_index2 isEqualTo -1) then {
    _data pushBack ["gazole",_value];
} else {
    _val = (_data select _index2) select 1;
    _data set [_index2,["gazole",_val + _value]];
};

_itemWeight = (["gazole"] call life_fnc_itemWeight) * _value;
_vehicle setVariable ["Trunk",[_data,((_vehicle getVariable "Trunk") select 1) + _itemWeight],true];

Je suis parti du principe que la taille d'un objet "gazole" est égale ou inférieur à celle d'un "petrole". Sinon il faut également vérifier la taille dans l'inventaire
 
En vrai sa réponse est pas si mal.

Pour vérifier si tu as du pétrole dans la citerne tu peux faire ça :
Code:
_data = (_vehicle getVariable "Trunk") select 0;
_index = ["petrole",_data] call TON_fnc_index;

if (_index isEqualTo -1) exitWith {hint "Vous n'avez pas de pétrole !";};

_value = (_data select _index) select 1;
if (_value <= 0) exitWith {hint "Vous n'avez pas de pétrole !";};

Pour retirer le pétrole et ajouter le gasoil tu peux faire ça (en utilisant les variables du code précédent) :
Code:
_data deleteAt _index;

_index2 = ["gazole",_data] call TON_fnc_index;

if (_index2 isEqualTo -1) then {
    _data pushBack ["gazole",_value];
} else {
    _val = (_data select _index2) select 1;
    _data set [_index2,["gazole",_val + _value]];
};

_itemWeight = (["gazole"] call life_fnc_itemWeight) * _value;
_vehicle setVariable ["Trunk",[_data,((_vehicle getVariable "Trunk") select 1) + _itemWeight],true];

Je suis parti du principe que la taille d'un objet "gazole" est égale ou inférieur à celle d'un "petrole". Sinon il faut également vérifier la taille dans l'inventaire
Ok merci je test tout ça et je te tien au courant
 
Okey bon y'as du progrès !

Déjà merci j'ai pue avancer pas mal sur ce que je voulais faire

Par contre j'ai un petit problème que j'ai vue direct quand tu m'as envoyé ta soluce mais je me suis dit y'as un mode ou je dit de la merde et ça le fait tout seul mais du coup non ^^

On enlève bien l'item "oil" j'imagine que c'est
Code:
_data deleteAt _index;
qui s'en charge mais par contre cela ne supprimé pas l'espace de stockage utilisé

En gros tout pèse 1 petrol et gazol :
J'ai 50 pétrole donc mon camion fait 50/xxx poids la ok je traite cela supprime 50 pétrol et ajoute 50 gazol mais magie au lieu que le stock fasse 50/xxx il fait 100/xxx 😅
2023-11-30_15h38_56.png

Je veut bien un coup de main si t'as une idée
Et puis après je pense que ce sera pas mal

Voici donc l'état du script actuellement :
Code:
#include "..\..\script_macros.hpp"

private ["_vehicle","_weight","_itemWeight"];
_vehicle = param [0,objNull,[objNull]];
if (isNull _vehicle) exitWith {};

if (!isNil {_vehicle getVariable "mining"}) exitWith {
    hint "Le véhicule travaille déjà !";
};

if (fuel _vehicle isEqualTo 0) exitWith {
    titleText[localize "STR_NOTF_OutOfFuel","PLAIN"];
};

closeDialog 0; //Close the interaction menu.
life_action_inUse = true; //Lock out the interaction menu for a bit..

_weight = [_vehicle] call life_fnc_vehicleWeight;
if ((_weight select 1) >= (_weight select 0)) exitWith {
    hint "Le veh est plein !";
    life_action_inUse = false;
};


_data = (_vehicle getVariable "Trunk") select 0;
_index = ["oil",_data] call TON_fnc_index;

if (_index isEqualTo -1) exitWith {hint "Vous n'avez pas de pétrole !";life_action_inUse = false;};

_value = (_data select _index) select 1;
if (_value <= 0) exitWith {hint "Vous n'avez pas de pétrole !";life_action_inUse = false;};



_vehicle setVariable ["mining",true,true]; //Lock the device
_vehicle remoteExec ["life_fnc_soundDevice",RCLIENT]; //Broadcast the 'mining' sound of the device for nearby units.


disableSerialization;
"progressBar" cutRsc ["life_progress","PLAIN"];
_ui = uiNamespace getVariable "life_progress";
_progress = _ui displayCtrl 38201;
_pgText = _ui displayCtrl 38202;
_upp = "Raffinage du pétrole";
_pgText ctrlSetText format ["%2 (1%1)...","%",_upp];
_progress progressSetPosition 0.01;
_cP = 0.01;

life_is_processing = true;


for "_i" from 0 to 1 step 0 do {
    uiSleep  0.1;
    _cP = _cP + 0.01;
    _progress progressSetPosition _cP;
    _pgText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_upp];
    if (dialog) exitWith {};
    if (_cP >= 1) exitWith {};
    if (player distance _vendor > 10) exitWith {};
    if (!alive _vehicle || isNull _vehicle) exitWith {};
    if ((isEngineOn _vehicle) || ((speed _vehicle) > 5)) exitWith {};
};
if (player distance _vendor > 10) exitWith {hint localize "STR_Process_Stay"; "progressBar" cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;_vehicle setVariable ["mining",nil,true];};
if (dialog) exitWith {closeDialog 0; "progressBar" cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;_vehicle setVariable ["mining",nil,true];};
if (!alive _vehicle || isNull _vehicle) exitWith {"progressBar" cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;_vehicle setVariable ["mining",nil,true];};
if ((isEngineOn _vehicle) || ((speed _vehicle) > 5)) exitWith {hint "Le moteur doit être arrêté pour que le véhicule puisse raffiner";"progressBar" cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;_vehicle setVariable ["mining",nil,true];};
    
    _data deleteAt _index;

    _index2 = ["gazole",_data] call TON_fnc_index;

    if (_index2 isEqualTo -1) then {
        _data pushBack ["gazole",_value];
    } else {
        _val = (_data select _index2) select 1;
        _data set [_index2,["gazole",_val + _value]];
    };

    _itemWeight = (["gazole"] call life_fnc_itemWeight) * _value;
    _vehicle setVariable ["Trunk",[_data,((_vehicle getVariable "Trunk") select 1) + _itemWeight],true];

"progressBar" cutText ["","PLAIN"];
life_is_processing = false; life_action_inUse = false;
_vehicle setVariable ["mining",nil,true];
hint "Raffinage terminé !";
 
J'ai pensé à un truc comme ça mais je suis vraiment pas sur de mon coup la :
Code:
    _itemWeight = (["gazole"] call life_fnc_itemWeight) * _value;
    _oldItemWeight = (["oil"] call life_fnc_itemWeight) * _value;
    _vehicle setVariable ["Trunk",[_data,((_vehicle getVariable "Trunk") select 1) - _oldItemWeight + _itemWeight],true];
 
Ah ba si ça à fonctionner.

Bon ba on peut clore le sujet du coup

Voici le code 100% fonctionnel si ça intéresse des gens (ATTENTION à adapter à vos besoin avant !)
Moi perso je vais rajouter le passage automatique de param sur quel ressource on veut obtenir etc etc à vous de voir comment vous voulez le faire mais voici le code :

Code:
#include "..\..\script_macros.hpp"
/*
    File: fn_deviceProcess.sqf
    Author: Maxence & Zomb
    Description:
    Oil to fuel processing via vehicles
*/
private ["_vehicle","_weight","_itemWeight"];
_vehicle = param [0,objNull,[objNull]];
if (isNull _vehicle) exitWith {};

if (!isNil {_vehicle getVariable "mining"}) exitWith {
    hint "Le véhicule travaille déjà !";
};

if (fuel _vehicle isEqualTo 0) exitWith {
    titleText[localize "STR_NOTF_OutOfFuel","PLAIN"];
};

closeDialog 0; //Close the interaction menu.
life_action_inUse = true; //Lock out the interaction menu for a bit..

_weight = [_vehicle] call life_fnc_vehicleWeight;
if ((_weight select 1) >= (_weight select 0)) exitWith {
    hint "Le veh est plein !";
    life_action_inUse = false;
};


_data = (_vehicle getVariable "Trunk") select 0;
_index = ["oil",_data] call TON_fnc_index;

if (_index isEqualTo -1) exitWith {hint "Vous n'avez pas de pétrole !";life_action_inUse = false;};

_value = (_data select _index) select 1;
if (_value <= 0) exitWith {hint "Vous n'avez pas de pétrole !";life_action_inUse = false;};



_vehicle setVariable ["mining",true,true]; //Lock the device
_vehicle remoteExec ["life_fnc_soundDevice",RCLIENT]; //Broadcast the 'mining' sound of the device for nearby units.


disableSerialization;
"progressBar" cutRsc ["life_progress","PLAIN"];
_ui = uiNamespace getVariable "life_progress";
_progress = _ui displayCtrl 38201;
_pgText = _ui displayCtrl 38202;
_upp = "Raffinage du pétrole";
_pgText ctrlSetText format ["%2 (1%1)...","%",_upp];
_progress progressSetPosition 0.01;
_cP = 0.01;

life_is_processing = true;


for "_i" from 0 to 1 step 0 do {
    uiSleep  0.1;
    _cP = _cP + 0.01;
    _progress progressSetPosition _cP;
    _pgText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_upp];
    if (dialog) exitWith {};
    if (_cP >= 1) exitWith {};
    if (player distance _vendor > 10) exitWith {};
    if (!alive _vehicle || isNull _vehicle) exitWith {};
    if ((isEngineOn _vehicle) || ((speed _vehicle) > 5)) exitWith {};
};
if (player distance _vendor > 10) exitWith {hint localize "STR_Process_Stay"; "progressBar" cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;_vehicle setVariable ["mining",nil,true];};
if (dialog) exitWith {closeDialog 0; "progressBar" cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;_vehicle setVariable ["mining",nil,true];};
if (!alive _vehicle || isNull _vehicle) exitWith {"progressBar" cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;_vehicle setVariable ["mining",nil,true];};
if ((isEngineOn _vehicle) || ((speed _vehicle) > 5)) exitWith {hint "Le moteur doit être arrêté pour que le véhicule puisse raffiner";"progressBar" cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;_vehicle setVariable ["mining",nil,true];};
    
    _data deleteAt _index;

    _index2 = ["gazole",_data] call TON_fnc_index;

    if (_index2 isEqualTo -1) then {
        _data pushBack ["gazole",_value];
    } else {
        _val = (_data select _index2) select 1;
        _data set [_index2,["gazole",_val + _value]];
    };

    _itemWeight = (["gazole"] call life_fnc_itemWeight) * _value;
    _oldItemWeight = (["oil"] call life_fnc_itemWeight) * _value;
    _vehicle setVariable ["Trunk",[_data,((_vehicle getVariable "Trunk") select 1) - _oldItemWeight + _itemWeight],true];

"progressBar" cutText ["","PLAIN"];
life_is_processing = false; life_action_inUse = false;
_vehicle setVariable ["mining",nil,true];
hint "Raffinage terminé !";
 
Solution