Вопросы по 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
 
Последнее редактирование:

BARRY BRADLEY

Известный
711
176
У меня есть ссылка с api телеграма по которой бот отправляет мне сообщение, как открыть эту ссылку и чтоб браузер не открылся?
Где то в конце скрипта:
Lua:
function asyncHttpRequest(method, url, args, resolve, reject)
   local request_thread = effil.thread(function (method, url, args)
      local requests = require 'requests'
      local result, response = pcall(requests.request, method, url, args)
      if result then
         response.json, response.xml = nil, nil
         return true, response
      else
         return false, response
      end
   end)(method, url, args)
   if not resolve then resolve = function() end end
   if not reject then reject = function() end end
    lua_thread.create(function() 
      local runner = request_thread
      while true do
         local status, err = runner:status()
         if not err then
            if status == 'completed' then
               local result, response = runner:get()
               if result then
                  resolve(response)
               else
                  reject(response)
               end
               return
            elseif status == 'canceled' then
               return reject(status)
            end
         else
            return reject(err)
         end
         wait(0)
      end
   end) 
end

Код который вызывает функцию и отправляет в телеграмм сообщение:
Код:
asyncHttpRequest("GET", 'https://api.telegram.org/botтипа_токен/sendMessage?chat_id=типа_ид?text="Hello"', _, function (response) print(response.text) end, function (err) print(err) end)
 
  • Нравится
Реакции: neverlane

Joni Scripts

Известный
535
374
При использовании RadioButton выдает ошибку
Код:
[ML] (error) Mine-Bot_VILLAGE_RP.lua: D:\MEETEN GTA\moonloader\234234234.lua:261: sol: no matching function call takes this number of arguments and the specified types
stack traceback:
    [C]: in function 'RadioButton'
    D:\MEETEN GTA\moonloader\23423424.lua:261: in function 'OnDrawFrame'
    D:\MEETEN GTA\moonloader\lib\imgui.lua:1378: in function <D:\MEETEN GTA\moonloader\lib\imgui.lua:1367>
 

[SA ARZ]

Известный
392
8
вырезаю эти функции - скрипт не крашит, возвращаю их - крашит

