9 Commits

19 changed files with 216 additions and 120 deletions

View File

@@ -18,8 +18,8 @@ class CfgFunctions {
}; };
}; };
class RangerMetrics_event { class RangerMetrics_event {
class functions { class server {
file = "\RangerMetrics\functions\capture\EHOnly"; file = "\RangerMetrics\functions\capture\serverEH";
class ace_unconscious {}; class ace_unconscious {};
class EntityKilled {}; class EntityKilled {};
class Explosion {}; class Explosion {};
@@ -30,13 +30,16 @@ class CfgFunctions {
class MarkerUpdated {}; class MarkerUpdated {};
class milsim_serverEfficiency {}; class milsim_serverEfficiency {};
}; };
class client {
file = "\RangerMetrics\functions\capture\clientEH";
};
}; };
class RangerMetrics_cDefinitions { class RangerMetrics_cDefinitions {
class functions { class functions {
file = "\RangerMetrics\functions\captureDefinitions"; file = "\RangerMetrics\functions\captureDefinitions";
class server_poll {}; class server_poll {};
class server_missionEH {}; class server_missionEH {};
class client_poll {}; class client_EH {postInit = 1;};
// class clientEvent {}; // class clientEvent {};
class server_CBA {}; class server_CBA {};
class unit_handlers {}; class unit_handlers {};

View File

@@ -76,7 +76,19 @@ switch (_function) do {
} forEach RangerMetrics_allServerPoll; } forEach RangerMetrics_allServerPoll;
}; };
call RangerMetrics_fnc_initCapture; if (!isNil "RangerMetrics_sendHandler") then {
[RangerMetrics_sendHandler] call CBA_fnc_removePerFrameHandler;
missionNamespace setVariable ["RangerMetrics_sendHandler", nil];
};
if (
missionNamespace getVariable [
"RangerMetrics_run",
false
]
) then {
call RangerMetrics_fnc_initCapture;
};
}; };
default { default {
_response call RangerMetrics_fnc_log; _response call RangerMetrics_fnc_log;

View File

@@ -112,4 +112,22 @@ private _allPlayers = call BIS_fnc_listPlayers;
] call RangerMetrics_fnc_queue; ] call RangerMetrics_fnc_queue;
}; };
} forEach [east, west, independent, civilian]; } forEach [east, west, independent, civilian];
if (isServer) then {
[
_settings get "bucket",
"player_count",
nil,
[
["int", "players_connected", {
private _info = getUserInfo (getPlayerId _x);
if (!isNil "_info" && {count _info >= 6}) then {
_info select 7
} else {false}
} count _allPlayers]
]
] call RangerMetrics_fnc_queue;
};

View File

@@ -16,7 +16,13 @@ private _settings = RangerMetrics_recordingSettings get "runningMission";
getMissionConfigValue ["onLoadName", ""] getMissionConfigValue ["onLoadName", ""]
], ],
["string","author", getMissionConfigValue ["author", ""]], ["string","author", getMissionConfigValue ["author", ""]],
["string","server_name",serverName] ["string","server_name",serverName],
["int", "playable_slots_west", playableSlotsNumber west],
["int", "playable_slots_east", playableSlotsNumber east],
["int", "playable_slots_guer", playableSlotsNumber independent],
["int", "playable_slots_civ", playableSlotsNumber civilian],
["int", "playable_slots_logic", playableSlotsNumber sideLogic]
], ],
["profile", "server", "world"] // context ["profile", "server", "world"] // context
] call RangerMetrics_fnc_queue; ] call RangerMetrics_fnc_queue;

View File

