forge/arma/client/addons/garage/functions/fnc_initHelperService.sqf

224 lines
8.5 KiB
Plaintext

#include "..\script_component.hpp"
/*
* File: fnc_initHelperService.sqf
* Author: IDSolutions
* Date: 2026-03-27
* Public: No
*
* Description:
* Initializes the garage helper service for vehicle metadata and UI-friendly shaping.
*
* Arguments:
* None
*
* Return Value:
* Garage helper service object [HASHMAP OBJECT]
*
* Example:
* call forge_client_garage_fnc_initHelperService;
*/
#pragma hemtt ignore_variables ["_self"]
GVAR(GarageHelperServiceBaseClass) = compileFinal createHashMapFromArray [
["#type", "GarageHelperServiceBaseClass"],
["normalizeGarageCategory", compileFinal {
params [["_value", "", [""]]];
private _normalized = toLowerANSI (trim _value);
if (_normalized isEqualTo "") exitWith { "" };
if (_normalized in ["cars", "armor", "helis", "planes", "naval", "other"]) exitWith { _normalized };
""
}],
["inferGarageCategory", compileFinal {
params [["_value", "", [""]]];
private _normalized = toLowerANSI (trim _value);
if (_normalized isEqualTo "") exitWith { "" };
private _resolvedCategory = _self call ["normalizeGarageCategory", [_normalized]];
if (_resolvedCategory isNotEqualTo "") exitWith { _resolvedCategory };
switch (true) do {
case ((_normalized find "cars") >= 0): { "cars" };
case ((_normalized find "armor") >= 0): { "armor" };
case ((_normalized find "helis") >= 0): { "helis" };
case ((_normalized find "planes") >= 0): { "planes" };
case ((_normalized find "naval") >= 0): { "naval" };
case ((_normalized find "other") >= 0): { "other" };
default { "" };
}
}],
["resolveCategory", compileFinal {
params [["_className", "", [""]]];
if (_className isEqualTo "") exitWith { "other" };
switch (true) do {
case (_className isKindOf ["Car", configFile >> "CfgVehicles"]): { "car" };
case (_className isKindOf ["Tank", configFile >> "CfgVehicles"]): { "armor" };
case (_className isKindOf ["Helicopter", configFile >> "CfgVehicles"]): { "air" };
case (_className isKindOf ["Plane", configFile >> "CfgVehicles"]): { "air" };
case (_className isKindOf ["Ship", configFile >> "CfgVehicles"]): { "naval" };
default { "other" };
}
}],
["resolveVGCategory", compileFinal {
params [["_className", "", [""]]];
if (_className isEqualTo "") exitWith { "other" };
switch (true) do {
case (_className isKindOf ["Car", configFile >> "CfgVehicles"]): { "cars" };
case (_className isKindOf ["Tank", configFile >> "CfgVehicles"]): { "armor" };
case (_className isKindOf ["Helicopter", configFile >> "CfgVehicles"]): { "helis" };
case (_className isKindOf ["Plane", configFile >> "CfgVehicles"]): { "planes" };
case (_className isKindOf ["Ship", configFile >> "CfgVehicles"]): { "naval" };
default { "other" };
}
}],
["resolveGarageCategoryLabel", compileFinal {
params [["_category", "", [""]]];
switch (_category) do {
case "cars": { "cars" };
case "armor": { "armored vehicles" };
case "helis": { "helicopters" };
case "planes": { "planes" };
case "naval": { "naval vehicles" };
case "other": { "other vehicles" };
default { "this vehicle type" };
}
}],
["resolveDisplayName", compileFinal {
params [["_className", "", [""]]];
private _displayName = getText (configFile >> "CfgVehicles" >> _className >> "displayName");
if (_displayName isEqualTo "") then {
_displayName = _className;
};
_displayName
}],
["resolvePicture", compileFinal {
params [["_className", "", [""]]];
private _picture = getText (configFile >> "CfgVehicles" >> _className >> "editorPreview");
if (_picture isEqualTo "") then {
_picture = getText (configFile >> "CfgVehicles" >> _className >> "picture");
};
_picture
}],
["buildHitPointRows", compileFinal {
params [["_hitPoints", createHashMap, [createHashMap]]];
private _rows = [];
private _names = _hitPoints getOrDefault ["names", []];
private _selections = _hitPoints getOrDefault ["selections", []];
private _values = _hitPoints getOrDefault ["values", []];
private _count = count _names;
for "_index" from 0 to (_count - 1) do {
private _rowName = _names param [_index, ""];
_rows pushBack (createHashMapFromArray [
["name", _rowName],
["selection", _selections param [_index, ""]],
["value", _values param [_index, 0]]
]);
};
_rows
}],
["resolveHealth", compileFinal {
params [["_damage", 0, [0]], ["_hitPointRows", [], [[]]]];
private _worstHitPoint = 0;
{
private _value = _x getOrDefault ["value", 0];
if (_value > _worstHitPoint) then {
_worstHitPoint = _value;
};
} forEach _hitPointRows;
1 - ((_damage max _worstHitPoint) min 1)
}],
["buildStoredVehicle", compileFinal {
params [["_plate", "", [""]], ["_vehicleData", createHashMap, [createHashMap]]];
private _className = _vehicleData getOrDefault ["classname", ""];
private _damage = _vehicleData getOrDefault ["damage", 0];
private _fuel = _vehicleData getOrDefault ["fuel", 0];
private _hitPoints = _vehicleData getOrDefault ["hit_points", createHashMap];
private _hitPointRows = _self call ["buildHitPointRows", [_hitPoints]];
createHashMapFromArray [
["entryKind", "stored"],
["plate", _plate],
["classname", _className],
["displayName", _self call ["resolveDisplayName", [_className]]],
["picture", _self call ["resolvePicture", [_className]]],
["category", _self call ["resolveCategory", [_className]]],
["damage", _damage],
["fuel", _fuel],
["health", _self call ["resolveHealth", [_damage, _hitPointRows]]],
["hitPoints", _hitPointRows]
]
}],
["buildNearbyVehicle", compileFinal {
params [
["_vehicle", objNull, [objNull]],
["_origin", [], [[]]]
];
if (isNull _vehicle) exitWith { createHashMap };
private _className = typeOf _vehicle;
private _rawHitPoints = getAllHitPointsDamage _vehicle;
private _hitPointRows = [];
if (_rawHitPoints isEqualType [] && { count _rawHitPoints >= 3 }) then {
private _names = _rawHitPoints param [0, []];
private _selections = _rawHitPoints param [1, []];
private _values = _rawHitPoints param [2, []];
private _count = count _names;
for "_index" from 0 to (_count - 1) do {
_hitPointRows pushBack (createHashMapFromArray [
["name", _names param [_index, ""]],
["selection", _selections param [_index, ""]],
["value", _values param [_index, 0]]
]);
};
};
private _damage = damage _vehicle;
private _distance = if (_origin isEqualType [] && { count _origin >= 2 }) then {
_vehicle distance2D _origin
} else {
_vehicle distance2D player
};
private _ownerUid = _vehicle getVariable ["forge_garage_owner_uid", ""];
private _plate = _vehicle getVariable ["forge_garage_plate", ""];
createHashMapFromArray [
["entryKind", "nearby"],
["netId", netId _vehicle],
["plate", _plate],
["classname", _className],
["displayName", _self call ["resolveDisplayName", [_className]]],
["picture", _self call ["resolvePicture", [_className]]],
["category", _self call ["resolveCategory", [_className]]],
["damage", _damage],
["fuel", fuel _vehicle],
["health", _self call ["resolveHealth", [_damage, _hitPointRows]]],
["hitPoints", _hitPointRows],
["distance", _distance],
["ownerUid", _ownerUid],
["isEmpty", crew _vehicle isEqualTo []]
]
}]
];
GVAR(GarageHelperService) = createHashMapObject [GVAR(GarageHelperServiceBaseClass)];
GVAR(GarageHelperService)