lighter perun event listener

This commit is contained in:
ags
2021-11-25 01:31:55 +00:00
parent f46ffd9385
commit b87276cfe3
9 changed files with 615 additions and 71 deletions

View File

@@ -1,26 +1,28 @@
-- Perun for DCS World https://github.com/szporwolik/perun -> DCS Hook config component
local PerunConfig = {}
local config = {}
-- ###################### SETTINGS - DO NOT MODIFY OUTSIDE THIS SECTION #############################
-- Connection
PerunConfig.TCPPerunHost = "localhost" -- (string) [default: "localhost"] IP adress of the Perun instance or "localhost"
PerunConfig.TCPTargetPort = 48621 -- (int) [default: 48621] TCP port to send data to
PerunConfig.Instance = 1 -- (int) [default: 1] Id number of instance (if multiple DCS instances are to run at the same PC)
PerunConfig.RefreshStatus = 60 -- (int) [default: 60] Base refresh rate in seconds to send status update
-- Mission Configuration
PerunConfig.MissionStartNoDeathWindow = 300 -- (int) [default: 300] Number of secounds after mission start when death of the pilot will not go to statistics, shall avoid death penalty during spawning DCS bugs
config.host = "localhost" -- (string) [default: "localhost"] IP adress of the Perun instance or "localhost"
config.port = 48621 -- (int) [default: 48621] TCP port to send data to
config.Instance = 1 -- (int) [default: 1] Id number of instance (if multiple DCS instances run on the same machine)
config.keepAliveSeconds = 5 --
config.refreshSlotsSeconds = 300 -- delay between slot updates are sent
config.refreshMissionSeconds = 600 -- delay between mission update is sent
config.bigUpdatesSeconds = 100 -- big updates (mission, unit IDs, slots) have to wait between being sent
-- Localisation
PerunConfig.MOTD_L1 = "[Perun] Welcome to our server !" -- (string) Message send to players connecting the server - Line 1
PerunConfig.MOTD_L2 = "[Perun] Stats and event data integrated with Perun for DCS World" -- (string) Message send to players connecting the server - Line 2
PerunConfig.ConnectionError_L1 = "[Perun] ERROR: Connection broken - contact server admin!" -- (string) Information to send to players when Perun connection is broken
-- Server MOTD, sent to ALL players when entering cockpit
config.MOTD_line1 = "[Perun] Welcome to our server!";
config.MOTD_line2 = "[Perun] Stats and event data integrated with Perun for DCS World";
-- (string) Information to send to players when Perun connection is broken
config.ConnectionError = "[Perun] ERROR: Connection broken - contact server admin!"
-- Misc
PerunConfig.BroadcastPerunErrors = 1 -- (int) [0 (default),1] Value greater than 0 will broadcast chat message about missing connection to Perun
config.BroadcastPerunErrors = 1 -- (int) [0 (default),1] Value greater than 0 will broadcast chat message about missing connection to Perun
-- Debug
PerunConfig.DebugMode = 1 -- (int) [0 (default),1,2] Value greater than 0 will display Perun information in DCS log file, values: 1 - minimal verbose, 2 - all log information will be logged
config.DebugMode = 1 -- (int) [0 (default),1,2] Value greater than 0 will display Perun information in DCS log file, values: 1 - minimal verbose, 2 - all log information will be logged
-- ###################### END OF SETTINGS - DO NOT MODIFY OUTSIDE THIS SECTION ######################
return PerunConfig
return config

View File

