Français Solved Système de traitement personnalisé

  • Auteur de la discussion Auteur de la discussion BastienWolf
  • Date de début Date de début
29/12/19
320
45
61
1 100
25
Bonjour à tous.
Actuellement en train de travailler sur un système de traitement un peu différent de celui de base. J'ai utilisé le fn_processAction.sqf comme référence, puis fait quelques modifs pour mes besoins.


Le but est que le système traite par rapport au stock dans un objet plutôt que sur moi. Tout le système fonctionne, stockage, récupération, limite par rapport à l'item.
Même au niveau du process ça tourne, l'array se vide et se reremplis.

Si j'ai un seul objet en 1 pour 1 alors dans ce cas pas de soucis, tout fonctionne.
Si par exemple je met 10 fer brut, alors le système ne m'en rend que 1 en mettant le poids des 10.

Voici mon script complet :



Code:
#include "..\..\script_macros.hpp"

private ["_materialsRequired","_materialsGiven","_noLicenseCost","_text","_upp","_trunkMaxSpace"];
_ProcessAction = life_action_process;
_ProcessObject = life_trunk_process;


if (isClass (missionConfigFile >> "ProcessAction" >> life_action_process)) then {
    _filter = false;
    _materialsRequired = getArray (missionConfigFile >> "ProcessAction" >> life_action_process >> "MaterialsReq");
    _materialsGiven = getArray (missionConfigFile >> "ProcessAction" >> life_action_process >> "MaterialsGive");
    _noLicenseCost = getNumber(missionConfigFile >> "ProcessAction" >> life_action_process >> "NoLicenseCost");
    _text = getText(missionConfigFile >> "ProcessAction" >> life_action_process >> "Text");
    _trunkMaxSpace = getNumber(missionConfigFile >> "ProcessAction" >> life_action_process >> "TrunkSpace");
} else { hint "ERROR CONFIG";};


_itemInfo = [_materialsRequired,_materialsGiven,_noLicenseCost,(localize format ["%1",_text])];
if (count _itemInfo isEqualTo 0) exitWith {hint "BIZARRE";};

_oldItem = _itemInfo select 0;
_newItem = _itemInfo select 1;
_cost = _itemInfo select 2;
_upp = _itemInfo select 3;
_exit = false;
if (count _oldItem isEqualTo 0) exitWith {};
_trunkSpace = _ProcessObject getVariable "Trunk" select 1;
_totalConversions = [];
{
    _data = _ProcessObject getVariable "Trunk" select 0;
    _index = [_x select 0,_data] call TON_fnc_index;
    if (_index isEqualTo -1) exitWith {_exit = true;};
    _value = _data select _index select 1;
    if (_value isEqualTo 0) exitWith {_exit = true;};
    if (_value < (_x select 1)) exitWith {_exit = true;};
    _totalConversions pushBack (floor (_value/(_x select 1)));
} forEach _oldItem;

//hint format ["%1",_oldItem];

if (_exit) exitWith {life_is_processing = false; hint localize "STR_NOTF_NotEnoughItemProcess"; life_action_inUse = false;};
_minimumConversions = _totalConversions call BIS_fnc_lowestNum;
//hint format ["%1",_totalConversions];


_oldItemWeight = 0;
{
    _weight = ([_x select 0] call life_fnc_itemWeight) * (_x select 1);
    _oldItemWeight = _oldItemWeight + _weight;
} count _oldItem;

_newItemWeight = 0;
{
    _weight = ([_x select 0] call life_fnc_itemWeight) * (_x select 1);
    _newItemWeight = _newItemWeight + _weight;
} count _newItem;

_exit = false;

if (_newItemWeight > _oldItemWeight) then {
    _netChange = _newItemWeight - _oldItemWeight;
    _freeSpace = _trunkMaxSpace - _trunkSpace;
    if (_freeSpace < _netChange) exitWith {_exit = true;};
    private _estConversions = floor(_freeSpace / _netChange);
    if (_estConversions < _minimumConversions) then {
        _minimumConversions = _estConversions;
    };
};

if (_exit) exitWith {hint "Il n'y a pas assez d'espace dans le traitement"; life_is_processing = false;};
_multiCount = 0;
{
    _multiCount = ((_x select 1)*(_minimumConversions));   
} count _newItem;

_time = getNumber (missionConfigFile >> "ProcessAction" >> life_action_process >> "time");
life_trunk_process setVariable ["processEnCours",true,true];
hint format ["Vous avez lancé une fabrication, patientez %1 secondes",_time * _multiCount]; closeDialog 0;
_anim = false;

