чс в скрипте

Joce

Участник
Автор темы
31
7
Версия MoonLoader
.026-beta
Не могу понять, что не так черный список не работает
Черный списко был реализован так, что если в массиве blackkist будет ид, который я вкинул через /bl, то он не будет использоваться в скрипте, но что-то он не воркает, хз даже с чем это связано, может сможете подсказать
Lua:
script_name('test')
script_author('gfgfg')
script_description('hghg')

require "lib.moonloader"
local sampev = require 'lib.samp.events'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local tag = "[pairs derby]: "
local main_color = "{FFF000}"

local cars = {
    400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415,
    416, 418, 419, 420, 421, 422, 423, 424, 426, 427, 428, 429, 431, 432, 433, 434,
    436, 437, 438, 439, 440, 442, 443, 444, 445, 448, 451, 455, 456, 457, 458, 459,
    461, 462, 463, 466, 467, 468, 469, 470, 471, 474, 475, 477, 478, 479, 480, 482,
    483, 484, 485, 486, 489, 490, 491, 494, 495, 496, 498, 499, 500, 502, 503, 504,
    505, 506, 507, 508, 514, 515, 516, 517, 518, 521, 522, 523, 524, 525, 526, 527,
    528, 529, 530, 531, 532, 533, 534, 535, 536, 540, 541, 542, 543, 544, 545, 546,
    547, 549, 550, 551, 552, 554, 555, 556, 557, 558, 559, 560, 562, 565, 566, 567,
    571, 572, 573, 574, 575, 576, 578, 579, 580, 581, 582, 583, 585, 586, 587, 588,
    589, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 609
}

function main()
    repeat wait(0) until isSampAvailable()

    sampAddChatMessage(tag .. "Скрипт запущен и готов к работе", 0xFFF000)
    sampAddChatMessage(tag .. "/dbtwo - Запуск выдачи рандомных каров, автоматической посадки и выдачи оружия", 0xFFF000)
    sampAddChatMessage(tag .. "/bl [ID] - Добавление игрока в черный список", 0xFFF000)
 
    sampRegisterChatCommand("dbtwo", cmd_dbtwo)
    sampRegisterChatCommand("bl", cmd_bl)
    wait(-1)
end

function setMarker(type, x, y, z, radius, color)
    deleteCheckpoint(marker)
    removeBlip(checkpoint)
    checkpoint = addBlipForCoord(x, y, z)
    marker = createCheckpoint(type, x, y, z, 1, 1, 1, radius)
    changeBlipColour(checkpoint, color)
    lua_thread.create(function()
    repeat
        wait(0)
        local x1, y1, z1 = getCharCoordinates(PLAYER_PED)
        until getDistanceBetweenCoords3d(x, y, z, x1, y1, z1) < radius or not doesBlipExist(checkpoint)
        deleteCheckpoint(marker) 
        removeBlip(checkpoint)
        addOneOffSound(0, 0, 0, 1149)
    end)
end

global_cID = nil
used_i_values = {}  -- отслеживание использованных id
group_counter = 0  -- номера групп
formed_groups = 0  -- количества сформированных групп
total_participants = 0  -- общее количества участников
blacklist = {} -- Табдица id, тех кого не будет видеть скрипт

function sampev.onServerMessage(color, text)
    if text:find("%[A%] .+%[%d+%] выдал временную машину игроку .+%[%d+%] %[%d+%] %- в интерьере") and color == -1347440641 then
        local aName, aID, pName, pID, cID = text:match("%[A%] (.+)%[(%d+)%] выдал временную машину игроку (.+)%[(%d+)%] %[(%d+)%] %- в интерьере")
        global_cID = cID
        -- глобалка cID к global_cID
    end
end

function getPlayerName(playerID)
    local playerName = sampGetPlayerNickname(playerID)
    return playerName or "Unknown"
end

function cmd_bl(playerID)
    if tonumber(playerID) then
        blacklist[tonumber(playerID)] = true
        sampAddChatMessage("Игрок с ID " .. playerID .. " добавлен в черный список.", 0xFFFFFF)
    else
        sampAddChatMessage("Используйте команду в формате: /bl [ID игрока]", 0xFFFFFF)
    end
