Français Solved Problème de minage multiple avec un véhicule

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

LouLou

User
4/8/20
39
3
1
450
Bonjour,

Après quelques tentative pour mettre en place le système de minage multiple sur un véhicule, j'ai abandonné et préférer venir demander de l'aide ici.

Tout ce passe dans le fichier core/actions/fn_deviceMine.sqf

Je pense que ça ce passe ici :

Code:
_resourceCfg = missionConfigFile >> "CfgGather" >> "Resources";
for "_i" from 0 to count(_resourceCfg)-1 do {
    _curConfig = (_resourceCfg select _i);
    _resource = configName(_curConfig);
    _resourceZones = getArray(_curConfig >> "zones");
    _zoneSize = getNumber(_curConfig >> "zoneSize");

    {
        if ((player distance (getMarkerPos _x)) < _zoneSize) exitWith {
            _zone = _x;
        };
    } forEach _resourceZones;

    if (_zone != "") exitWith {_isMineral = false;};
};

_resourceCfg = missionConfigFile >> "CfgGather" >> "Minerals";
for "_i" from 0 to count(_resourceCfg)-1 do {
    private ["_curConfig","_resourceZones","_resources","_mined"];

    if (!_isMineral) exitWith {};
    _curConfig = (_resourceCfg select _i);
    _resources = getArray(_curConfig >> "mined");
    _resourceZones = getArray(_curConfig >> "zones");
    _zoneSize = getNumber(_curConfig >> "zoneSize");

    if (!(_resources select 0 isEqualType [])) then {
        _mined = _resources select 0;
    } else {
        _mined = (_resources select 0) select 0;
    };

    {
        if ((player distance (getMarkerPos _x)) < _zoneSize) exitWith {
            _zone = _x;
        };
    } forEach _resourceZones;

    if (_zone != "") exitWith {_resource = _mined};
};

Donc j'explique mon problème. Je dispose d'une mine à multiples ressources. Il y a donc 50% de chance de prendre de la pierre, etc.
Le problème étant que lorsque l'on mine avec le dispositif de minage, il ne mine que de la pierre.
J'ai essayé d'adapter le fichier core/actions/fn_mine.sqf mais sans réussite.

Comment feriez-vous ?
 
Solution
Le fichier fn_mine.sqf (ou fn_gather.sqf) est executé quand un joueur ramasse via la touche windows de son clavier.
Le fn_deviceMine.sqf est le minage d'un véhicule qui est activable dans le menu windows sur celui-ci.

Normalement, le fichier fn_mine.sqf est fait correctement et tu devrais avoir aléatoirement une des ressources. Mais pour le fn_deviceMine.sqf, quoi qu'il arrive ça donnera que la 1ère ressource (= select 0) :
Code:
if (!(_resources select 0 isEqualType [])) then {
    _mined = _resources select 0;
} else {
    _mined = (_resources select 0) select 0;
};

Après réflexion, j'ai compris pourquoi il y avait ce problème. Au début du script il défini dans la variable _ressource la...
Le fichier fn_mine.sqf (ou fn_gather.sqf) est executé quand un joueur ramasse via la touche windows de son clavier.
Le fn_deviceMine.sqf est le minage d'un véhicule qui est activable dans le menu windows sur celui-ci.

Normalement, le fichier fn_mine.sqf est fait correctement et tu devrais avoir aléatoirement une des ressources. Mais pour le fn_deviceMine.sqf, quoi qu'il arrive ça donnera que la 1ère ressource (= select 0) :
Code:
if (!(_resources select 0 isEqualType [])) then {
    _mined = _resources select 0;
} else {
    _mined = (_resources select 0) select 0;
};

Après réflexion, j'ai compris pourquoi il y avait ce problème. Au début du script il défini dans la variable _ressource la ressource à ajouter à chaque boucle que fais le script (pour remplir le camion en entier). Sauf que pour qu'elle change entre plusieurs items, _ressource devrait changer également dans chaque boucle, mais ici la variable est fixe est définie avant les boucles. Donc elle ne changera pas.

Il faut donc modifier la variable _ressource dans la boucle et calculer l'item qui devra être ajouté à chaque fois. Pour ça, trouve cette ligne :
Code:
_space = (_vehicle_data select 1);
et ajoute en dessous la partie qui change la variable _ressource selon le config et les probas des items :
Code:
_resource = "";
_percent = (floor random 100) + 1;

for "_i" from 0 to count (_resources) do {
    if ((count _resources) isEqualTo 1) exitWith {
        if (!((_resources select 0) isEqualType [])) then {
            _resource = _resources select 0;
        } else {
            _resource = (_resources select 0) select 0;
        };
    };

    _prob = (_resources select _i) select 1;
    _probdiff = (_resources select _i) select 2;

    if ((_percent >= _prob) && (_percent <= _probdiff)) exitWith {
        _resource = (_resources select _i) select 0;
    };
};

if (_resource isEqualTo "") exitWith {hint "Bad config.";};

Et remplace cette ligne :
Code:
_random = 10 + round((random(10)));
par :
Code:
_random = 10;
Pour enlever le nombre aléatoire d'items qui seront ajoutés dans le véhicule, sinon les probabilités ne servent à rien.

Pour que la variable _ressources soit définie dans la boucle, en dessous de cette ligne :
Code:
_resourceCfg = missionConfigFile >> "CfgGather" >> "Minerals";
ajoute :
Code:
_resources = [];
if !(_isMineral) then {_resources = [[_resource,0,100]];};

Et remplace cette ligne :
Code:
private ["_curConfig","_resourceZones","_resources","_mined"];
par celle-ci :
Code:
private ["_curConfig","_resourceZones","_mined"];

Je n'ai pas eu le temps de tester, puisque c'était déjà long de comprendre pourquoi ce script avait été fait comme ça, donc tiens moi au courant :)
 
Dernière édition:
Solution
Tout d'abord, merci pour t'être penché sur le sujet.
J'ai donc essayé ce que tu as fait, ça me sort "Bad config."

Comment est-ce que ça ce fait qu'il sort _resource = "" ?
 
Code:
class mine {
    amount = 3;
    zones[] = { "mine" };
    item = "pickaxe";
    mined[] = {{"rock",0,50},{"copper_unrefined",50,75},{"iron_unrefined",75,92},{"diamond_uncut",92,100}};
    zoneSize = 30;
};
ça fonctionne bien avec le fn_mine.sqf
 
Du coup j'ai testé en solo pour voir ce que ça donnait avec ton config, et ça fonctionne pour moi (c'est bien aléatoire) :
1603707994678.png

Je viens de comprendre le soucis, en fait la variable _ressources n'est pas définie dans la boucle :confused:
J'ai update ma réponse au dessus en ajoutant les parties suivantes :
Pour que la variable _ressources soit définie dans la boucle, en dessous de cette ligne :
Code:
_resourceCfg = missionConfigFile >> "CfgGather" >> "Minerals";
ajoute :
Code:
_resources = [];
if !(_isMineral) then {_resources = [[_resource,0,100]];};
Et remplace cette ligne :
Code:
private ["_curConfig","_resourceZones","_resources","_mined"];
par celle-ci :
Code:
private ["_curConfig","_resourceZones","_mined"];