• 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 script bug? (TFS 1.3)

Lucifer

Active Member
Joined
Dec 27, 2014
Messages
145
Reaction score
33
Location
Sweden
Trying to fix this in a 8.6 tfs 1.3 server but i got this stupid errors. Can someone help me? Maybe @M0ustafa the legend? xD


Code:
Lua Script Error: [Main Interface]
(Unknown scriptfile)
data/globalevents/scripts/highscore.lua:84: bad argument #2 to 'format' (number expected, got nil)
stack traceback:
        [C]: at 0x7ff64d94c580
        [C]: in function 'format'
        data/globalevents/scripts/highscore.lua:84: in function 'setPlayerSkull'
        data/globalevents/scripts/highscore.lua:104: in function <data/globalevents/scripts/highscore.lua:96>

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}
    }
    --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` = %d WHERE `id` = %d;'
        query = string.format(query, skull, 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
 
Solution
You're still updating skull to nil, you didn't need to edit the accounts table at all.
query = string.format(query, skull or SKULL_NONE, guid)
Try this one, I will recompile my 1.3 and test soon just formatted my PC.
Lua:
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}
    }
    --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, 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
 
The key column does not exist in the accounts table. I don't know what type is it or what is it but you can try.
SQL:
ALTER TABLE `accounts` ADD `nil` int NOT NULL;
 
nil is Lua, not SQL. You should be setting it to 0 for skull to remove it and update it in-game via setSkull(0) or SKULL_NONE.
 
ALTER TABLE accounts ADD 0 int NOT NULL

Just dit that on db and now the skulls show up but disspear after 2 sec and got this msg

Code:
Paladin Sample has logged in.
[Error - mysql_real_query] Query: UPDATE `players` SET `skull` = nil WHERE `id` = 6;
Message: Unknown column 'nil' in 'field list'
 
I know nothing about coding. :S
So actually have no idea what I need to do right now. Should I put that code somewhere or how should I do it.
Would appreciate if you help me how to do in a basic way xD.
 
in the script
query = string.format(query, skull, guid)
to
query = string.format(query, skull or SKULL_NONE, guid)
 
All skulls disappear after few seconds? Try black/red etc..
 
Last edited:
Yeah this will require source edits.
Inside player.cpp search for this
C++:
void Player::onEndCondition(ConditionType_t type)
and remove this
C++:
        if (getSkull() != SKULL_RED && getSkull() != SKULL_BLACK) {
            setSkull(SKULL_NONE);
        }
 
Back
Top