further expansion of metrics collection

This commit is contained in:
2023-04-10 02:20:54 -07:00
parent 98f5339fef
commit 12ef61e067
29 changed files with 714 additions and 71 deletions

View File

@@ -10,6 +10,18 @@ class CfgPatches {
}; };
class CfgFunctions { class CfgFunctions {
class RangerMetrics_event {
class functions {
file = "\RangerMetrics\functions\capture\EHOnly";
class ace_unconscious {};
class EntityKilled {};
class FiredMan {};
class HandleChatMessage {};
class MarkerCreated {};
class MarkerDeleted {};
class MarkerUpdated {};
};
}
class RangerMetrics_cDefinitions { class RangerMetrics_cDefinitions {
class functions { class functions {
file = "\RangerMetrics\functions\captureDefinitions"; file = "\RangerMetrics\functions\captureDefinitions";
@@ -17,24 +29,25 @@ class CfgFunctions {
class server_missionEH {}; class server_missionEH {};
class client_poll {}; class client_poll {};
// class clientEvent {}; // class clientEvent {};
class server_CBA {};
}; };
}; };
class RangerMetrics_capture { class RangerMetrics_capture {
// these names represent measurement names send to InfluxDB - snake case // these names represent measurement names send to InfluxDB - snake case
class functions { class functions {
file = "\RangerMetrics\functions\capture"; file = "\RangerMetrics\functions\capture";
class chat_message {}; class entity_count {};
class entities_global {};
class entities_local {};
class mission_config_file {}; class mission_config_file {};
class player_identity {}; class player_identity {};
class player_loadout {};
class player_performance {}; class player_performance {};
class player_status {}; class player_status {};
class running_mission {}; class running_mission {};
class running_scripts {}; class running_scripts {};
class server_performance {}; class server_performance {};
class server_time {}; class server_time {};
class unit_inventory {};
class unit_state {};
class view_distance {};
class weather {}; class weather {};
}; };
}; };
@@ -49,11 +62,8 @@ class CfgFunctions {
class callbackHandler {}; class callbackHandler {};
class sendClientPoll {}; class sendClientPoll {};
class startServerPoll {}; class startServerPoll {};
}; class classHandlers {};
class initUnit {};
class eventHandlers {
file = "\RangerMetrics\functions\eventHandlers";
class addHandlers {};
}; };
class helpers { class helpers {
file = "\RangerMetrics\functions\helpers"; file = "\RangerMetrics\functions\helpers";

View File

@@ -0,0 +1,41 @@
if (!RangerMetrics_run) exitWith {};
params ["_killed", "_killer", "_instigator"];
// check in case ACE is active and lastDamageSource has been broadcast via addLocalSoldierEH
_instigator = _unit getVariable [
"ace_medical_lastDamageSource",
_instigator
];
if (isNull _instigator) then { _instigator = UAVControl vehicle _killer select 0 }; // UAV/UGV player operated road kill
if (isNull _instigator) then { _instigator = _killer }; // player driven vehicle road kill
if (isNull _instigator) then { _instigator = _killed };
// hint format ["Killed By %1", name _instigator];
private _tags = [];
private _fields = [];
if (getPlayerUID _instigator != "") then {
_tags pushBack ["string", "killerPlayerUID", getPlayerUID _instigator];
};
if (name _instigator != "") then {
_fields pushBack ["string", "killerName", name _instigator];
};
if (getPlayerUID _killed != "") then {
_tags pushBack ["string", "killedPlayerUID", getPlayerUID _killed];
};
if (name _killed != "") then {
_fields pushBack ["string", "killedName", name _killed];
};
[
"server_events",
"EntityKilled",
_tags,
_fields,
nil
] call RangerMetrics_fnc_queue;

View File

@@ -0,0 +1,21 @@
params ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle"];
private _unitPlayerId = getPlayerId _unit;
private _userInfo = getUserInfo _unitPlayerId;
[
"player_events",
"FiredMan",
[
["string", "playerUID", _userInfo select 2]
],
[
["string", "weapon", _weapon],
["string", "muzzle", _muzzle],
["string", "mode", _mode],
["string", "ammo", _ammo],
["string", "magazine", _magazine],
// ["object", "projectile", _projectile],
["string", "vehicle", [configOf _vehicle] call displayName],
["string", "vehicleClass", typeOf _vehicle]
]
] call RangerMetrics_fnc_queue;

View File

@@ -0,0 +1,40 @@
if (!RangerMetrics_run) exitWith {};
params ["_channel", "_owner", "_from", "_text", "_person", "_name", "_strID", "_forcedDisplay", "_isPlayerMessage", "_sentenceType", "_chatMessageType"];
private _fields = [
["int", "channel", _channel],
["int", "owner", _owner],
["string", "from", _from],
["string", "text", _text],
// ["object", "person", _person],
["string", "name", _name],
["string", "strID", _strID],
["bool", "forcedDisplay", _forcedDisplay],
["bool", "isPlayerMessage", _isPlayerMessage],
["int", "sentenceType", _sentenceType],
["int", "chatMessageType", _chatMessageType]
];
// we need special processing to ensure the object is valid and we have a playerUid. Line protocol doesn't support empty string
private "_playerUid";
if (isNil "_person") then {
_playerUid = "";
} else {
if !(objNull isEqualType _person) then {
_playerUid = getPlayerUID _person;
} else {
_playerUid = "";
};
};
if (_playerUid isNotEqualTo "") then {
_fields pushBack ["string", "playerUid", _playerUid];
};
[
"server_events",
"HandleChatMessage",
nil,
_fields
] call RangerMetrics_fnc_queue;

View File

@@ -0,0 +1,30 @@
if (!RangerMetrics_run) exitWith {};
params ["_marker", "_channelNumber", "_owner", "_local"];
// Log marker
if (_marker isEqualTo "") exitWith {};
if (_channelNumber isEqualTo "") exitWith {};
if (_owner isEqualTo "") exitWith {};
// Get marker
private _markerData = _marker call BIS_fnc_markerToString;
// Get owner playerUID
private _ownerUID = getPlayerUID _owner;
if (_ownerUID isEqualTo "") then {
_ownerUID = "-1";
};
[
"server_events",
"MarkerCreated",
[
["string", "actorPlayerUID", _ownerUID]
],
[
["string", "marker", _markerData],
["number", "channelNumber", _channelNumber],
["string", "owner", _ownerUID]
]
] call RangerMetrics_fnc_queue;

View File

@@ -0,0 +1,30 @@
if (!RangerMetrics_run) exitWith {};
params ["_marker", "_channelNumber", "_owner", "_local"];
// Log marker
if (_marker isEqualTo "") exitWith {};
if (_channelNumber isEqualTo "") exitWith {};
if (_owner isEqualTo "") exitWith {};
// Get marker
private _markerData = _marker call BIS_fnc_markerToString;
// Get owner playerUID
private _ownerUID = getPlayerUID _owner;
if (_ownerUID isEqualTo "") then {
_ownerUID = "-1";
};
[
"server_events",
"MarkerDeleted",
[
["string", "actorPlayerUID", _ownerUID]
],
[
["string", "marker", _markerData],
["number", "channelNumber", _channelNumber],
["string", "owner", _ownerUID]
]
] call RangerMetrics_fnc_queue;

View File

@@ -0,0 +1,31 @@
if (!RangerMetrics_run) exitWith {};
params ["_marker", "_channelNumber", "_owner", "_local"];
// Log marker
if (_marker isEqualTo "") exitWith {};
if (_channelNumber isEqualTo "") exitWith {};
if (_owner isEqualTo "") exitWith {};
// Get marker
private _markerData = _marker call BIS_fnc_markerToString;
// Get owner playerUID
private _ownerUID = getPlayerUID _owner;
if (_ownerUID isEqualTo "") then {
_ownerUID = "-1";
};
[
"server_events",
"MarkerUpdated",
[
["string", "actorPlayerUID", _ownerUID]
],
[
["string", "marker", _markerData],
["number", "channelNumber", _channelNumber],
["string", "owner", _ownerUID]
]
] call RangerMetrics_fnc_queue;

View File

@@ -0,0 +1,20 @@
if (!RangerMetrics_run) exitWith {};
params [["_unit", objNull], "_unconscious"];
if (isNull _unit) exitWith {};
// Get owner playerUID
private _unitUID = getPlayerUID _unitUID;
if (_unitUID isEqualTo "") exitWith {};
[
"player_state",
"player_health",
[
["string", "playerUID", _unitUID]
],
[
["int", "health", damage _unit],
["bool", "state", _unconscious]
]
] call RangerMetrics_fnc_queue;

View File

@@ -0,0 +1,25 @@
if (!RangerMetrics_run) exitWith {};
// Number of remote units
["server_state", "entities_remote", nil, [
["int", "units_alive", { not (local _x)} count allUnits ],
["int", "units_dead", { not (local _x) } count allDeadMen],
["int", "groups_total", { not (local _x) } count allGroups],
["int", "vehicles_total", { not (local _x) } count vehicles]
]] call RangerMetrics_fnc_queue;
// Number of local units
["server_state", "entities_local", nil, [
["int", "units_alive", { local _x} count allUnits ],
["int", "units_dead", { local _x } count allDeadMen],
["int", "groups_total", { local _x } count allGroups],
["int", "vehicles_total", { local _x } count vehicles]
]] call RangerMetrics_fnc_queue;
// Number of global units
["server_state", "entities_global", nil, [
["int", "units_alive", count allUnits ],
["int", "units_dead", count allDeadMen],
["int", "groups_total", count allGroups],
["int", "vehicles_total", count vehicles]
]] call RangerMetrics_fnc_queue;

View File

@@ -1,3 +1,5 @@
if (!RangerMetrics_run) exitWith {};
// get basic config properties // get basic config properties
private _properties = [ private _properties = [
["mission_info", [ ["mission_info", [

View File

@@ -1,3 +1,5 @@
if (!RangerMetrics_run) exitWith {};
params ["_playerID", "_ownerId", "_playerUID", "_profileName", "_displayName", "_steamName", "_clientState", "_isHC", "_adminState", "_networkInfo", "_unit", ["_jip", false]]; params ["_playerID", "_ownerId", "_playerUID", "_profileName", "_displayName", "_steamName", "_clientState", "_isHC", "_adminState", "_networkInfo", "_unit", ["_jip", false]];
// _networkInfo params ["_avgPing", "_avgBandwidth", "_desync"]; // _networkInfo params ["_avgPing", "_avgBandwidth", "_desync"];
@@ -12,13 +14,6 @@ private _fields = [
["bool", "isJip", _jip] ["bool", "isJip", _jip]
]; ];
if (!isNil "_unit") then {
private _roleDescription = roleDescription _unit;
if (_roleDescription isNotEqualTo "") then {
_fields pushBack ["string", "roleDescription", _roleDescription];
};
};
[ [
"player_state", "player_state",
"player_identity", "player_identity",

View File

@@ -1,3 +1,5 @@
if (!RangerMetrics_run) exitWith {};
{ {
_x params ["_playerID", "_ownerId", "_playerUID", "_profileName", "_displayName", "_steamName", "_clientState", "_isHC", "_adminState", "_networkInfo", "_unit"]; _x params ["_playerID", "_ownerId", "_playerUID", "_profileName", "_displayName", "_steamName", "_clientState", "_isHC", "_adminState", "_networkInfo", "_unit"];
_networkInfo params ["_avgPing", "_avgBandwidth", "_desync"]; _networkInfo params ["_avgPing", "_avgBandwidth", "_desync"];

View File

@@ -1,10 +1,11 @@
if (!RangerMetrics_run) exitWith {};
params ["_playerID", "_ownerId", "_playerUID", "_profileName", "_displayName", "_steamName", "_clientState", "_isHC", "_adminState", "_networkInfo", "_unit"]; params ["_playerID", "_ownerId", "_playerUID", "_profileName", "_displayName", "_steamName", "_clientState", "_isHC", "_adminState", "_networkInfo", "_unit"];
// _networkInfo params ["_avgPing", "_avgBandwidth", "_desync"]; // _networkInfo params ["_avgPing", "_avgBandwidth", "_desync"];
["player_state", "player_status", ["player_state", "player_status",
[["string", "playerUID", _playerUID]], [["string", "playerUID", _playerUID]],
[ [
["int", "clientStateNumber", _clientState], ["int", "clientStateNumber", _clientState],
["int", "adminState", _adminState] ["int", "adminState", _adminState]
], ],

View File

@@ -1,3 +1,5 @@
if (!RangerMetrics_run) exitWith {};
// Mission name // Mission name
[ [
"server_state", // bucket to store the data "server_state", // bucket to store the data
@@ -12,5 +14,6 @@
["string","briefingName", briefingName], ["string","briefingName", briefingName],
["string","missionName", missionName], ["string","missionName", missionName],
["string","missionNameSource", missionNameSource] ["string","missionNameSource", missionNameSource]
] ],
["profile", "server", "world"] // context
] call RangerMetrics_fnc_queue; ] call RangerMetrics_fnc_queue;

View File

@@ -1,3 +1,5 @@
if (!RangerMetrics_run) exitWith {};
["server_state", "running_scripts", nil, [ ["server_state", "running_scripts", nil, [
["int", "spawn", diag_activeScripts select 0], ["int", "spawn", diag_activeScripts select 0],
["int", "execVM", diag_activeScripts select 1], ["int", "execVM", diag_activeScripts select 1],

View File

@@ -1,3 +1,5 @@
if (!RangerMetrics_run) exitWith {};
["server_state", "server_performance", nil, [ ["server_state", "server_performance", nil, [
["float", "avg", diag_fps toFixed 2], ["float", "avg", diag_fps toFixed 2],
["float", "min", diag_fpsMin toFixed 2] ["float", "min", diag_fpsMin toFixed 2]

View File

@@ -1,3 +1,5 @@
if (!RangerMetrics_run) exitWith {};
["server_state", "server_time", nil, [ ["server_state", "server_time", nil, [
["float", "diag_tickTime", diag_tickTime toFixed 2], ["float", "diag_tickTime", diag_tickTime toFixed 2],
["float", "serverTime", time toFixed 2], ["float", "serverTime", time toFixed 2],

View File

@@ -0,0 +1,48 @@
params [
["_unit", objNull, [objNull]]
];
if (isNull _unit) exitWith {};
private _lastLoadout = _unit getVariable "RangerMetrics_myLoadout";
if (isNil "_lastLoadout") then {
_lastLoadout = [];
};
private _currentLoadout = [
["string", "currentWeapon", currentWeapon _unit],
["string", "uniform", uniform _unit],
["string", "vest", vest _unit],
["string", "backpack", backpack _unit],
["string", "headgear", headgear _unit],
["string", "goggles", goggles _unit],
["string", "hmd", hmd _unit],
["string", "primaryWeapon", primaryWeapon _unit],
["string", "primaryWeaponMagazine", primaryWeaponMagazine _unit],
["string", "secondaryWeapon", secondaryWeapon _unit],
["string", "secondaryWeaponMagazine", secondaryWeaponMagazine _unit],
["string", "handgunWeapon", handgunWeapon _unit],
["string", "handgunMagazine", handgunMagazine _unit]
];
// exit if loadout hasn't changed
if (_lastLoadout isEqualTo _currentLoadout) exitWith {};
// continue if loadout has changed
// store loadout data locally
_unit setVariable ["RangerMetrics_myLoadout", _currentLoadout];
_playerUID = getPlayerUID _unit;
// send loadout data
[
"player_state",
"unit_loadout",
[
["string", "playerUID", _playerUID]
],
_currentLoadout,
["server"]
] call RangerMetrics_fnc_queue;

View File

@@ -0,0 +1,72 @@
if (!RangerMetrics_run) exitWith {};
params ["_unit"];
if (isNull _unit || !(isPlayer _unit)) exitWith {};
// Get owner playerUID
private _unitUID = getPlayerUID _unitUID;
if (_unitUID isEqualTo "") exitWith {};
// Medical info
private _isUnconscious = false;
private _isInCardiacArrest = false;
if (RangerMetrics_aceMedicalPresent) then {
_isUnconscious = _unit getVariable ["ace_medical_isUnconscious", false];
_isInCardiacArrest = _unit getVariable ["ace_medical_isInCardiacArrest", false];
} else {
_isUnconscious = (lifeState _unit) isEqualTo "INCAPACITATED";
};
// Vehicle info
if (!isNull (objectParent _unit)) then {
_crew = fullCrew (objectParent _unit);
_pos = _crew find {(_x select 0) isEqualTo _unit};
_vehicleRole = toLower _crew select _pos select 1;
} else {
_vehicleRole = "";
};
// Declare fields
private _fields = [
["float", "health", 1 - (damage _unit)],
["bool", "is_unconscious", _isUnconscious],
["bool", "is_cardiac_arrest", _isInCardiacArrest],
["bool", "is_captive", captive _unit],
["bool", "in_vehicle", !isNull (objectParent _unit)],
["string", "vehicle_role", _vehicleRole],
["float", "speed_kmh", speed _unit]
];
// Role description
private _roleDescription = roleDescription _unit;
if (_roleDescription isNotEqualTo "") then {
_fields pushBack ["string", "roleDescription", _roleDescription];
};
// Traits
private _playerTraits = getAllUnitTraits player;
{
private _valueType = typeNAME (_x select 1);
switch (_valueType) do {
case "BOOL": {
_fields pushBack ["bool", (_x select 0), (_x select 1)];
};
case "SCALAR": {
_fields pushBack ["float", (_x select 0), (_x select 1)];
};
case "STRING": {
_fields pushBack ["string", (_x select 0), (_x select 1)];
};
};
} forEach _playerTraits;
[
"player_state",
"unit_status",
[
["string", "playerUID", _unitUID]
],
_fields,
["server"]
] call RangerMetrics_fnc_queue;

View File

@@ -0,0 +1,9 @@
[
"server_state",
"view_distance",
nil,
[
["float", "objectViewDistance", getObjectViewDistance # 0],
["float", "viewDistance", viewDistance]
]
] call RangerMetrics_fnc_queue;

View File

@@ -1,3 +1,5 @@
if (!RangerMetrics_run) exitWith {};
[ [
"server_state", // bucket to store the data "server_state", // bucket to store the data
"weather", // measurement classifier inside of bucket "weather", // measurement classifier inside of bucket

View File

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

View File

@@ -0,0 +1,5 @@
[
["ace_unconscious", {
call RangerMetrics_event_fnc_aceUnconscious
}]
]

View File

@@ -1,19 +1,12 @@
[ [
["MPEnded", {
private ["_winner", "_reason"];
_winner = "Unknown";
_reason = "Mission Complete";
["server_events", "MPEnded", nil, [
["string", "winner", _winner],
["string", "reason", _reason]
]] call RangerMetrics_fnc_queue;
call RangerMetrics_capture_fnc_running_mission;
}],
["OnUserConnected", { ["OnUserConnected", {
params ["_networkId", "_clientStateNumber", "_clientState"]; params ["_networkId", "_clientStateNumber", "_clientState"];
(getUserInfo _networkId) call RangerMetrics_capture_fnc_player_identity; private _userInfo = (getUserInfo _networkId);
(getUserInfo _networkId) call RangerMetrics_capture_fnc_player_status; _userInfo call RangerMetrics_capture_fnc_player_identity;
["server_events", "UserConnected", nil, [ _userInfo call RangerMetrics_capture_fnc_player_status;
["server_events", "UserConnected", [
["string", "playerUID", _userInfo#2]
], [
["string", "networkId", _networkId], ["string", "networkId", _networkId],
["int", "clientStateNumber", _clientStateNumber], ["int", "clientStateNumber", _clientStateNumber],
["string", "clientState", _clientState] ["string", "clientState", _clientState]
@@ -21,9 +14,12 @@
}], }],
["OnUserDisconnected", { ["OnUserDisconnected", {
params ["_networkId", "_clientStateNumber", "_clientState"]; params ["_networkId", "_clientStateNumber", "_clientState"];
(getUserInfo _networkId) call RangerMetrics_capture_fnc_player_identity; private _userInfo = (getUserInfo _networkId);
(getUserInfo _networkId) call RangerMetrics_capture_fnc_player_status; _userInfo call RangerMetrics_capture_fnc_player_identity;
["server_events", "OnUserDisconnected", nil, [ _userInfo call RangerMetrics_capture_fnc_player_status;
["server_events", "OnUserDisconnected", [
["string", "playerUID", _userInfo#2]
], [
["string", "networkId", _networkId], ["string", "networkId", _networkId],
["int", "clientStateNumber", _clientStateNumber], ["int", "clientStateNumber", _clientStateNumber],
["string", "clientState", _clientState] ["string", "clientState", _clientState]
@@ -31,9 +27,12 @@
}], }],
["PlayerConnected", { ["PlayerConnected", {
params ["_id", "_uid", "_name", "_jip", "_owner", "_idstr"]; params ["_id", "_uid", "_name", "_jip", "_owner", "_idstr"];
(getUserInfo _idstr) call RangerMetrics_capture_fnc_player_identity; private _userInfo = (getUserInfo _networkId);
(getUserInfo _idstr) call RangerMetrics_capture_fnc_player_status; _userInfo call RangerMetrics_capture_fnc_player_identity;
["server_events", "PlayerConnected", nil, [ _userInfo call RangerMetrics_capture_fnc_player_status;
["server_events", "PlayerConnected", [
["string", "playerUID", _userInfo#2]
], [
["int", "id", _id], ["int", "id", _id],
["string", "uid", _uid], ["string", "uid", _uid],
["string", "name", _name], ["string", "name", _name],
@@ -44,9 +43,12 @@
}], }],
["PlayerDisconnected", { ["PlayerDisconnected", {
params ["_id", "_uid", "_name", "_jip", "_owner", "_idstr"]; params ["_id", "_uid", "_name", "_jip", "_owner", "_idstr"];
(getUserInfo _idstr) call RangerMetrics_capture_fnc_player_identity; private _userInfo = (getUserInfo _networkId);
(getUserInfo _idstr) call RangerMetrics_capture_fnc_player_status; _userInfo call RangerMetrics_capture_fnc_player_identity;
["server_events", "PlayerDisconnected", nil, [ _userInfo call RangerMetrics_capture_fnc_player_status;
["server_events", "PlayerDisconnected", [
["string", "playerUID", _userInfo#2]
], [
["int", "id", _id], ["int", "id", _id],
["string", "uid", _uid], ["string", "uid", _uid],
["string", "name", _name], ["string", "name", _name],
@@ -57,8 +59,11 @@
}], }],
["OnUserClientStateChanged", { ["OnUserClientStateChanged", {
params ["_networkId", "_clientStateNumber", "_clientState"]; params ["_networkId", "_clientStateNumber", "_clientState"];
(getUserInfo _networkId) call RangerMetrics_capture_fnc_player_status; private _userInfo = (getUserInfo _networkId);
["server_events", "OnUserClientStateChanged", nil, [ _userInfo call RangerMetrics_capture_fnc_player_status;
["server_events", "OnUserClientStateChanged", [
["string", "playerUID", _userInfo#2]
], [
["string", "networkId", _networkId], ["string", "networkId", _networkId],
["int", "clientStateNumber", _clientStateNumber], ["int", "clientStateNumber", _clientStateNumber],
["string", "clientState", _clientState] ["string", "clientState", _clientState]
@@ -66,16 +71,86 @@
}], }],
["OnUserAdminStateChanged", { ["OnUserAdminStateChanged", {
params ["_networkId", "_loggedIn", "_votedIn"]; params ["_networkId", "_loggedIn", "_votedIn"];
(getUserInfo _networkId) call RangerMetrics_capture_fnc_player_status; private _userInfo = (getUserInfo _networkId);
["server_events", "OnUserAdminStateChanged", nil, [ _userInfo call RangerMetrics_capture_fnc_player_status;
["server_events", "OnUserAdminStateChanged", [
["string", "playerUID", _userInfo#2]
], [
["string", "networkId", _networkId], ["string", "networkId", _networkId],
["bool", "loggedIn", _loggedIn], ["bool", "loggedIn", _loggedIn],
["bool", "votedIn", _votedIn] ["bool", "votedIn", _votedIn]
]] call RangerMetrics_fnc_queue; ]] call RangerMetrics_fnc_queue;
}], }],
["OnUserKicked", {
params ["_networkId", "_kickTypeNumber", "_kickType", "_kickReason", "_kickMessageIncReason"];
private _userInfo = (getUserInfo _networkId);
_userInfo call RangerMetrics_capture_fnc_player_identity;
_userInfo call RangerMetrics_capture_fnc_player_status;
["server_events", "OnUserKicked", [
["string", "playerUID", _userInfo#2]
], [
["string", "networkId", _networkId],
["int", "kickTypeNumber", _kickTypeNumber],
["string", "kickType", _kickType],
["string", "kickReason", _kickReason],
["string", "kickMessageIncReason", _kickMessageIncReason]
]] call RangerMetrics_fnc_queue;
}],
["HandleChatMessage", { ["HandleChatMessage", {
_this call RangerMetrics_capture_fnc_chat_message; _this call RangerMetrics_event_fnc_HandleChatMessage;
// don't interfaere with the chat message // don't interfaere with the chat message
false; false;
}],
["MPEnded", {
private ["_winner", "_reason"];
_winner = "Unknown";
_reason = "Mission Complete";
["server_events", "MPEnded", nil, [
["string", "winner", _winner],
["string", "reason", _reason]
]] call RangerMetrics_fnc_queue;
call RangerMetrics_capture_fnc_running_mission;
}],
["EntityCreated", {
params ["_entity"];
call RangerMetrics_capture_fnc_entity_count;
}],
["EntityKilled", {
_this call RangerMetrics_event_fnc_EntityKilled;
}],
["GroupCreated", {
params ["_group"];
call RangerMetrics_capture_fnc_entity_count;
}],
["GroupDeleted", {
params ["_group"];
call RangerMetrics_capture_fnc_entity_count;
}],
["MarkerCreated", {
params ["_marker", "_channelNumber", "_owner", "_local"];
_this call RangerMetrics_event_fnc_MarkerCreated;
}],
["MarkerDeleted", {
params ["_marker", "_channelNumber", "_owner", "_local"];
_this call RangerMetrics_event_fnc_MarkerDeleted;
}],
["MarkerUpdated", {
params ["_marker", "_channelNumber", "_owner", "_local"];
_this call RangerMetrics_event_fnc_MarkerUpdated;
}],
["Service", {
params ["_serviceVehicle", "_servicedVehicle", "_serviceType", "_needsService", "_autoSupply"];
[
"server_events",
"Service",
[
["string", "serviceVehicle", typeOf _serviceVehicle],
["string", "servicedVehicle", typeOf _servicedVehicle],
["int", "serviceType", _serviceType],
["bool", "needsService", _needsService],
["bool", "autoSupply", _autoSupply]
],
nil
] call RangerMetrics_fnc_queue;
}] }]
] ]

View File

@@ -5,15 +5,16 @@
RangerMetrics_capture_fnc_server_performance, RangerMetrics_capture_fnc_server_performance,
RangerMetrics_capture_fnc_running_scripts, RangerMetrics_capture_fnc_running_scripts,
RangerMetrics_capture_fnc_server_time, RangerMetrics_capture_fnc_server_time,
RangerMetrics_capture_fnc_entities_local, RangerMetrics_capture_fnc_entity_count,
RangerMetrics_capture_fnc_entities_global,
RangerMetrics_capture_fnc_player_performance RangerMetrics_capture_fnc_player_performance
] ]
], ],
[ [
60, 60,
[ [
RangerMetrics_capture_fnc_weather RangerMetrics_capture_fnc_weather,
RangerMetrics_capture_fnc_view_distance,
RangerMetrics_capture_fnc_running_mission
] ]
] ]
] ]

View File

@@ -0,0 +1,29 @@
if (!RangerMetrics_cbaPresent) exitWith {
[
format["RangerMetrics: CBA not present, aborting class EHs."],
"WARN"
] call RangerMetrics_fnc_log;
};
///////////////////////////////////////////////////////////////////////
// Initialize all units
///////////////////////////////////////////////////////////////////////
["All", "InitPost", {
private _unit = _this # 0;
if (_unit isKindOf "CAManBase" && isPlayer _unit) then {
[_unit] call RangerMetrics_fnc_initUnit;
};
_unit setVariable ["RangerMetrics_id", RangerMetrics_nextID, true];
if (RangerMetrics_debug) then {
[
format["ID %1, Object %2 (%3)", RangerMetrics_nextID, _unit, [configOf _unit] call BIS_fnc_displayName],
"DEBUG"
] call RangerMetrics_fnc_log;
};
RangerMetrics_nextID = RangerMetrics_nextID + 1;
}, nil, nil, true] call CBA_fnc_addClassEventHandler;

View File

@@ -0,0 +1,129 @@
params [
["_unit", objNull, [objNull]]
];
if (isNull _unit) exitWith {};
if (!isPlayer _unit) exitWith {};
[RangerMetrics_aceMedicalPresent, {
if (not _this) exitWith {};
player addEventHandler ["Dammaged", {
params ["_unit", "_killer", "_instigator", "_useEffects"];
private _aceLastDamage = _unit getVariable "ace_medical_lastDamageSource";
if (!isNil "_aceLastDamage") then {
_unit setVariable ["ace_medical_lastDamageSource", _aceLastDamage, 2];
};
}];
}] remoteExec ["call", owner _unit, _unit];
_unit addEventHandler ["Dammaged", {
params ["_unit", "_selection", "_damage", "_hitIndex", "_hitPoint", "_shooter", "_projectile"];
private _unitPlayerId = getPlayerId _unit;
private _userInfo = getUserInfo _unitPlayerId;
private _shooterPlayerId = (getPlayerId (getShotParents _projectile select 1));
private _shooterInfo = getUserInfo _shooterPlayerId;
[_unit] call RangerMetrics_capture_fnc_unit_state;
[
"player_events",
"Dammaged",
[
["string", "playerUID", _userInfo select 2]
],
[
["string", "selection", _selection],
["number", "damage", _damage],
["number", "hitIndex", _hitIndex],
["string", "hitPoint", _hitPoint],
["string", "shooter", _shooterInfo select 2],
["string", "projectile", _projectile]
],
["server"]
] call RangerMetrics_fnc_queue;
}];
_unit addEventHandler ["FiredMan", {
_this call RangerMetrics_event_fnc_FiredMan;
}];
_unit addEventHandler ["GetInMan", {
params ["_unit", "_role", "_vehicle", "_turret"];
private _unitPlayerId = getPlayerId _unit;
private _userInfo = getUserInfo _unitPlayerId;
[
"player_events",
"GetInMan",
[
["string", "playerUID", _userInfo select 2]
],
[
["string", "role", _role],
["string", "vehicle", _vehicle],
["string", "turret", _turret]
],
["server"]
] call RangerMetrics_fnc_queue;
}];
_unit addEventHandler ["GetOutMan", {
params ["_unit", "_role", "_vehicle", "_turret"];
private _unitPlayerId = getPlayerId _unit;
private _userInfo = getUserInfo _unitPlayerId;
[
"player_events",
"GetOutMan",
[
["string", "playerUID", _userInfo select 2]
],
[
["string", "role", _role],
["string", "vehicle", _vehicle],
["string", "turret", _turret]
],
["server"]
] call RangerMetrics_fnc_queue;
}];
_unit addEventHandler ["HandleScore", {
params ["_unit", "_object", "_score"];
private _unitPlayerId = getPlayerId _unit;
private _userInfo = getUserInfo _unitPlayerId;
[
"player_events",
"HandleScore",
[
["string", "playerUID", _userInfo select 2]
],
[
["int", "score", _score],
["string", "objectClass", typeOf _object],
["string", "object", [configOf _object] call BIS_fnc_displayName]
],
["server"]
] call RangerMetrics_fnc_queue;
nil;
}];
// _unit addEventHandler ["InventoryClosed", {
// params ["_unit", "_container"];
// private _unitPlayerId = getPlayerId _unit;
// private _userInfo = getUserInfo _unitPlayerId;
// [
// "player_events",
// "InventoryClosed",
// [
// ["string", "playerUID", _userInfo select 2]
// ],
// [
// ["string", "container", _container]
// ],
// ["server"]
// ] call RangerMetrics_fnc_queue;
// }];

View File

@@ -2,12 +2,13 @@
if (is3DEN || !isMultiplayer) exitWith {}; if (is3DEN || !isMultiplayer) exitWith {};
RangerMetrics_cbaPresent = (isClass(configFile >> "CfgPatches" >> "cba_main")); RangerMetrics_cbaPresent = isClass(configFile >> "CfgPatches" >> "cba_main");
RangerMetrics_aceMedicalPresent = isClass(configFile >> "CfgPatches" >> "ace_medical_status");
RangerMetrics_logPrefix = "RangerMetrics"; RangerMetrics_logPrefix = "RangerMetrics";
RangerMetrics_debug = true; RangerMetrics_debug = true;
RangerMetrics_initialized = false; RangerMetrics_initialized = false;
RangerMetrics_run = false; RangerMetrics_run = false;
RangerMetrics_activeThreads = []; RangerMetrics_nextID = 0;
RangerMetrics_messageQueue = createHashMap; RangerMetrics_messageQueue = createHashMap;
RangerMetrics_sendBatchHandle = scriptNull; RangerMetrics_sendBatchHandle = scriptNull;
@@ -84,6 +85,10 @@ RangerMetrics_captureDefinitions = createHashMapFromArray [
[ [
"ClientPoll", "ClientPoll",
call RangerMetrics_cDefinitions_fnc_client_poll call RangerMetrics_cDefinitions_fnc_client_poll
],
[
"CBAEvent",
call RangerMetrics_cDefinitions_fnc_server_CBA
] ]
]; ];
@@ -113,21 +118,32 @@ RangerMetrics_captureDefinitions = createHashMapFromArray [
// begin client polling // begin client polling
// set up CBA event listeners
{_x params ["_handleName", "_code"];
missionNamespace setVariable [
("RangerMetrics" + "_CBAEH_" + _handleName),
([_handleName, _code] call CBA_fnc_addEventHandlerArgs)
];
} forEach (RangerMetrics_captureDefinitions get "CBAEvent");
// set up CBA class inits if CBA loaded
call RangerMetrics_fnc_classHandlers;
// start sending
[{
params ["_args", "_idPFH"];
if (scriptDone RangerMetrics_sendBatchHandle) then {
RangerMetrics_sendBatchHandle = [] spawn RangerMetrics_fnc_send;
};
}, 2, []] call CBA_fnc_addPerFrameHandler;
RangerMetrics_initialized = true; RangerMetrics_initialized = true;
RangerMetrics_run = true; RangerMetrics_run = true;
["RangerMetrics_run", true] remoteExecCall ["setVariable", 0, true];
call RangerMetrics_capture_fnc_running_mission;
// start sending
[{
params ["_args", "_idPFH"];
// if (scriptDone RangerMetrics_sendBatchHandle) then {
// RangerMetrics_sendBatchHandle = [] spawn RangerMetrics_fnc_send;
// };
call RangerMetrics_fnc_send;
}, 3, []] call CBA_fnc_addPerFrameHandler;

View File

@@ -23,8 +23,8 @@ if (
// extension calls support a max of 2048 elements in the extension call // extension calls support a max of 2048 elements in the extension call
// so we need to split the data into chunks of 2000 // so we need to split the data into chunks of 2000
private "_processing"; private "_processing";
_processing = _records select [0, (count _records -1) min 2000]; _processing = _records select [0, (count _records -1) min 750];
_records = _records select [2000, count _records - 1]; _records = _records select [750, count _records - 1];
// send the data // send the data
if ( if (