@@ -0,0 +1,37 @@
if (!isServer) exitWith {};
// remoteExec to all machines with JIP -- will trigger when local
{
if (!hasInterface) exitWith {};
RangerMetrics_event_fnc_broadcastAceDamageSource = {
params ["_unit"];
private _aceLastDamage = _unit getVariable "ace_medical_lastDamageSource";
if (!isNil "_aceLastDamage") then {
_unit setVariable ["ace_medical_lastDamageSource", _aceLastDamage, 2];
};
};
player addEventHandler ["Killed", {
params ["_unit", "_killer", "_instigator", "_useEffects"];
[_unit] call RangerMetrics_event_fnc_broadcastAceDamageSource;
}];
player addEventHandler ["Respawn", {
params ["_unit", "_corpse"];
_unit addEventHandler ["Killed", {
params ["_unit", "_killer", "_instigator", "_useEffects"];
[_unit] call RangerMetrics_event_fnc_broadcastAceDamageSource;
}];
}];
addMissionEventHandler ["HandleChatMessage", {
params ["_channel", "_owner", "_from", "_text", "_person", "_name", "_strID", "_forcedDisplay", "_isPlayerMessage", "_sentenceType", "_chatMessageType"];
if !(missionNamespace getVariable ["RangerMetrics_run", false]) exitWith {};
if (_owner == clientOwner && parseNumber _strID > 1) then {
_this remoteExecCall ["RangerMetrics_event_fnc_HandleChatMessage", 2];
};
false;
}];
} remoteExec ["call", 0, true];

View File

@@ -1,11 +0,0 @@
[
// [
// 5, // Poll interval in seconds
// [ // Array of things to poll on clients
// [
// "RangerMetrics_poll_loadout", // Name of localNamespace variable to save the handler as on clients
// RangerMetrics_capture_fnc_player_loadout // Function to call
// ]
// ]
// ]
]

View File

