- Update CAD client UI and generated site assets - Keep dispatcher and sidepanel status lists aligned with server defaults - Refresh task, assignment, and group repository initialization
255 lines
10 KiB
Plaintext
255 lines
10 KiB
Plaintext
#include "..\script_component.hpp"
|
|
|
|
/*
|
|
* File: fnc_initAssignmentRepository.sqf
|
|
* Author: IDSolutions
|
|
* Date: 2026-03-30
|
|
* Public: No
|
|
*
|
|
* Description:
|
|
* Initializes the CAD assignment repository for contract assignment
|
|
* state and dispatcher/group-leader task actions.
|
|
*
|
|
* Arguments:
|
|
* None
|
|
*
|
|
* Return Value:
|
|
* CAD assignment repository object [HASHMAP OBJECT]
|
|
*
|
|
* Example:
|
|
* call forge_server_cad_fnc_initAssignmentRepository
|
|
*/
|
|
|
|
#pragma hemtt ignore_variables ["_self"]
|
|
GVAR(AssignmentRepositoryBaseClass) = compileFinal createHashMapFromArray [
|
|
["#type", "CadAssignmentRepositoryBaseClass"],
|
|
["#create", compileFinal {
|
|
_self set ["assignmentRegistry", createHashMap];
|
|
}],
|
|
["pruneAssignments", compileFinal {
|
|
private _assignmentRegistry = _self getOrDefault ["assignmentRegistry", createHashMap];
|
|
private _keysToRemove = [];
|
|
|
|
{
|
|
private _status = EGVAR(task,TaskStore) call ["getTaskStatus", [_x]];
|
|
if !(_status in ["active", ""]) then {
|
|
_keysToRemove pushBack _x;
|
|
};
|
|
} forEach _assignmentRegistry;
|
|
|
|
{
|
|
_assignmentRegistry deleteAt _x;
|
|
} forEach _keysToRemove;
|
|
|
|
_self set ["assignmentRegistry", _assignmentRegistry];
|
|
count _keysToRemove
|
|
}],
|
|
["getAssignments", compileFinal {
|
|
values (_self getOrDefault ["assignmentRegistry", createHashMap])
|
|
}],
|
|
["buildContracts", compileFinal {
|
|
params [["_uid", "", [""]]];
|
|
|
|
_self call ["pruneAssignments", []];
|
|
|
|
private _assignmentRegistry = _self getOrDefault ["assignmentRegistry", createHashMap];
|
|
private _contracts = [];
|
|
private _permissionService = _self getOrDefault ["permissionService", createHashMap];
|
|
private _groupRepository = _self getOrDefault ["groupRepository", createHashMap];
|
|
private _canDispatch = _permissionService call ["canDispatch", [_uid]];
|
|
private _playerGroupId = _groupRepository call ["getPlayerGroupId", [_uid]];
|
|
|
|
{
|
|
private _taskID = _x getOrDefault ["taskID", ""];
|
|
if (_taskID isEqualTo "") then { continue; };
|
|
|
|
private _assignment = _assignmentRegistry getOrDefault [_taskID, createHashMap];
|
|
private _entry = +_x;
|
|
_entry set ["taskId", _taskID];
|
|
_entry set ["assignedGroupId", _assignment getOrDefault ["groupId", ""]];
|
|
_entry set ["assignmentState", [_assignment getOrDefault ["state", ""], "unassigned"] select (_assignment isEqualTo createHashMap)];
|
|
|
|
if (!_canDispatch) then {
|
|
private _assignedGroupId = _entry getOrDefault ["assignedGroupId", ""];
|
|
if (_assignedGroupId isEqualTo "") then { continue; };
|
|
if (_assignedGroupId isNotEqualTo _playerGroupId) then { continue; };
|
|
};
|
|
|
|
_contracts pushBack _entry;
|
|
} forEach (EGVAR(task,TaskStore) call ["getActiveTaskCatalog", []]);
|
|
|
|
_contracts
|
|
}],
|
|
["assignTaskToGroup", compileFinal {
|
|
params [
|
|
["_requesterUid", "", [""]],
|
|
["_taskID", "", [""]],
|
|
["_groupID", "", [""]],
|
|
["_note", "", [""]]
|
|
];
|
|
|
|
private _result = createHashMapFromArray [
|
|
["success", false],
|
|
["message", "Unable to assign task."],
|
|
["assignment", createHashMap]
|
|
];
|
|
|
|
private _permissionService = _self getOrDefault ["permissionService", createHashMap];
|
|
if !(_permissionService call ["canDispatch", [_requesterUid]]) exitWith {
|
|
_result set ["message", "You are not authorized to assign contracts."];
|
|
_result
|
|
};
|
|
|
|
if ((EGVAR(task,TaskStore) call ["getTaskStatus", [_taskID]]) isNotEqualTo "active") exitWith {
|
|
_result set ["message", "Task is no longer active."];
|
|
_result
|
|
};
|
|
|
|
private _assignmentRegistry = _self getOrDefault ["assignmentRegistry", createHashMap];
|
|
private _existingAssignment = +(_assignmentRegistry getOrDefault [_taskID, createHashMap]);
|
|
if (
|
|
_existingAssignment isNotEqualTo createHashMap
|
|
&& { (_existingAssignment getOrDefault ["state", ""]) in ["assigned", "acknowledged"] }
|
|
) exitWith {
|
|
_result set ["message", "Task is already assigned and must be declined or completed before reassignment."];
|
|
_result set ["assignment", _existingAssignment];
|
|
_result
|
|
};
|
|
|
|
private _groupRepository = _self getOrDefault ["groupRepository", createHashMap];
|
|
private _groupRecord = _groupRepository call ["getGroupRecord", [_groupID]];
|
|
if (_groupRecord isEqualTo createHashMap) exitWith {
|
|
_result set ["message", "Selected group is unavailable."];
|
|
_result
|
|
};
|
|
|
|
private _leaderUid = _groupRecord getOrDefault ["leaderUid", ""];
|
|
if (_leaderUid isEqualTo "") exitWith {
|
|
_result set ["message", "Selected group has no online leader."];
|
|
_result
|
|
};
|
|
|
|
private _requesterPlayer = [_requesterUid] call EFUNC(common,getPlayer);
|
|
private _assignment = createHashMapFromArray [
|
|
["taskId", _taskID],
|
|
["groupId", _groupID],
|
|
["assignedByUid", _requesterUid],
|
|
["assignedByName", ["Dispatcher", name _requesterPlayer] select (_requesterPlayer isNotEqualTo objNull)],
|
|
["assignedAt", serverTime],
|
|
["state", "assigned"],
|
|
["note", _note]
|
|
];
|
|
|
|
_assignmentRegistry set [_taskID, _assignment];
|
|
_self set ["assignmentRegistry", _assignmentRegistry];
|
|
|
|
private _activityRepository = _self getOrDefault ["activityRepository", createHashMap];
|
|
_activityRepository call ["appendActivity", [
|
|
"task_assigned",
|
|
format ["%1 assigned %2 to %3.", _assignment get "assignedByName", _taskID, _groupRecord getOrDefault ["callsign", _groupID]],
|
|
_taskID,
|
|
_groupID,
|
|
_requesterUid
|
|
]];
|
|
|
|
_result set ["success", true];
|
|
_result set ["message", "Task assigned."];
|
|
_result set ["assignment", _assignment];
|
|
_result set ["leaderUid", _leaderUid];
|
|
_result
|
|
}],
|
|
["acknowledgeTask", compileFinal {
|
|
params [["_requesterUid", "", [""]], ["_taskID", "", [""]]];
|
|
|
|
private _result = createHashMapFromArray [
|
|
["success", false],
|
|
["message", "Unable to acknowledge task."],
|
|
["assignment", createHashMap]
|
|
];
|
|
|
|
private _assignmentRegistry = _self getOrDefault ["assignmentRegistry", createHashMap];
|
|
private _assignment = +(_assignmentRegistry getOrDefault [_taskID, createHashMap]);
|
|
if (_assignment isEqualTo createHashMap) exitWith {
|
|
_result set ["message", "Task is not assigned."];
|
|
_result
|
|
};
|
|
|
|
private _groupID = _assignment getOrDefault ["groupId", ""];
|
|
private _groupRepository = _self getOrDefault ["groupRepository", createHashMap];
|
|
if !(_groupRepository call ["isGroupLeader", [_requesterUid, _groupID]]) exitWith {
|
|
_result set ["message", "Only the assigned group leader can acknowledge this task."];
|
|
_result
|
|
};
|
|
|
|
private _bindResult = EGVAR(task,TaskStore) call ["bindTaskOwnership", [_taskID, _requesterUid]];
|
|
if !(_bindResult getOrDefault ["success", false]) exitWith {
|
|
_result set ["message", _bindResult getOrDefault ["message", "Failed to bind task ownership."]];
|
|
_result
|
|
};
|
|
|
|
_assignment set ["state", "acknowledged"];
|
|
_assignment set ["acknowledgedAt", serverTime];
|
|
_assignmentRegistry set [_taskID, _assignment];
|
|
_self set ["assignmentRegistry", _assignmentRegistry];
|
|
|
|
private _activityRepository = _self getOrDefault ["activityRepository", createHashMap];
|
|
_activityRepository call ["appendActivity", [
|
|
"task_acknowledged",
|
|
format ["%1 acknowledged %2.", _requesterUid, _taskID],
|
|
_taskID,
|
|
_groupID,
|
|
_requesterUid
|
|
]];
|
|
|
|
_result set ["success", true];
|
|
_result set ["message", "Task acknowledged."];
|
|
_result set ["assignment", _assignment];
|
|
_result
|
|
}],
|
|
["declineTask", compileFinal {
|
|
params [["_requesterUid", "", [""]], ["_taskID", "", [""]]];
|
|
|
|
private _result = createHashMapFromArray [
|
|
["success", false],
|
|
["message", "Unable to decline task."],
|
|
["assignment", createHashMap]
|
|
];
|
|
|
|
private _assignmentRegistry = _self getOrDefault ["assignmentRegistry", createHashMap];
|
|
private _assignment = +(_assignmentRegistry getOrDefault [_taskID, createHashMap]);
|
|
if (_assignment isEqualTo createHashMap) exitWith {
|
|
_result set ["message", "Task is not assigned."];
|
|
_result
|
|
};
|
|
|
|
private _groupID = _assignment getOrDefault ["groupId", ""];
|
|
private _groupRepository = _self getOrDefault ["groupRepository", createHashMap];
|
|
if !(_groupRepository call ["isGroupLeader", [_requesterUid, _groupID]]) exitWith {
|
|
_result set ["message", "Only the assigned group leader can decline this task."];
|
|
_result
|
|
};
|
|
|
|
_assignment set ["state", "declined"];
|
|
_assignment set ["declinedAt", serverTime];
|
|
EGVAR(task,TaskStore) call ["releaseTaskOwnership", [_taskID]];
|
|
_assignmentRegistry deleteAt _taskID;
|
|
_self set ["assignmentRegistry", _assignmentRegistry];
|
|
|
|
private _activityRepository = _self getOrDefault ["activityRepository", createHashMap];
|
|
_activityRepository call ["appendActivity", [
|
|
"task_declined",
|
|
format ["%1 declined %2.", _requesterUid, _taskID],
|
|
_taskID,
|
|
_groupID,
|
|
_requesterUid
|
|
]];
|
|
|
|
_result set ["success", true];
|
|
_result set ["message", "Task declined and returned to the contract board."];
|
|
_result set ["assignment", _assignment];
|
|
_result
|
|
}]
|
|
];
|
|
|
|
createHashMapObject [GVAR(AssignmentRepositoryBaseClass)]
|