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

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

  1. FYP

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

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

    Частые вопросы по скриптингу под MoonLoader
    Как вывести текст на русском? Вместо русского текста у меня какие-то иероглифы.
    Изменить кодировку файла скрипта на Windows-1251. В Atom: комбинация клавиш Ctrl+Shift+U, в Notepad++: меню Кодировки -> Кодировки -> Кириллица -> Windows-1251.
    Как получить транспорт, в котором сидит игрок?
    
    local veh = storeCarCharIsInNoSave(PLAYER_PED)
    
    Как получить свой id или id другого игрока?
    
    local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получить свой ид
    local _, id = sampGetPlayerIdByCharHandle(ped) -- получить ид другого игрока. ped - это хендл персонажа
    
    Как проверить, что строка содержит какой-то текст?
    
    if string.find(str, 'текст', 1, true) then
    -- строка str содержит "текст"
    end
    
    Как эмулировать нажатие игровой клавиши?
    
    local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main
    
    setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
    
    Все иды клавиш находятся в файле moonloader/lib/game/keys.lua.
    Подробнее о функции setGameKeyState здесь: http://blast.hk/wiki/lua:setgamekeystate
    Как получить id другого игрока, в которого целюсь я?
    
    local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
    if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
      local result, id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
      if result then -- проверить, прошло ли получение ида успешно
        -- здесь любые действия с полученным идом игрока
      end
    end
    
     
    #1
    Последнее редактирование: 20 июн 2017
    k0lenval, Garrus, RedBoxWhite и 2 другим нравится это.
  2. mac

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

    Регистрация:
    06.09.14
    Сообщения:
    1.327
    Лайки:
    802
    Репутация:
    41
    От делать нехуй решил попробовать работу с диалогами. list в стиле диалогов почему-то принимается за msgbox. Скрин
    Хз, вот сурс на всякий случай. Мб чего не помню, в клео такую херню делал года полтора-два назад, в луа первый день :/
    
    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.281
    Лайки:
    804
    Репутация:
    462
    тип должен быть int, а не string
    константы подключи
     
    #3
    mac нравится это.
  4. mac

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

    Регистрация:
    06.09.14
    Сообщения:
    1.327
    Лайки:
    802
    Репутация:
    41
    Я понимаю, что я уебан, но все-таки, в этом луа первый день. Скрипт сразу крашается, в логах ничего необычного. При релоаде скриптов виснет игра :/
    Без того, что в while true в main работает спокойно. Не оч понял просто
    
    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
    Сообщения:
    1.012
    Лайки:
    1.873
    Репутация:
    717
    @[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 и открывалось меню сервера
    Не пашет
    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.299
    Лайки:
    379
    Репутация:
    97
    Через sampAddChatMessage можно вывести текст и он никому кроме тебя не будет виден, для ввода команды используй sampSendChat(string text)
     
    #9
    Шелди нравится это.
  10. 4el0ve4ik

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

    Регистрация:
    12.11.15
    Сообщения:
    1.299
    Лайки:
    379
    Репутация:
    97
    Знаю, я долбоеб который ничего не смыслит, но все же. Такой вопрос: как сделать что бы работало вот это
    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:
    
    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.299
    Лайки:
    379
    Репутация:
    97
    про сравнивание не шло и речи, мне нужно что бы при прицеливании на игрока и нажатии n-ой клавиши выполнялось действие.
     
    #12
    Шелди нравится это.
  13. loremi735

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

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

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

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

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

    DarkP1xel Δ9
    BH Team

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

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

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

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

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

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

    Регистрация:
    06.09.14
    Сообщения:
    1.327
    Лайки:
    802
    Репутация:
    41
    Банальный пример, хотя можно и легче
     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.281
    Лайки:
    804
    Репутация:
    462
    Ну если вам не хочется ставить \n, то юзайте так:
    local content = [[Other players
    Self
    Vehicle
    ]]
    -- showDialog
    
    
    UPD: мда, над починить синтаксис
     
    #19
    loremi735 нравится это.
  20. 4el0ve4ik

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

    Регистрация:
    12.11.15
    Сообщения:
    1.299
    Лайки:
    379
    Репутация:
    97
    пол дня ебусь, ебусь, а толку 0...
    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.794
    Лайки:
    1.098
    Репутация:
    187
    sampHasDialogRespond() в цикле юзать надо

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

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

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

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

    Регистрация:
    12.11.15
    Сообщения:
    1.299
    Лайки:
    379
    Репутация:
    97
    В общем получилось, но не так как хотелось бы, когда выбираешь пункт и что бы надпись появилась нужно еще раз открыть диалог,
    как сделать что бы отправлялась сразу после закрытия диалога?
    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.794
    Лайки:
    1.098
    Репутация:
    187
     
    #24
  25. 4el0ve4ik

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

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

    Друг

    Регистрация:
    23.03.13
    Сообщения:
    1.794
    Лайки:
    1.098
    Репутация:
    187
    
    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.299
    Лайки:
    379
    Репутация:
    97
    подскажите как сделать что бы диалог закрывался на кнопку "Exit",
    sampShowDialog(17, "Mactawish Mod Menu", string.format("Other Players \nSelf \nVehicle"), "Ok", "Exit", 2)
    как я понял делаеться это с помощью данного
    sampCloseCurrentDialogWithButton(--[[int]] button)
    Но как не пытался ничего у меня не получилось:(
     
    #27
  28. DarkP1xel

    DarkP1xel Δ9
    BH Team

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

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

    Регистрация:
    12.11.15
    Сообщения:
    1.299
    Лайки:
    379
    Репутация:
    97
    я пишу так
    sampCloseCurrentDialogWithButton(2)
    или нужно так?
    sampCloseCurrentDialogWithButton(button2)
     
    #29
  30. DarkP1xel

    DarkP1xel Δ9
    BH Team

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

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

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

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

    Регистрация:
    23.03.13
    Сообщения:
    2.281
    Лайки:
    804
    Репутация:
    462
    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
    Сообщения:
    261
    Лайки:
    33
    Репутация:
    5
    как правильно указать инт Актера?
     
    #33
  34. 4el0ve4ik

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

    Регистрация:
    12.11.15
    Сообщения:
    1.299
    Лайки:
    379
    Репутация:
    97
    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.281
    Лайки:
    804
    Репутация:
    462
    В начале скрипта объяви(вне функций)
     
    #35
    4el0ve4ik нравится это.
  36. 4el0ve4ik

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

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

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.611
    Лайки:
    1.573
    Репутация:
    418
    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.299
    Лайки:
    379
    Репутация:
    97
    if hp<50 then
    --code
    end
     
    #39
    loremi735 нравится это.
  40. mac

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

    Регистрация:
    06.09.14
    Сообщения:
    1.327
    Лайки:
    802
    Репутация:
    41
    
    while true do
        wait(0)
        local health = getCharHealth(playerPed)
        if health < 50 then
            *something*
        end
    end
    В тему.
    Пример работы с локальными диалогами, если кому надо. Простенько, доступно. Внизу файл, /menuTest активейшн.
    Все пять видов диалогов тут, хотя хз зачем, на вики вроде было это :/
    
    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 КБ
      Просмотров:
      20
    Последние данные очков репутации:
    helloy: 1 Очко 23 апр 2017
    #40
    vremya1927, RedBoxWhite, Muxic и ещё 1-му нравится это.