- replace placeholder garage interaction with real UI open flow - add catalog/session/UI bridge services for hydrate, sync, store, and retrieve actions - migrate garage web UI bundle to new app shell/runtime structure - align org/store function naming with shared init and UI bridge patterns
206 lines
8.3 KiB
Plaintext
206 lines
8.3 KiB
Plaintext
#include "..\script_component.hpp"
|
|
|
|
/*
|
|
* File: fnc_initUIBridge.sqf
|
|
* Author: IDSolutions
|
|
* Date: 2026-03-14
|
|
* Public: No
|
|
*
|
|
* Description:
|
|
* Initializes the garage UI bridge for browser control state and retrieve/store actions.
|
|
*/
|
|
|
|
#pragma hemtt ignore_variables ["_self"]
|
|
private _webUIDeclarations = call EFUNC(common,initWebUIBridge);
|
|
private _webUIBridgeDeclaration = _webUIDeclarations get "bridgeDeclaration";
|
|
|
|
GVAR(GarageUIBridgeBaseClass) = compileFinal createHashMapFromArray [
|
|
["#base", _webUIBridgeDeclaration],
|
|
["#type", "GarageUIBridgeBaseClass"],
|
|
["#create", compileFinal {
|
|
_self set ["pendingStoreVehicle", objNull];
|
|
_self set ["pendingRetrieve", createHashMap];
|
|
}],
|
|
["getActiveBrowserControl", compileFinal {
|
|
private _display = uiNamespace getVariable ["RscGarage", displayNull];
|
|
if (isNull _display) exitWith {
|
|
_self call ["setActiveBrowserControl", [controlNull]];
|
|
controlNull
|
|
};
|
|
|
|
private _control = _display displayCtrl 1006;
|
|
_self call ["setActiveBrowserControl", [_control]];
|
|
_control
|
|
}],
|
|
["handleReady", compileFinal {
|
|
params [["_control", controlNull, [controlNull]], ["_data", createHashMap, [createHashMap]]];
|
|
|
|
private _screen = _self call ["getScreen", []];
|
|
_screen call ["setControl", [_control]];
|
|
_screen call ["markReady", [true]];
|
|
|
|
_self call ["flushPendingEvents", []];
|
|
_self call ["sendEvent", ["garage::hydrate", GVAR(GarageSessionService) call ["buildPayload", []], _control]];
|
|
}],
|
|
["refreshGarage", compileFinal {
|
|
private _control = _self call ["getActiveBrowserControl", []];
|
|
if (isNull _control) exitWith { false };
|
|
|
|
_self call ["sendEvent", ["garage::sync", GVAR(GarageSessionService) call ["buildPayload", []], _control]]
|
|
}],
|
|
["handleRetrieveRequest", compileFinal {
|
|
params [["_data", createHashMap, [createHashMap]]];
|
|
|
|
private _plate = _data getOrDefault ["plate", ""];
|
|
if (_plate isEqualTo "") exitWith {
|
|
_self call ["sendEvent", ["garage::retrieve::failure", createHashMapFromArray [
|
|
["message", "Select a stored vehicle to retrieve."]
|
|
]]];
|
|
};
|
|
|
|
private _garageMap = if (isNil QGVAR(GarageClass)) then {
|
|
createHashMap
|
|
} else {
|
|
GVAR(GarageClass) call ["getGarageState", []]
|
|
};
|
|
private _vehicleData = _garageMap getOrDefault [_plate, createHashMap];
|
|
if (_vehicleData isEqualTo createHashMap) exitWith {
|
|
_self call ["sendEvent", ["garage::retrieve::failure", createHashMapFromArray [
|
|
["message", "Stored vehicle record could not be found."]
|
|
]]];
|
|
};
|
|
|
|
private _context = GVAR(GarageSessionService) call ["getContext", []];
|
|
private _spawnPosition = _context getOrDefault ["spawnPosition", getPosATL player];
|
|
private _spawnHeading = _context getOrDefault ["spawnHeading", getDir player];
|
|
private _spawnRadius = _context getOrDefault ["spawnRadius", 6];
|
|
private _blockingVehicles = [];
|
|
{
|
|
_blockingVehicles pushBackUnique _x;
|
|
} forEach (_spawnPosition nearEntities [["Car", "Tank", "Air", "Ship"], _spawnRadius]);
|
|
{
|
|
_blockingVehicles pushBackUnique _x;
|
|
} forEach (nearestObjects [_spawnPosition, ["Car", "Tank", "Air", "Ship"], _spawnRadius]);
|
|
if (_blockingVehicles isNotEqualTo []) exitWith {
|
|
_self call ["sendEvent", ["garage::retrieve::failure", createHashMapFromArray [
|
|
["message", "The garage spawn area is blocked."]
|
|
]]];
|
|
};
|
|
|
|
private _className = _vehicleData getOrDefault ["classname", ""];
|
|
if (_className isEqualTo "") exitWith {
|
|
_self call ["sendEvent", ["garage::retrieve::failure", createHashMapFromArray [
|
|
["message", "Stored vehicle record is missing a classname."]
|
|
]]];
|
|
};
|
|
|
|
private _vehicle = createVehicle [_className, _spawnPosition, [], 0, "CAN_COLLIDE"];
|
|
_vehicle setDir _spawnHeading;
|
|
_vehicle setFuel (_vehicleData getOrDefault ["fuel", 0]);
|
|
_vehicle setDamage (_vehicleData getOrDefault ["damage", 0]);
|
|
|
|
private _hitPoints = _vehicleData getOrDefault ["hit_points", createHashMap];
|
|
private _hitPointNames = _hitPoints getOrDefault ["names", []];
|
|
private _hitPointValues = _hitPoints getOrDefault ["values", []];
|
|
for "_index" from 0 to ((count _hitPointNames) - 1) do {
|
|
_vehicle setHitPointDamage [_hitPointNames param [_index, ""], _hitPointValues param [_index, 0]];
|
|
};
|
|
|
|
_vehicle setVariable ["forge_garage_plate", _plate, true];
|
|
_vehicle setVariable ["forge_garage_owner_uid", getPlayerUID player, true];
|
|
|
|
_self set ["pendingRetrieve", createHashMapFromArray [
|
|
["plate", _plate],
|
|
["vehicle", _vehicle]
|
|
]];
|
|
|
|
[SRPC(garage,requestRetrieveVehicle), [getPlayerUID player, _plate]] call CFUNC(serverEvent);
|
|
}],
|
|
["handleStoreRequest", compileFinal {
|
|
params [["_data", createHashMap, [createHashMap]]];
|
|
|
|
private _netId = _data getOrDefault ["netId", ""];
|
|
if (_netId isEqualTo "") exitWith {
|
|
_self call ["sendEvent", ["garage::store::failure", createHashMapFromArray [
|
|
["message", "Select a nearby vehicle to store."]
|
|
]]];
|
|
};
|
|
|
|
private _vehicle = objectFromNetId _netId;
|
|
if (isNull _vehicle) exitWith {
|
|
_self call ["sendEvent", ["garage::store::failure", createHashMapFromArray [
|
|
["message", "The selected vehicle is no longer available."]
|
|
]]];
|
|
};
|
|
|
|
if (crew _vehicle isNotEqualTo []) exitWith {
|
|
_self call ["sendEvent", ["garage::store::failure", createHashMapFromArray [
|
|
["message", "All crew must exit the vehicle before storing it."]
|
|
]]];
|
|
};
|
|
|
|
private _rawHitPoints = getAllHitPointsDamage _vehicle;
|
|
private _hitPointsJson = toJSON (createHashMapFromArray [
|
|
["names", _rawHitPoints param [0, []]],
|
|
["selections", _rawHitPoints param [1, []]],
|
|
["values", _rawHitPoints param [2, []]]
|
|
]);
|
|
|
|
_self set ["pendingStoreVehicle", _vehicle];
|
|
[SRPC(garage,requestStoreVehicle), [
|
|
getPlayerUID player,
|
|
typeOf _vehicle,
|
|
fuel _vehicle,
|
|
damage _vehicle,
|
|
_hitPointsJson
|
|
]] call CFUNC(serverEvent);
|
|
}],
|
|
["handleActionResponse", compileFinal {
|
|
params [["_payload", createHashMap, [createHashMap]]];
|
|
|
|
private _action = _payload getOrDefault ["action", ""];
|
|
private _success = _payload getOrDefault ["success", false];
|
|
private _message = _payload getOrDefault ["message", "Garage action failed."];
|
|
|
|
switch (_action) do {
|
|
case "retrieve": {
|
|
private _pendingRetrieve = _self getOrDefault ["pendingRetrieve", createHashMap];
|
|
private _vehicle = _pendingRetrieve getOrDefault ["vehicle", objNull];
|
|
|
|
if (!_success && { !isNull _vehicle }) then {
|
|
deleteVehicle _vehicle;
|
|
};
|
|
|
|
_self set ["pendingRetrieve", createHashMap];
|
|
_self call ["sendEvent", [[
|
|
"garage::retrieve::failure",
|
|
"garage::retrieve::success"
|
|
] select _success, createHashMapFromArray [["message", _message]]]];
|
|
};
|
|
case "store": {
|
|
private _vehicle = _self getOrDefault ["pendingStoreVehicle", objNull];
|
|
|
|
if (_success && { !isNull _vehicle }) then {
|
|
deleteVehicle _vehicle;
|
|
};
|
|
|
|
_self set ["pendingStoreVehicle", objNull];
|
|
_self call ["sendEvent", [[
|
|
"garage::store::failure",
|
|
"garage::store::success"
|
|
] select _success, createHashMapFromArray [["message", _message]]]];
|
|
};
|
|
};
|
|
|
|
[] spawn {
|
|
sleep 0.05;
|
|
if !(isNil QGVAR(GarageUIBridge)) then {
|
|
GVAR(GarageUIBridge) call ["refreshGarage", []];
|
|
};
|
|
};
|
|
}]
|
|
];
|
|
|
|
GVAR(GarageUIBridge) = createHashMapObject [GVAR(GarageUIBridgeBaseClass)];
|
|
GVAR(GarageUIBridge)
|