• 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+ Highscore Skull System

haji h ali

Member
Joined
Sep 10, 2013
Messages
59
Reaction score
6
Hello guys, I have found this Highscore Skull System and i believe it works fine, but I need it in tfs 1.0+.. Can somebody help me please.

Code:
    <globalevent name="highscore" interval="2" script="highscore.lua"/>

C++:
skulls =
{
    requiredSkulls =
    {
        {fromId = 1, toId = 1, skullId = SKULL_BLACK},
        {fromId = 2, toId = 3, skullId = SKULL_RED},
        {fromId = 4, toId = 5, skullId = SKULL_YELLOW},
        {fromId = 6, toId = 7, skullId = SKULL_GREEN},
        {fromId = 8, toId = 10, skullId = SKULL_WHITE}
    }
    --rest white
}

function skulls:getRequiredSkull(place)
    for i = 1, #self.requiredSkulls do
        local requiredSkull = self.requiredSkulls[i]
        if (place >= requiredSkull.fromId and place <= requiredSkull.toId) then
            return requiredSkull.skullId
        end
    end
    return SKULL_NONE
end

function skulls:getPlayerSkullPlace(player)
    if (player) then
        print(player:getSkull())
        for i = 1, #self.requiredSkulls do
            local requiredSkull = self.requiredSkulls[i]
            if (player:getSkull() == requiredSkull.skullId) then
                --print(requiredSkull.skullId)
                return i
            end
        end
    end
end

function sendSkullPlaceMessage(cid)
    local player = Player(cid)
    if (player) then
        skulls:sendSkullPlaceMessage(player)
    end
end

function skulls:sendSkullPlaceMessage(player)
    if (player) then
        local query = 'SELECT `id` FROM `players` ORDER BY `level` DESC LIMIT 10;';

        db.asyncStoreQuery(query,
            function(query)
                --local playersToSave = {}
                --highSkullScores = {}
                if(query) then    
                    local count = 1
                    local guid = 0    
                    repeat
                        guid = result.getDataInt(query, "id")
                        --self:setPlayerSkull(guid, count)
                        if (player:getGuid() == guid) then
                            player:sendTextMessage(MESSAGE_INFO_DESCR, "You are now on top 10 level. You are on place "..count..'!')
                            return false
                        end
                        --print("test")
                        count = count + 1
                    until not result.next(query)
                end
                --highSkullScores
            end
        )
       
    end
end

function skulls:setPlayerSkull(guid, place)
    local player = Player(guid)
    local skull = self:getRequiredSkull(place)
    if (player) then
        --print("skull "..skull.."___name: "..player:getName())
        --player:sendTextMessage(MESSAGE_INFO_DESCR, "You are now on top 10 level. You are on place "..place..'!')
        player:setSkull(skull)
    else
        --print("skull "..skull.."___guid: "..guid)
        local query = 'UPDATE `players` SET `skull` = %s WHERE `id` = %s;'
        query = string.format(query, skull or SKULL_NONE, guid)
        db.asyncQuery(query)
    end
end
if (not highSkullScores) then
    highSkullScores = {}
end

function skulls:getHighScores()
    local query = 'SELECT `id` FROM `players` ORDER BY `level` DESC LIMIT 10;';

    db.asyncStoreQuery(query,
        function(query)
            local playersToSave = {}
            highSkullScores = {}
            if(query) then    
                local count = 1
                local guid = 0    
                repeat
                    guid = result.getDataInt(query, "id")
                    self:setPlayerSkull(guid, count)
                    --print("test")
                    count = count + 1
                until not result.next(query)
            end
            --highSkullScores
        end
    )

    --print(p)

    --return playersToSave
end

