• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

TFS 1.X+ Error Top Frags Help

Magicalx

Banned User
Joined
Jul 6, 2022
Messages
56
Reaction score
9
GitHub
Magicalx
Hello I use this script and it does not work I have one error
ttfs 1,2
Code:
Lua Script Error: [GlobalEvent Interface]
data/globalevents/scripts/top_fraggers.lua:onThink
data/globalevents/scripts/top_fraggers.lua:67: attempt to index a nil value
[Error - GlobalEvents::think] Failed to execute event: fraggers

Lua:
local cfg = {
   top = 5,
   messagetype = MESSAGE_STATUS_CONSOLE_ORANGE
}

function table.find(table, value)
   for i, v in pairs(table) do
     if v == value then
       return i
     end
   end
   return nil
end

function getHighest(check, values)
   local highest = 0
   local highestVal = nil
   local highestI = nil
   for i = 1, #values do
     if check[values[i]] > highest then
       highest = check[values[i]]
       highestVal = values[i]
       highestI = i
     end
   end
  
   return {highest, highestVal, highestI}
end

function getTopFraggers()
   local fraggers = {}
   local resultId = db.storeQuery("SELECT `player_id`, `killed_by` FROM `player_deaths` WHERE `is_player` = 1")
   if resultId then
     repeat
       table.insert(fraggers, result.getDataString(resultId, "killed_by"))       
     until not result.next(resultId)
     result.free(resultId)
   end

   local fraggers_names = {}
   for i = 1, #fraggers do
     if not table.find(fraggers_names, fraggers[i]) then
       table.insert(fraggers_names, fraggers[i])
     end
   end
  
   local fraggers_total = {}
   for i = 1, #fraggers do
   for j = 1, #fraggers_names do
     if fraggers_names[j] == fraggers[i] then
       if not fraggers_total[fraggers_names[j]] then fraggers_total[fraggers_names[j]] = 0 end
       fraggers_total[fraggers_names[j]] = fraggers_total[fraggers_names[j]] + 1
     end
   end   
   end
  
   local fraggers_top = {}
   for i = 1, cfg.top do
     local v = getHighest(fraggers_total, fraggers_names)
     table.insert(fraggers_top, {v[1], v[2]})
     table.remove(fraggers_names, v[3])
   end
  
   local msg = "Top fraggers:\n"
   for i = 1, #fraggers_top do
     if fraggers_top[i][2] then
       msg = msg .. "[" .. i .. "]: " .. fraggers_top[i][2] .. ": [" .. fraggers_top[i][1] .. "]" .. ((fraggers_top[i+1][2] and i+1 ~= #fraggers_top) and "\n" or "")
     else
       break
     end
   end
   broadcastMessage(msg, cfg.messagetype)
end

function onThink(interval)
   getTopFraggers()
   return true
end
 
Solution
Lua:
local function spairs(t, order)
    local keys = {}
    for k in pairs(t) do keys[#keys + 1] = k end

    if order then
        table.sort(keys, function(a, b) return order(t, a, b) end)
    else
        table.sort(keys)
    end

    local i = 0
    return function()
        i = i + 1
        if keys[i] then
            return keys[i], t[keys[i]]
        end
    end
end

function getTopFraggers(max)
    max = max or 5
    local fraggers = {}
    local resultId = db.storeQuery("SELECT `player_id`, `killed_by` FROM `player_deaths` WHERE `is_player` = 1")
    if resultId then
        while (true) do
            local killer = result.getDataString(resultId, "killed_by")
            fraggers[killer] = (fraggers[killer] or 0) + 1
            if not...
Lua:
local function spairs(t, order)
    local keys = {}
    for k in pairs(t) do keys[#keys + 1] = k end

    if order then
        table.sort(keys, function(a, b) return order(t, a, b) end)
    else
        table.sort(keys)
    end

    local i = 0
    return function()
        i = i + 1
        if keys[i] then
            return keys[i], t[keys[i]]
        end
    end
end

function getTopFraggers(max)
    max = max or 5
    local fraggers = {}
    local resultId = db.storeQuery("SELECT `player_id`, `killed_by` FROM `player_deaths` WHERE `is_player` = 1")
    if resultId then
        while (true) do
            local killer = result.getDataString(resultId, "killed_by")
            fraggers[killer] = (fraggers[killer] or 0) + 1
            if not result.next(resultId) then
                break
            end
        end
        result.free(resultId)
    end

    if not next(fraggers) then
        return -- no killers
    end

    local output = {}
    for killer, frags in spairs(fraggers, function(t, a, b) return t[b] < t[a] end) do
        output[#output + 1] = "["..(#output + 1).."]: "..killer.." - "..frags.." frags"
        if (#output >= max) then
            break
        end
    end

    output[1] = "Top "..math.min(#output, max).." fraggers:\n"..output[1]
    return broadcastMessage(table.concat(output, "\n"), MESSAGE_STATUS_CONSOLE_ORANGE)
end

function onThink(interval)
   getTopFraggers()
   return true
end
 
Solution
Back
Top