Français Sauvegarde des items présents dans les sacs à dos à l'intérieur des véhicules

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

R404

User
14/10/21
72
3
5
450
Sauvegarder les items des sacs à dos, gilets et tenues présent dans les véhicules





Pré-requis :

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Arma 3 installé sur votre ordinateur.
  • Un éditeur de texte (comme Notepad++ ou Visual Studio Code) pour modifier les fichiers.
  • Quelques connaissances de base en programmation SQF.
  • Un éditeur de PBO comme PBO Manager




Étape 1 : Identifier les fichiers à modifier

Pensez à bien décompresser le fichier life_server.pbo afin de pouvoir éditer les fichiers.
Les fichiers que vous devez modifier se trouvent dans
Code:
life_server\Functions\Systems
à la racine de votre serveur.
Recherchez les fichiers

Code:
fn_spawnVehicle.sqf
fn_vehicleStore.sqf

C’est ici que vous allez insérer le code pour gérer la sauvegarde des items.




Étape 2 : Ajouter le code pour sauvegarder les items

Dans votre fichier fn_vehicleStore.sqf, recherchez :

Code:
// save damage.

Et ajoutez au dessus :

Code:
// R404 - Save vehicle containers items
private _containers = everyContainer _vehicle;
private _itemInVeh = [];
private _countItems = {
    private _array = _this;
    private _itemCount = [];
    {
        private _item = _x;
        private _existing = _itemCount findIf {
            (_x select 0) == _item
        };
        if (_existing == -1) then {
            _itemCount pushBack [_item, 1];
        } else {
            _itemCount set [_existing, [_item, (_itemCount select _existing select 1) + 1]];
        };
    } forEach _array;
    _itemCount
};
private _countMagazines = {
    private _array = _this;
    private _magazineCount = [];
    {
        private _magazine = _x select 0;
        private _ammoCount = _x select 1;
        private _existing = _magazineCount findIf {
            (_x select 0) == _magazine
        };
        if (_existing == -1) then {
            _magazineCount pushBack [_magazine, _ammoCount];
        } else {
            _magazineCount set [_existing, [_magazine, (_magazineCount select _existing select 1) + _ammoCount]];
        };
    } forEach _array;
    _magazineCount
};
{
    _container = _x#1;
    _classname = _x#0;
    _containerClass = typeOf _container;
    _items = itemCargo _container;
    _weapons = weaponCargo _container;
    _magazines = magazinesAmmo _container;
    _countedItems = _items call _countItems;
    _countedWeapons = _weapons call _countItems;
    _countedMagazines = _magazines call _countMagazines;
    _itemInVeh pushBack [_classname, _containerClass, _countedItems, _countedWeapons, _countedMagazines];
} forEach _containers;

_itemInVeh = [_itemInVeh] call DB_fnc_mresArray;
_query = format ["UPDATE vehicles SET container_items='%1' WHERE pid='%2' AND plate='%3'", _itemInVeh, _uid, _plate];
[_query, 1] call DB_fnc_asyncCall;




Étape 3 : Charger les items à la sortie du véhicule

Pour charger les items lorsque vous sortez un véhicule du garage, recherchez cette ligne dans le fichier fn_spawnVehicle.sqf :

Code:
[1, _spawntext] remoteExecCall ["life_fnc_broadcast", _unit];

Et ajoutez au dessus :

Code:
// R404 - load containers items
_query = format ["SELECT container_items FROM vehicles WHERE id='%1' AND pid='%2'", _vid, _pid];
_queryResult = [_query, 2] call DB_fnc_asyncCall;
_queryResult = [(_queryResult#0)] call DB_fnc_mresToArray;
_queryResult = call compile format["%1", _queryResult];
diag_log format ["Query Result Container in vehicule: %1", _queryResult];
_containers = everyContainer _vehicle;
_modifiedContainers = [];
{
    _containerClass = _x#0;
    _containerObj = _x#1;
    _found = false;
    if (!(_containerObj in _modifiedContainers)) then {
        for "_i" from 0 to ((count _queryResult) - 1) do {
     
            _queryEntry = _queryResult select _i;
            _queryClass = _queryEntry#0;
            if (_containerClass isEqualTo _queryClass && !(_i in _modifiedContainers)) then {
                _found = true;
                _queryItems = createHashMapFromArray (_queryEntry#2);
                _queryWeapons = createHashMapFromArray (_queryEntry#3);
                _queryMagazines = createHashMapFromArray (_queryEntry#4);
                {
                    _containerObj addItemCargo [_x, _y];
                } forEach _queryItems;
                {
                    _containerObj addWeaponCargo [_x, _y];
                } forEach _queryWeapons;
                {
                    private _magazine = _x;
                    private _ammoCount = _y;
                    private _magCapacity = getNumber (configFile >> "CfgMagazines" >> _magazine >> "count");
                    while {_ammoCount > 0} do {
                        private _ammoToAdd = _ammoCount min _magCapacity;
                        _containerObj addMagazineAmmoCargo [_magazine, 1, _ammoToAdd];
                        _ammoCount = _ammoCount - _ammoToAdd;
                    };
                } forEach _queryMagazines;
                _modifiedContainers pushBack _containerObj;
                _modifiedContainers pushBack _i;
                break;
            };
        };
    };
    if (!_found) then {
        diag_log format ["fn_spawnVehicle | saveContaineItem - Le container %1 n'a pas été trouvé dans _queryResult pour le joueur %2.", _containerClass, getPlayerUID player];
    };
} forEach _containers;

Étape 4 : Mettre à jours la base de données et recompresser le fichier life_server

Dans votre base de données exécutez ceci :

SQL:
ALTER TABLE `vehicles` ADD COLUMN `container_items` TEXT DEFAULT NULL;

Ensuite, faites un clic droit sur le dossier life_server et re-compressez le en .pbo avec un outil comme PBO Manager.




Conclusion :

Félicitations, vous avez réussi à implémenter un système de sauvegarde pour les items dans les sacs à dos des véhicules ! Vous pouvez maintenant profiter d'une gestion d'inventaire plus fluide et éviter de perdre vos précieux équipements.

N'hésitez pas à partager vos questions ou vos propres astuces dans les commentaires ci-dessous !
 
  • Like
Les réactions: Nhexen