function skulls:updateHighScoresSkulls()
    return self:getHighScores()
    --[[   local players = self:getHighScores()
        print('#players: '..#highSkullScores)
        if (#players > 0) then
            for i = 1, #players do
                self:setPlayerSkull(players[i], i)
            end
        end --]]--
end


--local players = {}
--local playersByName = {}
--local queries = {}

function cleanPlayers(onlinePlayers)
    local player
    for i = 1, #onlinePlayers do
        player = onlinePlayers[i]
        player:setSkull(SKULL_NONE)
        player:setSkullTime(0)
    end
end

function getRequiredSkull(pos)
    local skull
    for i = 1, #skulls do
        skull = skulls[i]
        if (pos >= skull.fromId and skull.fromId <= skull.toId) then
            return skull.skullId
        end
    end

    return SKULL_WHITE
end

function changePlayerSkull(player, players)
    local guid = player:getGuid()
    local id = 0
    for i = 1, #players do
        if (players[i] == guid) then
            id  = i
            break
        end
    end

    local skull = getRequiredSkull(id)
    skull = skull and skull or SKULL_WHITE


    player:setSkull(skull)
    player:setSkullTime(os.time()*2)
end

function changeSkullsToHigh(onlinePlayers, players)
    local player
    for i = 1, #onlinePlayers do
        player = onlinePlayers[i]
        if (player) then
            if (isInArray(players, player:getGuid())) then
                changePlayerSkull(player, players)
            end
        end
    end
end


function onThink(interval)

    players = {}
    playersByName = {}
    queries = {}
    --[[db.asyncStoreQuery("SELECT `id`,  `name` FROM `players` ORDER BY `level` DESC LIMIT 10;",
        function(query)
 
            if(query) then            
                repeat
                    players[#players+1] = result.getDataInt(query, "id")
                    playersByName[#playersByName+1] = result.getDataString(query, "name")
                until not result.next(query)
                local playerCheck
                for i = 1, #players do
                    playerCheck = Player(playersByName[i])
                    if (not playerCheck) then
                        queries[#queries + 1] = string.format('UPDATE players set skull = %d, skulltime = 999999 WHERE id = %d', getRequiredSkull(i), players[i])
                    end
                end

                local onlinePlayers = Game.getPlayers()
                cleanPlayers(onlinePlayers)
                changeSkullsToHigh(onlinePlayers, players)

                for i = 1, #queries do
                    db.query(queries[i])
                end

            end
        end
    )--]]





--[[    if (resultId) then
        repeat
            players[#players+1] = result.getDataInt(resultId, "id")
            playersByName[#playersByName+1] = result.getDataString(resultId, "name")
        until not(resultId:next())
        resultId:free()

        local playerCheck
        for i = 1, #players do
            playerCheck = Player(playersByName[i])
            if (not playerCheck) then
                queries[#queries + 1] = string.format('UPDATE players set skull = %d, skulltime = 999999 WHERE id = %d', getRequiredSkull(i), players[i])
            end
        end

        local onlinePlayers = Game.getPlayers()
        cleanPlayers(onlinePlayers)
        changeSkullsToHigh(onlinePlayers)

    end
--]]
   
  --[[  if resultId then
        local i = 1
        while true do
            if getPlayerByName(resultId:getDataString("name")) ~= nil then
                if i == 1 then
                    doCreatureSetSkullType(getPlayerByName(resultId:getDataString("name")),SKULL_BLACK)
                elseif i == 2 or i == 3 then
                    doCreatureSetSkullType(getPlayerByName(resultId:getDataString("name")),SKULL_RED)
                elseif i == 4 or i == 5 then
                    doCreatureSetSkullType(getPlayerByName(resultId:getDataString("name")),SKULL_GREEN)
                elseif i == 6 or i == 7 then
                    doCreatureSetSkullType(getPlayerByName(resultId:getDataString("name")),SKULL_YELLOW)
                else
                    doCreatureSetSkullType(getPlayerByName(resultId:getDataString("name")),SKULL_WHITE)
                end
            end
            i = i + 1
            if not resultId:next() or i > 10 then
                break
            end
        end
        resultId:free()
    end--]]
    return true
end
 
Last edited:
Back
Top