1. Внимание!
    Объявились мошенники, которые представляются администрацией форума и обманывают покупателей. У них есть своя группа ВКонтакте, копирующая нашу, и несколько аккаунтов, маскирующихся под аккаунты администраторов и гарантов форума.
    При проведении любых сделок с администраторами, гарантами и пользователями BlastHack настойчиво требуйте у них написать вам личное сообщение на форуме и ни в коем случае не продолжайте сделку при отказе выполнять это требование или если сообщение не было получено.

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

Тема в разделе "Lua", создана пользователем FYP, 8 авг 2016.

  1. FYP

    FYP админ какой-то

    Регистрация:
    09.03.13
    Сообщения:
    917
    Лайки:
    1.771
    Репутация:
    699
    Общая тема для вопросов по разработке скриптов на языке программирования Lua, в частности под MoonLoader.
    • Задавая вопрос, убедитесь, что на него ещё не отвечали (воспользуйтесь поиском).
    • Отвечая, убедитесь, что ваш ответ корректен.
    • Старайтесь как можно точнее выразить мысль, а если проблема связана с кодом, то обязательно прикрепите его к сообщению, используя блок [code=lua]здесь мог бы быть ваш код[/code].
    • Если вопрос связан с MoonLoader-ом первым делом желательно поискать решение на wiki.
     
    #1
    Garrus, RedBoxWhite, 4el0ve4ik и ещё 1-му нравится это.
  2. mac

    mac ща как ебну копытом
    Друг

    Регистрация:
    06.09.14
    Сообщения:
    1.327
    Лайки:
    799
    Репутация:
    41
    От делать нехуй решил попробовать работу с диалогами. list в стиле диалогов почему-то принимается за msgbox. Скрин
    Хз, вот сурс на всякий случай. Мб чего не помню, в клео такую херню делал года полтора-два назад, в луа первый день :/
    Код (Text):
    Выделить всё двойным кликом
    function openmenu()
        s = string.format("Player \nVehicle \nOther Huinya")
        sampShowDialog(17, "Mactawish Mod Menu", s, "Ok", "Exit", "DIALOG_STYLE_LIST")
    end
     
    #2
  3. legend2360

    legend2360 Лятим в космос
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.174
    Лайки:
    755
    Репутация:
    447
    тип должен быть int, а не string
    константы подключи
     
    #3
    mac нравится это.
  4. mac

    mac ща как ебну копытом
    Друг

    Регистрация:
    06.09.14
    Сообщения:
    1.327
    Лайки:
    799
    Репутация:
    41
    Я понимаю, что я уебан, но все-таки, в этом луа первый день. Скрипт сразу крашается, в логах ничего необычного. При релоаде скриптов виснет игра :/
    Без того, что в while true в main работает спокойно. Не оч понял просто
    Код (Text):
    Выделить всё двойным кликом
    function main()
        while not isSampfuncsLoaded() do
            wait(1000)
        end
        sampAddChatMessage("Mod Menu by Mactawish loaded. Version: 0.0000001", -1)
        sampRegisterChatCommand("menu", openmenu)
        while true do
            local result, button, list, input = sampHasDialogRespond(17)
            if result == true then
                sampAddChatMessage("Была нажата кнопка " .. button, -1)
            end
            if button == 1 then
                sampAddChatMessage("Типа выбран элемент под номером " .. list, -1);
            end
        end
    end

    function openmenu()
        s = string.format("Other Players \nSelf \nVehicle")
        sampShowDialog(17, "Mactawish Mod Menu", s, "Ok", "Exit", 2)
    end
     
    #4
    Последнее редактирование: 9 авг 2016
  5. FYP

    FYP админ какой-то

    Регистрация:
    09.03.13
    Сообщения:
    917
    Лайки:
    1.771
    Репутация:
    699
    @[Mactawish] ты используешь бесконечный цикл без задержки. не надо так.
     
    #5
    kewa.opcode1, 4el0ve4ik, AWRage и 2 другим нравится это.
  6. WhyExtern

    WhyExtern Известный пользователь

    Регистрация:
    10.08.16
    Сообщения:
    74
    Лайки:
    8
    Репутация:
    0
    После: while true do
    Добавь: wait (0)
     
    #6
  7. WhyExtern

    WhyExtern Известный пользователь

    Регистрация:
    10.08.16
    Сообщения:
    74
    Лайки:
    8
    Репутация:
    0
    Как при нажатии клавиши задействовать команду которая сразу отправится в чат как сообщение?
    Написал скрипт чтобы при нажатии на Y автоматически вводилась команда /mm и открывалось меню сервера
    Не пашет
    Код (Text):
    Выделить всё двойным кликом
    script_name("Ymm")
    script_author("WhyExtern")
    script_description("Y")
    script_version_number(1)

    require "lib.moonloader"
    require "lib.sampfuncs"

    function main()
       while true
       wait(0)
       if isKeyDown(VK_Y) then
       sampAddChatMessage "/mm"
       while isKeyDown(VK_1) do
       wait(100) end
        end
      end
    end
    Вот что пишет sampfuncs в консоль
     
    #7
    Последнее редактирование: 10 авг 2016
  8. MelomanCool

    Проверенный

    Регистрация:
    19.03.13
    Сообщения:
    66
    Лайки:
    40
    Репутация:
    20
    while true do
    Учите синтаксис.
     
    #8
  9. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.257
    Лайки:
    338
    Репутация:
    84
    Через sampAddChatMessage можно вывести текст и он никому кроме тебя не будет виден, для ввода команды используй sampSendChat(string text)
     
    #9
    Шелди нравится это.
  10. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.257
    Лайки:
    338
    Репутация:
    84
    Знаю, я долбоеб который ничего не смыслит, но все же. Такой вопрос: как сделать что бы работало вот это
    Код (C++):
    Выделить всё двойным кликом
    if handle = getCharPlayerIsTargeting(int player) and isKeyDown(VK_1) then
    ......
    Если пишу так как представил выше, то выбивает ошибку 'then' expected near '='.
     
    #10
    Шелди и loremi735 нравится это.
  11. loremi735

    loremi735 Пользователь

    Регистрация:
    26.07.16
    Сообщения:
    11
    Лайки:
    13
    Репутация:
    4
    Во-первых, getCharPlayerIsTargeting() возвращает два значения, а это значит, что нужно сперва сохранить эти значения (или только одно нужное) в какую-нибудь переменную, чтобы затем использовать в if:
    Код (Lua):
    Выделить всё двойным кликом
    local result, target = getCharPlayerIsTargeting(playerHandle) -- нижнее подчеркивание (_) позволяет игнорировать возвращаемый результат, поэтому можешь написать _ вместо result, если не будешь использовать result. вот так:
    local _, target = getCharPlayerIsTargeting(playerHandle)
    if handle == target and isKeyDown(VK_1) then
    ......
    Во-вторых, чтобы сравнить два значения, нужно использовать оператор ==, а не = (это присваивание).

    В-третьих, не нужно указывать тип аргумента при вызове функции.

    Можешь смотреть возвращаемые значения, тип аргументов и названия функций здесь: https://gist.github.com/THE-FYP/abc6f8bea87f4cb42331fc6dd7a84576
     
    #11
    Последнее редактирование: 10 авг 2016
    FYP и 4el0ve4ik нравится это.
  12. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.257
    Лайки:
    338
    Репутация:
    84
    про сравнивание не шло и речи, мне нужно что бы при прицеливании на игрока и нажатии n-ой клавиши выполнялось действие.
     
    #12
    Шелди нравится это.
  13. loremi735

    loremi735 Пользователь

    Регистрация:
    26.07.16
    Сообщения:
    11
    Лайки:
    13
    Репутация:
    4
    ну, тогда нужно проверить result на true:
    Код (Lua):
    Выделить всё двойным кликом
    local result, target = getCharPlayerIsTargeting(playerHandle)
    if result and isKeyDown(VK_1) then
    ....
    result здесь означает, удалось ли получить другого игрока, в которого целится играющий.
    target - это игрок, в которого целится играющий.

    про сравнивание я написал, потому что многие путают = и ==, и не вдавался в подробности кода
     
    #13
  14. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.257
    Лайки:
    338
    Репутация:
    84
    каким образом можно заменить опкод
    0ad3: format_stirng 0@ = "Первый пункт%cВторой пункт%cТретий пункт" 0xA 0xA
    я прост нуб))
     
    #14
    Шелди нравится это.
  15. DarkP1xel

    DarkP1xel Δ9
    BH Team

    Регистрация:
    17.06.13
    Сообщения:
    1.926
    Лайки:
    1.176
    Репутация:
    315
    string.format
     
    #15
  16. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.257
    Лайки:
    338
    Репутация:
    84
    Да понял я что string.format, как вывести переменную с данными строки, мне для локального диалога, так бы не спрашивал
     
    #16
    Шелди нравится это.
  17. legend2360

    legend2360 Лятим в космос
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.174
    Лайки:
    755
    Репутация:
    447
    Просто берешь и подставляешь форматированную строку
     
    Последние данные очков репутации:
    4el0ve4ik: 1 Очко (помог) 11 авг 2016
    #17
  18. mac

    mac ща как ебну копытом
    Друг

    Регистрация:
    06.09.14
    Сообщения:
    1.327
    Лайки:
    799
    Репутация:
    41
    Банальный пример, хотя можно и легче
    Код (Text):
    Выделить всё двойным кликом
     s = string.format("Other Players \nSelf \nVehicle")
        sampShowDialog(17, "Mactawish Mod Menu", s, "Ok", "Exit", 2)
     
    #18
    4el0ve4ik нравится это.
  19. legend2360

    legend2360 Лятим в космос
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.174
    Лайки:
    755
    Репутация:
    447
    Ну если вам не хочется ставить \n, то юзайте так:
    Код (Lua):
    Выделить всё двойным кликом
    local content = [[Other players
    Self
    Vehicle
    ]]

    -- showDialog
     
    UPD: мда, над починить синтаксис
     
    #19
    loremi735 нравится это.
  20. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.257
    Лайки:
    338
    Репутация:
    84
    пол дня ебусь, ебусь, а толку 0...
    Код (Text):
    Выделить всё двойным кликом
    menu = string.format("первый \nвторой \nтретий")
    dialog = sampShowDialog(17, "парапа",  menu, "Ok", "Exit", 2)
    re  = sampIsDialogActive()
    if re then
    res, button, list, input = sampHasDialogRespond(17)
    if res then


    if list  == 0 then
        sampAddChatMessage("1", 0xcc0000)
    end

    if list == 1 then
      sampaddchatmessage("2", 0xcc0000)
    end

    if list == 2 then
     sampAddChatMessage("3", 0xcc0000)
    end
    какой пункт не выбери в диалоге, все равно нихуя не выходит, как ни еб*лся с ними
     
    #20
    Шелди нравится это.
  21. hnnssy

    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    1.739
    Лайки:
    1.060
    Репутация:
    179
    sampHasDialogRespond() в цикле юзать надо

    можно просто
    Код (Lua):
    Выделить всё двойным кликом
    sampShowDialog(17, "Mactawish Mod Menu", string.format("Other Players \nSelf \nVehicle"), "Ok", "Exit", 2)
    наверн
     
    #21
    Последнее редактирование модератором: 11 авг 2016
  22. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.257
    Лайки:
    338
    Репутация:
    84
    можно, проверил)
     
    #22
    Шелди нравится это.
  23. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.257
    Лайки:
    338
    Репутация:
    84
    В общем получилось, но не так как хотелось бы, когда выбираешь пункт и что бы надпись появилась нужно еще раз открыть диалог,
    как сделать что бы отправлялась сразу после закрытия диалога?
    Код (Text):
    Выделить всё двойным кликом
    menu = string.format("1 \n2")
    dia = sampShowDialog(17, "парапа", menu, "OK", "Close", 2)
    re, button, list, input = sampHasDialogRespond(17)
    while not re do
      wait(10)
    end
    if list == 0 then
      sampAddChatMessage("1")
    end
    if list == 1 then
      sampAddChatMessage("2")
    end
     
    #23
  24. hnnssy

    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    1.739
    Лайки:
    1.060
    Репутация:
    179
     
    #24
  25. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.257
    Лайки:
    338
    Репутация:
    84
    напиши пожалуйста цикл с sampHasDialogRespond(), а то я криворукий и только по примерам че то смогу выучить -_-
     
    #25
  26. hnnssy

    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    1.739
    Лайки:
    1.060
    Репутация:
    179
    Код (Lua):
    Выделить всё двойным кликом
    dia = sampShowDialog(17, "парапа", string.format("1 \n2"), "OK", "Close", 2)
    repeat
      wait(0)
      result, button, list, input = sampHasDialogRespond(17)
    until result
    if list == 0 then
      sampAddChatMessage("1")
    end
    if list == 1 then
      sampAddChatMessage("2")
    end
     
    Последние данные очков репутации:
    4el0ve4ik: 1 Очко (спасибо) 11 авг 2016
    #26
  27. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.257
    Лайки:
    338
    Репутация:
    84
    подскажите как сделать что бы диалог закрывался на кнопку "Exit",
    Код (Text):
    Выделить всё двойным кликом
    sampShowDialog(17, "Mactawish Mod Menu", string.format("Other Players \nSelf \nVehicle"), "Ok", "Exit", 2)
    как я понял делаеться это с помощью данного
    Код (Text):
    Выделить всё двойным кликом
    sampCloseCurrentDialogWithButton(--[[int]] button)
    Но как не пытался ничего у меня не получилось:(
     
    #27
  28. DarkP1xel

    DarkP1xel Δ9
    BH Team

    Регистрация:
    17.06.13
    Сообщения:
    1.926
    Лайки:
    1.176
    Репутация:
    315
    ID какой пишешь?
     
    #28
  29. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.257
    Лайки:
    338
    Репутация:
    84
    я пишу так
    Код (Text):
    Выделить всё двойным кликом
    sampCloseCurrentDialogWithButton(2)
    или нужно так?
    Код (Text):
    Выделить всё двойным кликом
    sampCloseCurrentDialogWithButton(button2)
     
    #29
  30. DarkP1xel

    DarkP1xel Δ9
    BH Team

    Регистрация:
    17.06.13
    Сообщения:
    1.926
    Лайки:
    1.176
    Репутация:
    315
    Просто цифру.
     
    #30
  31. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.257
    Лайки:
    338
    Репутация:
    84
    как сделать что бы открывался файл ини, который лежит в папке со скриптом, у каждого пользователя путь к гта разный я подумал использовать так:
    Код (Text):
    Выделить всё двойным кликом
      dir = script.directory
      ini_test = io.openfile(dir"test.ini", "r")
    ну или подскажите как усобачить путь по другому.
     
    #31
  32. legend2360

    legend2360 Лятим в космос
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.174
    Лайки:
    755
    Репутация:
    447
    Код (Lua):
    Выделить всё двойным кликом
    local file = io.open("moonloader/file.txt", "r")
    if file ~= nil then
        --local first_line = file:read()
        print(file:read())
        file:close()
    end
    Кстати, если ты там пишешь свои костыли, то лучше заюзай библиотеку, по типу LIP: https://github.com/Dynodzzo/Lua_INI_Parser
    Не хуже будет.
     
    #32
    Последнее редактирование: 12 авг 2016
    Garrus, loremi735 и 4el0ve4ik нравится это.
  33. iTz_W33Z7

    iTz_W33Z7 Известный пользователь

    Регистрация:
    14.03.16
    Сообщения:
    244
    Лайки:
    28
    Репутация:
    5
    как правильно указать инт Актера?
     
    #33
  34. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.257
    Лайки:
    338
    Репутация:
    84
    Код (Text):
    Выделить всё двойным кликом
    function prost()
      menurp = string.format("1 \n2")
      dia = sampShowDialog(25, "qq", menurp, "OK", "Close", 2)
      sampSetCurrentDialogListItem(0)
      repeat
        wait(0)
        re, button, listr, input = sampHasDialogRespond(25)
      until re
      if button == 0 then
        _ = sampCloseCurrentDialogWithButton()
      else
        if listr == 0 then
            dia = sampShowDialog(26, "prp", "hz", "OK", "Close", 1)
            repeat
              wait(0)
               re, button, _, number = sampHasDialogRespond(26) -- вот тут
            until re
            if button == 0 then
              _ = sampCloseCurrentDialogWithButton()
            end
          end
        if listrpsms == 1 then
          sampAddChatMessage("%d", number, 0xcc0000)
        end
    Как можно сохранить переменную number до полной перезагрузки скрипта или покуда не введу другое число?
     
    #34
  35. legend2360

    legend2360 Лятим в космос
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.174
    Лайки:
    755
    Репутация:
    447
    В начале скрипта объяви(вне функций)
     
    #35
    4el0ve4ik нравится это.
  36. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.257
    Лайки:
    338
    Репутация:
    84
    Столкнулся с такой проблемой: если sampSendChat("/showpass %d", id) -работает,
    а если sampSendChat("/sms %d qq") - не работает.
    протестил и понял что после переменной в команды текст нельзя вбивать иначе не отправляет, есть идеи как решить?
     
    #36
  37. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.565
    Лайки:
    1.523
    Репутация:
    414
    Код (Lua):
    Выделить всё двойным кликом
    sampSendChat( string.format("/sms %d qq", id) )
     
    #37
  38. Danijr97

    Danijr97 Активный пользователь

    Регистрация:
    22.10.13
    Сообщения:
    26
    Лайки:
    4
    Репутация:
    1
    Можете привести пример " если хп меньше 50, то включается определенная функция"
     
    #38
  39. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.257
    Лайки:
    338
    Репутация:
    84
    Код (Text):
    Выделить всё двойным кликом
    if hp<50 then
    --code
    end
     
    #39
    loremi735 нравится это.
  40. mac

    mac ща как ебну копытом
    Друг

    Регистрация:
    06.09.14
    Сообщения:
    1.327
    Лайки:
    799
    Репутация:
    41
    Код (Lua):
    Выделить всё двойным кликом
    while true do
        wait(0)
        local health = getCharHealth(playerPed)
        if health < 50 then
            *something*
        end
    end
    В тему.
    Пример работы с локальными диалогами, если кому надо. Простенько, доступно. Внизу файл, /menuTest активейшн.
    Все пять видов диалогов тут, хотя хз зачем, на вики вроде было это :/
    Код (Lua):
    Выделить всё двойным кликом
    script_name("Test Dialogs")
    script_description("huy znaet")
    script_version_number(1)
    script_version("1.0")
    script_authors("Mactawishka")

    function main()
        while not isSampfuncsLoaded() do
            wait(1000)
        end
        sampAddChatMessage("Test Menu by Mactawish loaded. Version: 0.1 Alpha", -1)
        sampRegisterChatCommand("menuTest", openmenu)
        while true do
            wait(0)
            local resultMain, buttonMain, listMain = sampHasDialogRespond(109)
            if resultMain == true then
                if buttonMain == 1 then
                    if listMain == 0 then
                        sampShowDialog(1000, "MsgBox Test", string.format("Dat is MSGBOX \nPornHub - the best porn \nNatasha one love"), "Ok", "Exit", 0)
                        sampAddChatMessage("You have chosen MsgBox Test, list id: " .. listMain, -1)
                    end
                    if listMain == 1 then
                        sampShowDialog(1001, "Input Test", string.format("Man, input something here"), "Ok", "Exit", 1)
                        sampAddChatMessage("You have chosen Input Test, list id: " .. listMain, -1)
                    end
                    if listMain == 2 then
                        sampShowDialog(1002, "List Test", string.format("Nah \nI did it in main \nJust list"), "Ok", "Exit", 2)
                        sampAddChatMessage("You have chosen List Test, list id: " .. listMain, -1)
                    end
                    if listMain == 3 then
                        sampShowDialog(1003, "Password Test", string.format("Input pass, I'll steal it :p"), "Ok", "Exit", 3)
                        sampAddChatMessage("You have chosen Password Input Test, list id: " .. listMain, -1)
                    end
                    if listMain == 4 then
                        sampShowDialog(1004, "Tablist Test", string.format("R8 Revolver \tVery fucking powerful \t5000rub \nColt 1911 \tNot so powerful \tBut 8000rub"), "Ok", "Exit", 4)
                        sampAddChatMessage("You have chosen Iablist Test, list id: " .. listMain, -1)
                    end
                    if listMain == 5 then
                        sampShowDialog(1005, "TabHeaders Test", string.format("Pistol name \tPower \tPrice \nR8 Revolver \tVery fucking powerful \t5000rub \nColt 1911 \tNot so powerful \tBut 8000rub"), "Ok", "Exit", 5)
                        sampAddChatMessage("You have chosen Iablist With Header Test, list id: " .. listMain, -1)
                    end
                end
            end
         
            local resultInput, buttonInput, listInput, stringInput = sampHasDialogRespond(1001)
            if resultInput == true then
                if buttonInput == 1 then
                    sampAddChatMessage("You've inputed: " .. stringInput, -1)
                else sampAddChatMessage("You're pussy, you've pressed Exit", -1)
                end
            end
         
            local resultInput, buttonInput, listInput, stringInput = sampHasDialogRespond(1003)
            if resultInput == true then
                if buttonInput == 1 then
                    sampAddChatMessage("You've inputed in Password: " .. stringInput, -1)
                else sampAddChatMessage("You're pussy, you've pressed Exit, do you afraid to write your pass here?", -1)
                end
            end
        end
    end

    function openmenu()
        sampShowDialog(109, "Test Menu", string.format("MsgBox \nInput \nList \nPassword \nTab \nTabHeaders"), "Ok", "Exit", 2)
    end
     

    Вложения:

    • dialogTest.lua
      Размер файла:
      2,8 КБ
      Просмотров:
      14
    Последние данные очков репутации:
    helloy: 1 Очко 23 апр 2017
    #40
    vremya1927, RedBoxWhite, Muxic и ещё 1-му нравится это.