@@ -2,11 +2,14 @@
["OnUserConnected", { ["OnUserConnected", {
params ["_networkId", "_clientStateNumber", "_clientState"]; params ["_networkId", "_clientStateNumber", "_clientState"];
private _userInfo = (getUserInfo _networkId); private _userInfo = (getUserInfo _networkId);
_userInfo call RangerMetrics_capture_fnc_player_identity; private _tags = [];
_userInfo call RangerMetrics_capture_fnc_player_status; if (!isNil "_userInfo") then {
["server_events", "OnUserConnected", [ _tags pushBack ["string", "playerUID", _userInfo#2];
["string", "playerUID", _userInfo#2] _userInfo call RangerMetrics_capture_fnc_player_identity;
], [ _userInfo call RangerMetrics_capture_fnc_player_status;
};
["server_events", "OnUserConnected",
_tags, [
["string", "networkId", _networkId], ["string", "networkId", _networkId],
["int", "clientStateNumber", _clientStateNumber], ["int", "clientStateNumber", _clientStateNumber],
["string", "clientState", _clientState] ["string", "clientState", _clientState]
@@ -16,11 +19,14 @@
["OnUserDisconnected", { ["OnUserDisconnected", {
params ["_networkId", "_clientStateNumber", "_clientState"]; params ["_networkId", "_clientStateNumber", "_clientState"];
private _userInfo = (getUserInfo _networkId); private _userInfo = (getUserInfo _networkId);
_userInfo call RangerMetrics_capture_fnc_player_identity; private _tags = [];
_userInfo call RangerMetrics_capture_fnc_player_status; if (!isNil "_userInfo") then {
["server_events", "OnUserDisconnected", [ _tags pushBack ["string", "playerUID", _userInfo#2];
["string", "playerUID", _userInfo#2] _userInfo call RangerMetrics_capture_fnc_player_identity;
], [ _userInfo call RangerMetrics_capture_fnc_player_status;
};
["server_events", "OnUserDisconnected",
_tags, [
["string", "networkId", _networkId], ["string", "networkId", _networkId],
["int", "clientStateNumber", _clientStateNumber], ["int", "clientStateNumber", _clientStateNumber],
["string", "clientState", _clientState] ["string", "clientState", _clientState]
@@ -45,22 +51,22 @@
]] call RangerMetrics_fnc_queue; ]] call RangerMetrics_fnc_queue;
[format ["(EventHandler) PlayerConnected fired: %1", _this], "DEBUG"] call RangerMetrics_fnc_log; [format ["(EventHandler) PlayerConnected fired: %1", _this], "DEBUG"] call RangerMetrics_fnc_log;
}], }],
["PlayerDisconnected", { ["HandleDisconnect", {
params ["_id", "_uid", "_name", "_jip", "_owner", "_idstr"]; params ["_unit", "_id", "_uid", "_name"];
private _userInfo = (getUserInfo _idstr); private _userInfo = (getUserInfo (_id toFixed 0));
_userInfo call RangerMetrics_capture_fnc_player_identity; if (!isNil "_userInfo") then {
_userInfo call RangerMetrics_capture_fnc_player_status; _userInfo call RangerMetrics_capture_fnc_player_identity;
["server_events", "PlayerDisconnected", [ _userInfo call RangerMetrics_capture_fnc_player_status;
};
["server_events", "HandleDisconnect", [
["string", "playerUID", _uid] ["string", "playerUID", _uid]
], [ ], [
["string", "id", _id toFixed 0], ["string", "id", _id toFixed 0],
["string", "uid", _uid], ["string", "uid", _uid],
["string", "name", _name], ["string", "name", _name]
["bool", "jip", _jip],
["int", "owner", _owner],
["string", "idstr", _idstr]
]] call RangerMetrics_fnc_queue; ]] call RangerMetrics_fnc_queue;
[format ["(EventHandler) PlayerDisconnected fired: %1", _this], "DEBUG"] call RangerMetrics_fnc_log; [format ["(EventHandler) HandleDisconnect fired: %1", _this], "DEBUG"] call RangerMetrics_fnc_log;
false;
}], }],
["OnUserClientStateChanged", { ["OnUserClientStateChanged", {
params ["_networkId", "_clientStateNumber", "_clientState"]; params ["_networkId", "_clientStateNumber", "_clientState"];
@@ -78,6 +84,7 @@
["OnUserAdminStateChanged", { ["OnUserAdminStateChanged", {
params ["_networkId", "_loggedIn", "_votedIn"]; params ["_networkId", "_loggedIn", "_votedIn"];
private _userInfo = (getUserInfo _networkId); private _userInfo = (getUserInfo _networkId);
if (isNil "_userInfo") exitWith {};
_userInfo call RangerMetrics_capture_fnc_player_status; _userInfo call RangerMetrics_capture_fnc_player_status;
["server_events", "OnUserAdminStateChanged", [ ["server_events", "OnUserAdminStateChanged", [
["string", "playerUID", _userInfo#2] ["string", "playerUID", _userInfo#2]
@@ -91,6 +98,7 @@
["OnUserKicked", { ["OnUserKicked", {
params ["_networkId", "_kickTypeNumber", "_kickType", "_kickReason", "_kickMessageIncReason"]; params ["_networkId", "_kickTypeNumber", "_kickType", "_kickReason", "_kickMessageIncReason"];
private _userInfo = (getUserInfo _networkId); private _userInfo = (getUserInfo _networkId);
if (isNil "_userInfo") exitWith {};
_userInfo call RangerMetrics_capture_fnc_player_identity; _userInfo call RangerMetrics_capture_fnc_player_identity;
_userInfo call RangerMetrics_capture_fnc_player_status; _userInfo call RangerMetrics_capture_fnc_player_status;
["server_events", "OnUserKicked", [ ["server_events", "OnUserKicked", [

View File

@@ -79,8 +79,6 @@
RangerMetrics_allMEH = allVariables missionNamespace select { RangerMetrics_allMEH = allVariables missionNamespace select {
_x find (toLower "RangerMetrics_MEH_") == 0 _x find (toLower "RangerMetrics_MEH_") == 0
}; };
@@ -102,8 +100,14 @@ missionNamespace setVariable ["RangerMetrics_run", true, true];
// start sending // start sending
[{ RangerMetrics_sendHandler = [{
params ["_args", "_idPFH"]; params ["_args", "_idPFH"];
if !(
missionNamespace getVariable [
"RangerMetrics_run",
false
]
) exitWith {};
if (scriptDone RangerMetrics_sendBatchHandle) then { if (scriptDone RangerMetrics_sendBatchHandle) then {
RangerMetrics_sendBatchHandle = [] spawn RangerMetrics_fnc_send; RangerMetrics_sendBatchHandle = [] spawn RangerMetrics_fnc_send;
}; };

View File

@@ -6,9 +6,9 @@ if (!isServer && hasInterface) exitWith {};
RangerMetrics_cbaPresent = isClass(configFile >> "CfgPatches" >> "cba_main"); RangerMetrics_cbaPresent = isClass(configFile >> "CfgPatches" >> "cba_main");
RangerMetrics_aceMedicalPresent = isClass(configFile >> "CfgPatches" >> "ace_medical_status"); RangerMetrics_aceMedicalPresent = isClass(configFile >> "CfgPatches" >> "ace_medical_status");
RangerMetrics_logPrefix = "RangerMetrics"; RangerMetrics_logPrefix = "RangerMetrics";
RangerMetrics_debug = true; RangerMetrics_debug = false;
RangerMetrics_initialized = false; RangerMetrics_initialized = false;
RangerMetrics_run = false; RangerMetrics_run = true;
RangerMetrics_nextID = 0; RangerMetrics_nextID = 0;
RangerMetrics_messageQueue = createHashMap; RangerMetrics_messageQueue = createHashMap;
// for debug, view messages in queue // for debug, view messages in queue

View File

@@ -16,86 +16,105 @@
"debug": false "debug": false
}, },
"recordingSettings": { "recordingSettings": {
"serverPolls": [ "serverPerformance": {
{ "name": "serverPerformance",
"name": "serverPerformance", "enabled": true,
"enabled": true, "serverOnly": false,
"serverOnly": false, "intervalMs": 1000,
"intervalMs": 1000, "bucket": "server_performance",
"bucket": "server_performance", "measurement": "fps",
"measurement": "fps", "description": "SERVER/HC POLL. Tracks average and minimum FPS. Polled on server (and HC) at specified interval."
"description": "SERVER/HC POLL. Tracks average and minimum FPS. Polled on server (and HC) at specified interval." },
}, "runningScripts": {
{ "name": "runningScripts",
"name": "runningScripts", "enabled": true,
"enabled": true, "serverOnly": false,
"serverOnly": false, "intervalMs": 1000,
"intervalMs": 1000, "bucket": "server_performance",
"bucket": "server_performance", "measurement": "running_scripts",
"measurement": "running_scripts", "description": "SERVER/HC POLL. Tracks the number of scripts running on the server (and HC). Polled on specified interval."
"description": "SERVER/HC POLL. Tracks the number of scripts running on the server (and HC). Polled on specified interval." },
}, "entityCount": {
{ "name": "entityCount",
"name": "entityCount", "enabled": true,
"enabled": true, "serverOnly": false,
"serverOnly": false, "intervalMs": 8000,
"intervalMs": 20000, "bucket": "server_performance",
"bucket": "server_performance", "measurement": "n/a",
"measurement": "n/a", "description": "SERVER/HC POLL. Tracks the number of entities on the server. Polled on server (and HC) at specified interval as well as on EntityCreated/EntityRespawned/EntityKilled events. Measurement is static, [entities_local, entities_remote, entities_global]."
"description": "SERVER/HC POLL. Tracks the number of entities on the server. Polled on server (and HC) at specified interval as well as on EntityCreated/EntityRespawned/EntityKilled events. Measurement is static, [entities_local, entities_remote, entities_global]." },
}, "playerPerformance": {
{ "name": "playerPerformance",
"name": "playerPerformance", "enabled": true,
"enabled": true, "serverOnly": true,
"serverOnly": true, "intervalMs": 3000,
"intervalMs": 1000, "bucket": "player_performance",
"bucket": "player_performance", "measurement": "network",
"measurement": "network", "description": "SERVER POLL. User network performance. Tracks average ping, average bandwidth, and desync. Polled by the server at specified interval. Not tracked from headless client."
"description": "SERVER POLL. User network performance. Tracks average ping, average bandwidth, and desync. Polled by the server at specified interval. Not tracked from headless client." },
}, "serverTime": {
{ "name": "serverTime",
"name": "serverTime", "enabled": true,
"enabled": true, "serverOnly": true,
"serverOnly": true, "intervalMs": 10000,
"intervalMs": 10000, "bucket": "mission_data",
"bucket": "mission_data", "measurement": "server_time",
"measurement": "server_time", "description": "SERVER POLL. Tracks the server time. Always server-only. Runs at specified interval."
"description": "SERVER POLL. Tracks the server time. Always server-only. Runs at specified interval." },
}, "weather": {
{ "name": "weather",
"name": "weather", "enabled": true,
"enabled": true, "serverOnly": true,
"serverOnly": true, "intervalMs": 300000,
"intervalMs": 120000, "bucket": "mission_data",
"bucket": "mission_data", "measurement": "weather",
"measurement": "weather", "description": "SERVER POLL. Tracks the weather on the server. Always server-only. Runs at specified interval."
"description": "SERVER POLL. Tracks the weather on the server. Always server-only. Runs at specified interval." },
}, "viewDistance": {
{ "name": "viewDistance",
"name": "viewDistance", "enabled": true,
"enabled": true, "serverOnly": true,
"serverOnly": true, "intervalMs": 300000,
"intervalMs": 120000, "bucket": "mission_data",
"bucket": "mission_data", "measurement": "view_distance",
"measurement": "view_distance", "description": "SERVER POSTINIT, MPEnded. Tracks the view distance on the server. Always server-only. Runs at specified interval."
"description": "SERVER POSTINIT, MPEnded. Tracks the view distance on the server. Always server-only. Runs at specified interval." },
}, "runningMission": {
{ "name": "runningMission",
"name": "runningMission", "enabled": true,
"enabled": true, "serverOnly": true,
"serverOnly": true, "intervalMs": 0,
"intervalMs": 0, "bucket": "mission_data",
"bucket": "mission_data", "measurement": "running_mission",
"measurement": "running_mission", "description": "SERVER POSTINIT, MPEnded. Tracks the name of the mission running on the server. Always server-only. Runs at the start (and tries at end) of the mission."
"description": "SERVER POSTINIT, MPEnded. Tracks the name of the mission running on the server. Always server-only. Runs at the start (and tries at end) of the mission." },
} "playerStatus": {
], "name": "playerStatus",
"CBAEventHandlers": [ "enabled": true,
{ "serverOnly": true,
"intervalMs": 0,
"bucket": "player_data",
"measurement": "client_state",
"description": "EH. Tracks players' clientstateNumber, adminState, and profileName on connect/disconnect to server and to mission, as well as when these values change."
},
"playerIdentity": {
"name": "playerIdentity",
"enabled": true,
"serverOnly": true,
"intervalMs": 0,
"bucket": "player_data",
"measurement": "player_identity",
"description": "EH. Tracks players' identity on connect/disconnect to server and to mission, as well as when these values change."
},
"CBAEventHandlers": {
"milsimServerEfficiency": {
"name": "milsimServerEfficiency", "name": "milsimServerEfficiency",
"enabled": true, "enabled": true,
"serverOnly": true,
"bucket": "server_performance",
"measurement": "milsim_server_efficiency",
"description": "EVENTHANDLER. Tracks the efficiency of the server." "description": "EVENTHANDLER. Tracks the efficiency of the server."
} }
] }
} }
} }