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

Highscore skull system

Salvus

Well-Known Member
Joined
Feb 7, 2019
Messages
102
Solutions
1
Reaction score
69
I bought a server that had funny systems. Now I want to share them with you.
I am not a scripter but if it need something more for this script i will upload them here to just tell me what it need.

TFS 1.3
TIBIA 10.98

The system gives skulls to the top 10

Highest level: Black skull
2-3: Red skull
4-5: Orange skull
6-7: Green skull
8-9: Yellow skull
10: White skull



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

Code:
skulls =
{
    requiredSkulls =
    {
        {fromId = 1, toId = 1, skullId = SKULL_BLACK},
        {fromId = 2, toId = 3, skullId = SKULL_RED},
        {fromId = 4, toId = 5, skullId = SKULL_ORANGE},
        {fromId = 6, toId = 7, skullId = SKULL_GREEN},
        {fromId = 8, toId = 9, skullId = SKULL_YELLOW},
        {fromId = 10, toId = 10, skullId = SKULL_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
                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 [ICODE]id[/ICODE] FROM [ICODE]players[/ICODE] ORDER BY [ICODE]level[/ICODE] 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 [ICODE]players[/ICODE] SET [ICODE]skull[/ICODE] = %d WHERE [ICODE]id[/ICODE] = %d;'
        query = string.format(query, skull, guid)
        db.asyncQuery(query)
    end
end
if (not highSkullScores) then
    highSkullScores = {}
end

function skulls:getHighScores()
    local query = 'SELECT [ICODE]id[/ICODE] FROM [ICODE]players[/ICODE] ORDER BY [ICODE]level[/ICODE] 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
        end
    )

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 [ICODE]id[/ICODE],  [ICODE]name[/ICODE] FROM [ICODE]players[/ICODE] ORDER BY [ICODE]level[/ICODE] 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