attempt to compare nil with number

Slyme

Участник
Автор темы
12
1
Версия MoonLoader
.026-beta
Всем привет, учу луа 2 дня и столкнулся с проблемой и хочу узнать как ее исправить. В общем у меня есть функция которая берет из массива координаты и проверяет попадают они под зону или нет, но ИНОГДА в консоли СФ появляется это:
праблем:
[ML] (script) KladmenV0.7.1.lua: Coord zone is:    -98.177215576172   -2188.9006347656   1101.8228759766   -988.90081787109
[ML] (script) KladmenV0.7.1.lua: Точка   361 -1747 5   входит в зону
[ML] (script) KladmenV0.7.1.lua: Точка   723 -1495 0.8   входит в зону
[ML] (script) KladmenV0.7.1.lua: Точка   609.4 -1872.8 7.4   входит в зону
[ML] (script) KladmenV0.7.1.lua: Точка   1031.1 -2076 22.4   входит в зону
[ML] (script) KladmenV0.7.1.lua: Точка   137.75 -1760.36 4.67   входит в зону
[ML] (error) KladmenV0.7.1.lua: ...GameWorld - GTA San Andreas\moonloader\KladmenV0.7.1.lua:1120: attempt to compare nil with number
stack traceback:
    ...GameWorld - GTA San Andreas\moonloader\KladmenV0.7.1.lua:1120: in function 'isPointInZone'
    ...GameWorld - GTA San Andreas\moonloader\KladmenV0.7.1.lua:1133: in function 'markers_check'
    ...GameWorld - GTA San Andreas\moonloader\KladmenV0.7.1.lua:1204: in function <...GameWorld - GTA San Andreas\moonloader\KladmenV0.7.1.lua:1203>
[ML] (error) KladmenV0.7.1.lua: Script died due to an error. (0EDA320C)
--Coord zone is:    -98.177215576172   -2188.9006347656   1101.8228759766   -988.90081787109 это результат регистрации команды /zp (в коде ниже видно)

А так же может быть и так, что все работает без проблем
сф консоль все гуд:
[ML] (script) KladmenV0.7.1.lua: Coord zone is:    -2480.8061523438   360.70733642578   -1280.8061523438   1560.7072753906
[ML] (script) KladmenV0.7.1.lua: Òî÷êà   -2427.25 489.24 29.92   âõîäèò â çîíó
[ML] (script) KladmenV0.7.1.lua: Òî÷êà   -1890 1369.3 0.4   âõîäèò â çîíó
[ML] (script) KladmenV0.7.1.lua: Òî÷êà   -1647.7 1279.4 6.5   âõîäèò â çîíó
[ML] (script) KladmenV0.7.1.lua: Òî÷êà   -1502.58 1373.73 2.66   âõîäèò â çîíó
-- и код полностью выполняет свою задачу


получение координат из общего массива и перебор их в зависимости от зоны:
function markers_check(coord, allCoords)

    if #coord ~= 0 then
        if coord:match('l: (.*); u: (.*); r: (.*); d: (.*)') then
            pLeft, pUp, pRight, pDown = coord:match('l: (.*); u: (.*); r: (.*); d: (.*)')
            cordtext = 'Coord zone is: '
            print(cordtext, pLeft, pUp, pRight, pDown)
            sampAddChatMessage('The territory has been successfully added to your map!', -1)
        else
            sampAddChatMessage('Insert normal coordinates!', -1)
            return
        end
    else
        sampAddChatMessage('It's empty here', -1)
        return
    end



    pLeft = tonumber(pLeft)
    pUp = tonumber(pUp)
    pRight = tonumber(pRight)
    pDown = tonumber(pDown)
    -- pLeft = tonumber(pLeft)
    -- pUp = tonumber(pUp)
    -- pRight = tonumber(pRight)
    -- pDown = tonumber(pDown)


    if pLeft == nil or pUp == nil or pRight == nil or pDown == nil then
        sampAddChatMessage('Error when parsing coordinates. Please check the input.', -1)
        return
    end


    local function isPointInZone(x, y)
        return x >= pLeft and x <= pRight and y >= pUp and y <= pDown
    end

local coords = {}


    for _, point in ipairs(allCoords) do
        local splitCoords = {}
        for coord in point:gmatch("%S+") do
            table.insert(splitCoords, tonumber(coord))
        end

        local x, y = splitCoords[1], splitCoords[2]
        local isInZone = isPointInZone(x, y)
        if isInZone then
            table.insert(coords, point)
            print("Точка", point, "In zone")
        end
    end


return coords
end
 
Решение
решение:
function markers_check(square, allCoords)

    local coords = {}
    -- l, u, r, d = square:match("l: (.-); u: (.-); r: (.-); d: (.-);")
    l, u, r, d = square:match("l: ([-%d.]+); u: ([-%d.]+); r: ([-%d.]+); d: ([-%d.]+)")

    -- l, u, r, d = square:match("l: (.-); u: (.-); r: (.-); d: (.-);")
    print(l,u,r,d)
    print('599 строка выше')



    if l and u and r and d then
        l, u, r, d = tonumber(l), tonumber(u), tonumber(r), tonumber(d)
        if l and u and r and d then -- ??????????????????????????????????????????????????????????????????????????
            for i, coord in ipairs(allCoords) do
                -- local x, y, z = coord:match("([%d.-]+), ([%d.-]+), ([%d.-]+)")
                local x, y, z =...

Slyme

Участник
Автор темы
12
1
решение:
function markers_check(square, allCoords)

    local coords = {}
    -- l, u, r, d = square:match("l: (.-); u: (.-); r: (.-); d: (.-);")
    l, u, r, d = square:match("l: ([-%d.]+); u: ([-%d.]+); r: ([-%d.]+); d: ([-%d.]+)")

    -- l, u, r, d = square:match("l: (.-); u: (.-); r: (.-); d: (.-);")
    print(l,u,r,d)
    print('599 строка выше')



    if l and u and r and d then
        l, u, r, d = tonumber(l), tonumber(u), tonumber(r), tonumber(d)
        if l and u and r and d then -- ??????????????????????????????????????????????????????????????????????????
            for i, coord in ipairs(allCoords) do
                -- local x, y, z = coord:match("([%d.-]+), ([%d.-]+), ([%d.-]+)")
                local x, y, z = coord:match("([%d.-]+) ([%d.-]+) ([%d.-]+)")
                
                x, y, z = tonumber(x), tonumber(y), tonumber(z)

                if x >= l and x <= r and y >= u and y <= d then
                    table.insert(coords, coord)
                end
            end
        else
            print("Не удалось преобразовать l, u, r, d в число из входных данных: ", square)
        end
    else
        print("Не удалось извлечь l, u, r, d из входных данных: ", square)
  

    end

    return coords
    
end