Вопросы по Lua скриптингу

Общая тема для вопросов по разработке скриптов на языке программирования Lua, в частности под MoonLoader.
  • Задавая вопрос, убедитесь, что его нет в списке частых вопросов и что на него ещё не отвечали (воспользуйтесь поиском).
  • Поищите ответ в теме посвященной разработке Lua скриптов в MoonLoader
  • Отвечая, убедитесь, что ваш ответ корректен.
  • Старайтесь как можно точнее выразить мысль, а если проблема связана с кодом, то обязательно прикрепите его к сообщению, используя блок [code=lua]здесь мог бы быть ваш код[/code].
  • Если вопрос связан с MoonLoader-ом первым делом желательно поискать решение на wiki.

Частые вопросы

Как научиться писать скрипты? С чего начать?
Информация - Гайд - Всё о Lua скриптинге для MoonLoader(https://blast.hk/threads/22707/)
Как вывести текст на русском? Вместо русского текста у меня какие-то каракули.
Изменить кодировку файла скрипта на Windows-1251. В Atom: комбинация клавиш Ctrl+Shift+U, в Notepad++: меню Кодировки -> Кодировки -> Кириллица -> Windows-1251.
Как получить транспорт, в котором сидит игрок?
Lua:
local veh = storeCarCharIsInNoSave(PLAYER_PED)
Как получить свой id или id другого игрока?
Lua:
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получить свой ид
local _, id = sampGetPlayerIdByCharHandle(ped) -- получить ид другого игрока. ped - это хендл персонажа
Как проверить, что строка содержит какой-то текст?
Lua:
if string.find(str, 'текст', 1, true) then
-- строка str содержит "текст"
end
Как эмулировать нажатие игровой клавиши?
Lua:
local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
Все иды клавиш находятся в файле moonloader/lib/game/keys.lua.
Подробнее о функции setGameKeyState здесь: lua - setgamekeystate | BlastHack — DEV_WIKI(https://www.blast.hk/wiki/lua:setgamekeystate)
Как получить id другого игрока, в которого целюсь я?
Lua:
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
  local result, id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
  if result then -- проверить, прошло ли получение ида успешно
    -- здесь любые действия с полученным идом игрока
  end
end
Как зарегистрировать команду чата SAMP?
Lua:
-- До бесконечного цикла/задержки
sampRegisterChatCommand("mycommand", function (param)
     -- param будет содержать весь текст введенный после команды, чтобы разделить его на аргументы используйте string.match()
    sampAddChatMessage("MyCMD", -1)
end)
Крашит игру при вызове sampSendChat. Как это исправить?
Это происходит из-за бага в SAMPFUNCS, когда производится попытка отправки пакета определенными функциями изнутри события исходящих RPC и пакетов. Исправления для этого бага нет, но есть способ не провоцировать его. Вызов sampSendChat изнутри обработчика исходящих RPC/пакетов нужно обернуть в скриптовый поток с нулевой задержкой:
Lua:
function onSendRpc(id)
  -- крашит:
  -- sampSendChat('Send RPC: ' .. id)

  -- норм:
  lua_thread.create(function()
    wait(0)
    sampSendChat('Send RPC: ' .. id)
  end)
end
 
Последнее редактирование:

Wood_Goblin

Новичок
22
0
не может быть такого, что axleaX, axlebX, axleY и axleZ имеют значение, а twinExh нет
Я понимаю, что это выглядит дичайше глупо, но так это и работает. Вот полный скрипт:
Lua:
script_author("Wood_Goblin")
script_name("Exhaust Flame")
require "lib.moonloader"
local glob = require "lib.game.models"
local glob = require "lib.game.globals"
local bitex = require "lib.bitex"

function main()
    cjChar = getGameGlobal(glob.PLAYER_CHAR)
    cjPed = getGameGlobal(glob.PLAYER_ACTOR)
    while true do
        wait(0)
        bool1 = isPlayerPlaying(cjChar)
        bool2 = doesCharExist(cjPed)
        if bool1 == false or bool2 == false then
            cjChar = getGameGlobal(glob.PLAYER_CHAR)
            cjPed = getGameGlobal(glob.PLAYER_ACTOR)
        end

        if isCharInAnyCar(cjPed)
            and isCharInAnyBoat(cjPed) == false
            and isCharInAnyHeli(cjPed) == false
            and isCharInAnyPlane(cjPed) == false
            and isCharInFlyingVehicle(cjPed) == false
            and isCharInAnyTrain(cjPed) == false
        then
            wait(0)
            cjShowCar = storeCarCharIsInNoSave(cjPed)
            if isCharInCar(cjPed, cjShowCar) and doesVehicleExist(cjShowCar) then
                wait(0)
                if isCarDead(cjShowCar) == false then
                    exhaustCar(axleaX, axlebX, axleY, axleZ, twinExh)
                    exhaustDir(diraX, diraY, diraZ, dirbX, dirbY, dirbZ)
                    wait(0)
                    while true do
                        wait(0)
                        while isKeyDown(49) and isCarEngineOn(cjShowCar) do
                            if twinExh == 2 then
                                local particle1 = createFxSystemOnCarWithDirection("flamethrower", cjShowCar, axleaX, axleY, axleZ, diraX, diraY, diraZ, 1)
                                local particle2 = createFxSystemOnCarWithDirection("flamethrower", cjShowCar, axlebX, axleY, axleZ, dirbX, dirbY, dirbZ, 1)
                                playFxSystem(particle1)
                                playFxSystem(particle2)
                            end
                            if twinExh == 1 then
                                local particle3 = createFxSystemOnCarWithDirection("flamethrower", cjShowCar, axleaX, axleY, axleZ, dirbX, dirbY, dirbZ, 1)
                                playFxSystem(particle3)
                            end
                            wait(0)
                            if wasKeyReleased(49) or isCarDead(cjShowCar) or isCarEngineOn(cjShowCar) == false or doesVehicleExist(cjShowCar) == false then
                                wait(0)
                                if twinExh == 2 then
                                    killFxSystem(particle1)
                                    killFxSystem(particle2)
                                end
                                if twinExh == 1 then
                                    killFxSystem(particle3)
                                end
                            end
                        end
                        if not isCharInCar(cjPed, cjShowCar) then
                            wait(0)
                            if twinExh == 2 then
                                playAndKillFxSystem(particle1)
                                playAndKillFxSystem(particle2)
                            end
                            if twinExh == 1 then
                                playAndKillFxSystem(particle3)
                            end
                            wait(10)
                            local deleteCar = markCarAsNoLongerNeeded(cjShowCar)
                            break
                        end
                    end
                end
            end
        end
    end
end

function exhaustCar()
    structCarA = readMemory(0xBA18FC, 4, false)
    --[[ Vehicle CPED Pointer
    заменил сразу несколько проверок, это указатель на машину игрока.
    если он есть, то игрок существует, и игрок в авто, причем structCarA это сразу структура ]]
    if structCarA ~= nil then -- указатель есть
        local axleExhaustOneX = 0.0
        local axleExhaustTwoX = 0.0
        local axleExhaustY = 0.0
        local axleExhaustZ = 0.0
        local doubleExh = 0
        local exhFindA = structCarA + 0x22 -- получаем ID модели (индекс модели) Vehicle Car-ID & Car-Name
        local exhFindA = readMemory(exhFindA, 2, false) -- сканируем индекс модели (model index)
        local exhFindA = exhFindA * 4 -- переходим в подструктуру
        local exhFindA = exhFindA + 0xA9B0C8 -- получаем указатель на структуру CModel
        local exhFindA = readMemory(exhFindA, 4, false) -- сканируем CModel
        local exhFindA = exhFindA + 0x5C -- получаем ускорение по трём осям (RwV3D vector)
        local exhFindA = readMemory(exhFindA, 4, false) -- сканируем RwV3D vector по структуре модели машины
        local exhFindA = exhFindA + 0x48 -- вычисление координат глушителя (exhaust (dummy))
        local axleExhaustOneX = representIntAsFloat(readMemory(exhFindA, 4, false)) -- ось X
        local exhFindA = exhFindA + 0x4
        local axleExhaustY = representIntAsFloat(readMemory(exhFindA, 4, false)) -- ось Y
        local exhFindA = exhFindA + 0x4
        local axleExhaustZ = representIntAsFloat(readMemory(exhFindA, 4, false)) -- ось Z
        local structCarB = getCarPointer(cjShowCar) -- получаем структуру cjShowCar
        local exhDoudleA = structCarB + 0x384 -- смещение указывает на файл handling.cfg (для проверки настроек и флагов транспорта)
        local exhDoudleA = readMemory(exhDoudleA, 4, false) -- получили указатель на handling-структуру
        local exhDoudleA = exhDoudleA + 0xCC -- флаги транспорта (из файа handling.cfg) (проверка на наличие второго глушителя)
        local exhDoudleB = readMemory(exhDoudleA, 4, false) -- сканируем флаги настройки машины из файа handling.cfg
        bit = bitex.bextract(exhDoudleB, 13, 1)
        if bitex.bextract(exhDoudleB, 13, 1) == 1 then -- если установлено 2 глушителя
            local doubleExh = 2
            local axleExhaustTwoX = axleExhaustOneX * -1.0 -- вычисление координат по оси X для второго глушителя (зеркально отразить в плоскости)
        end
        if bitex.bextract(exhDoudleB, 13, 1) == 0 then -- если установлен 1 глушитель
            local doubleExh = 1
        end
        if doubleExh ~= nil and axleExhaustOneX ~= nil and axleExhaustY ~= nil and axleExhaustZ ~= nil then
            axleaX = axleExhaustOneX
            axlebX = axleExhaustTwoX
            axleY = axleExhaustY
            axleZ = axleExhaustZ
            twinExh = doubleExh
            return axleaX, axlebX, axleY, axleZ, twinExh
        end
    end
end

function exhaustDir()
    diraX = -90.0
    diraY = -90.0
    diraZ = 0.0
    dirbX = 0.0
    dirbY = -90.0
    dirbZ = 90.0
    return diraX, diraY, diraZ, dirbX, dirbY, dirbZ
end

Т.е. координаты глушака находит и передаёт, а вот twinExh почему-то пустой. Хотя doubleExh вроде как принимает какое-то значение.
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Ты очень странно вызываешь функции (не говорю что это точно решит проблему).
Функции не так возвращают значения, а что-то вроде:
Lua:
function main()
    local funcResult = someFunc(0, 1)
    print(funcResult)
end

-- ...

function someFunc(argument1, argument2)
    local result = 0

    if argument1 == 1 and argument2 == 1 then
        result = 3 -- OR return 3
    elseif argument1 == 1 then
        result = 1 -- OR return 1
    elseif argument2 == 1 then
        result = 2 -- OR return 2
    end

    return result -- OR return 0
end
 
  • Нравится
Реакции: Wood_Goblin

Wood_Goblin

Новичок
22
0
Ты очень странно вызываешь функции (не говорю что это точно решит проблему).
Функции не так возвращают значения, а что-то вроде:
Lua:
function main()
    local funcResult = someFunc(0, 1)
    print(funcResult)
end

-- ...

function someFunc(argument1, argument2)
    local result = 0

    if argument1 == 1 and argument2 == 1 then
        result = 3 -- OR return 3
    elseif argument1 == 1 then
        result = 1 -- OR return 1
    elseif argument2 == 1 then
        result = 2 -- OR return 2
    end

    return result -- OR return 0
end

Спасибо, пойду дальше думать. А bitex правильно использован?
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
В плане? То, что правильно используешь - да, правильно выбираешь бит - не знаю.
 

Wood_Goblin

Новичок
22
0
В плане? То, что правильно используешь - да, правильно выбираешь бит - не знаю.
Да, я об использовании. На счёт бита я уже и сам не уверен. Я его взял из cleo, который год назад писал. Там именно 13 бит используется. Есть несколько других скриптов (от разных авторов), в которых этот-же бит в качестве аргумента идёт. Но, на всякий случай - попробую и с этим значением поэкспериментировать.

UPD:
Починил функцию, работает. Спасибо за помощь. :good: :thank_you:Буду с кнопками разбираться (конструкцию не правильно написал :().
 
Последнее редактирование:

Bogach

Активный
558
27
Ребят, у меня такая проблема. Делаю типа черного списка для смс, и появилась небольшая проблема. Когда игрок который у меня в черном списке пишет мне смс переменной CheckTrue присваивается true, далее, если переменная CheckTrue равняется true то срабатывает это "return false" - это не показывает нам смс от игрока в чс, но после return false ничего нельзя написать и поэтому обнулить переменную CheckTrue не получается, а если её не обнулить, то у меня не показывается не только смска от ненужного нам человека, но и эмоции "))", "((", "=0", может что - то ещё, не знаю. Помогите мне решить проблему? Может быть я что - то не правильно сделал? Может есть какой - то другой вариант? Заранее спасибо за помощь.
Lua:
script_name("SMS автоответчик")
script_author("Jon_Cameron")

-- Загружаем библиотки
require("lib.moonloader")
local sampev = require("lib.samp.events")
local inicfg = require "inicfg"

--Общие переменные.
local pSMS = 0
local smstext
local smsnick
local smsnomer
local playername
local SMSGO = 0
local telnomer
local telnick
local pTelGO = false
local SMSBL
local CheckTrue = false

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("asms", autootvetsms)
    sampRegisterChatCommand("smsbl", SMS_BlackList)

    --Создаем папку autoreport
        if not doesDirectoryExist("moonloader\\SMSBlackList")
        then createDirectory("moonloader\\SMSBlackList")
        end
    --Создаем файл autoreport.txt
        if not doesFileExist("moonloader\\SMSBlackList\\SMSBlackList.txt")
      then
          local file2 = io.open("moonloader\\SMSBlackList\\SMSBlackList.txt", "w")
          io.close(file2)
          sampAddChatMessage("[SMS Автоответчик]: {FFFFFF}SMSBlackList.txt успешно создан.", 25023851)
     end

    repeat
    wait(0)
    until sampIsLocalPlayerSpawned()
    local spawnID = sampGetPlayerIdByCharHandle(playerPed)
    playername = sampGetPlayerNickname(spawnID)
    while true do
    wait(0)
        -- Автоответчик на смс
        if SMSGO == 1 then
            if smsnomer ~= nil then
                 print(smsnick)
                 sampSendChat(string.format("/sms %d Здравствуйте. Я сейчас очень занят, напишите позже.", smsnomer))
                 SMSGO = 0
            end
        end
        -- Автоответчик на телефон
        if pTelGO == true then
             sampSendChat("/p")
             wait(1000)
             sampSendChat("[Автоответчик]: Добрый день, на данный момент я очень сильно занят...")
             wait(1000)
             sampSendChat("Оставьте своё сообщение, я его обязательно прослушаю.")
             wait(2000)
             sampSendChat("(( Отпишитесь мне в /sms ))")
             wait(1000)
             sampSendChat("/h")
             pTelGO = false
        end
    end
end

function autootvetsms()
    if pSMS == 0 then
         sampAddChatMessage("[Автоответчик]: {FFFFFF}Автоответ в SMS активирован.", 25023851)
         pSMS = 1
    elseif pSMS == 1 then
         sampAddChatMessage("[Автоответчик]: {FFFFFF}Автоответ в SMS деактивирован.", 25023851)
         pSMS = 0
    end
end

function SMS_BlackList(args)
    SMSBL = string.match(args, "%d+")
    if SMSBL == nil then
         sampAddChatMessage("{d6d6d6}Используйте /smsbl [Ид игрока]", 0xFFFFFFFF)
    else
         if sampIsPlayerConnected(SMSBL) then
              local smsbl = io.open("moonloader\\SMSBlackList\\SMSBlackList.txt", "a")
                local smsblnick = sampGetPlayerNickname(SMSBL)
                smsbl:write(smsblnick .. "\n")
                io.close(smsbl)
         end
    end
end

function sampev.onServerMessage(color, text)
    if pSMS == 1 then
         local smsbl = io.open("moonloader\\SMSBlackList\\SMSBlackList.txt", "r+")
         smstext, smsnick, smsnomer = string.match(text, "SMS(.+)|.+Отправитель..(%a+_%a+).+т.(%d+).")
         if smstext ~= nil and smsnick ~= nil and smsnomer ~= nil and smsnick ~= playername then
              print(smsnick, smsnomer)
                for lines in smsbl:lines() do
                     if smsnick == lines then
                          CheckTrue = true
                     else
                         CheckTrue = false
                     end
                     break
                end
         end
         telnomer, telnick = string.match(text, "Входящий.+|.Номер:.(.+)...........Вызывает.(.+)")
         if telnomer ~= nil and telnick ~= nil then
                 print(telnomer, telnick)
                 pTelGO = true
          end
         if CheckTrue then
              return false
        else
              SMSGO = 1
        end
    end
end
 

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,338
Ребят, у меня такая проблема. Делаю типа черного списка для смс, и появилась небольшая проблема. Когда игрок который у меня в черном списке пишет мне смс переменной CheckTrue присваивается true, далее, если переменная CheckTrue равняется true то срабатывает это "return false" - это не показывает нам смс от игрока в чс, но после return false ничего нельзя написать и поэтому обнулить переменную CheckTrue не получается, а если её не обнулить, то у меня не показывается не только смска от ненужного нам человека, но и эмоции "))", "((", "=0", может что - то ещё, не знаю. Помогите мне решить проблему? Может быть я что - то не правильно сделал? Может есть какой - то другой вариант? Заранее спасибо за помощь.
Lua:
script_name("SMS автоответчик")
script_author("Jon_Cameron")

-- Загружаем библиотки
require("lib.moonloader")
local sampev = require("lib.samp.events")
local inicfg = require "inicfg"

--Общие переменные.
local pSMS = 0
local smstext
local smsnick
local smsnomer
local playername
local SMSGO = 0
local telnomer
local telnick
local pTelGO = false
local SMSBL
local CheckTrue = false

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("asms", autootvetsms)
    sampRegisterChatCommand("smsbl", SMS_BlackList)

    --Создаем папку autoreport
        if not doesDirectoryExist("moonloader\\SMSBlackList")
        then createDirectory("moonloader\\SMSBlackList")
        end
    --Создаем файл autoreport.txt
        if not doesFileExist("moonloader\\SMSBlackList\\SMSBlackList.txt")
      then
          local file2 = io.open("moonloader\\SMSBlackList\\SMSBlackList.txt", "w")
          io.close(file2)
          sampAddChatMessage("[SMS Автоответчик]: {FFFFFF}SMSBlackList.txt успешно создан.", 25023851)
     end

    repeat
    wait(0)
    until sampIsLocalPlayerSpawned()
    local spawnID = sampGetPlayerIdByCharHandle(playerPed)
    playername = sampGetPlayerNickname(spawnID)
    while true do
    wait(0)
        -- Автоответчик на смс
        if SMSGO == 1 then
            if smsnomer ~= nil then
                 print(smsnick)
                 sampSendChat(string.format("/sms %d Здравствуйте. Я сейчас очень занят, напишите позже.", smsnomer))
                 SMSGO = 0
            end
        end
        -- Автоответчик на телефон
        if pTelGO == true then
             sampSendChat("/p")
             wait(1000)
             sampSendChat("[Автоответчик]: Добрый день, на данный момент я очень сильно занят...")
             wait(1000)
             sampSendChat("Оставьте своё сообщение, я его обязательно прослушаю.")
             wait(2000)
             sampSendChat("(( Отпишитесь мне в /sms ))")
             wait(1000)
             sampSendChat("/h")
             pTelGO = false
        end
    end
end

function autootvetsms()
    if pSMS == 0 then
         sampAddChatMessage("[Автоответчик]: {FFFFFF}Автоответ в SMS активирован.", 25023851)
         pSMS = 1
    elseif pSMS == 1 then
         sampAddChatMessage("[Автоответчик]: {FFFFFF}Автоответ в SMS деактивирован.", 25023851)
         pSMS = 0
    end
end

function SMS_BlackList(args)
    SMSBL = string.match(args, "%d+")
    if SMSBL == nil then
         sampAddChatMessage("{d6d6d6}Используйте /smsbl [Ид игрока]", 0xFFFFFFFF)
    else
         if sampIsPlayerConnected(SMSBL) then
              local smsbl = io.open("moonloader\\SMSBlackList\\SMSBlackList.txt", "a")
                local smsblnick = sampGetPlayerNickname(SMSBL)
                smsbl:write(smsblnick .. "\n")
                io.close(smsbl)
         end
    end
end

function sampev.onServerMessage(color, text)
    if pSMS == 1 then
         local smsbl = io.open("moonloader\\SMSBlackList\\SMSBlackList.txt", "r+")
         smstext, smsnick, smsnomer = string.match(text, "SMS(.+)|.+Отправитель..(%a+_%a+).+т.(%d+).")
         if smstext ~= nil and smsnick ~= nil and smsnomer ~= nil and smsnick ~= playername then
              print(smsnick, smsnomer)
                for lines in smsbl:lines() do
                     if smsnick == lines then
                          CheckTrue = true
                     else
                         CheckTrue = false
                     end
                     break
                end
         end
         telnomer, telnick = string.match(text, "Входящий.+|.Номер:.(.+)...........Вызывает.(.+)")
         if telnomer ~= nil and telnick ~= nil then
                 print(telnomer, telnick)
                 pTelGO = true
          end
         if CheckTrue then
              return false
        else
              SMSGO = 1
        end
    end
end
перед return false дописать CheckTrue = false не варик?
 

Bogach

Активный
558
27
В общем, булевую переменную нельзя было использовать для этих целей, так как на значение true у меня стоял return false, а на значении false стоял автоответ на смс, поэтому перешел на переменную типа int, но и тут загвоздка, при использовании переменной типа int у меня срабатывало только автоответ в смс, т.е CheckTrue = 2, хотя странно, что я присваивал значения и 0 и 3 бесполезно
Lua:
function sampev.onServerMessage(color, text)
    if pSMS == 1 then
         local smsbl = io.open("moonloader\\SMSBlackList\\SMSBlackList.txt", "r+")
         smstext, smsnick, smsnomer = string.match(text, "SMS(.+)|.+Отправитель..(%a+_%a+).+т.(%d+).")
         if smstext ~= nil and smsnick ~= nil and smsnomer ~= nil and smsnick ~= playername then
              print(smsnick, smsnomer)
                for lines in smsbl:lines() do
                     if string.find(smsnick, lines) then
                          CheckTrue = 1
                     else
                         CheckTrue = 2
                     end
                     break
                end
         end
         telnomer, telnick = string.match(text, "Входящий.+|.Номер:.(.+)...........Вызывает.(.+)")
         if telnomer ~= nil and telnick ~= nil then
                 print(telnomer, telnick)
                 pTelGO = true
          end
         if CheckTrue == 1 then
              --CheckTrue = 3
              return false
        elseif CheckTrue == 2 then
              SMSGO = 1
        end
    end
end
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Lua:
script_name("SMS автоответчик")
script_author("Jon_Cameron")

-- Загружаем библиотки
require("lib.moonloader")
local sampev = require("lib.samp.events")
local inicfg = require "inicfg"

--Общие переменные.
local pSMS = 0
local smstext
local smsnick
local smsnomer
local playername
local SMSGO = 0
local telnomer
local telnick
local pTelGO = false
local SMSBL
local CheckTrue = false

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("asms", autootvetsms)
    sampRegisterChatCommand("smsbl", SMS_BlackList)

    --Создаем папку autoreport
        if not doesDirectoryExist("moonloader\\SMSBlackList")
        then createDirectory("moonloader\\SMSBlackList")
        end
    --Создаем файл autoreport.txt
        if not doesFileExist("moonloader\\SMSBlackList\\SMSBlackList.txt")
      then
          local file2 = io.open("moonloader\\SMSBlackList\\SMSBlackList.txt", "w")
          io.close(file2)
          sampAddChatMessage("[SMS Автоответчик]: {FFFFFF}SMSBlackList.txt успешно создан.", 25023851)
     end

    repeat
    wait(0)
    until sampIsLocalPlayerSpawned()
    local spawnID = sampGetPlayerIdByCharHandle(playerPed)
    playername = sampGetPlayerNickname(spawnID)
    while true do
    wait(0)
        -- Автоответчик на смс
        if SMSGO == 1 then
            if SMSGO_nomer ~= nil then
                 print(smsnick)
                 sampSendChat(string.format("/sms %d Здравствуйте. Я сейчас очень занят, напишите позже.", SMSGO_nomer))
                 SMSGO = 0
            end
        end
        -- Автоответчик на телефон
        if pTelGO == true then
             sampSendChat("/p")
             wait(1000)
             sampSendChat("[Автоответчик]: Добрый день, на данный момент я очень сильно занят...")
             wait(1000)
             sampSendChat("Оставьте своё сообщение, я его обязательно прослушаю.")
             wait(2000)
             sampSendChat("(( Отпишитесь мне в /sms ))")
             wait(1000)
             sampSendChat("/h")
             pTelGO = false
        end
    end
end

function autootvetsms()
    if pSMS == 0 then
         sampAddChatMessage("[Автоответчик]: {FFFFFF}Автоответ в SMS активирован.", 25023851)
         pSMS = 1
    elseif pSMS == 1 then
         sampAddChatMessage("[Автоответчик]: {FFFFFF}Автоответ в SMS деактивирован.", 25023851)
         pSMS = 0
    end
end

function SMS_BlackList(args)
    SMSBL = string.match(args, "%d+")
    if SMSBL == nil then
         sampAddChatMessage("{d6d6d6}Используйте /smsbl [Ид игрока]", 0xFFFFFFFF)
    else
         if sampIsPlayerConnected(SMSBL) then
              local smsbl = io.open("moonloader\\SMSBlackList\\SMSBlackList.txt", "a")
                local smsblnick = sampGetPlayerNickname(SMSBL)
                smsbl:write(smsblnick .. "\n")
                io.close(smsbl)
         end
    end
end

function sampev.onServerMessage(color, text)
    local ignore = false
 
    if pSMS == 1 then
        smstext, smsnick, smsnomer = string.match(text, "SMS(.+)|.+Отправитель..(%a+_%a+).+т.(%d+).")
        if smstext ~= nil and smsnick ~= nil and smsnomer ~= nil and smsnick ~= playername then
            print(smsnick, smsnomer)

            local smsbl = io.open("moonloader\\SMSBlackList\\SMSBlackList.txt", "r+")
            if smsbl ~= nil then
                for lines in smsbl:lines() do
                    if smsnick == lines then
                        ignore = true
                        break
                    end
                end
                smsbl:close()
            end
         
            if not ignore then
                SMSGO_nomer = smsnomer
                SMSGO = 1
            end
        else
            telnomer, telnick = string.match(text, "Входящий.+|.Номер:.(.+)...........Вызывает.(.+)")
            if telnomer ~= nil and telnick ~= nil then
                print(telnomer, telnick)
                pTelGO = true
            end
        end
    end
 
    if ignore then
        return false
    end
end

Хуже твоего кода я наверно видел только реализацию ИИ на паскале (а я её не видел).
 
  • Нравится
Реакции: FYP

Bogach

Активный
558
27
Lua:
script_name("SMS автоответчик")
script_author("Jon_Cameron")

-- Загружаем библиотки
require("lib.moonloader")
local sampev = require("lib.samp.events")
local inicfg = require "inicfg"

--Общие переменные.
local pSMS = 0
local smstext
local smsnick
local smsnomer
local playername
local SMSGO = 0
local telnomer
local telnick
local pTelGO = false
local SMSBL
local CheckTrue = false

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("asms", autootvetsms)
    sampRegisterChatCommand("smsbl", SMS_BlackList)

    --Создаем папку autoreport
        if not doesDirectoryExist("moonloader\\SMSBlackList")
        then createDirectory("moonloader\\SMSBlackList")
        end
    --Создаем файл autoreport.txt
        if not doesFileExist("moonloader\\SMSBlackList\\SMSBlackList.txt")
      then
          local file2 = io.open("moonloader\\SMSBlackList\\SMSBlackList.txt", "w")
          io.close(file2)
          sampAddChatMessage("[SMS Автоответчик]: {FFFFFF}SMSBlackList.txt успешно создан.", 25023851)
     end

    repeat
    wait(0)
    until sampIsLocalPlayerSpawned()
    local spawnID = sampGetPlayerIdByCharHandle(playerPed)
    playername = sampGetPlayerNickname(spawnID)
    while true do
    wait(0)
        -- Автоответчик на смс
        if SMSGO == 1 then
            if SMSGO_nomer ~= nil then
                 print(smsnick)
                 sampSendChat(string.format("/sms %d Здравствуйте. Я сейчас очень занят, напишите позже.", SMSGO_nomer))
                 SMSGO = 0
            end
        end
        -- Автоответчик на телефон
        if pTelGO == true then
             sampSendChat("/p")
             wait(1000)
             sampSendChat("[Автоответчик]: Добрый день, на данный момент я очень сильно занят...")
             wait(1000)
             sampSendChat("Оставьте своё сообщение, я его обязательно прослушаю.")
             wait(2000)
             sampSendChat("(( Отпишитесь мне в /sms ))")
             wait(1000)
             sampSendChat("/h")
             pTelGO = false
        end
    end
end

function autootvetsms()
    if pSMS == 0 then
         sampAddChatMessage("[Автоответчик]: {FFFFFF}Автоответ в SMS активирован.", 25023851)
         pSMS = 1
    elseif pSMS == 1 then
         sampAddChatMessage("[Автоответчик]: {FFFFFF}Автоответ в SMS деактивирован.", 25023851)
         pSMS = 0
    end
end

function SMS_BlackList(args)
    SMSBL = string.match(args, "%d+")
    if SMSBL == nil then
         sampAddChatMessage("{d6d6d6}Используйте /smsbl [Ид игрока]", 0xFFFFFFFF)
    else
         if sampIsPlayerConnected(SMSBL) then
              local smsbl = io.open("moonloader\\SMSBlackList\\SMSBlackList.txt", "a")
                local smsblnick = sampGetPlayerNickname(SMSBL)
                smsbl:write(smsblnick .. "\n")
                io.close(smsbl)
         end
    end
end

function sampev.onServerMessage(color, text)
    local ignore = false

    if pSMS == 1 then
        smstext, smsnick, smsnomer = string.match(text, "SMS(.+)|.+Отправитель..(%a+_%a+).+т.(%d+).")
        if smstext ~= nil and smsnick ~= nil and smsnomer ~= nil and smsnick ~= playername then
            print(smsnick, smsnomer)

            local smsbl = io.open("moonloader\\SMSBlackList\\SMSBlackList.txt", "r+")
            if smsbl ~= nil then
                for lines in smsbl:lines() do
                    if smsnick == lines then
                        ignore = true
                        break
                    end
                end
                smsbl:close()
            end
        
            if not ignore then
                SMSGO_nomer = smsnomer
                SMSGO = 1
            end
        else
            telnomer, telnick = string.match(text, "Входящий.+|.Номер:.(.+)...........Вызывает.(.+)")
            if telnomer ~= nil and telnick ~= nil then
                print(telnomer, telnick)
                pTelGO = true
            end
        end
    end

    if ignore then
        return false
    end
end

Хуже твоего кода я наверно видел только реализацию ИИ на паскале (а я её не видел).
Спасибо большое, друг. А в таком случае переменная smsnomer в цикле будет с значением nil ?