Как оптимизировать код, исправив краш на non-suspended

RevoLVAshnik

Новичок
Автор темы
14
0
LUA:
lua_thread.create(function() -- Рендер
while true do
    wait(0)
if jfrender and preparecomplete then
for k, ped in pairs(getAllChars()) do
local result, checkid = sampGetPlayerIdByCharHandle(ped)
local nick = sampGetPlayerNickname(checkid)
    for k, v in ipairs(membersnicks) do
        if nick == v then
        if isCharOnScreen(ped) then
            local x, y, z = getCharCoordinates(ped)
            local mX, mY, mZ = getCharCoordinates(PLAYER_PED)
            local dist = getDistanceBetweenCoords3d(x, y, z, mX, mY, mZ)
            local _, id = sampGetPlayerIdByCharHandle(ped)
            local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
            if dist <= 20 and id ~= myid then
                local rx, ry, rz = convert3DCoordsToScreen(x, y, z)
                if membersranks[k] ~= "LEADER" then
                renderFontDrawText(dx9font, "РАНГ: " .. membersranks[k] .. "", rx - (renderGetFontDrawTextLength(dx9font, "Ранг: " .. membersranks[k] .. "") / 2), ry-100, 0xFF139BEC) -- рисуем текст
    else        renderFontDrawText(dx9font, "ЛИДЕР ПРОФСОЮЗА", rx - (renderGetFontDrawTextLength(dx9font, "ЛИДЕР ПРОФСОЮЗА") / 2), ry-100, 0xFF139BEC)
    end
            end
        end
    end
    end
end
end
end
end)
ПОмогите

UP
 
Последнее редактирование:
Решение
У тебя есть несколько ошибок:
  • Табулируй код, чтобы он был читабелен. Когда код весь «слеплен» – понять его невозможно. Если ты будешь дорабатывать свой скрипт в дальнейшем, то это является неотъемлемой частью.
  • Вместо pairs() используй ipairs(), так как именно эта функция проходит по всем элементам массива.
  • Если ты не используешь какой-то аргумент, то ставь прочерк. Например, в строке for k, ped in ipairs(getAllChars()) do тебе «k» не нужна, так поставь вместо неё прочерк: for _, ped in ipairs(getAllChars()) do
  • Кстати, ты использовал итератор «k» в обоих циклах: и в том, который проходится по всем игрокам, и в том, который проходится по списку ников. Из-за этого...

Vintik

Мечтатель
Проверенный
1,478
924
У тебя есть несколько ошибок:
  • Табулируй код, чтобы он был читабелен. Когда код весь «слеплен» – понять его невозможно. Если ты будешь дорабатывать свой скрипт в дальнейшем, то это является неотъемлемой частью.
  • Вместо pairs() используй ipairs(), так как именно эта функция проходит по всем элементам массива.
  • Если ты не используешь какой-то аргумент, то ставь прочерк. Например, в строке for k, ped in ipairs(getAllChars()) do тебе «k» не нужна, так поставь вместо неё прочерк: for _, ped in ipairs(getAllChars()) do
  • Кстати, ты использовал итератор «k» в обоих циклах: и в том, который проходится по всем игрокам, и в том, который проходится по списку ников. Из-за этого могла и, скорее всего, возникла ошибка.
  • Зачем-то ты два раза ищешь ID одного и того же игрока и записываешь его в переменные check_id и id. В чём смысл?
  • Маловероятная, но возможная ошибка: в зоне прорисовки есть NPC (например, квестовый персонаж), но когда ты пытаешься найти его ID - возникает ошибка, а далее ты пытаешься найти его ник по неопределённому («nil») ID. Я выделил другим цветом строки, где добавил на это проверку.
  • И совет по оптимизации: ты даже если нашёл игрока в массиве membersnicks, все равно продолжаешь искать его до конца списка. Вряд-ли задумано, что игрок может попасться более одного раза в списке, так что я добавил выход из цикла (break)