if (typeOf life_trunk_process isEqualto "Land_OLF_Sawmill_V1") then {
    playSound3D ["\OLF_meubles\industrial\Sawmill_1\sounds\saw.ogg", life_trunk_process];life_trunk_process animateSource ["log_on", 1];
    _anim = true;
};
life_trunk_process setVariable ["processEnCours",true,true];
disableSerialization;
"progressBar" cutRsc ["life_progress","PLAIN"];
_ui = uiNamespace getVariable "life_progress";
_progress = _ui displayCtrl 38201;
_pgText = _ui displayCtrl 38202;
_pgText ctrlSetText format ["%2 (1%1)...","%",_upp];
_progress progressSetPosition 0.01;
_cP = 0.01;


for "_i" from 0 to 1 step 0 do {
    uiSleep  (_time * _multiCount / 100);
    _cP = _cP + 0.01;
    _progress progressSetPosition _cP;
    _pgText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_upp];
    if (_cP >= 1) exitWith {};
};

{   
    _data = _ProcessObject getVariable "Trunk" select 0;
    _index = [_x select 0,_data] call TON_fnc_index;
    _old = _ProcessObject getVariable "Trunk" select 1;
    _value = (_data select _index) select 1;
    _num = ((_x select 1)*(_minimumConversions));
    _weight = ([(_x select 0)] call life_fnc_itemWeight) * _num;
    if (_num == _value) then {
        _data deleteAt _index;
    } else {
        _data set[_index,[(_x select 0),(_value - _num)]];
    };
    life_trunk_process setVariable ["Trunk",[_data,_old - _weight],true];
} count _oldItem;


{   
    _data = _ProcessObject getVariable "Trunk" select 0;
    _index = [_x select 0,_data] call TON_fnc_index;
    _old = _ProcessObject getVariable "Trunk" select 1;
    _value = (_data select _index) select 1;
    _num = ((_x select 1)*(_minimumConversions));
    _weight = ([(_x select 0)] call life_fnc_itemWeight) * _num;
    if (_index isEqualTo -1) then {
        _data pushBack [(_x select 0),(_x select 1)];
    } else {
        _value = _data select _index select 1;
        _data set[_index,[(_x select 0),_value + _num]];
    };
    life_trunk_process setVariable ["Trunk",[_data,_old + _weight],true];
} count _newItem;


if (_minimumConversions isEqualTo (_totalConversions call BIS_fnc_lowestNum)) then {hint "Votre traitement a été effectué";} else {hint "Le traitement a été partiellement effectué pour cause de place.";};
if (dialog) then {
    [life_trunk_process,life_action_process] call life_fnc_processInventory;
};
life_trunk_process setVariable ["processEnCours",false,true];


if (_anim) then {
    life_trunk_process animateSource ["log_on", 0];
    _anim = false;
};

"progressBar" cutText ["","PLAIN"];
life_trunk_process setVariable ["processEnCours",false,true];

Je sais que c'est un peu particulier comme code.
Si quelqu'un préfère aider via discord c'est avec plaisir aussi.

Merci d'avance à ceux qui prendrons le temps de lire.
 
Solution
Hello, je pense que tu as une erreur à cette ligne :
Code:
_data pushBack [(_x select 0),(_x select 1)];

Il faut prendre en compte la quantité multipliée par le nombre de fois où tu fais le traitement, comme ça :
Code:
_data pushBack [(_x select 0),_num];
--- Ce message a été généré automatiquement par ChatGPT, le contenu peut être incorrect. Veuillez lire le message avec précaution ! ---

Bonjour, il semble que vous ayez mis en place un système de traitement personnalisé assez complexe en vous basant sur le fn_processAction.sqf. Le problème que vous rencontrez avec le traitement de plusieurs objets à la fois réside probablement dans le calcul du poids total. Assurez-vous que la gestion des poids se fait correctement pour chaque type d'objet traité. Si vous avez besoin d'aide supplémentaire, n'hésitez pas à demander des clarifications spécifiques. Bonne continuation dans votre projet!

--- Pour continuer la discussion avec ChatGPT, cliquez sur "Répondre" en bas à droite de ce message. Sinon, attendez que quelqu'un vous réponde. ---
 
Hello, je pense que tu as une erreur à cette ligne :
Code:
_data pushBack [(_x select 0),(_x select 1)];

Il faut prendre en compte la quantité multipliée par le nombre de fois où tu fais le traitement, comme ça :
Code:
_data pushBack [(_x select 0),_num];
 
Solution
En effet, surtout que c'était ma var _minimumConversions qui n'était pas reconnu.
Refonte à peu du code et tout refonctionne.

Je te remercie et le post peut être close.