@@ -13,17 +13,18 @@ package.cpath = package.cpath..';'.. lfs.writedir()..'/Mods/services/Perun/bin/'
Perun.DLL = require('perun')
-- Load config file
local PerunConfig = require "perun_config"
Perun.RefreshStatus = PerunConfig.RefreshStatus
Perun.TCPTargetPort = PerunConfig.TCPTargetPort
Perun.TCPPerunHost = PerunConfig.TCPPerunHost
Perun.Instance = PerunConfig.Instance
Perun.MissionStartNoDeathWindow = PerunConfig.MissionStartNoDeathWindow
Perun.DebugMode = PerunConfig.DebugMode
Perun.MOTD_L1 = PerunConfig.MOTD_L1
Perun.MOTD_L2 = PerunConfig.MOTD_L2
Perun.ConnectionError = PerunConfig.ConnectionError_L1
Perun.BroadcastPerunErrors = PerunConfig.BroadcastPerunErrors
local config = require "perun_config"
Perun.RefreshStatus = config.RefreshStatus
Perun.TCPTargetPort = config.port
Perun.TCPPerunHost = config.host
Perun.Instance = config.Instance
Perun.MissionStartNoDeathWindow = config.MissionStartNoDeathWindow
Perun.DebugMode = config.DebugMode
Perun.MOTD_L1 = config.MOTD_L1
Perun.MOTD_L2 = config.MOTD_L2
Perun.ConnectionError = config.ConnectionError_L1
Perun.BroadcastPerunErrors = config.BroadcastPerunErrors
-- Variable init
Perun.Version = "v0.12.1"
@@ -47,6 +48,23 @@ Perun.lastFrameTime = 0;
Perun.ReconnectTimeout = 30;
Perun.RefreshKeepAlive = 3
Perun.State = {}
Perun.State.connected = false;
-- to avoid declaring every time a function is run
Perun.Globals = {}
Perun.Globals.Sides = {
[0] = 'SPECTATOR',
[1] = 'RED',
[2] = 'BLUE',
[3] = 'NEUTRAL', -- TBD check once this is released in DCS
}
Perun.Mission = {}
Perun.Mission.Coalitions = {}
-- ################################ Helper function definitions ################################
Perun.GetCategory = function(id)
-- Helper function returns object category basing on https://pastebin.com/GUAXrd2U
@@ -75,14 +93,8 @@ end
Perun.SideID2Name = function(id)
-- Helper function returns side name per side (coalition) id
local _sides = {
[0] = 'SPECTATOR',
[1] = 'RED',
[2] = 'BLUE',
[3] = 'NEUTRAL', -- TBD check once this is released in DCS
}
if id > 0 and id <= 3 then
return _sides[id]
return Perun.Globals.Sides[id]
else
return "?"
end
@@ -91,11 +103,11 @@ end
Perun.AddLog = function(text,LogLevel)
-- Adds logs to DCS.log file
if Perun.DebugMode >= LogLevel then
net.log("[Perun] ".. text)
net.log("[Perun] ", text)
end
end
Perun.GenerateMissionHash = function()
Perun.generate_mission_hash = function()
-- Generates unique simulation mission hash
return DCS.getMissionName( ).."@".. Perun.Instance .. "@" .. Perun.Version .. "@".. os.date('%Y%m%d_%H%M%S')
end
@@ -239,6 +251,7 @@ Perun.ConnectToPerun = function ()
Perun.DLL.tcpConnect(Perun.TCPPerunHost, Perun.TCPTargetPort)
Perun.AddLog(string.format("Connecting to TCP server %s:%i", Perun.TCPPerunHost, Perun.TCPTargetPort), 2)
Perun.State.connected = true;
end
Perun.SendToPerun = function(data_id, data_package)
@@ -253,7 +266,7 @@ Perun.SendToPerun = function(data_id, data_package)
_payload = net.lua2json(data_package);
end
local _TempData={"<SOT>","{\"dcs_current_frame_delay\":",((DCS.getRealTime() - Perun.lastFrameStart) * 1000000),",\"type\":",data_id,",\"dcs_frame_time\":",(Perun.lastFrameTime * 1000000),",\"instance\":",(Perun.Instance),",\"timestamp\":\"",(os.date('%Y-%m-%d %H:%M:%S')),"\",\"payload\":",(_payload),"}<EOT>"}
local _TempData={"<SOT>","{\"dcs_current_frame_delay\":",((DCS.getRealTime() - Perun.lastFrameStart) * 1000),",\"type\":",data_id,",\"dcs_frame_time\":",(Perun.lastFrameTime * 1000),",\"instance\":",(Perun.Instance),",\"timestamp\":\"",(os.date('%Y-%m-%d %H:%M:%S')),"\",\"payload\":",(_payload),"}<EOT>"}
local _tcpMessage= table.concat( _TempData )
-- TCP Part - sending
@@ -620,7 +633,7 @@ end
Perun.onSimulationStart = function()
-- Simulation was started
Perun.MissionHash=Perun.GenerateMissionHash()
Perun.MissionHash=Perun.generate_mission_hash()
Perun.LogEvent("SimStart","Mission " .. Perun.MissionHash .. " started",nil,nil);
Perun.StatData = {}
Perun.StatDataLastType = {}
@@ -634,7 +647,7 @@ Perun.onSimulationStop = function()
-- Simulation was stopped
Perun.LogEvent("SimStop","Mission " .. Perun.MissionHash .. " finished",nil,nil);
Perun.LogAllStats()
Perun.MissionHash=Perun.GenerateMissionHash();
Perun.MissionHash=Perun.generate_mission_hash();
Perun.StatData = {}
Perun.MissionData = {}
Perun.StatDataLastType = {}
@@ -716,6 +729,24 @@ end
Perun.onGameEvent = function (eventName,arg1,arg2,arg3,arg4,arg5,arg6,arg7)
-- Game event has occured
local _now = DCS.getRealTime()
local _payload = net.lua2json({eventName, arg1, arg2, arg3, arg4, arg5, arg6, arg7})
Perun.DLL.tcpSend("<SOT>" .. _payload .. "<EOT>")
for i, value in pairs({ "red", "blue" }) do
-- table { type, unit_missionID }
local slots = DCS.getAvailableSlots(value)
for slot in slots do
local idx = slot[1];
Perun.Mission.Coalitions[value][idx] = {}
Perun.Mission.Coalitions[value][idx]["type"] = slot[2];
Perun.DLL.tcpSend("<SOT>" .. net.lua2json(DCS.getUnitType(idx)) .. "<EOT>")
end
end
local _payload = net.lua2json(Perun.Mission.Coalitions)
Perun.DLL.tcpSend("<SOT> SLOTS " .. _payload .. "<EOT>")
Perun.AddLog("Event handler for ".. eventName .. " started",2)
if eventName == "friendly_fire" then
@@ -873,7 +904,7 @@ end
if DCS.isServer() then
-- If this game instance is hosting multiplayer game, start Perun
Perun.DLL.StartOfApp() -- Start the main Perun dll
Perun.MissionHash=Perun.GenerateMissionHash() -- Generate initial missionhash
Perun.MissionHash=Perun.generate_mission_hash() -- Generate initial missionhash
DCS.setUserCallbacks(Perun) -- Set user callbacs, map DCS event handlers with functions defined above
Perun.AddLog("Loaded - Perun for DCS World - version: " .. Perun.Version,0) -- Display perun information in log
Perun.ConnectToPerun() -- Connect to Perun server

