• 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!

Lua TFS 1.4+ Top 10 players gets skull

Sprrw

Well-Known Member
Joined
Jun 22, 2021
Messages
100
Reaction score
55
Location
Sweden
Hey guys! I made this script. Well I tried atleast. So what I want it to do is give the top 10 players diffrent skulls. It kind of already does using the code I wrote down below. But it seems to have some weird behavior. It works 7 / 10 times but sometimes wrong player gets the wrong skull. It always work when all players relog so it refreshes, but its almost like the skulls gets cached or some, sometimes. Anyone got any clue? Im using the latest TFS 1.4 btw. Edit: It seems like the problem is when the player gains exp and surpasing the next in the toplist without killing or interfering with the player above. So Ig, it doesnt update cuz the player above havent refreshed. But how would I fix this? Is there any way of refreshing the skulls everytime the script is called?

Lua:
-- White skull = 3
-- Yellow skull = 1
-- Green skull = 2
-- Red skull = 4
-- Black skull = 5

function onThink(interval)
    local resultQuery = db.storeQuery("SELECT `level`, `name` FROM `players` ORDER BY `level` DESC, `experience` DESC LIMIT 10")
   
    local topPlayerName = result.getString(resultQuery, "name")
    local topPlayer = Player(topPlayerName)

    if topPlayer then
        doCreatureSetSkullType(topPlayer, 5) --1
    end
    print(topPlayerName)

    result.next(resultQuery)

    local topPlayerName = result.getString(resultQuery, "name")
    local topPlayer = Player(topPlayerName)

    if topPlayer then
        doCreatureSetSkullType(topPlayer, 4)--2
    end
    print(topPlayerName)

    result.next(resultQuery)

    local topPlayerName = result.getString(resultQuery, "name")
    local topPlayer = Player(topPlayerName)

    if topPlayer then
        doCreatureSetSkullType(topPlayer, 4)--3
    end
    print(topPlayerName)

    result.next(resultQuery)

    local topPlayerName = result.getString(resultQuery, "name")
    local topPlayer = Player(topPlayerName)

    if topPlayer then
        doCreatureSetSkullType(topPlayer, 2)--4
    end
    print(topPlayerName)

    result.next(resultQuery)

    local topPlayerName = result.getString(resultQuery, "name")
    local topPlayer = Player(topPlayerName)

    if topPlayer then
        doCreatureSetSkullType(topPlayer, 2)--5
    end
    print(topPlayerName)

    result.next(resultQuery)

    local topPlayerName = result.getString(resultQuery, "name")
    local topPlayer = Player(topPlayerName)

    if topPlayer then
        doCreatureSetSkullType(topPlayer, 2)--6
    end
    print(topPlayerName)

    result.next(resultQuery)

    local topPlayerName = result.getString(resultQuery, "name")
    local topPlayer = Player(topPlayerName)

    if topPlayer then
        doCreatureSetSkullType(topPlayer, 1)--7
    end
    print(topPlayerName)

    result.next(resultQuery)

    local topPlayerName = result.getString(resultQuery, "name")
    local topPlayer = Player(topPlayerName)

    if topPlayer then
        doCreatureSetSkullType(topPlayer, 1)--8
    end
    print(topPlayerName)

    result.free(resultQuery)

return true
end
 
Last edited:
@Shalaby was a true chad and helped me write this. And Im truly thankful for all the support bro <3 Luv you!

Lua:
function onThink(interval)
    local resultQuery = db.storeQuery("SELECT `level`, `name` FROM `players` ORDER BY `level` DESC, `experience` DESC LIMIT 10")
    local rank = 1
    local topPlayerName = result.getString(resultQuery, "name")
    local topPlayer = Player(topPlayerName)
    if topPlayer then
        doCreatureSetSkullType(topPlayer, skull_types[rank])
    end
    rank = rank + 1
    print(topPlayerName)
    while result.next(resultQuery) do
        local topPlayerName = result.getString(resultQuery, "name")
        local topPlayer = Player(topPlayerName)
        if topPlayer then
            doCreatureSetSkullType(topPlayer, skull_types[rank])
        end
        print(topPlayerName)
        rank = rank + 1
    end
    result.free(resultQuery)
    return true
end

But still looking for a fix. If youre a scripter contact me @MrVilhelm(KONST)#9336 on discord (I can pay you for your time).
 
@Shalaby was a true chad and helped me write this. And Im truly thankful for all the support bro <3 Luv you!

Lua:
function onThink(interval)
    local resultQuery = db.storeQuery("SELECT `level`, `name` FROM `players` ORDER BY `level` DESC, `experience` DESC LIMIT 10")
    local rank = 1
    local topPlayerName = result.getString(resultQuery, "name")
    local topPlayer = Player(topPlayerName)
    if topPlayer then
        doCreatureSetSkullType(topPlayer, skull_types[rank])
    end
    rank = rank + 1
    print(topPlayerName)
    while result.next(resultQuery) do
        local topPlayerName = result.getString(resultQuery, "name")
        local topPlayer = Player(topPlayerName)
        if topPlayer then
            doCreatureSetSkullType(topPlayer, skull_types[rank])
        end
        print(topPlayerName)
        rank = rank + 1
    end
    result.free(resultQuery)
    return true
end

But still looking for a fix. If youre a scripter contact me @MrVilhelm(KONST)#9336 on discord (I can pay you for your time).
First, u don't need to know level if you go for exp in the query, so, delete the level part of the query

Exp will be always higher for only one Player even if same level
 