Если я нигде не ошибся, то код должен быть следующим:
Lua:
lua_thread.create(function() -- Рендер
    while true do
        wait(0)
        if jfrender and preparecomplete then
            for _, ped in ipairs(getAllChars()) do
                local result, id = sampGetPlayerIdByCharHandle(ped)
                if result then
                    local nick = sampGetPlayerNickname(id)
                    for k, v in ipairs(membersnicks) do
                        if nick == v then
                            if isCharOnScreen(ped) then
                                local x, y, z = getCharCoordinates(ped)
                                local mX, mY, mZ = getCharCoordinates(PLAYER_PED)
                                local dist = getDistanceBetweenCoords3d(x, y, z, mX, mY, mZ)
                                local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
                                if dist <= 20 and id ~= myid then
                                    local rx, ry = convert3DCoordsToScreen(x, y, z)
                                    if membersranks[k] ~= "LEADER" then
                                        renderFontDrawText(dx9font, "РАНГ: " .. membersranks[k] .. "", rx - (renderGetFontDrawTextLength(dx9font, "Ранг: " .. membersranks[k] .. "") / 2), ry-100, 0xFF139BEC) -- рисуем текст
                                    else
                                        renderFontDrawText(dx9font, "ЛИДЕР ПРОФСОЮЗА", rx - (renderGetFontDrawTextLength(dx9font, "ЛИДЕР ПРОФСОЮЗА") / 2), ry-100, 0xFF139BEC)
                                    end
                                end
                            end
                            break
                        end
                    end
                end
            end
        end
    end
end)
 

RevoLVAshnik

Новичок
Автор темы
14
0
У тебя есть несколько ошибок:
  • Табулируй код, чтобы он был читабелен. Когда код весь «слеплен» – понять его невозможно. Если ты будешь дорабатывать свой скрипт в дальнейшем, то это является неотъемлемой частью.
  • Вместо pairs() используй ipairs(), так как именно эта функция проходит по всем элементам массива.
  • Если ты не используешь какой-то аргумент, то ставь прочерк. Например, в строке for k, ped in ipairs(getAllChars()) do тебе «k» не нужна, так поставь вместо неё прочерк: for _, ped in ipairs(getAllChars()) do
  • Кстати, ты использовал итератор «k» в обоих циклах: и в том, который проходится по всем игрокам, и в том, который проходится по списку ников. Из-за этого могла и, скорее всего, возникла ошибка.
  • Зачем-то ты два раза ищешь ID одного и того же игрока и записываешь его в переменные check_id и id. В чём смысл?
  • Маловероятная, но возможная ошибка: в зоне прорисовки есть NPC (например, квестовый персонаж), но когда ты пытаешься найти его ID - возникает ошибка, а далее ты пытаешься найти его ник по неопределённому («nil») ID. Я выделил другим цветом строки, где добавил на это проверку.
  • И совет по оптимизации: ты даже если нашёл игрока в массиве membersnicks, все равно продолжаешь искать его до конца списка. Вряд-ли задумано, что игрок может попасться более одного раза в списке, так что я добавил выход из цикла (break)
Если я нигде не ошибся, то код должен быть следующим:
Lua:
lua_thread.create(function() -- Рендер
    while true do
        wait(0)
        if jfrender and preparecomplete then
            for _, ped in ipairs(getAllChars()) do
                local result, id = sampGetPlayerIdByCharHandle(ped)
                if result then
                    local nick = sampGetPlayerNickname(id)
                    for k, v in ipairs(membersnicks) do
                        if nick == v then
                            if isCharOnScreen(ped) then
                                local x, y, z = getCharCoordinates(ped)
                                local mX, mY, mZ = getCharCoordinates(PLAYER_PED)
                                local dist = getDistanceBetweenCoords3d(x, y, z, mX, mY, mZ)
                                local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
                                if dist <= 20 and id ~= myid then
                                    local rx, ry = convert3DCoordsToScreen(x, y, z)
                                    if membersranks[k] ~= "LEADER" then
                                        renderFontDrawText(dx9font, "РАНГ: " .. membersranks[k] .. "", rx - (renderGetFontDrawTextLength(dx9font, "Ранг: " .. membersranks[k] .. "") / 2), ry-100, 0xFF139BEC) -- рисуем текст
                                    else
                                        renderFontDrawText(dx9font, "ЛИДЕР ПРОФСОЮЗА", rx - (renderGetFontDrawTextLength(dx9font, "ЛИДЕР ПРОФСОЮЗА") / 2), ry-100, 0xFF139BEC)
                                    end
                                end
                            end
                            break
                        end
                    end
                end
            end
        end
    end
end)
Спасибо, я лично не учёл множество нюансов