code:
if isKeyJustPressed(VK_1) and not sampIsChatInputActive() and not sampIsDialogActive() and not sampIsScoreboardOpen() and not isSampfuncsConsoleActive() then
            local result, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
            local table = {
                'Здравия желаю',
                'здравия желаю'
            }
            if result then
                local tdd, id = sampGetPlayerIdByCharHandle(ped)
                if tdd then
                    if systemMO then
                        sampSendChat("/anim 59")
                        wait(150)
                        if getCharModel(ped) == 191 then -- бабоскин на "мэм"
                            sampSendChat("/todo Поприветствовав женщину в форме*"..table[math.random(1, #table)]..", мэм.")
                        elseif getCharModel(ped) == 73 or getCharModel(ped) == 179 or getCharModel(ped) == 253 or getCharModel(ped) == 255 or getCharModel(ped) == 287 or getCharModel(ped) == 61 then -- мужиков на "мистер"
                            sampSendChat("/todo Поприветствовав военного*"..table[math.random(1, #table)]..", мистер "..string.gsub(sampGetPlayerNickname(id), ".*_", "").."!")
                        else -- бомжей как обычно
                            sampSendChat("/todo Поприветствовав человека напротив*"..table[math.random(1, #table)].."!")
                        end
                    end
                end
            end
        end
        if isKeyJustPressed(VK_G) and not sampIsChatInputActive() and not sampIsDialogActive() and not sampIsScoreboardOpen() and not isSampfuncsConsoleActive() then
            local result, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
            if result then
                local tdd, id = sampGetPlayerIdByCharHandle(ped)
                if tdd then
                    if systemGOV and (NumRangPlayer >= 1 and NumRangPlayer <= 2) then
                        sampShowDialog(1020, "Взаимодействие » "..sampGetPlayerNickname(id):gsub("_", " ").."["..id.."]", "{1E90FF}1. {F5FFFA}Предупреждение.\n{1E90FF}2. {F5FFFA}Попросить вести себя культурно.\n{1E90FF}3. {F5FFFA}Схватит за куртку.\n{1E90FF}4. {F5FFFA}Дубинка.\n{1E90FF}5. {F5FFFA}Выстрелить резиновыми пулями.", "Выбрать", "Закрыть", 2)
                    end
                end
            end
        end
 

.Makarov.

Известный
188
36
Здравствуйте. Почему может крашить игру через n-ое количество времени? Какую ошибку можно допустить, при написании кода? Может ли это быть за большого количества созданных потоков? (около 10)
Lua:
function startscript()
    oneslot = 2131-- первый слот
    twoslot = 2133 --второй слот
    threeslot = 2135 -- третий слот
    fourslot = 2137 -- четвертый слот
    sendclick = 2302 -- использовать предмет
    closeinv = 65535 -- закрыть инвентарь
    sampRegisterChatCommand("setmypin", function (arg)
        --код
    end)
    sampRegisterChatCommand("setprod", function (arg)
        --код
    end)
    sampRegisterChatCommand("alogin", function (arg)
        --код
    end)
    sampRegisterChatCommand("acase", function (arg)
        --код
    end)
    sampRegisterChatCommand("ans", function ()
        --код
    end)
    lua_thread.create(blabla) -- Вот о таких потоках идет речь
end
function blabla()
    while true do wait(100)
        if not isPauseMenuActive() and isPlayerPlaying(playerHandle) and sampIsLocalPlayerSpawned() then
            if script.dialogs.paragraph1 and script.dialogs.paragraph14 then
                sampSendChat("/invent")
                sampSendClickTextdraw(oneslot)
                sampSendClickTextdraw(sendclick)
                sampSendClickTextdraw(closeinv)
                wait(set.Waits.acasewait)
            end
        end
    end
end
Или же может крашить за сильного изнасилования samp events? (onShowDialog, onServerMessage,onDisplayGameText)
К слову, крашит даже если весь функционал скрипта отключен. Крашит обычно после 1-6 часов игры. В логе сампфункса пишет следующее:
Код:
[14:50:22] SAMPFUNCS v5.3 release #17 (SA-MP 0.3.7) caught an exception.
[14:50:22] Base address: 65E40000
[14:50:22] > Exception record:
[14:50:22] Exception at address: 65AD77A6, Flags: 00000000
[14:50:22] Module: D:\Games\GTA San Andreas\lua51.dll (65AD0000)
[14:50:22] Cause: EXCEPTION_ACCESS_VIOLATION
[14:50:22] Attempted to read from: 00008096
[14:50:22] > Exception context:
[14:50:22] EAX: 00008096    ESI: 0C673968
[14:50:22] EBX: 0000003A    EDX: 00000000
[14:50:22] ECX: FFFFD8F0    EDI: 0C673968
[14:50:22] EBP: 0C5901C0    ESP: 0177FC30
[14:50:22] DR0: 00000000    DR1: 00000000
[14:50:22] DR2: 00000000    DR3: 00000000
[14:50:22] DR6: 00000000    DR7: 00000000
[14:50:22] SegGs: 0000002B    SegFs: 00000053
[14:50:22] SegEs: 0000002B    SegDs: 0000002B
[14:50:22] > Stack:
FFFFD8F0 65B1B2E5 0C673968 FFFFD8F0
00000000 FFFFFFFF 0CF461D4 0C590D58
65C58D25 0C673968 FFFFD8F0 0000003A
0CF461C8 65B50588 65B500E0 0C5902CC
65B50112 0C674018 0C5901C0 00000001
65AD280D 0C5901C0 13183D30 00000064
00010006 16A07480 00000001 0C5901C0
00000009 00000000 0177FD44 65AF41B0
0C590D50 7FFFFF00 0C5901F0 0C5901C0
65AF78FB 0C5901C0 0177FD20 00000001
FFFFFFFF 0C673FF8 0C5901F0 0177FD0C
0C590D58 65AF8794 0C5901F0 0C5901C0
0C5E9768 0C673FF8 00000000 0C5901C0
0A076D98 0C5901F0 0A46D4D0 0C5901C0
65B13942 0C5901C0 0C5901C0 65AD2BB4
0C5901C0 00000000 00000000 0C5901C0
Может быть кто-то сталкивался с такой проблемой. Или же знает в чем может быть причина. Заранее спасибо!
 

ImPasha

Software Developer & System Administrator
Друг
1,788
2,142
Здравствуйте. Почему может крашить игру через n-ое количество времени? Какую ошибку можно допустить, при написании кода? Может ли это быть за большого количества созданных потоков? (около 10)
Lua:
function startscript()
    oneslot = 2131-- первый слот
    twoslot = 2133 --второй слот
    threeslot = 2135 -- третий слот
    fourslot = 2137 -- четвертый слот
    sendclick = 2302 -- использовать предмет
    closeinv = 65535 -- закрыть инвентарь
    sampRegisterChatCommand("setmypin", function (arg)
        --код
    end)
    sampRegisterChatCommand("setprod", function (arg)
        --код
    end)
    sampRegisterChatCommand("alogin", function (arg)
        --код
    end)
    sampRegisterChatCommand("acase", function (arg)
        --код
    end)
    sampRegisterChatCommand("ans", function ()
        --код
    end)
    lua_thread.create(blabla) -- Вот о таких потоках идет речь
end
function blabla()
    while true do wait(100)
        if not isPauseMenuActive() and isPlayerPlaying(playerHandle) and sampIsLocalPlayerSpawned() then
            if script.dialogs.paragraph1 and script.dialogs.paragraph14 then
                sampSendChat("/invent")
                sampSendClickTextdraw(oneslot)
                sampSendClickTextdraw(sendclick)
                sampSendClickTextdraw(closeinv)
                wait(set.Waits.acasewait)
            end
        end
    end
end
Или же может крашить за сильного изнасилования samp events? (onShowDialog, onServerMessage,onDisplayGameText)
К слову, крашит даже если весь функционал скрипта отключен. Крашит обычно после 1-6 часов игры. В логе сампфункса пишет следующее:
Код:
[14:50:22] SAMPFUNCS v5.3 release #17 (SA-MP 0.3.7) caught an exception.
[14:50:22] Base address: 65E40000
[14:50:22] > Exception record:
[14:50:22] Exception at address: 65AD77A6, Flags: 00000000
[14:50:22] Module: D:\Games\GTA San Andreas\lua51.dll (65AD0000)
[14:50:22] Cause: EXCEPTION_ACCESS_VIOLATION
[14:50:22] Attempted to read from: 00008096
[14:50:22] > Exception context:
[14:50:22] EAX: 00008096    ESI: 0C673968
[14:50:22] EBX: 0000003A    EDX: 00000000
[14:50:22] ECX: FFFFD8F0    EDI: 0C673968
[14:50:22] EBP: 0C5901C0    ESP: 0177FC30
[14:50:22] DR0: 00000000    DR1: 00000000
[14:50:22] DR2: 00000000    DR3: 00000000
[14:50:22] DR6: 00000000    DR7: 00000000
[14:50:22] SegGs: 0000002B    SegFs: 00000053
[14:50:22] SegEs: 0000002B    SegDs: 0000002B
[14:50:22] > Stack:
FFFFD8F0 65B1B2E5 0C673968 FFFFD8F0
00000000 FFFFFFFF 0CF461D4 0C590D58
65C58D25 0C673968 FFFFD8F0 0000003A
0CF461C8 65B50588 65B500E0 0C5902CC
65B50112 0C674018 0C5901C0 00000001
65AD280D 0C5901C0 13183D30 00000064
00010006 16A07480 00000001 0C5901C0
00000009 00000000 0177FD44 65AF41B0
0C590D50 7FFFFF00 0C5901F0 0C5901C0
65AF78FB 0C5901C0 0177FD20 00000001
FFFFFFFF 0C673FF8 0C5901F0 0177FD0C
0C590D58 65AF8794 0C5901F0 0C5901C0
0C5E9768 0C673FF8 00000000 0C5901C0
0A076D98 0C5901F0 0A46D4D0 0C5901C0
65B13942 0C5901C0 0C5901C0 65AD2BB4
0C5901C0 00000000 00000000 0C5901C0
Может быть кто-то сталкивался с такой проблемой. Или же знает в чем может быть причина. Заранее спасибо!
Слишком часто вызывается какая-то SF функция. Лучше делать между ними какую-то задержку.
 
  • Нравится
Реакции: .Makarov.

cheremuxa

Известный
428
203
Проверка на то, есть ли в руках моего педа мешок, например с работы грузчика?
 

.Makarov.

Известный
188
36
Слишком часто вызывается какая-то SF функция. Лучше делать между ними какую-то задержку.
Подозревал что примерно в этом может быть моя проблема. Но всё что у меня использует SF - локальные диалоги. Вот код диалогов и всё что с ними связано:
Lua:
local sf = require 'sampfuncs'
local script = {
    dialogs = {
        paragraph1 = false;
        paragraph2 = true; -- +
        paragraph3 = false;
        paragraph4 = false;
        paragraph5 = false;
        paragraph6 = false;
        paragraph7 = false; ----
        paragraph8 = false;
        paragraph9 = true; -- +
        paragraph10 = true; -- +
        paragraph11 = true; ---+
        paragraph12 = set.Main.weather;
        paragraph13 = true;
        paragraph14 = set.RpSon.acase;
        paragraph15 = set.RpSon.arecon;
        paragraph16 = set.RpSon.aheal;
        paragraph17 = set.RpSon.aeat;
        paragraph18 = set.RpSon.noAFK;
        paragraph19 = set.IgnorMessage.all;
        paragraph20 = set.IgnorMessage.vip;
        paragraph21 = set.IgnorMessage.ad;
        paragraph22 = set.IgnorMessage.adm;
        paragraph23 = set.IgnorMessage.smi
    }
}
function menukey()
    while true do
        wait(40)
        if not isSampfuncsConsoleActive() and not isPauseMenuActive() and not sampIsChatInputActive() and not sampIsDialogActive() then
            if isKeyDown(93) then
                while isKeyDown(93) do wait(80) end
                lua_thread.create(dialog)
            end
        end
    end
end
function dialog()
    local status = {}
    for v, k in pairs(script.dialogs) do
        if k == true then
            status[v] = '{32C13E}[Включен]'
        elseif k == false then       
            status[v] = '{E21F1F}[Выключен]'
        end
    end

    local dialogs = {
        {
            title = '{FF8C00}[1] {FFFFFF}РП сон',
            onclick = function() lua_thread.create(noafksettings) end
        },
        {
            title = '{FF8C00}[2] {FFFFFF}Отыгровки \t\t'..status['paragraph2'],
            onclick = function(menu, row)
                script.dialogs.paragraph2 = not script.dialogs.paragraph2
                menu[row].title = '{FF8C00}[2] {FFFFFF}Отыгровки \t\t'..(script.dialogs.paragraph2 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                return true   
            end
        },
        {
            title = '{FF8C00}[3] {FFFFFF}ВХ 1\t\t\t'..status['paragraph3'],
            onclick = function(menu, row)
                script.dialogs.paragraph3 = not script.dialogs.paragraph3
                menu[row].title = '{FF8C00}[3] {FFFFFF}ВХ 1\t\t\t'..(script.dialogs.paragraph3 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                return true
            end
        },
        {
            title = '{FF8C00}[4] {FFFFFF}ВХ 2\t\t\t'..status['paragraph4'],
            onclick = function(menu, row)
                script.dialogs.paragraph4 = not script.dialogs.paragraph4
                menu[row].title = '{FF8C00}[4] {FFFFFF}ВХ 2\t\t\t'..(script.dialogs.paragraph4 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                return true
            end
        },
        {
            title = '{FF8C00}[5] {FFFFFF}ВХ 3\t\t\t'..status['paragraph5'],
            onclick = function(menu, row)
                script.dialogs.paragraph5 = not script.dialogs.paragraph5
                menu[row].title = '{FF8C00}[5] {FFFFFF}ВХ 3\t\t\t'..(script.dialogs.paragraph5 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                return true
            end
        },
        {
            title = '{FF8C00}[6] {FFFFFF}ВХ 4\t\t\t\t'..status['paragraph6'],
            onclick = function(menu, row)
                script.dialogs.paragraph6 = not script.dialogs.paragraph6
                menu[row].title = '{FF8C00}[6] {FFFFFF}ВХ 4\t\t\t\t'..(script.dialogs.paragraph6 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                return true
            end
        },
        {
            title = '{FF8C00}[7] {FFFFFF}Автоответчик \t\t\t'..status['paragraph7'],
            onclick = function(menu, row)
                script.dialogs.paragraph7 = not script.dialogs.paragraph7
                menu[row].title = '{FF8C00}[7] {FFFFFF}Автоответчик \t\t\t'..(script.dialogs.paragraph7 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                return true
            end
        },
        {
            title = '{FF8C00}[8] {FFFFFF}Авто сбив \t\t\t\t'..status['paragraph8'],
            onclick = function(menu, row)
                script.dialogs.paragraph8 = not script.dialogs.paragraph8
                menu[row].title = '{FF8C00}[8] {FFFFFF}Авто сбив \t\t\t\t'..(script.dialogs.paragraph8 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                return true
            end
        },
        {
            title = '{FF8C00}[9] {FFFFFF}Автологин \t\t\t\t'..status['paragraph9'],
            onclick = function(menu, row)
                script.dialogs.paragraph9 = not script.dialogs.paragraph9
                menu[row].title = '{FF8C00}[9] {FFFFFF}Автологин \t\t\t\t'..(script.dialogs.paragraph9 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                return true
            end
        },
        {
            title = '{FF8C00}[10] {FFFFFF}Таймеры\t\t'..status['paragraph10'],
            onclick = function(menu, row)
                script.dialogs.paragraph10 = not script.dialogs.paragraph10
                menu[row].title = '{FF8C00}[10] {FFFFFF}Таймеры\t\t'..(script.dialogs.paragraph10 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                return true
            end
        },
        {
            title = '{FF8C00}[11] {FFFFFF}Авто ввод PIN-кода \t\t'..status['paragraph11'],
            onclick = function(menu, row)
                script.dialogs.paragraph11 = not script.dialogs.paragraph11
                menu[row].title = '{FF8C00}[11] {FFFFFF}Авто ввод PIN-кода \t\t'..(script.dialogs.paragraph11 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                return true
            end
        },
        {
            title = '{FF8C00}[12] {FFFFFF}Автовзлом \t'..status['paragraph13'],
            onclick = function(menu, row)
                script.dialogs.paragraph13 = not script.dialogs.paragraph13
                menu[row].title = '{FF8C00}[12] {FFFFFF}Автовзлом\t'..(script.dialogs.paragraph13 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                return true
            end
        },
        {
            title = '{FF8C00}[13] {FFFFFF}Игнор сообщений',
            onclick = function() lua_thread.create(ignormessage) end
        },
        {
            title = '{FF8C00}[14] {FFFFFF}Варианты',
            onclick = function() lua_thread.create(clicktype) end
        },
        {
            title = '{FF8C00}[15] {FFFFFF}Настройки',
            onclick = function() lua_thread.create(skriptpose) end
        }
    }
    submenus_show(dialogs, "А шо це таке?", "Выбрать", "Закрыть")
end
function noafksettings()
    local status = {}
    for v, k in pairs(script.dialogs) do
        if k == true then
            status[v] = '{32C13E}[Включен]'
        elseif k == false then       
            status[v] = '{E21F1F}[Выключен]'
        end
    end
    local dialogs = {
        {
            title = '{FF8C00}[1] {FFFFFF}Статус скрипта \t\t\t'..status['paragraph1'],
            onclick = function(menu, row)
                script.dialogs.paragraph1 = not script.dialogs.paragraph1
                menu[row].title = '{FF8C00}[1] {FFFFFF}Статус скрипта \t\t\t'..(script.dialogs.paragraph1 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                if script.dialogs.paragraph18 and script.dialogs.paragraph1 then
                    writeMemory(7634870, 1, 1, 1)
                    writeMemory(7635034, 1, 1, 1)
                    mem.fill(7623723, 144, 8)
                    mem.fill(5499528, 144, 6)
                else
                    writeMemory(7634870, 1, 0, 1)
                    writeMemory(7635034, 1, 0, 1)
                    mem.hex2bin('5051FF1500838500', 7623723, 8)
                    mem.hex2bin('0F847B010000', 5499528, 6)
                end
                return true
            end
        },
        {
            title = '{FF8C00}[2] {FFFFFF}Авто кейс с рулетками \t\t'..status['paragraph14'],
            onclick = function(menu, row)
                script.dialogs.paragraph14 = not script.dialogs.paragraph14
                menu[row].title = '{FF8C00}[2] {FFFFFF}Авто кейс с рулетками \t\t'..(script.dialogs.paragraph14 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                set.RpSon.acase = not set.RpSon.acase
                inicfg.save(set, "settings")
                return true
            end
        },
        {
            title = '{FF8C00}[3] {FFFFFF}Авто перезаход \t\t\t'..status['paragraph15'],
            onclick = function(menu, row)
                script.dialogs.paragraph15 = not script.dialogs.paragraph15
                menu[row].title = '{FF8C00}[3] {FFFFFF}Авто перезаход \t\t\t'..(script.dialogs.paragraph15 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                set.RpSon.arecon = not set.RpSon.arecon
                inicfg.save(set, "settings")
                return true
            end
        },
        {
            title = '{FF8C00}[4] {FFFFFF}Авто хилл \t\t\t\t'..status['paragraph16'],
            onclick = function(menu, row)
                script.dialogs.paragraph16 = not script.dialogs.paragraph16
                menu[row].title = '{FF8C00}[4] {FFFFFF}Авто хилл \t\t\t\t'..(script.dialogs.paragraph16 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                set.RpSon.aheal = not set.RpSon.aheal
                inicfg.save(set, "settings")
                return true
            end
        },
        {
            title = '{FF8C00}[5] {FFFFFF}Авто сытость \t\t\t'..status['paragraph17'],
            onclick = function(menu, row)
                script.dialogs.paragraph17 = not script.dialogs.paragraph17
                menu[row].title = '{FF8C00}[5] {FFFFFF}Авто сытость \t\t\t'..(script.dialogs.paragraph17 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                set.RpSon.aeat = not set.RpSon.aeat
                inicfg.save(set, "settings")
                return true
            end
        },
        {
            title = '{FF8C00}[6] {FFFFFF}Анти АФК \t\t\t\t'..status['paragraph18'],
            onclick = function(menu, row)
                script.dialogs.paragraph18 = not script.dialogs.paragraph18
                menu[row].title = '{FF8C00}[6] {FFFFFF}Анти АФК \t\t\t\t'..(script.dialogs.paragraph18 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                set.RpSon.noAFK = not set.RpSon.noAFK
                inicfg.save(set, "settings")
                return true
            end
        },
    }
    submenus_show(dialogs, "А шо це таке?", "Выбрать", "Закрыть")
end
function skriptpose()
     local status = {}
    for v, k in pairs(script.dialogs) do
        if k == true then
            status[v] = '{32C13E}[Включен]'
        elseif k == false then       
            status[v] = '{E21F1F}[Выключен]'
        end
    end   
    local dialogs = {
        {
            title = '{FF8C00}[1] {FFFFFF}Настройка 1',
            onclick = function()
            wait(400) 
            showCursor(true, true)   
            pos5 = true
            script.dialogs.paragraph3 = true
            end
        },
        {
            title = '{FF8C00}[2] {FFFFFF}Настройка 2',
            onclick = function()
            wait(400)   
            showCursor(true, true)   
            pos4 = true
            script.dialogs.paragraph4 = true
            end
        },
        {
            title = '{FF8C00}[3] {FFFFFF}Настройка 3',
            onclick = function()
            wait(400)   
            showCursor(true, true)   
            pos2 = true
            script.dialogs.paragraph5 = true
            end
        },
        {
            title = '{FF8C00}[4] {FFFFFF}Настройка 4',
            onclick = function()
            wait(400)   
            showCursor(true, true)   
            pos3 = true
            script.dialogs.paragraph6 = true
            end
        }
    }
    submenus_show(dialogs, "А шо це таке?", "Выбрать", "Закрыть")
end
function ignormessage()
     local status = {}
    for v, k in pairs(script.dialogs) do
        if k == true then
            status[v] = '{32C13E}[Включен]'
        elseif k == false then       
            status[v] = '{E21F1F}[Выключен]'
        end
    end

    local dialogs = {
        {
            title = '{FF8C00}[1] {FFFFFF}Выбрать всё\t\t\t\t',
            onclick = function(menu, row)
                script.dialogs.paragraph19 = not script.dialogs.paragraph19
                if not script.dialogs.paragraph19 then
                    set.IgnorMessage.vip,script.dialogs.paragraph20 = false,false
                    set.IgnorMessage.ad, script.dialogs.paragraph21 = false,false
                    set.IgnorMessage.adm, script.dialogs.paragraph22 = false,false
                    set.IgnorMessage.smi, script.dialogs.paragraph23 = false,false
                else
                    set.IgnorMessage.vip, script.dialogs.paragraph20 = true,true
                    set.IgnorMessage.ad, script.dialogs.paragraph21 = true,true
                    set.IgnorMessage.adm, script.dialogs.paragraph22 = true,true
                    set.IgnorMessage.smi, script.dialogs.paragraph23 = true,true
                end
                inicfg.save(set, "settings")
            end
        },
        {
            title = '{FF8C00}[2] {FFFFFF}Вип чат\t\t\t\t'..status['paragraph20'],
            onclick = function(menu, row)
                script.dialogs.paragraph20 = not script.dialogs.paragraph20
                menu[row].title = '{FF8C00}[2] {FFFFFF}Вип чат\t\t\t\t'..(script.dialogs.paragraph20 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                if not script.dialogs.paragraph20 then
                    set.IgnorMessage.vip = false
                else
                    set.IgnorMessage.vip = true
                end
                inicfg.save(set, "settings")
                return true
            end
        },
        {
            title = '{FF8C00}[3] {FFFFFF}Объявления\t\t\t'..status['paragraph21'],
            onclick = function(menu, row)
                script.dialogs.paragraph21 = not script.dialogs.paragraph21
                menu[row].title = '{FF8C00}[3] {FFFFFF}Объявления\t\t\t'..(script.dialogs.paragraph21 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                if not script.dialogs.paragraph21 then
                    set.IgnorMessage.ad = false
                else
                    set.IgnorMessage.ad = true
                end
                inicfg.save(set, "settings")
                return true
            end
        },
        {
            title = '{FF8C00}[4] {FFFFFF}Действия админов\t\t\t'..status['paragraph22'],
            onclick = function(menu, row)
                script.dialogs.paragraph22 = not script.dialogs.paragraph22
                menu[row].title = '{FF8C00}[4] {FFFFFF}Действия админов\t\t\t'..(script.dialogs.paragraph22 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                if not script.dialogs.paragraph22 then
                    set.IgnorMessage.adm = false
                else
                    set.IgnorMessage.adm = true
                end
                inicfg.save(set, "settings")
                return true
            end
        },
        {
            title = '{FF8C00}[5] {FFFFFF}Сообщения СМИ\t\t\t'..status['paragraph23'],
            onclick = function(menu, row)
                script.dialogs.paragraph23 = not script.dialogs.paragraph23
                menu[row].title = '{FF8C00}[5] {FFFFFF}Вип объявления\t\t\t'..(script.dialogs.paragraph23 and '{32C13E}[Включен]' or '{E21F1F}[Выключен]')
                if not script.dialogs.paragraph23 then
                    set.IgnorMessage.smi = false
                else
                    set.IgnorMessage.smi = true
                end
                inicfg.save(set, "settings")
                return true
            end
        }
    }
    submenus_show(dialogs, "А шо це таке?", "Выбрать", "Закрыть")
end
function clicktype()
    local dialogs = {
        {
            title = '{FF8C00}[1] {FFFFFF}Первый вариант',
            onclick = function(menu, row)
                menu[row].title = '{FF8C00}[1] {FFFFFF}Первый вариант'
                set.Main.clicktype = 1
                inicfg.save(set, "settings")
                return true
            end
        },
        {
            title = '{FF8C00}[2] {FFFFFF}Второй вариант',
            onclick = function(menu, row)
                menu[row].title = '{FF8C00}[2] {FFFFFF}Второй вариант'
                set.Main.clicktype = 2
                inicfg.save(set, "settings")
                return true
            end
        },
        {
            title = '{FF8C00}[3] {FFFFFF}Третий вариант',
            onclick = function(menu, row)
                menu[row].title = '{FF8C00}[3] {FFFFFF}Третий вариант'
                set.Main.clicktype = 3
                inicfg.save(set, "settings")
                return true
            end
        }
    }
    submenus_show(dialogs, "А шо це таке?", "Выбрать", "Закрыть")
end
function submenus_show(menu, caption, select_button, close_button, back_button)
    select_button, close_button, back_button = select_button or 'Select', close_button or 'Close', back_button or 'Back'
    prev_menus = {}
    function display(menu, id, caption)
        local string_list = {}
        for i, v in ipairs(menu) do
            table.insert(string_list, type(v.submenu) == 'table' and v.title .. '  >>' or v.title)
        end
        sampShowDialog(id, caption, table.concat(string_list, '\n'), select_button, (#prev_menus > 0) and back_button or close_button, sf.DIALOG_STYLE_LIST)
        repeat
            wait(0)
            local result, button, list = sampHasDialogRespond(id)
            if result then
                if button == 1 and list ~= -1 then
                    local item = menu[list + 1]
                    if type(item.submenu) == 'table' then -- submenu
                        table.insert(prev_menus, {menu = menu, caption = caption})
                        if type(item.onclick) == 'function' then
                            item.onclick(menu, list + 1, item.submenu)
                        end
                        return display(item.submenu, id + 1, item.submenu.title and item.submenu.title or item.title)
                    elseif type(item.onclick) == 'function' then
                        local result = item.onclick(menu, list + 1)
                        if not result then return result end
                        return display(menu, id, caption)
                    end
                else -- if button == 0
                    if #prev_menus > 0 then
                        local prev_menu = prev_menus[#prev_menus]
                        prev_menus[#prev_menus] = nil
                        return display(prev_menu.menu, id - 1, prev_menu.caption)
                    end
                    return false
                end
            end
        until result
    end
    return display(menu, 31337, caption or menu.title)
end
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,920
1,292
Помогите пожалуйста.. Вообще не понимаю где тут ошибка, но при вводе /pds - тупо крашит :C

Lua:
-- Подстава
local imgui = require 'lib.imgui'
local keys = require "vkeys"
local encoding = require 'encoding'
local inicfg = require 'inicfg'
local sampev = require 'lib.samp.events'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local idp = imgui.ImBuffer(256)
local sms = imgui.ImBuffer(256)
local btn_size = imgui.ImVec2(-0.1, 0)
local MenuWind = imgui.ImBool(false)

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("pds", function()
    MenuWind.v = not MenuWind.v
    end)
    while true do
    wait(0)
    imgui.Process = MenuWind.v
    idz = sampGetPlayerNickname(idp)
    end
    end

function imgui.TextQuestion(text)
    imgui.TextDisabled('(?)')
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end
function imgui.OnDrawFrame()
          imgui.ShowCursor = MenuWind.v
  if MenuWind.v then
        local ex, ey = getScreenResolution()
        imgui.SetNextWindowSize(imgui.ImVec2(285, 200), imgui.Cond.FirstUseEver) -- пример
        imgui.SetNextWindowPos(imgui.ImVec2(ex / 2 + 390, ey / 2 + 175), imgui.Cond.FirstUseEver) -- пример
        imgui.Begin(u8"Первая помощь!", MenuWindw)
        imgui.InputText(u8"Сообщение", sms) imgui.SameLine() imgui.TextQuestion(u8"Введите сообщение подставы")
        imgui.InputText(u8"Айди жертвы", idp) imgui.SameLine() imgui.TextQuestion(u8"Введите ID жертвы")
        if imgui.Button(u8"Протестировать", btn_size) then
            sampAddChatMessage("{FFFFFF}" .. idz .. "[" .. idp .. "] говорит:{B7AFAF}" .. sms, 0xFFFFFF)
        end
    end
end
Что за значение у btn_size? -0.1 пиксель по X и 0 по Y?
 

cheremuxa

Известный
428
203
Помогите пожалуйста.. Вообще не понимаю где тут ошибка, но при вводе /pds - тупо крашит :C

Lua:
-- Подстава
local imgui = require 'lib.imgui'
local keys = require "vkeys"
local encoding = require 'encoding'
local inicfg = require 'inicfg'
local sampev = require 'lib.samp.events'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local idp = imgui.ImBuffer(256)
local sms = imgui.ImBuffer(256)
local btn_size = imgui.ImVec2(-0.1, 0)
local MenuWind = imgui.ImBool(false)

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("pds", function()
    MenuWind.v = not MenuWind.v
    end)
    while true do
    wait(0)
    imgui.Process = MenuWind.v
    idz = sampGetPlayerNickname(idp)
    end
    end

function imgui.TextQuestion(text)
    imgui.TextDisabled('(?)')
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end
function imgui.OnDrawFrame()
          imgui.ShowCursor = MenuWind.v
  if MenuWind.v then
        local ex, ey = getScreenResolution()
        imgui.SetNextWindowSize(imgui.ImVec2(285, 200), imgui.Cond.FirstUseEver) -- пример
        imgui.SetNextWindowPos(imgui.ImVec2(ex / 2 + 390, ey / 2 + 175), imgui.Cond.FirstUseEver) -- пример
        imgui.Begin(u8"Первая помощь!", MenuWindw)
        imgui.InputText(u8"Сообщение", sms) imgui.SameLine() imgui.TextQuestion(u8"Введите сообщение подставы")
        imgui.InputText(u8"Айди жертвы", idp) imgui.SameLine() imgui.TextQuestion(u8"Введите ID жертвы")
        if imgui.Button(u8"Протестировать", btn_size) then
            sampAddChatMessage("{FFFFFF}" .. idz .. "[" .. idp .. "] говорит:{B7AFAF}" .. sms, 0xFFFFFF)
        end
    end
end

у тебя end'а нету в конце,и в Begin вместо MenuWind стоит MenuWindw
Ищу вот такую анимку, или что это вообще?

HP1O4sU.png
 
Последнее редактирование:
У

Удалённый пользователь 257775

Гость
Как сделать так, что-бы то что я пишу в IinputText записывалось в переменную?
 

Германский

Потрачен
43
3
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
у тебя end'а нету в конце,и в Begin вместо MenuWind стоит MenuWindw
Ищу вот такую анимку, или что это вообще?

HP1O4sU.png
 

astynk

Известный
Проверенный
741
532
Что не так?
Lua:
if not sampGetCurrentServerAddress() == "ип сервера" then
    thisScript():unload()
end
почему не работает?
У not выше приоритет, чем у сравнения, поэтому он выполняется первым. В итоге sampGetCurrentServerAddress() приводится к типу boolean и ты сравниваешь ип сервера с false.
Lua:
if not (a == b) then
Lua:
if a ~= b then