View File

@@ -0,0 +1,480 @@
-- Perun for DCS World https://github.com/szporwolik/perun -> DCS Hook component
net.log("[Perun] Loading Perun")
-- Initial init
local Perun = {}
-- Load Luas
package.path = package.path..";"..lfs.currentdir().."/LuaSocket/?.lua"..";"..lfs.writedir() .. "/Mods/services/Perun/lua/?.lua"
package.cpath = package.cpath..";"..lfs.currentdir().."/LuaSocket/?.dll"
-- Load Dlls
package.cpath = package.cpath..';'.. lfs.writedir()..'/Mods/services/Perun/bin/' ..'?.dll;'
net.log("[Perun]", "Loading DLL")
Perun.DLL = require('perun')
net.log("[Perun]", "Loaded DLL, starting")
Perun.DLL.StartOfApp();
net.log("[Perun]", "DLL started")
-- Load config file
net.log("[Perun]", "Loading config")
local config = require "perun_config"
net.log("[Perun]", "Config loaded")
Perun.host = config.host
Perun.port = config.port
Perun.Instance = config.Instance
Perun.DebugMode = config.DebugMode
Perun.MOTD_line1 = config.MOTD_line1
Perun.MOTD_line2 = config.MOTD_line2
Perun.ConnectionError = config.ConnectionError
Perun.BroadcastPerunErrors = config.BroadcastPerunErrors
Perun.keepAliveSeconds = config.keepAliveSeconds
Perun.bigUpdatesSeconds = config.bigUpdatesSeconds
Perun.refreshSlotsSeconds = config.refreshSlotsSeconds
Perun.refreshMissionSeconds = config.refreshMissionSeconds
Perun.Version = "v0.12.1"
Perun.MissionHash=""
Perun.lastSentStatus = 0
Perun.lastSentMission = 0
Perun.lastSentKeepAlive = 0
Perun.lastConnectionError = 0
Perun.lastFrameStart = 0;
Perun.lastTimer = 0
Perun.lastFrameTime = 0;
Perun.ReconnectTimeout = 30;
Perun.RefreshKeepAlive = 5
Perun.State = {}
Perun.State.connected = false;
Perun.State.slotsInitialised = false;
-- to avoid declaring every time a function is run
Perun.Globals = {}
Perun.Globals.Sides = {
[0] = 'SPECTATOR',
[1] = 'RED',
[2] = 'BLUE',
[3] = 'NEUTRAL', -- TBD check once this is released in DCS
}
Perun.Mission = {}
Perun.Mission.Slots = {}
Perun.Mission.Slots["blue"] = {}
Perun.Mission.Slots["red"] = {}
Perun.Mission.Players = {}
Perun.Mission.Units = {}
Perun.HandlerArgCounts = {}
Perun.HandlerArgCounts["self_kill"] = 1
Perun.HandlerArgCounts["crash"] = 2
Perun.HandlerArgCounts["eject"] = 2
Perun.HandlerArgCounts["connect"] = 2
Perun.HandlerArgCounts["mission_end"] = 2
Perun.HandlerArgCounts["pilot_death"] = 2
Perun.HandlerArgCounts["takeoff"] = 3
Perun.HandlerArgCounts["landing"] = 3
Perun.HandlerArgCounts["change_slot"] = 3
Perun.HandlerArgCounts["friendly_fire"] = 3
Perun.HandlerArgCounts["disconnect"] = 4
Perun.HandlerArgCounts["kill"] = 7
net.log("[Perun]", "Global variables initialised")
Perun.Stats = {}
Perun.Stats.LastSentTCP = 0
Perun.Stats.LastSentSlots = 0
Perun.Stats.LastBigUpdate = 0
Perun.Stats.LastSentMission = 0
Perun.Stats.PreviousFrameStart = 0
Perun.Stats.LastConnectionError = 0
Perun.func = {};
Perun.func.ensureSlots = function()
if(not Perun.State.slotsInitialised) then
net.log("Perun", "initialising slots")
local blue = DCS.getAvailableSlots("blue");
for k, unit in pairs(blue) do
Perun.Mission.Slots["blue"][unit["unitId"]] = unit
end
local red = DCS.getAvailableSlots("red");
for k, unit in pairs(red) do
Perun.Mission.Slots["red"][unit["unitId"]] = unit
end
Perun.State.slotsInitialised = true;
end
end
Perun.func.ensureUnitId = function(unitId)
if(not Perun.Mission.Units[unitId]) then
local unitData = DCS.getUnitType(unitId)
Perun.Mission.Units[unitId] = unitData
local payload = {}
payload["unit"] = unitData
Perun.func.sendData(net.lua2json(unitData))
end
end
Perun.func.sendData = function(payload)
local now = DCS.getRealTime()
local connected, reconnected = Perun.DLL.tcpSend(payload)
net.log("[Perun]", connected, reconnected)
if(connected < 1) and (now > Perun.Stats.LastConnectionError + Perun.ReconnectTimeout) then
Perun.AddLog("ERROR - TCP connection is not available",0)
if Perun.BroadcastPerunErrors > 0 then
local _all_players = net.get_player_list()
for i, playerId in ipairs(_all_players) do
net.send_chat_to(Perun.ConnectionError , playerId)
end
end
Perun.Stats.LastConnectionError = now
else
Perun.Stats.LastSentTCP = now
if(reconnected > 0) then
net.log("Perun", "TCP reconnected")
Perun.Stats.LastBigUpdate = 0
Perun.Stats.LastSentSlots = 0
Perun.Stats.LastSentMission = 0
end
end
end
Perun.Handlers = {}
Perun.Handlers["event"] = function(eventName)
local data = {};
data["event"] = eventName;
data["hash"] = Perun.MissionHash
data['datetime']=os.date('%Y-%m-%d %H:%M:%S')
return data;
end
Perun.Handlers["friendly_fire"] = function(playerID, weaponName, victimPlayerID)
local data = Perun.Handlers["event"]("friendly_fire")
data["killer"] = playerID;
data["victim"] = victimPlayerID;
data["weapon"] = weaponName;
return data;
end
Perun.Handlers["mission_end"] = function(winner, msg)
local data = Perun.Handlers["event"]("mission_end")
data["winner"] = winner;
data["message"] = msg;
return data;
end
Perun.Handlers["kill"] = function(killerPlayerID, killerUnitType, killerSide, victimPlayerID, victimUnitType, victimSide, weaponName)
local data = Perun.Handlers["event"]("kill")
data["killer"] = {killerPlayerID, killerUnitType, killerSide}
data["victim"] = {victimPlayerID, victimUnitType, victimSide}
data["weapon"] = weaponName;
return data;
end
Perun.Handlers["self_kill"] = function(playerID)
local data = Perun.Handlers["event"]("self_kill")
data["who"] = playerID;
return data;
end
Perun.Handlers["change_slot"] = function(playerID, slotID, prevSide)
local details = net.get_player_info(playerID, "side")
Perun.Mission.Players[playerID]["side"] = details
local data = Perun.Handlers["event"]("change_slot")
data["previousSlot"] = slotID
data["previousSide"] = prevSide
return data;
end
Perun.Handlers["connect"] = function(playerID, name)
net.log("Perun", "Getting player details")
local details = net.get_player_info(playerID)
Perun.Mission.Players[playerID] = details
net.log("Perun", "Preparing event")
local data = Perun.Handlers["event"]("connect")
data["who"] = playerID
data["details"] = details;
return data;
end
Perun.Handlers["disconnect"] = function(playerID, name, playerSide, reason_code)
local data = Perun.Handlers["event"]("disconnect")
data["who"] = playerID;
data["details"] = {name, playerSide, reason_code}
Perun.Mission.Players[playerID] = nil
return data;
end
--"crash", playerID, unit_missionID
Perun.Handlers["crash"] = function(playerID, unit_missionID)
Perun.func.ensureUnitId(unit_missionID)
local data = Perun.Handlers["event"]("crash")
data["who"] = playerID;
data["unitId"] = unit_missionID;
return data;
end
--"eject", playerID, unit_missionID
Perun.Handlers["eject"] = function(playerID, unit_missionID)
Perun.func.ensureUnitId(unit_missionID)
local data = Perun.Handlers["event"]("eject")
data["who"] = playerID;
data["unitId"] = unit_missionID;
return data;
end
--"takeoff", playerID, unit_missionID, airdromeName
Perun.Handlers["takeoff"] = function(playerID, unit_missionID, airdromeName)
Perun.func.ensureUnitId(unit_missionID)
local data = Perun.Handlers["event"]("takeoff")
data["who"] = playerID;
data["unitId"] = unit_missionID;
data["from"] = airdromeName;
return data;
end
--"landing", playerID, unit_missionID, airdromeName
Perun.Handlers["landing"] = function(playerID, unit_missionID, airdromeName)
Perun.func.ensureUnitId(unit_missionID)
local data = Perun.Handlers["event"]("landing")
data["who"] = playerID;
data["unitId"] = unit_missionID;
data["at"] = airdromeName;
return data;
end
--"pilot_death", playerID, unit_missionID
Perun.Handlers["pilot_death"] = function(playerID, unit_missionID)
Perun.func.ensureUnitId(unit_missionID)
local data = Perun.Handlers["event"]("pilot_death")
data["who"] = playerID;
data["unitId"] = unit_missionID;
return data;
end
net.log("[Perun] Handlers defined")
--- ################################ Helper function definitions ################################
Perun.AddLog = function(text, LogLevel)
-- Adds logs to DCS.log file
if Perun.DebugMode >= LogLevel then
net.log("[Perun]", text)
end
end
Perun.generate_mission_hash = function()
-- Generates unique simulation mission hash
return DCS.getMissionName( ).."@".. Perun.Instance .. "@" .. Perun.Version .. "@".. os.date('%Y%m%d_%H%M%S');
end
--- ################################ TCP Connection ################################
Perun.ConnectToPerun = function ()
Perun.AddLog(string.format("Connecting to TCP server %s:%i", Perun.host, Perun.port), 0);
local status = Perun.DLL.tcpConnect(Perun.host, Perun.port);
if(status == 0) then
Perun.AddLog(string.format("Connection failed: %s:%i", Perun.host, Perun.port), 0);
else
Perun.State.connected = true;
end
end
--- ################################ Log functions ################################
Perun.LogChat = function(playerID, msg, all)
local data = Perun.Handlers["event"]("chat");
data['player']= Perun.Mission.Players[playerID]
data['msg']=msg
data['messageToAll']=all
data['missionhash']=Perun.MissionHash
Perun.func.sendData(net.lua2json(data));
end
Perun.LogEvent = function(log_type, log_content, log_arg_1, log_arg_2)
-- Logs events messages
local data = Perun.Handlers["event"]("customLog");
data['log_type']= log_type
data['log_arg_1']= log_arg_1
data['log_arg_2']= log_arg_2
data['log_content']=log_content
data['log_missionhash']=Perun.MissionHash
Perun.AddLog("Sending event data, event: " .. log_type .. ", arg1:" .. log_arg_1 .. ", arg2:" .. log_arg_2 .. ", content: " .. log_content,1)
Perun.func.sendData(net.lua2json(data));
end
--- ################################ Event callbacks ################################
Perun.onSimulationStart = function()
-- Simulation was started
Perun.MissionHash=Perun.generate_mission_hash()
Perun.LogEvent("SimStart","Mission " .. Perun.MissionHash .. " started",nil,nil);
Perun.lastSentMission = 0 -- reset so mission information will be send
end
Perun.onSimulationStop = function()
-- Simulation was stopped
Perun.LogEvent("SimStop","Mission " .. Perun.MissionHash .. " finished",nil,nil);
Perun.MissionHash=Perun.generate_mission_hash();
Perun.Mission = {}
Perun.Mission.Slots = {}
Perun.Mission.Slots["blue"] = {}
Perun.Mission.Slots["red"] = {}
Perun.Mission.Players = {}
Perun.Mission.Units = {}
end
Perun.onPlayerDisconnect = function(id, err_code)
-- Player disconnected
Perun.LogEvent("disconnect", "Player " .. id .. " disconnected.",nil,nil);
return
end
Perun.onPlayerStop = function (id)
-- Player left the simulation (happens right before a disconnect, if player exited by desire)
Perun.LogEvent("quit", "Player " .. id .. " quit the server.",nil,nil);
return
end
Perun.onSimulationFrame = function()
if(not Perun.State.slotsInitialised) then
local foo = Perun.func.ensureSlots;
local status, error = pcall(foo);
if(status) then
Perun.AddLog( "slot information loaded")
else
Perun.AddLog( "error getting slot information", error)
end
end
local now = DCS.getRealTime()
--net.log("Perun", "big updates check, now", now, "last sent slots", Perun.Stats.LastSentSlots, "last sent mission", Perun.Stats.LastSentMission)
if(now - Perun.Stats.LastBigUpdate > Perun.bigUpdatesSeconds) then
if(now > Perun.Stats.LastSentSlots + Perun.refreshSlotsSeconds) then
local payload = Perun.Handlers["event"]("slots")
payload["slots"] = Perun.Mission.Slots;
local json = net.lua2json(payload)
--net.log("Perun, slots", json)
Perun.func.sendData(json)
Perun.Stats.LastSentSlots = now
Perun.Stats.LastBigUpdate = now
elseif (now > Perun.Stats.LastSentMission + Perun.refreshMissionSeconds) then
local payload = Perun.Handlers["event"]("mission")
payload["mission"] = DCS.getCurrentMission()["mission"]
local json = net.lua2json(payload);
--net.log("Perun, mission", json)
Perun.func.sendData(json)
Perun.Stats.LastSentMission = now
Perun.Stats.LastBigUpdate = now
end
end
if(now > Perun.LastSentTCP + Perun.RefreshKeepAlive) then
Perun.func.sendData(" ")
end
Perun.Stats.PreviousFrameStart = DCS.getRealTime()
end
Perun.onPlayerStart = function (playerId)
-- Player entered cocpit
net.send_chat_to(Perun.MOTD_line1, playerId);
net.send_chat_to(Perun.MOTD_line2, playerId);
end
Perun.onPlayerTrySendChat = function (playerID, msg, all)
-- Somebody tries to send chat message
if (msg == Perun.ConnectionError or msg == Perun.MOTD_line1 or msg == Perun.MOTD_line2) then
return msg;
end
Perun.LogChat(playerID,msg,all)
return msg;
end
Perun.onGameEvent = function (eventName,arg1,arg2,arg3,arg4,arg5,arg6,arg7)
local argCount = Perun.HandlerArgCounts[eventName]
local handler = Perun.Handlers[eventName]
local payload = {}
if(argCount == 1) then
payload = handler(arg1)
elseif argCount == 2 then
payload = handler(arg1, arg2)
elseif argCount == 3 then
payload = handler(arg1, arg2, arg3)
elseif argCount == 4 then
payload = handler(arg1, arg2, arg3, arg4)
else
payload = handler(arg1, arg2, arg3, arg4, arg5, arg6, arg7)
end
local json = net.lua2json(payload)
Perun.func.sendData(json)
end
-- ########### Finalize and set callbacks ###########
if DCS.isServer() then
-- If this game instance is hosting multiplayer game, start Perun
Perun.DLL.StartOfApp(); -- Perun dll StartOfApp callback
Perun.MissionHash=Perun.generate_mission_hash(); -- Generate initial missionhash
DCS.setUserCallbacks(Perun); -- Set user callbacs, map DCS event handlers with functions defined above
Perun.ConnectToPerun(); -- Connect to Perun server
Perun.AddLog("Loaded - Perun for DCS World - version: " .. Perun.Version,0) -- Display perun information in log
end