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

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

  1. Frapsy

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

    Регистрация:
    4 сен 2016
    Сообщения:
    66
    Симпатии:
    5
    Можно пример кода, который будет в через определенное время выводить разные подсказки в чат? хД
     
  2. #Northn

    #Northn Знаток

    Регистрация:
    10 авг 2017
    Сообщения:
    417
    Симпатии:
    84
        lua_thread.create(function()
            while true do
                math.randomseed(os.time())
                local helpd = math.random(1, 10)
                if helpd == 1 then
                    sampAddChatMessage("[ PHELP ]{ffffff}: Если вы хотите узнать, кто в вас выстрелил последний раз - нажмите кнопку {0088ff}X.", 0x0088ff)
                    sampAddChatMessage("[ PHELP ]{ffffff}: Однако, учтите, с киллерами такое не получится.", 0x0088ff)
                elseif helpd == 2 then
                    sampAddChatMessage("[ PHELP ]{ffffff}: У нас действует свой отдельный чат, в котором могут общаться кто угодно!", 0x0088ff)
                    sampAddChatMessage("[ PHELP ]{ffffff}: Для взаимодействия с данным чатом включите его. [{0088ff} /pinfo » Модификации {ffffff}]", 0x0088ff)
                elseif helpd == 3 then
                    sampAddChatMessage("[ PHELP ]{ffffff}: У нас существует отдельная модификация, именуемая как \'Стробоскопы\'", 0x0088ff)
                    sampAddChatMessage("[ PHELP ]{ffffff}: Данная модификация срабатывает при включённых мигалках в транспортном средстве.", 0x0088ff)
                elseif helpd == 4 then
                    sampAddChatMessage("[ PHELP ]{ffffff}: Данный скрипт обновляется часто, по этому если у вас есть идея по улучшению или обнаружили недоработку.", 0x0088ff)
                    sampAddChatMessage("[ PHELP ]{ffffff}: Вы можете обратиться к основателю скрипта через соц.сеть VK. [ {0088ff}vk.com/thenortonpclife{ffffff} ]", 0x0088ff)
                elseif helpd == 5 then
                    sampAddChatMessage("[ PHELP ]{ffffff}: У нас действует система горячих клавиш, подробнее в [ /pinfo » Основная информация » Горячие клавиши ]", 0x0088ff)
                elseif helpd == 6 then
                    sampAddChatMessage("[ PHELP ]{ffffff}: Не работают горячие клавиши? Проверьте включённость NUMLOCK, она должна быть включена.", 0x0088ff)
                    sampAddChatMessage("[ PHELP ]{ffffff}: А так-же, если у вас установлен биндер - выключите его.", 0x0088ff)
                elseif helpd == 7 then
                    sampAddChatMessage("[ PHELP ]{ffffff}: Обращайте внимание на версию Police Helper, вполне возможно, что скрипт обновился и были добавлены новые функции.", 0x0088ff)
                elseif helpd == 8 then
                    sampAddChatMessage("[ PHELP ]{ffffff}: Если у вас Police Helper иногда показывает в SMS одну версию, а в другой раз показывает другую, то будьте внимательны.", 0x0088ff)
                    sampAddChatMessage("[ PHELP ]{ffffff}: Вполне возможно, что в первом - версия установщика, а во втором - версия самого скрипта.", 0x0088ff)
                elseif helpd == 9 then
                    sampAddChatMessage("[ PHELP ]{ffffff}: Быстрое меню 1.0 и 2.0 срабатывают только при появлении зелёного треугольника над головой персонажа.", 0x0088ff)
                elseif helpd == 10 then
                    sampAddChatMessage("[ PHELP ]{ffffff}: Пожалуйста, будьте адекватны в чате Police Helper, не оскорбляйте, не пишите включенным CAPSLOCK-ом.", 0x0088ff)
                    sampAddChatMessage("[ PHELP ]{ffffff}: В чате запрещена торговля, если вы хотите обсудить цену с другом - используйте [{0088ff} /kw или /ksms Ник Текст{ffffff} ]", 0x0088ff)
                    sampAddChatMessage("[ PHELP ]{ffffff}: В противном случае вы можете получить блокировку чата от 5 минут до бесконечности.", 0x0088ff)
                end
                wait(2700000)
            end
        end)
    45 минут
     
    Tyzik нравится это.
  3. JackR

    JackR Новичок

    Регистрация:
    25 ноя 2017
    Сообщения:
    3
    Симпатии:
    0
    Ребята, помогите, что я не так делаю:

    function main()
    while not isSampAvailable() do
    wait(1000)
    end
    while true do
    wait(0)
    text, prefix, color, pcolor = sampGetChatString(99)
    id = string.match(text, "Жалоба:.+[%d+]: .+")
    if string.find(text, "Как показать паспорт") then
    sampSendChat(string.format("/ans %d /pass [id]", id))
    end
    end
    end

    Нужно что бы если в чате появлялось сообщение "Жалоба: Bomj_Sampovski[228]: Как показать паспорт?" ему автоматом отвечало "/ans 228 /pass [id]"
     
  4. laz3r228

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

    Регистрация:
    24 ноя 2016
    Сообщения:
    56
    Симпатии:
    1
    Как создать диалог такого типа
    [​IMG]
    и вывести в чат то что я написал в нем?
     
  5. Aniki

    Проверенный

    Регистрация:
    3 сен 2017
    Сообщения:
    177
    Симпатии:
    100
    Для таких целей намного удобнее и практичнее использовать библиотеку samp.lua SAMP.Lua(https://blast.hk/threads/14624/)
    С ней твой код будет выглядеть как-то так:

    function main()
      while not isSampAvailable() do
        wait(1000)
      end
      wait(-1)
    end
    
    local sampev = require 'lib.samp.events'
    
    function sampev.onServerMessage(color, text)
      if text:match('^Жалоба: .*%[%d+%]: Как показать паспорт') then
        local id = text:match('^Жалоба: .*%[(%d+)%]: .*')
        sampSendChat('/ans ' .. id .. ' /pass [id]')
      end
    end
    
    + в теме есть достаточно примеров
     
    JackR нравится это.
  6. #Northn

    #Northn Знаток

    Регистрация:
    10 авг 2017
    Сообщения:
    417
    Симпатии:
    84
    local sampev = require 'lib.samp.events'
    
    function main()
        while not isSampAvailable() do wait(50) end
        wait(-1)
    end
    
    function sampev.onServerMessage(color, text)
        if text:find('Жалоба: %a+_%a+[%d+]: .+') then
            local id, ques = text:match('Жалоба: %a+_%a+%[(%d+)%]: (.+)')
            if ques:find('Как показать паспорт?') then
                sampSendChat('/ans '..id..' /pass [ID]')
            end
        end
    end
    -----------------------------------------
    function main()
        while not isSampAvailable() do wait(50) end
        sampShowDialog(572, "Второй диалог", "А ниже поле для вывода", "Уря", "Закрыть", 1)
        while true do wait(0)
            local re, bu, li, inp = sampHasDialogRespond(572)
                if re == true and bu == 1 and inp ~= nil then
                    sampSendChat(inp)
                end
            end
        end
    end
     
    #8651 #Northn, 13 июн 2018
    Последнее редактирование: 13 июн 2018
  7. laz3r228

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

    Регистрация:
    24 ноя 2016
    Сообщения:
    56
    Симпатии:
    1
    function gr(pam)
      local dep, reason = string.match(pam, '(%d+)%s*(%s*)')
      if dep ~= nil then
        if dep == "" or dep < "1" or dep > "3" then
          sampAddChatMessage("{9966CC}FBI TOOLS {EAEAEA}| Enter /gr [1-3] REASON", -1)
          sampAddChatMessage("{9966CC}FBI TOOLS {EAEAEA}| 1 - LSPD | 2 - SFPD | 3 - LVPD", -1)
        elseif dep == "1" then
          sampSendChat("LSPD, пересекаю вашу юрисдикцию. "..reason)
        elseif dep == "2" then
          sampSendChat("SFPD, пересекаю вашу юрисдикцию. "..reason)
        elseif dep == "3" then
          sampSendChat("LVPD, пересекаю вашу юрисдикцию. "..reason)
        end
      end
    end
    Чего оно не считывает reason?
     
  8. Aniki

    Проверенный

    Регистрация:
    3 сен 2017
    Сообщения:
    177
    Симпатии:
    100
    потому что %s отвечает за пробельные символы. используй .*
    local dep, reason = string.match(pam, '(%d+)%s*(.*)')
     
  9. V3RC3TT1

    V3RC3TT1 KILLY - No Sad No Bad
    Проверенный

    Регистрация:
    3 дек 2016
    Сообщения:
    410
    Симпатии:
    220
    local dep, reason = pam:match('(%d+)%s+(.+)')
     
  10. laz3r228

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

    Регистрация:
    24 ноя 2016
    Сообщения:
    56
    Симпатии:
    1
    как сделать диалог STYLE_LIST который активируется на команду /ms и что бы при выборе пункта открывался диалог STYLE_INPUT в котором я вписываю текст и он отправляется в чат
    [​IMG]
     
    #8655 laz3r228, 13 июн 2018
    Последнее редактирование: 13 июн 2018
  11. JackR

    JackR Новичок

    Регистрация:
    25 ноя 2017
    Сообщения:
    3
    Симпатии:
    0
    Все же есть проблемы с этим:
    Вроде всё правильно сделал, но всё равно в итоге не срабатывает. Формат строки [/arep] Bomj_Bomj[228]: Как показать паспорт?, но всё же кажется что что то не так с регулярными выражениями.
     
  12. #Northn

    #Northn Знаток

    Регистрация:
    10 авг 2017
    Сообщения:
    417
    Симпатии:
    84
    LUA чувствителен к регистру, может быть пишут "как ПОКазать паспорт" или тому подобное? В таком случае работать не будет.
    А если же нет.
    А так же нужно скачать SAMP.Lua(https://blast.hk/threads/14624/)
     
  13. imring

    imring колечконуп
    Всефорумный модератор

    Регистрация:
    3 авг 2016
    Сообщения:
    1.138
    Симпатии:
    612
     
    DonHomka нравится это.
  14. JackR

    JackR Новичок

    Регистрация:
    25 ноя 2017
    Сообщения:
    3
    Симпатии:
    0
    Есть два вопроса:
    1) Можно ли хоть как то в sampev.onServerMessage(color, text) использовать wait(1000)?
    2) Можно ли, что бы текст, который был отловлен sampev.onServerMessage(color, text) был виден.?
     
  15. BND / PLP

    BND / PLP Известный пользователь

    Регистрация:
    8 апр 2016
    Сообщения:
    76
    Симпатии:
    5
    как получить координаты части тела скина? типа спина/башка/рука/нога
     
  16. Aniki

    Проверенный

    Регистрация:
    3 сен 2017
    Сообщения:
    177
    Симпатии:
    100
    1) Можно, но для этого нужно создать поток. Пример:
    function sampev.onServerMessage(color, text)
        if text:match('something') then
            lua_thread.create(function ()
                print('1')
                wait(500)
                print('2')
            end)
        end
    end
    2) Да, если не возвращать false. А если строка исчезает все равно, то в крайнем случае можно использовать sampAddChatMessage(text, color)
     
  17. Musaigen

    Musaigen Знаток

    Регистрация:
    1 апр 2018
    Сообщения:
    157
    Симпатии:
    39
    Как можно изменить галочку в чекбоксе, например чтоб она была квадратом или кругом?(imGui)
     
  18. Dragneel

    Dragneel Новичок

    Регистрация:
    13 май 2018
    Сообщения:
    4
    Симпатии:
    0
    Как можно развернуть персонажа на 90° в режиме прицеливания?
     
  19. Aniki

    Проверенный

    Регистрация:
    3 сен 2017
    Сообщения:
    177
    Симпатии:
    100
    Простого пути нет, надо заново определять функцию для чекбокса
    local heading = getCharHeading(PLAYER_PED)
    setCameraPositionUnfixed(0, math.rad(heading)) --влево
    setCameraPositionUnfixed(0, math.rad(heading + 180)) -- вправо
    недостаток только в том, что прицел после поворота всегда устанавливается посередине оси Z
     
    Dragneel нравится это.
  20. laz3r228

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

    Регистрация:
    24 ноя 2016
    Сообщения:
    56
    Симпатии:
    1
    как сделать диалог STYLE_LIST который активируется на команду /ms и что бы при выборе пункта открывался диалог STYLE_INPUT в котором я вписываю текст и он отправляется в чат
     
  21. Dragneel

    Dragneel Новичок

    Регистрация:
    13 май 2018
    Сообщения:
    4
    Симпатии:
    0
    Какая-то слишком нестабильная процедура. Потанцевал с бубном в поисках решения трабла с осью Z, но все безуспешно. Думаю работать напрямую с памятью будет намного эффективнее. Только вот кто бы мог предоставить указатель, по которому храниться значение координат камеры.
     
  22. BND / PLP

    BND / PLP Известный пользователь

    Регистрация:
    8 апр 2016
    Сообщения:
    76
    Симпатии:
    5
    
    function main()
        if not isSampfuncsLoaded() or not isSampLoaded() then return end
        while not isSampAvailable() do wait(100) end
        sampRegisterChatCommand('ms', dialog)
        while true do
            wait(0)
            local result, button, list, _ = sampHasDialogRespond(1385)
            if result then
                if list == 0 then
                    if button then
                        sampShowDialog(1359, 'Диалог', 'Текст внутри диалога', 'Отправить', '', 1)
                    end
                end
            end
            local res, but, _, input = sampHasDialogRespond(1359)
            if res then
                if but then
                    sampSendChat(tostring(input))
                end
            end
        end
    end
    function dialog()
        sampShowDialog(1385, 'Диалог', 'Строка 1\nСтрока2\nСтрока3', 'Выбрать', '', 2)
    end
    
    


    где можно получить координаты костей персонажа?
     
    #8667 BND / PLP, 13 июн 2018
    Последнее редактирование: 13 июн 2018
    laz3r228 нравится это.
  23. imring

    imring колечконуп
    Всефорумный модератор

    Регистрация:
    3 авг 2016
    Сообщения:
    1.138
    Симпатии:
    612
  24. Frapsy

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

    Регистрация:
    4 сен 2016
    Сообщения:
    66
    Симпатии:
    5
    error saving ini file: create_directories(p): invalid argument: operation not permitted

    Уже сразу понимаю, что нет доступа для сохранения(в моем случае создания) ини файлика. При этом у меня работает нормально, у остальных бьет эту ошибку. Запуск игры на пару с сампом от имени адм не решение этой проблемы хД Варианты? :D

    + как можно добавить текст похожий на PrintString, но который можно перемещать и менять размеры, а то чет крупноват
     
  25. BND / PLP

    BND / PLP Известный пользователь

    Регистрация:
    8 апр 2016
    Сообщения:
    76
    Симпатии:
    5
    у меня жта зависла
    local ffi = require "ffi"
    local getBonePosition = ffi.cast("int (__thiscall*)(void*, float*, int, bool)", 0x5E4280)
    
    function main()
        if not isSampfuncsLoaded() or not isSampLoaded() then return end
        while not isSampAvailable() do wait(100) end
        sampRegisterChatCommand('cmd', func)
        while true do
            wait(0)
        end
    end
    
    function func(arg)
        local id = tonumber(arg)
        local handle = PLAYER_HANDLE
        GetBodyPartCoordinates(id, handle)
        print(vec[0]..'|'..vec[1]..'|'..vec[2])
    end
    
    function GetBodyPartCoordinates(id, handle)
      local pedptr = getCharPointer(handle)
      local vec = ffi.new("float[3]")
      getBonePosition(ffi.cast("void*", pedptr), vec, id, true)
      return vec[0], vec[1], vec[2]
    end
    
    в логе пусто
     
  26. imring

    imring колечконуп
    Всефорумный модератор

    Регистрация:
    3 авг 2016
    Сообщения:
    1.138
    Симпатии:
    612
    function func(arg)
        local id = tonumber(arg)
        if id then
            local x, y, z = GetBodyPartCoordinates(id, playerPed)
            print(x, y, z)
        end
    end
     
  27. Cameron_Bawerman

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

    Регистрация:
    14 дек 2016
    Сообщения:
    50
    Симпатии:
    0
    Всем привет, как сделать проверку что в файле settings.ini под переменной mydepartament= пусто
    То есть если переменная заполнена каким то текстом то скрипт продолжал работу а если переменная пустая то он выдавал ошибку что переменная пустая
    Помогите, мучаюсь уже второй день с этим
     
  28. #Northn

    #Northn Знаток

    Регистрация:
    10 авг 2017
    Сообщения:
    417
    Симпатии:
    84
    if переменная == nil then
       print('nil')
    else
      --code
    end
     
  29. Cameron_Bawerman

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

    Регистрация:
    14 дек 2016
    Сообщения:
    50
    Симпатии:
    0
    Что у меня не так?
    function dB1()
        if inifiles.settings.myphone == nil then
           print('nil')
        else
            local termin = math.random(1, 4)
            if termin == 1 then sampSendChat("/n ДБ, CК, ТК мне в смс "..inifiles.settings.myphone.."", -1) end
            if termin == 2 then sampSendChat("/n ТК, РК, СК мне в смс "..inifiles.settings.myphone.."", -1) end
            if termin == 3 then sampSendChat("/n ПГ, ДМ, МГ мне в смс "..inifiles.settings.myphone.."", -1) end
            if termin == 4 then sampSendChat("/n ДМ, ТК, РК мне в смс "..inifiles.settings.myphone.."", -1) end
        end
    end
     
  30. #Northn

    #Northn Знаток

    Регистрация:
    10 авг 2017
    Сообщения:
    417
    Симпатии:
    84
    Где загрузка INI-файла?
     
  31. Cameron_Bawerman

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

    Регистрация:
    14 дек 2016
    Сообщения:
    50
    Симпатии:
    0
    Не понял(
     
  32. laz3r228

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

    Регистрация:
    24 ноя 2016
    Сообщения:
    56
    Симпатии:
    1
    как узнать ник игрока которого я убил?
     
  33. Jason2222

    Jason2222 Знаток

    Регистрация:
    20 янв 2018
    Сообщения:
    102
    Симпатии:
    0
    Этим засран весь лог-файл moonloader'a. Что с этим делать?
    Опкод sampfuncsLog(string text) -- 0B78
    
    [23:16:37.613216] (error)    SF Integration: opcode '0B78' call caused an unhandled exception
    stack traceback:
        [C]: in function 'sampfuncsLog'
        ...х\Desktop\         \GTA SA\moonloader\SF Integration.lua:38: in function 'log_message'
        ...х\Desktop\         \GTA SA\moonloader\SF Integration.lua:64: in function <...х\Desktop\         \GTA SA\moonloader\SF Integration.lua:60>
    
     
  34. Trefa_

    Trefa_ Знаток

    Регистрация:
    5 фев 2015
    Сообщения:
    194
    Симпатии:
    35
    Как конвертировать color в hex
    function sampev.onServerMessage(color, text)
    end
     
  35. laz3r228

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

    Регистрация:
    24 ноя 2016
    Сообщения:
    56
    Симпатии:
    1
    скиньте пж легкий пример скрипта с использованием inicfg для ознакомления