简体   繁体   中英

[FIVEM]/LUA. How would i compare two player id's here

Ive been racking brains all day tryna fix this and i am new with lua and cant come up with a solution to this problem even though im rather close. SO I have a drift leader board in my server. The problem is the script doesnt check for the players [id] in the table. So if player A has a score of 10 and Player B has a score of 5. Player A can take the 2nd position on the leaderboard (table) by getting a score of any int between. so lets say 7.

LEADERBOARD_CLEAR_TIME = 15 -- THIS IS IN MINUTES

local Players = {}
local Leaderboards = {}
RegisterCommand('cleardriftscores', function(source)
    if IsPlayerAceAllowed(source, 'drift') then --Ace permissions 
        clearLeaderboard()
    end
end)
RegisterNetEvent("SaveScore")
AddEventHandler("SaveScore", function(client, data)
    local identifier = (GetPlayerIdentifier(source, 0))
    local playerName = GetPlayerName(source)
    if Players[identifier] ~= nil then
        if Players[identifier].pb < data.curScore then
            -- Personal Best Beat
            local oldScore = Players[identifier].pb
            Players[identifier] = { pb = data.curScore }
            chatMessage(source, string.format("Congrats! You have just beaten your personal best drift chain score of ^2%s^0 with ^2%s^0!", oldScore,  data.curScore))
        end
    else
        Players[identifier] = { pb = data.curScore }
    end
    
    if #Leaderboards == 0 then
        table.insert(Leaderboards, {score = data.curScore, name = playerName, id = identifier})
        chatMessage(-1, string.format("^2%s^0 has started off the leaderboard with a score of ^2%s^0!", playerName, data.curScore))
    end
    for k, v in ipairs(Leaderboards) do
    if v.score < data.curScore and checkLeaderboard(identifier) then
            -- Outpassed Someone
            table.insert(Leaderboards, { score = data.curScore, name = playerName, id = identifier } )
            chatMessage(-1, string.format("^2%s^0 has beaten ^2%s's^0 score of ^2%s^0 with ^2%s^0! They are in ^2%s^0 place", playerName, v.name, v.score, data.curScore, GetPlacement(k)))
            break
        end
    end
    table.sort(Leaderboards, compare) --Currently bugged, when player 1 is in first and player 2 is in second. Player 1 can take second by getting a score inbetween table entry 1 & 2
end)

function chatMessage(target, msg)
    TriggerClientEvent('chat:addMessage', target or -1, {
        color = { 255, 0, 0},
        multiline = true,
        args = {"[Drift] ", msg}
    })
end

function checkLeaderboard(identifier)
    for k, v in ipairs(Leaderboards) do
        if v.id == identifier then
            Leaderboards[k] = nil
        end
    end
    return true
end

function compare(a, b) --actual compare funtion. Need to check for player id's somehow...
    if a ~= nil and b ~= nil then
     return a.score > b.score  --I tried adding another compare here but that didnt work. 
    end
end

function GetPlacement(number)   --This doesnt work very well. (12nd place??)
    lastDigit = number % 10
    local placement = 'th'
    if lastDigit == 1 then
        placement = 'st'
    elseif lastDigit == 2 then
        placement = 'nd'
    elseif lastDigit == 3 then
        placement = 'rd'
    end
    return number .. placement
end

function clearLeaderboard()
    Leaderboards = {}
    chatMessage(-1, "The Drift leaderboard has been cleared!")
end

Citizen.CreateThread(function() --Code for timer to reset leaderboard 
    while true do
        while #Leaderboards == 0 do
            Citizen.Wait(0)
        end
        Citizen.Wait((LEADERBOARD_CLEAR_TIME * 1000 * 60) - (60 * 1000 * 5))
        chatMessage(-1, "The Drift Leaderboard is clearing in 5 minutes!")
        Citizen.Wait(1000 * 60 * 3)
        chatMessage(-1, "The Drift Leaderboard is clearing in 2 minutes!")
        Citizen.Wait(1000 * 60 * 1)
        chatMessage(-1, "The Drift Leaderboard is clearing in 1 minute!")
        Citizen.Wait(1000 * 60 * 1)
        clearLeaderboard()
    end
end)

The problem here is the code that adds to the leaderboards. If a player is only allowed to be on a leaderboard once , you should check for that!

Here's how I'd do it: If the player has beaten his/her personal best then attempt to add his new score to the leaderboards. Start from the lowest score on the leaderboard. For each score: If the score owner is equal to the player, delete this score (it's outdated). If the personal best is smaller than the currently inspected score, insert the personal best one below the current inspected score.

Doing so there won't be any duplicates.

Btw, compare function is just fine;)

But , just a friendly reminder:

a ~= nil and b ~= nil
--This is simpler and faster!
a and b

Remember that nil in Lua evaluates to false . Therefore, if you need to check if something holds value just:

if a then --This checks if a isn't false or nil
   --your code goes here
end

And also that line is not really useful in your comparing function. Hope that helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM