diff --git a/data/scripts/logging/__init__.lua b/data/scripts/logging/__init__.lua new file mode 100644 index 00000000..33db4cfc --- /dev/null +++ b/data/scripts/logging/__init__.lua @@ -0,0 +1,117 @@ +-- 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()