Server Modules

Organization Usage Guide

The organization module stores organization records, members, assets, fleet entries, and credit lines. Durable commands manage persisted records directly. Hot-state commands support the active organization UI workflows.

Organization Usage Guide

The organization module stores organization records, members, assets, fleet entries, and credit lines. Durable commands manage persisted records directly. Hot-state commands support the active organization UI workflows.

Storage Model

Core organization:

{
  "id": "default",
  "owner": "server",
  "name": "Default Organization",
  "funds": 0.0,
  "reputation": 0,
  "credit_lines": {}
}

Hot organization:

{
  "id": "default",
  "owner": "server",
  "name": "Default Organization",
  "funds": 0.0,
  "reputation": 0,
  "credit_lines": {},
  "assets": {},
  "fleet": {},
  "members": {},
  "pending_invites": {}
}

Rules validated by the Rust service:

  • id must be non-empty and contain only alphanumeric characters or _.
  • owner must be server or a 17-digit Steam UID.
  • name cannot be empty, cannot exceed 100 characters, and cannot contain control characters.
  • funds, reputation, and credit line amounts cannot be negative.
  • Player registration is rejected when the player already belongs to a non-default organization.

Durable Commands

CommandArgumentsReturns
org:createorg_id, org_jsonOrganization JSON.
org:getorg_idOrganization JSON.
org:updateorg_id, patch_jsonUpdated organization JSON.
org:existsorg_idtrue or false.
org:deleteorg_idOK.
org:assets:getorg_idAsset map JSON.
org:assets:updateorg_id, assets_jsonUpdated asset map JSON.
org:fleet:getorg_idFleet map JSON.
org:fleet:updateorg_id, fleet_jsonUpdated fleet map JSON.
org:members:getorg_idMember array JSON.
org:members:addorg_id, member_uidOK.
org:members:removeorg_id, member_uidOK.

Create an Organization

The command key is authoritative for id.

private _org = createHashMapFromArray [
    ["id", _orgId],
    ["owner", getPlayerUID player],
    ["name", "Spearnet Logistics"],
    ["funds", 0],
    ["reputation", 0],
    ["credit_lines", createHashMap]
];

private _result = "forge_server" callExtension ["org:create", [
    _orgId,
    toJSON _org
]];

Update Organization Funds

private _patch = createHashMapFromArray [
    ["funds", 5000],
    ["reputation", 10]
];

private _result = "forge_server" callExtension ["org:update", [
    _orgId,
    toJSON _patch
]];

Supported durable patch fields are id, owner, name, funds, reputation, and credit_lines.

Assets and Fleet

Assets are grouped by category, then classname.

private _assets = createHashMapFromArray [
    ["ammo", createHashMapFromArray [
        ["ACE_30Rnd_65x39_caseless_mag", createHashMapFromArray [
            ["classname", "ACE_30Rnd_65x39_caseless_mag"],
            ["type", "ammo"],
            ["quantity", 20]
        ]]
    ]]
];

"forge_server" callExtension ["org:assets:update", [_orgId, toJSON _assets]];

Fleet is keyed by an internal fleet entry ID.

private _fleet = createHashMapFromArray [
    ["B_Truck_01_transport_F_0", createHashMapFromArray [
        ["classname", "B_Truck_01_transport_F"],
        ["name", "Transport Truck"],
        ["type", "cars"],
        ["status", "Ready"],
        ["damage", "0%"]
    ]]
];

"forge_server" callExtension ["org:fleet:update", [_orgId, toJSON _fleet]];

Hot-State Commands

CommandArgumentsReturns
org:hot:initorg_idHot organization JSON.
org:hot:getorg_idHot organization JSON.
org:hot:overrideorg_id, hot_org_jsonHot organization JSON.
org:hot:ensure_membercontext_jsonHot organization JSON.
org:hot:member_invitesmember_uidInvite array JSON.
org:hot:registercontext_jsonRegister result JSON.
org:hot:invite_membercontext_jsonInvite result JSON.
org:hot:accept_invitecontext_jsonInvite decision result JSON.
org:hot:decline_invitecontext_jsonInvite decision result JSON.
org:hot:assign_credit_linecontext_jsonMutation result JSON.
org:hot:repay_credit_linecontext_jsonRepayment result JSON.
org:hot:charge_checkoutcontext_jsonMutation result JSON.
org:hot:add_assetscontext_json, assets_jsonMutation result JSON.
org:hot:add_fleetcontext_json, fleet_jsonMutation result JSON.
org:hot:leavecontext_jsonLeave result JSON.
org:hot:disbandcontext_jsonDisband result JSON.
org:hot:saveorg_idCurrent hot organization JSON and async durable save.
org:hot:removeorg_idOK.

Register from UI Context

private _context = createHashMapFromArray [
    ["requesterUid", getPlayerUID player],
    ["requesterName", name player],
    ["orgId", _orgId],
    ["orgName", "Spearnet Logistics"],
    ["existingOrgId", "default"]
];

private _result = "forge_server" callExtension ["org:hot:register", [toJSON _context]];

Invite and Accept

private _invite = createHashMapFromArray [
    ["requesterUid", getPlayerUID player],
    ["requesterName", name player],
    ["orgId", _orgId],
    ["requesterIsDefaultOrgCeo", false],
    ["targetUid", _targetUid],
    ["targetName", _targetName],
    ["targetOrgId", "default"]
];

"forge_server" callExtension ["org:hot:invite_member", [toJSON _invite]];

private _decision = createHashMapFromArray [
    ["requesterUid", _targetUid],
    ["requesterName", _targetName],
    ["orgId", _orgId],
    ["existingOrgId", "default"]
];

"forge_server" callExtension ["org:hot:accept_invite", [toJSON _decision]];

Credit Line Checkout

private _credit = createHashMapFromArray [
    ["requesterUid", getPlayerUID player],
    ["orgId", _orgId],
    ["requesterIsDefaultOrgCeo", false],
    ["memberUid", _memberUid],
    ["memberName", _memberName],
    ["amount", 1000]
];

"forge_server" callExtension ["org:hot:assign_credit_line", [toJSON _credit]];

private _charge = createHashMapFromArray [
    ["requesterUid", _memberUid],
    ["orgId", _orgId],
    ["requesterIsDefaultOrgCeo", false],
    ["source", "credit_line"],
    ["amount", 250],
    ["commit", true]
];

"forge_server" callExtension ["org:hot:charge_checkout", [toJSON _charge]];

Error Handling

private _payload = _result select 0;
if (_payload find "Error:" == 0) exitWith {
    systemChat format ["Organization error: %1", _payload];
};
Copyright © 2026