184 lines
6.8 KiB
Plaintext
184 lines
6.8 KiB
Plaintext
// ICOM (Internal Communication) Usage Example
|
|
// Complete guide for using ICOM to communicate between Arma 3 servers
|
|
|
|
// ============================================================================
|
|
// STEP 1: Define the event handler (in init.sqf or mission init)
|
|
// ============================================================================
|
|
forge_icom_event = {
|
|
params ["_eventName", "_data"];
|
|
|
|
systemChat format ["📡 ICOM Event: %1", _eventName];
|
|
diag_log format ["[ICOM] Event received: %1 | Data: %2", _eventName, _data];
|
|
|
|
// Handle specific events
|
|
switch (_eventName) do {
|
|
case "supply_drop": {
|
|
systemChat "📦 Supply drop incoming!";
|
|
|
|
if (_data isEqualType createHashMap) then {
|
|
private _coords = _data getOrDefault ["coords", []];
|
|
private _supplies = _data getOrDefault ["supplies", []];
|
|
|
|
// Spawn supply crate at coordinates
|
|
if (count _coords >= 2) then {
|
|
private _pos = [_coords select 0, _coords select 1, 0];
|
|
private _crate = createVehicle ["Box_NATO_Ammo_F", _pos, [], 0, "NONE"];
|
|
|
|
systemChat format ["Supply crate spawned at %1", _pos];
|
|
diag_log format ["[ICOM] Supply drop: %1 supplies at %2", _supplies, _pos];
|
|
};
|
|
};
|
|
};
|
|
|
|
case "spawn_mission": {
|
|
systemChat "🎯 New mission spawning!";
|
|
|
|
if (_data isEqualType createHashMap) then {
|
|
private _missionType = _data getOrDefault ["mission_type", ""];
|
|
private _location = _data getOrDefault ["location", []];
|
|
private _difficulty = _data getOrDefault ["difficulty", "normal"];
|
|
|
|
// Trigger mission spawn logic here
|
|
systemChat format ["Mission: %1 (%2) at %3", _missionType, _difficulty, _location];
|
|
};
|
|
};
|
|
|
|
case "global_alert": {
|
|
systemChat "⚠️ GLOBAL ALERT";
|
|
|
|
if (_data isEqualType createHashMap) then {
|
|
private _message = _data getOrDefault ["message", ""];
|
|
private _severity = _data getOrDefault ["severity", "info"];
|
|
|
|
if (_message != "") then {
|
|
systemChat format ["Alert: %1", _message];
|
|
|
|
// Play sound based on severity
|
|
switch (_severity) do {
|
|
case "critical": { playSound "alarm"; };
|
|
case "warning": { playSound "hint"; };
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
case "player_join": {
|
|
if (_data isEqualType createHashMap) then {
|
|
private _playerName = _data getOrDefault ["name", "Unknown"];
|
|
private _serverName = _data getOrDefault ["server", "Unknown"];
|
|
|
|
systemChat format ["Player %1 joined %2", _playerName, _serverName];
|
|
};
|
|
};
|
|
|
|
default {
|
|
diag_log format ["[ICOM] Unhandled event: %1", _eventName];
|
|
};
|
|
};
|
|
};
|
|
|
|
systemChat "✅ ICOM event handler registered";
|
|
diag_log "[ICOM] Event handler initialized";
|
|
|
|
|
|
// ============================================================================
|
|
// STEP 2: Send events to other servers
|
|
// ============================================================================
|
|
|
|
// Example 1: Send supply drop to server_2
|
|
private _supplyData = createHashMapFromArray [
|
|
["coords", [1234, 5678, 0]],
|
|
["supplies", ["ammo_box", "medical_supplies", "repair_kit"]]
|
|
];
|
|
private _result = "forge_server" callExtension ["icom:send_event", ["server_2", "supply_drop", (toJSON _supplyData)]];
|
|
// Returns: ["OK",0,0] on success, ["ERROR: ...",0,0] on failure
|
|
|
|
// Example 2: Spawn mission on server_2
|
|
private _missionData = createHashMapFromArray [
|
|
["mission_type", "convoy_ambush"],
|
|
["difficulty", "hard"],
|
|
["location", [2345, 6789, 0]],
|
|
["reward", 5000]
|
|
];
|
|
"forge_server" callExtension ["icom:send_event", ["server_2", "spawn_mission", (toJSON _missionData)]];
|
|
|
|
// Example 3: Broadcast to all servers
|
|
private _alertData = createHashMapFromArray [
|
|
["message", "Server restart in 5 minutes"],
|
|
["severity", "warning"]
|
|
];
|
|
"forge_server" callExtension ["icom:broadcast", ["global_alert", (toJSON _alertData)]];
|
|
|
|
// Example 4: Notify all servers when a player joins
|
|
private _playerJoinData = createHashMapFromArray [
|
|
["name", name player],
|
|
["uid", getPlayerUID player],
|
|
["server", "server_1"]
|
|
];
|
|
"forge_server" callExtension ["icom:broadcast", ["player_join", (toJSON _playerJoinData)]];
|
|
|
|
|
|
// ============================================================================
|
|
// TIPS AND BEST PRACTICES
|
|
// ============================================================================
|
|
|
|
// 1. Always use toJSON to convert hashmaps to JSON strings
|
|
private _data = createHashMapFromArray [["key", "value"]];
|
|
private _json = toJSON _data;
|
|
|
|
// 2. Check for errors
|
|
private _result = "forge_server" callExtension ["icom:send_event", ["server_2", "test", _json]];
|
|
if ((_result select 0) find "ERROR" != -1) then {
|
|
systemChat "Failed to send event!";
|
|
diag_log format ["[ICOM] Error: %1", _result select 0];
|
|
};
|
|
|
|
// 3. Handle missing data gracefully in the event handler
|
|
// Use getOrDefault instead of direct hash access
|
|
|
|
// 4. Log everything for debugging
|
|
// All ICOM events are logged to @forge_server/logs/icom.log
|
|
|
|
// 5. Server IDs must match what's configured in the extension
|
|
// Default is "server_1", configure others as needed
|
|
|
|
|
|
// ============================================================================
|
|
// COMMON EVENT PATTERNS
|
|
// ============================================================================
|
|
|
|
// Pattern 1: Request-Response
|
|
// Server 1 requests something from Server 2
|
|
private _requestData = createHashMapFromArray [
|
|
["request_id", str (random 10000)],
|
|
["request_type", "player_data"],
|
|
["player_uid", getPlayerUID player]
|
|
];
|
|
"forge_server" callExtension ["icom:send_event", ["server_2", "data_request", (toJSON _requestData)]];
|
|
// Server 2 responds with a "data_response" event back to server_1
|
|
|
|
// Pattern 2: Cross-server triggers
|
|
// Trigger an action on all servers simultaneously
|
|
private _triggerData = createHashMapFromArray [
|
|
["trigger_type", "airdrop"],
|
|
["position", [5000, 5000, 0]],
|
|
["timestamp", time]
|
|
];
|
|
"forge_server" callExtension ["icom:broadcast", ["synchronized_trigger", (toJSON _triggerData)]];
|
|
|
|
// Pattern 3: Server status updates
|
|
// Periodically broadcast server status to other servers
|
|
[] spawn {
|
|
while {true} do {
|
|
sleep 60; // Every minute
|
|
|
|
private _statusData = createHashMapFromArray [
|
|
["player_count", count allPlayers],
|
|
["server_fps", diag_fps],
|
|
["mission_time", time]
|
|
];
|
|
|
|
"forge_server" callExtension ["icom:broadcast", ["server_status", (toJSON _statusData)]];
|
|
};
|
|
};
|