First, u don't need to know level if you go for exp in the query, so, delete the level part of the query

Exp will be always higher for only one Player even if same level
Thats true, thanks. But problem still stands, it wont update as it should. Ex, if black skull (top 1 player) dont die, he will just keep his skull until relog :( But thanks a lot for your response! Hope youre having an amazing day! <3
 
Thats true, thanks. But problem still stands, it wont update as it should. Ex, if black skull (top 1 player) dont die, he will just keep his skull until relog :( But thanks a lot for your response! Hope youre having an amazing day! <3
The problem here is: db will only update if player die, logout or server save. Maybe u can do a player:save() before giving skulls.

U can get level and exp from players that are online, but they cannot be the top level

Try a table save or force player save for all online players before giving skulls

Lua:
local players = Game.getPlayers()
    for i = 1, #players do
        players[i]:save()
    end
 
data/lib/core/game.lua
Lua:
function Game.getCurrentHighscores(max)
    max = max or 10
    
    local players = {}
    local query = db.storeQuery("SELECT `name`, `level`, `experience` FROM `players` ORDER BY `experience` DESC LIMIT " .. max)

    if query then
        while (true) do
            players[result.getDataString(query, "name")] = {
                result.getDataInt(query, "level"),
                result.getDataInt(query, "experience")
            }
            if not result.next(query) then
                break
            end
        end
        result.free(query)
    end

    for i, player in pairs(Game.getPlayers()) do -- # just to avoid extra code / sort
        players[player:getName()] = {player:getLevel(), player:getExperience()}
    end

    local sort = {}
    for name, info in pairs(players) do
        sort[#sort + 1] = {name = name, level = info[1], score = info[2]}
    end

    table.sort(sort, function(a, b) return a.score > b.score end)
    return {unpack(sort, 1, math.min(max, #sort))}
end

usage:
Lua:
for rank, info in ipairs(Game.getCurrentHighscores()) do
    local player = Player(info.name)
    if player then
        -- # if player is online then do whatever you want to make here
    end
    -- # default info
    print("[" .. rank .. "] - ".. info.name .. " - Lv: " .. info.level .. " - Xp: " .. info.score)
end
 
data/lib/core/game.lua
Lua:
function Game.getCurrentHighscores(max)
    max = max or 10
   
    local players = {}
    local query = db.storeQuery("SELECT `name`, `level`, `experience` FROM `players` ORDER BY `experience` DESC LIMIT " .. max)

    if query then
        while (true) do
            players[result.getDataString(query, "name")] = {
                result.getDataInt(query, "level"),
                result.getDataInt(query, "experience")
            }
            if not result.next(query) then
                break
            end
        end
        result.free(query)
    end

    for i, player in pairs(Game.getPlayers()) do -- # just to avoid extra code / sort
        players[player:getName()] = {player:getLevel(), player:getExperience()}
    end

    local sort = {}
    for name, info in pairs(players) do
        sort[#sort + 1] = {name = name, level = info[1], score = info[2]}
    end

    table.sort(sort, function(a, b) return a.score > b.score end)
    return {unpack(sort, 1, math.min(max, #sort))}
end

usage:
Lua:
for rank, info in ipairs(Game.getCurrentHighscores()) do
    local player = Player(info.name)
    if player then
        -- # if player is online then do whatever you want to make here
    end
    -- # default info
    print("[" .. rank .. "] - ".. info.name .. " - Lv: " .. info.level .. " - Xp: " .. info.score)
end
Brooo! This worked perfectly! Thanks a lot <3
 
data/lib/core/game.lua
Lua:
function Game.getCurrentHighscores(max)
    max = max or 10
   
    local players = {}
    local query = db.storeQuery("SELECT `name`, `level`, `experience` FROM `players` ORDER BY `experience` DESC LIMIT " .. max)

    if query then
        while (true) do
            players[result.getDataString(query, "name")] = {
                result.getDataInt(query, "level"),
                result.getDataInt(query, "experience")
            }
            if not result.next(query) then
                break
            end
        end
        result.free(query)
    end

    for i, player in pairs(Game.getPlayers()) do -- # just to avoid extra code / sort
        players[player:getName()] = {player:getLevel(), player:getExperience()}
    end

    local sort = {}
    for name, info in pairs(players) do
        sort[#sort + 1] = {name = name, level = info[1], score = info[2]}
    end

    table.sort(sort, function(a, b) return a.score > b.score end)
    return {unpack(sort, 1, math.min(max, #sort))}
end

usage:
Lua:
for rank, info in ipairs(Game.getCurrentHighscores()) do
    local player = Player(info.name)
    if player then
        -- # if player is online then do whatever you want to make here
    end
    -- # default info
    print("[" .. rank .. "] - ".. info.name .. " - Lv: " .. info.level .. " - Xp: " .. info.score)
end
How can I use this function for the 10 top level to gain skull?
 
How can I use this function for the 10 top level to gain skull?

Data/globalevents/scripts/script.lua
Lua:
function onThink(interval)
    local skull_types = {
        [1] = 5, -- black
        [2] = 4, -- red
        [3] = 4, -- red
        [4] = 2, -- green
        [5] = 2, -- green
        [6] = 2, -- green
        [7] = 1, -- yellow
        [8] = 1, -- yellow
        [9] = 3, -- white
        [10] = 3 -- white
    }

    for rank, info in ipairs(Game.getCurrentHighscores()) do
        local player = Player(info.name)
        if player then
            doCreatureSetSkullType(player, skull_types[rank])
        end
    end
    return true
end
 
Back
Top