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
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 !