-- modified version of https://github.com/Joelrau/S1x-IW6x-g_log-script (permission to use by author)

if (game:getdvar("gamemode") ~= "mp") then
    return
end

-- setup dvars
game:setdvarifuninitialized("logfile", 1)
if (tonumber(game:getdvar("logfile")) < 1) then
    return
end
game:setdvarifuninitialized("g_log", "logs/games_mp.log")

start_time = 0

function get_time()
    local seconds = math.floor((game:gettime() - start_time) / 1000)
    local minutes = math.floor(seconds / 60)
    time = string.format("%d:%02d", minutes, seconds - minutes * 60)
    while (string.len(time) < 6) do
        time = " " .. time
    end
    time = time .. " "
    return time
end

function create_path(path)
    local dir = path:gsub("%/", "\\"):match("(.*[\\])")
    os.execute("if not exist " .. dir .. " mkdir " .. dir)
end

function log_print(message)
    local path = game:getdvar("g_log")
    local file = io.open(path, "a")
    if (file == nil) then
        create_path(path)
        file = assert(io.open(path, "a"))
    end
    file:write(get_time() .. message .. "\n")
    file:close()
end

function init()
    start_time = game:gettime()

    log_print("------------------------------------------------------------")
    log_print("InitGame")

    -- player callbacks
    level:onnotify("connected", function(player)
        player:player_connected()
    end)
    level:onnotify("say", function(player, message, hidden)
        player:say(message)
    end)
    level:onnotify("say_team", function(player, message, hidden)
        player:say(message, "say_team")
    end)

    -- damage/killed hooks
    game:onplayerdamage(player_damage)
    game:onplayerkilled(player_killed)

    -- other level notifies for log
    level:onnotify("exitLevel_called", function()
        log_print("ExitLevel: executed")
    end)
    level:onnotify("shutdownGame_called", function()
        log_print("ShutdownGame:")
        log_print("------------------------------------------------------------")
    end)
end

function entity:player_connected()
    log_print(string.format("J;%s;%i;%s", self:getguid(), self:getentitynumber(), self.name))

    self:onnotifyonce("disconnect", function()
        self:disconnect()
    end)
end

function entity:disconnect()
    log_print(string.format("Q;%s;%i;%s", self:getguid(), self:getentitynumber(), self.name))
end

function player_damage(self_, inflictor, attacker, damage, dflags, mod, weapon, vPoint, vDir, hitLoc)
    if (game:isplayer(attacker) == 1) then
        log_print(string.format("D;%s;%i;%s;%s;%s;%i;%s;%s;%s;%i;%s;%s", self_:getguid(), self_:getentitynumber(),
            self_.team, self_.name, attacker:getguid(), attacker:getentitynumber(), attacker.team, attacker.name,
            weapon, damage, mod, hitLoc))
    else
        log_print(string.format("D;%s;%i;%s;%s;%s;%i;%s;%s;%s;%i;%s;%s", self_:getguid(), self_:getentitynumber(),
            self_.team, self_.name, "", "-1", "world", "", weapon, damage, mod, hitLoc))
    end
end

function player_killed(self_, inflictor, attacker, damage, mod, weapon, vDir, hitLoc, psTimeOffset, deathAnimDuration)
    if (game:isplayer(attacker) == 1) then
        log_print(string.format("K;%s;%i;%s;%s;%s;%i;%s;%s;%s;%i;%s;%s", self_:getguid(), self_:getentitynumber(),
            self_.team, self_.name, attacker:getguid(), attacker:getentitynumber(), attacker.team, attacker.name,
            weapon, damage, mod, hitLoc))
    else
        log_print(string.format("K;%s;%i;%s;%s;%s;%i;%s;%s;%s;%i;%s;%s", self_:getguid(), self_:getentitynumber(),
            self_.team, self_.name, "", "-1", "world", "", weapon, damage, mod, hitLoc))
    end
end

-- this function handles 'say' and 'say_team'
function entity:say(message, mode)
    if (not mode) then
        mode = "say"
    end

    log_print(string.format("%s;%s;%i;%s;%s", mode, self:getguid(), self:getentitynumber(), self.name, message))
end

init()