end

function cmd_dbtwo(arg)
    give = not give
    lua_thread.create(function()
        local radius = arg:match('(%d+)')
        if radius then
            sampAddChatMessage(give and main_color..tag .. '{FFFFFF}Выдача запущена, ожидайте полного завершения' or main_color..tag .. 'Выдача закончила свою работу и была завершена', -1)
            group_counter = 0
            formed_groups = 0
            total_participants = 0
            for i = 0, sampGetMaxPlayerId(false), 1 do
                if sampIsPlayerConnected(i) and select(1, sampGetCharHandleBySampPlayerId(i)) then
                    if give and not used_i_values[i] and not blacklist[i] then
                        if not isCharInAnyCar(select(2, sampGetCharHandleBySampPlayerId(i))) then
                            local x, y, z = getCharCoordinates(select(2, sampGetCharHandleBySampPlayerId(i)))
                            local x1, y1, z1 = getCharCoordinates(PLAYER_PED)
                            local dist = getDistanceBetweenCoords3d(x, y, z, x1, y1, z1)
                            if dist < tonumber(radius) then
                                local rand = math.random(1, #cars)
                                sampSendChat('/plveh '..i..' '..cars[rand]..' 0')
                                wait(300)
                                sampSendChat('/smp Игрок ' ..i.. ' получил транспорт')
                                used_i_values[i] = true  -- отметка id как использованного
                                total_participants = total_participants + 1
                                wait(5000)
                                group_counter = group_counter + 1
                                local player1_name = getPlayerName(i)
                                local player2_name = ""
                              
                                if global_cID then
                                    for j = 0, sampGetMaxPlayerId(false), 1 do
                                        if sampIsPlayerConnected(j) and select(1, sampGetCharHandleBySampPlayerId(j)) then
                                            if not used_i_values[j] and not blacklist[j] then
                                                sampSendChat('/setincar '..j..' '..global_cID..' 1')
                                                wait(300)
                                                sampSendChat('/smp Игрок '..j..' был посажен в кар '..global_cID..)
                                                used_i_values[j] = true  -- отметка id как использованного
                                                formed_groups = formed_groups + 1
                                                total_participants = total_participants + 1
                                                player2_name = getPlayerName(j)
                                                break
                                            end
                                        end
                                    end
                                else
                                    sampAddChatMessage(main_color .. tag .. 'Значение cID ещё не установлено.', 0xFFFFFF)
                                end
                              
                                -- вывод сообщения о статусе группы
                                sampSendChat('/smp tag .. Группа ' .. group_counter .. ' сформирована. В составе группы ' .. player1_name .. ' и ' .. player2_name)
                                sampAddChatMessage(main_color .. tag .. 'Группа ' .. group_counter .. ' сформирована. В составе группы ' .. player1_name .. ' и ' .. player2_name, 0xFFFFFF)
                            end
                        end
                    end
                end
            end
            -- чистка таблицы used_i_values после завершения функции
            used_i_values = {}
            sampAddChatMessage(main_color .. tag .. '{FFFFFF}Выдача закончила свою работу и была завершена', -1)
            sampAddChatMessage(main_color .. tag .. 'Всего сформировано групп: ' .. formed_groups, 0xFFFFFF)
            sampAddChatMessage(main_color .. tag .. 'Всего участвовало человек: ' .. total_participants, 0xFFFFFF)
        else
            sampAddChatMessage(main_color .. tag .. '{FFFFFF}/dbtwo [radius]', -1)
        end
        give = false
    end)
end
 
Последнее редактирование:

wojciech?

Известный
Проверенный
352
236
попробуй добавить отладочные сообщения перед проверками на чс (мб так понятнее будет, что там идет не так):
Lua:
print(give, used_i_values[i], blacklist[i]) -- в консоль выведутся значения
if give and not used_i_values[i] and not blacklist[i] then

sampGetMaxPlayerId(false) не стоит использовать для таких целей, лучше:
Lua:
-- вместо:
for i = 0, sampGetMaxPlayerId(false), 1 do
    --
end

-- вот так:
for i = 0, 1000 do
    --
end

один раз получи хендл и используй его, а не 4 раза вызывай для одного игрока:
Lua:
local result, handle = sampGetCharHandleBySampPlayerId(i)

и я не очень понял зачем тебе вложенный цикл
 

Joce

Участник
Автор темы
31
7
Не могу понять, что не так черный список не работает
Черный списко был реализован так, что если в массиве blackkist будет ид, который я вкинул через /bl, то он не будет использоваться в скрипте, но что-то он не воркает, хз даже с чем это связано, может сможете подсказать
Lua:
script_name('test')
script_author('gfgfg')
script_description('hghg')

require "lib.moonloader"
local sampev = require 'lib.samp.events'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local tag = "[pairs derby]: "
local main_color = "{FFF000}"

local cars = {
    400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415,
    416, 418, 419, 420, 421, 422, 423, 424, 426, 427, 428, 429, 431, 432, 433, 434,
    436, 437, 438, 439, 440, 442, 443, 444, 445, 448, 451, 455, 456, 457, 458, 459,
    461, 462, 463, 466, 467, 468, 469, 470, 471, 474, 475, 477, 478, 479, 480, 482,
    483, 484, 485, 486, 489, 490, 491, 494, 495, 496, 498, 499, 500, 502, 503, 504,
    505, 506, 507, 508, 514, 515, 516, 517, 518, 521, 522, 523, 524, 525, 526, 527,
    528, 529, 530, 531, 532, 533, 534, 535, 536, 540, 541, 542, 543, 544, 545, 546,
    547, 549, 550, 551, 552, 554, 555, 556, 557, 558, 559, 560, 562, 565, 566, 567,
    571, 572, 573, 574, 575, 576, 578, 579, 580, 581, 582, 583, 585, 586, 587, 588,
    589, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 609
}

function main()
    repeat wait(0) until isSampAvailable()

    sampAddChatMessage(tag .. "Скрипт запущен и готов к работе", 0xFFF000)
    sampAddChatMessage(tag .. "/dbtwo - Запуск выдачи рандомных каров, автоматической посадки и выдачи оружия", 0xFFF000)
    sampAddChatMessage(tag .. "/bl [ID] - Добавление игрока в черный список", 0xFFF000)
 
    sampRegisterChatCommand("dbtwo", cmd_dbtwo)
    sampRegisterChatCommand("bl", cmd_bl)
    wait(-1)
end

function setMarker(type, x, y, z, radius, color)
    deleteCheckpoint(marker)
    removeBlip(checkpoint)
    checkpoint = addBlipForCoord(x, y, z)
    marker = createCheckpoint(type, x, y, z, 1, 1, 1, radius)
    changeBlipColour(checkpoint, color)
    lua_thread.create(function()
    repeat
        wait(0)
        local x1, y1, z1 = getCharCoordinates(PLAYER_PED)
        until getDistanceBetweenCoords3d(x, y, z, x1, y1, z1) < radius or not doesBlipExist(checkpoint)
        deleteCheckpoint(marker)
        removeBlip(checkpoint)
        addOneOffSound(0, 0, 0, 1149)
    end)
end

global_cID = nil
used_i_values = {}  -- отслеживание использованных id
group_counter = 0  -- номера групп
formed_groups = 0  -- количества сформированных групп
total_participants = 0  -- общее количества участников
blacklist = {} -- Табдица id, тех кого не будет видеть скрипт

function sampev.onServerMessage(color, text)
    if text:find("%[A%] .+%[%d+%] выдал временную машину игроку .+%[%d+%] %[%d+%] %- в интерьере") and color == -1347440641 then
        local aName, aID, pName, pID, cID = text:match("%[A%] (.+)%[(%d+)%] выдал временную машину игроку (.+)%[(%d+)%] %[(%d+)%] %- в интерьере")
        global_cID = cID
        -- глобалка cID к global_cID
    end
end

function getPlayerName(playerID)
    local playerName = sampGetPlayerNickname(playerID)
    return playerName or "Unknown"
end

function cmd_bl(playerID)
    if tonumber(playerID) then
        blacklist[tonumber(playerID)] = true
        sampAddChatMessage("Игрок с ID " .. playerID .. " добавлен в черный список.", 0xFFFFFF)
    else
        sampAddChatMessage("Используйте команду в формате: /bl [ID игрока]", 0xFFFFFF)
    end
end

function cmd_dbtwo(arg)
    give = not give
    lua_thread.create(function()
        local radius = arg:match('(%d+)')
        if radius then
            sampAddChatMessage(give and main_color..tag .. '{FFFFFF}Выдача запущена, ожидайте полного завершения' or main_color..tag .. 'Выдача закончила свою работу и была завершена', -1)
            group_counter = 0
            formed_groups = 0
            total_participants = 0
            for i = 0, sampGetMaxPlayerId(false), 1 do
                if sampIsPlayerConnected(i) and select(1, sampGetCharHandleBySampPlayerId(i)) then
                    if give and not used_i_values[i] and not blacklist[i] then
                        if not isCharInAnyCar(select(2, sampGetCharHandleBySampPlayerId(i))) then
                            local x, y, z = getCharCoordinates(select(2, sampGetCharHandleBySampPlayerId(i)))
                            local x1, y1, z1 = getCharCoordinates(PLAYER_PED)
                            local dist = getDistanceBetweenCoords3d(x, y, z, x1, y1, z1)
                            if dist < tonumber(radius) then
                                local rand = math.random(1, #cars)
                                sampSendChat('/plveh '..i..' '..cars[rand]..' 0')
                                wait(300)
                                sampSendChat('/smp Игрок ' ..i.. ' получил транспорт')
                                used_i_values[i] = true  -- отметка id как использованного
                                total_participants = total_participants + 1
                                wait(5000)
                                group_counter = group_counter + 1
                                local player1_name = getPlayerName(i)
                                local player2_name = ""
                            
                                if global_cID then
                                    for j = 0, sampGetMaxPlayerId(false), 1 do
                                        if sampIsPlayerConnected(j) and select(1, sampGetCharHandleBySampPlayerId(j)) then
                                            if not used_i_values[j] and not blacklist[j] then
                                                sampSendChat('/setincar '..j..' '..global_cID..' 1')
                                                wait(300)
                                                sampSendChat('/smp Игрок '..j..' был посажен в кар '..global_cID..)
                                                used_i_values[j] = true  -- отметка id как использованного
                                                formed_groups = formed_groups + 1
                                                total_participants = total_participants + 1
                                                player2_name = getPlayerName(j)
                                                break
                                            end
                                        end
                                    end
                                else
                                    sampAddChatMessage(main_color .. tag .. 'Значение cID ещё не установлено.', 0xFFFFFF)
                                end
                            
                                -- вывод сообщения о статусе группы
                                sampSendChat('/smp tag .. Группа ' .. group_counter .. ' сформирована. В составе группы ' .. player1_name .. ' и ' .. player2_name)
                                sampAddChatMessage(main_color .. tag .. 'Группа ' .. group_counter .. ' сформирована. В составе группы ' .. player1_name .. ' и ' .. player2_name, 0xFFFFFF)
                            end
                        end
                    end
                end
            end
            -- чистка таблицы used_i_values после завершения функции
            used_i_values = {}
            sampAddChatMessage(main_color .. tag .. '{FFFFFF}Выдача закончила свою работу и была завершена', -1)
            sampAddChatMessage(main_color .. tag .. 'Всего сформировано групп: ' .. formed_groups, 0xFFFFFF)
            sampAddChatMessage(main_color .. tag .. 'Всего участвовало человек: ' .. total_participants, 0xFFFFFF)
        else
            sampAddChatMessage(main_color .. tag .. '{FFFFFF}/dbtwo [radius]', -1)
        end
        give = false
    end)
end
Спасибо за помощь, и за замечания тоже, но там по другому быстро выкрутится было сложновато, искать какое-то решение было сложно, делалось все чисто из логики