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

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

  1. imring

    imring колечконуп
    Проверенный

    Регистрация:
    3 авг 2016
    Сообщения:
    661
    Симпатии:
    394
    io.open os.remove
     
  2. Frapsy

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

    Регистрация:
    4 сен 2016
    Сообщения:
    9
    Симпатии:
    2
    Допустим, есть переменная pID, которая содержит в себе заданный айдишник, каким образом можно получить информацию о том, какой он дамаг нанес/получил? Ибо onSendGiveDamage и OnSendTakeDamage как я понял, они показывают информацию только обо мне(от кого я получаю и кому я даю урон).
     
    #5707 Frapsy, 16 апр 2018
    Последнее редактирование: 16 апр 2018
  3. randazzo

    randazzo не админ какой-то
    Проверенный

    Регистрация:
    21 май 2014
    Сообщения:
    967
    Симпатии:
    469
    local q = require 'lib.samp.events'
    
    function main()
        repeat wait(0) until isSampAvailable()
        wait(-1)
    end
    
    function q.onBulletSync(playerId, data)
        if playerId == pID then
            sampAddChatMessage('Target '..data.targetId..' WeaponId '..data.weaponId..' tX '..data.target.x..' tY '..data.target.y..' tZ '..data.target.z, -1)
        end
    end
    --[[
    struct BulletSyncData
    {
        uint8_t               targetType;
        uint16_t           targetId;
        struct VectorXYZ origin;
        struct VectorXYZ target;
        struct VectorXYZ center;
        uint8_t               weaponId;
    } __attribute__ ((packed));
    ]]
     
  4. Shuffle

    Shuffle Знаток

    Регистрация:
    11 мар 2018
    Сообщения:
    202
    Симпатии:
    60
    Пробывал так:
    function sampGetInfoPickup(id)
        ffi.cdef[[
        struct stPickup
        {
            int        iModelID;
            int        iType;
            float    fPosition[3];
        };
    
        struct stPickupPool
        {
            int                iPickupsCount;
            uint32_t        ul_GTA_PickupID[4096];
            int                iPickupID[4096];
            int                iTimePickup[4096];
            uint8_t            unk[4096 * 3];
            struct stPickup pickup[4096];
        };
        ]]
        local pool = ffi.cast('struct stPickupPool*', sampGetPickupPoolPtr())
        return pool.pickup[id].iModelID, pool.pickup[id].iType
    end
    Получилось так:
    [10:42:50.087901] (error)   test.lua: D:\Games\GTA San Andreas\moonloader\test.lua:186: attempt to redefine 'stPickup' at line 2
    stack traceback:
        [C]: in function 'cdef'
        D:\Games\GTA San Andreas\moonloader\test.lua:186: in function 'sampGetInfoPickup'
        D:\Games\GTA San Andreas\moonloader\test.lua:59: in function <D:\Games\GTA San Andreas\moonloader\test.lua:52>
     
  5. imring

    imring колечконуп
    Проверенный

    Регистрация:
    3 авг 2016
    Сообщения:
    661
    Симпатии:
    394
    вынеси ffi.cdef за функцию.
     
    Shuffle нравится это.
  6. Shuffle

    Shuffle Знаток

    Регистрация:
    11 мар 2018
    Сообщения:
    202
    Симпатии:
    60
    Так скрипт вообще не компилится
    UPD: Все ок, странно, но до этого не компилился
     
  7. rewzeisch

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

    Регистрация:
    29 июл 2017
    Сообщения:
    76
    Симпатии:
    4
    function checkall2()
        local data = LIP.load('moonloader\\config\\secret.ini')
        local ip = sampGetCurrentServerAddress()
        if data.AL.SERVER ~= nil then
            server = data.AL.SERVER
            local ip = data.AL.SERVER:gsub(':7777', '')
            if ip == 'ip' or not server == ip then
                sampAddChatMessage("[ {808080}GAuth {ffffff}]: IP сервера не указан, укажите его командой - [ {808080}/setserver {ffffff}].", 0xFFFFFF)
                checkall3()
            else
                if server == ip then
                checkall3()
              end
        end
      end
    end
    
    function checkall3()
        local data = LIP.load('moonloader\\config\\secret.ini')
        if data.AL.NAME ~= nil then
            name = data.AL.NAME
            local nick = sampGetPlayerNickname(id)
            local name = data.AL.NAME:gsub('_', ' ')
            if name == 'Nick_Name' or not name == nick then
                sampAddChatMessage("[ {808080}GAuth {ffffff}]: Ник не указан, укажите его командой [ {808080}/setnick {ffffff}].", 0xFFFFFF)
                checkall4()
            else
                if name ~= nil then
                    checkall4()
              end
            end
        end
    end
    
    function checkall4()
        local data = LIP.load('moonloader\\config\\secret.ini')
        local ip = sampGetCurrentServerAddress()
        local sname = servers[sampGetCurrentServerAddress()]
        nick = sampGetPlayerNickname(id)
        secret = data.AL.SECRET
        name = data.AL.NAME
        server = data.AL.SERVER
        if secret == 'secret' or name == 'Nick_Name' or not name == nick or not server == ip then
            lua_thread.create(firstThread)
            gauth = false
        else
        if secret ~= nil and name ~= nil and server ~= nil then
            sampAddChatMessage("[ {808080}GAuth {ffffff}]: Все данные для работы {808080}GAuth {ffffff}указаны верно.", 0xFFFFFF)
            sampAddChatMessage("[ {808080}GAuth {ffffff}]: Версия скрипта - "..thisScript().version, 0xFFFFFF)
          end
      end
    end
    почему если ник указан верно он всё равно говорит мне типо не верно, с ip точно так же
    в checkall4() он мне вообще ничего не показывает
     
  8. imring

    imring колечконуп
    Проверенный

    Регистрация:
    3 авг 2016
    Сообщения:
    661
    Симпатии:
    394
    moonloader/config/secret.ini скинь.
     
  9. rewzeisch

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

    Регистрация:
    29 июл 2017
    Сообщения:
    76
    Симпатии:
    4
    [AL]
    SECRET=secret
    AUTOUPD=1
    NAME=Nick_Name
    SERVER=176.32.37.63
     
  10. rewzeisch

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

    Регистрация:
    29 июл 2017
    Сообщения:
    76
    Симпатии:
    4
    function checkall2()
        local data = LIP.load('moonloader\\config\\secret.ini')
        local ip = sampGetCurrentServerAddress()
        if data.AL.SERVER ~= nil then
            server = data.AL.SERVER
            local ip = data.AL.SERVER:gsub(':7777', '')
            if server == 'ip' or ip ~= server then
                sampAddChatMessage("[ {808080}GAuth {ffffff}]: IP сервера указан не верно, укажите его командой - [ {808080}/setserver {ffffff}].", 0xFFFFFF)
                checkall3()
            else
                if ip ~= server then
                checkall3()
              end
        end
      end
    end
    
    function checkall3()
        local data = LIP.load('moonloader\\config\\secret.ini')
        if data.AL.NAME ~= nil then
            name = data.AL.NAME
            nick = sampGetPlayerNickname(id)
            local name = data.AL.NAME:gsub('_', ' ')
            if name == 'Nick_Name' or nick ~= name then
                sampAddChatMessage("[ {808080}GAuth {ffffff}]: Ник указан не верно, укажите его командой - [ {808080}/setnick {ffffff}].", 0xFFFFFF)
                checkall4()
            else
                if not name == 'Nick_Name' and name == nick then
                    checkall4()
              end
            end
        end
    end
    
    function checkall4()
        local data = LIP.load('moonloader\\config\\secret.ini')
        local ip = sampGetCurrentServerAddress()
        local sname = servers[sampGetCurrentServerAddress()]
        local nick = sampGetPlayerNickname(id)
        secret = data.AL.SECRET
        name = data.AL.NAME
        server = data.AL.SERVER
        if secret == 'secret' or name == 'Nick_Name' or server == 'ip' or not nick == name or not ip == server then
            lua_thread.create(firstThread)
            gauth = false
        else
        if secret ~= nil and nick == name and ip == server then
            sampAddChatMessage("[ {808080}GAuth {ffffff}]: Все данные для работы {808080}GAuth {ffffff}указаны верно.", 0xFFFFFF)
            sampAddChatMessage("[ {808080}GAuth {ffffff}]: Версия скрипта - "..thisScript().version, 0xFFFFFF)
          end
      end
    end
    теперь скрипт работает когда IP пишу стандартный (т.е. 'ip'), но если указать вообще что-либо кроме "ip" - он никак не хочет работать дальше (т.е. он даже до checkall3() не доходит, но сам скрипт не крашится)
    с ником точно так же, но он почему-то уже всегда показывает что всё указано не верно, даже если я напишу всё правильно
     
    #5715 rewzeisch, 16 апр 2018
    Последнее редактирование: 16 апр 2018
  11. brackets

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

    Регистрация:
    8 апр 2018
    Сообщения:
    14
    Симпатии:
    5
  12. rewzeisch

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

    Регистрация:
    29 июл 2017
    Сообщения:
    76
    Симпатии:
    4
    прив ещё раз, короче
    т.к. я бомж пытался сделать что-то годное но чет не оч получается, хотел сделать чтоб при отправке какого-то сообщения в чат то у меня выполнялась определённая функция, но я не очень разбираюсь в этом, и естественно у меня это не получилось

    если можно, объясните[!!!!!!] как сделать что-то подобное:
    function sampev.onServerMessage(color, text)
      if text:find('%{.+%}.+%[.+%] говорит:%{.+%} .+') then -- если найдена строка с таким форматом
        local thisnick, thistext = text:match('%{.+%}(.+)%[.+%] говорит:%{.+%} (.+)') -- получаем текст из этой строки
        if thisnick and thistext then -- если удачно
          local thisid = sampGetPlayerIdByNickname(thisnick) -- получаем ID по NickName (функция imring)
          local color = string.format("%06X", ARGBtoRGB(sampGetPlayerColor(thisid))) -- получаем цвет через ID
          sampAddChatMessage('{'..color..'}'..thisnick..' {ffffff}говорит: '..thistext, -1) -- отправляем в чат
          return false -- игнорируем прошлый текст, который без форматирования.
        end
      end
    end
    что значит вот это: %{.+%}.+%[.+%] говорит:%{.+%} .+, как можно их различать и тп, и ещё если можно что-нибудь по этому поводу разъясните мне)
     
  13. V3RC3TT1

    V3RC3TT1 Нуб с синим ником
    Проверенный

    Регистрация:
    3 дек 2016
    Сообщения:
    276
    Симпатии:
    187
    Как правильно достать слово выключи из строки 'Бомж, выключи музон'
     
  14. #Northn

    #Northn Знаток

    Регистрация:
    10 авг 2017
    Сообщения:
    159
    Симпатии:
    29
    
    local off = text:match('Бомж, (.+) музон')
    if off then
     print(off)
    end
    --------

    В начало каждого знака: [ ] { } ставится знак процента: %
    .+ обозначает любой символ, цифру или букву
    %d+ обозначает цифру
    %g+ ники (если не ошибаюсь)
    Исходя из этого всего строится предложение.
    Текст, который хочешь получить бери в скобки.
     
    #5719 #Northn, 16 апр 2018
    Последнее редактирование: 16 апр 2018
  15. imring

    imring колечконуп
    Проверенный

    Регистрация:
    3 авг 2016
    Сообщения:
    661
    Симпатии:
    394
    у тебя off будет nil.
    local off = ('Бомж, выключи музон'):match('Бомж%C%s(.+)%sмузон')
    print(off)
    UPD: а лучше так:
    local off = ('Эй, бомж! выруби музон! И уйди от сюда.'):rlower():match('^.-бомж%C-%s+(.+)%s+музон.-$')
    print(off)
     
    #5720 imring, 16 апр 2018
    Последнее редактирование: 17 апр 2018
    V3RC3TT1 и #Northn нравится это.
  16. yuy111

    yuy111 Знаток

    Регистрация:
    22 фев 2017
    Сообщения:
    101
    Симпатии:
    1
    почему нельзя сделать sampSendChat через команду с задержкой.
     
  17. KEPOCUH

    KEPOCUH Знаток

    Регистрация:
    10 апр 2017
    Сообщения:
    237
    Симпатии:
    74
    --команда
    sampRegisterChatCommand('test', function() lua_thread.create(test) end)
    
    --функция
    function test()
        sampSendChat('123')
        wait(5000)
        sampSendChat('123')
    end
    так пробуй
     
  18. Trefa_

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

    Регистрация:
    5 фев 2015
    Сообщения:
    72
    Симпатии:
    3
    function getPlayerSeatID(playerid)
        require 'samp.synchronization'
        local ffi = require 'ffi'--
        local data_type = 'struct PassengerSyncData'
        local data = ffi.new(data_type, {})
        local raw_data_ptr = tonumber(ffi.cast('uintptr_t', ffi.new(data_type .. '*', data)))
        sampStorePlayerPassengerData(playerid, raw_data_ptr)
    return readMemory(raw_data_ptr + 2, 1, true)
    end
    Ругается на эту фигню, как пофиксить?
    [19:42:10.159106] (error)    Spinfo: E:\arp\moonloader\lib\samp\synchronization.lua:154: attempt to redefine 'VectorXYZ' at line 2
    stack traceback:
        [C]: in function 'cdef'
        E:\arp\moonloader\lib\samp\synchronization.lua:154: in main chunk
        [C]: in function 'require'
        E:\arp\moonloader\lib\samp\events\utils.lua:34: in function 'read_data'
        E:\arp\moonloader\lib\samp\events\core.lua:78: in function <E:\arp\moonloader\lib\samp\events\core.lua:54>
    [19:42:10.169106] (error)    Spinfo: Script died due to an error. (21D47B24)
    
     
  19. imring

    imring колечконуп
    Проверенный

    Регистрация:
    3 авг 2016
    Сообщения:
    661
    Симпатии:
    394
    не вызывай samp.synchronization. если вызвал samp.events, то не вызывай samp.synchronization, если нет, то вызывай ОДИН раз.
     
  20. Trefa_

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

    Регистрация:
    5 фев 2015
    Сообщения:
    72
    Симпатии:
    3
    А как тогда можно узнать на каком месте в машине сидит игрок, если я юзаю samp.events и не могу использовать эту функцию (ибо краш)

    Как можно нарисовать прямоугольник зависящий от длины текста?
     
    #5725 Trefa_, 16 апр 2018
    Последнее редактирование модератором: 16 апр 2018
  21. Frapsy

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

    Регистрация:
    4 сен 2016
    Сообщения:
    9
    Симпатии:
    2
    Спасибо, но в этом случае мы получаем цель, по которой стреляет заданный игрок и оружие, из которого идет стрельба(кулак не ловит), вопрос состоит в том, как получить инфу о дамаге, который указанный игрок нанес :c Все гуглю информацию по BulletSyncData, onBulletSync и что-то ничего :c
     
  22. Shuffle

    Shuffle Знаток

    Регистрация:
    11 мар 2018
    Сообщения:
    202
    Симпатии:
    60
    Тред создавать нужно
     
  23. KEPOCUH

    KEPOCUH Знаток

    Регистрация:
    10 апр 2017
    Сообщения:
    237
    Симпатии:
    74
    как получить сколько патронов не в обойме(выделено красным)

    это не то:
    Функция позволяет узнать сколько патронов в обойме.
    
    function getAmmoInClip()
      local struct = getCharPointer(playerPed)
      local prisv = struct + 0x0718
      local prisv = memory.getint8(prisv, false)
      local prisv = prisv * 0x1C
      local prisv2 = struct + 0x5A0
      local prisv2 = prisv2 + prisv
      local prisv2 = prisv2 + 0x8
      local ammo = memory.getint32(prisv2, false)
      return ammo
    end
    
    Использование:
    local ammoinclip = getAmmoInClip()
    P.S.
    local memory = require "memory"
    в начало кода пропишите.
    int ammo = getAmmoInCharWeapon(Ped ped, int int)
     

    Вложения:

    • sa-mp-008.png
      sa-mp-008.png
      Размер файла:
      62,5 КБ
      Просмотров:
      122
  24. imring

    imring колечконуп
    Проверенный

    Регистрация:
    3 авг 2016
    Сообщения:
    661
    Симпатии:
    394
    от всего количества патрон отними кол-во патрон в обойме.
     
    KEPOCUH нравится это.
  25. rewzeisch

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

    Регистрация:
    29 июл 2017
    Сообщения:
    76
    Симпатии:
    4
    приветик помогите))))

        function sampev.onServerMessage(color, text)
          if text:find('Деньги перечислены на ваш банковский счёт.') then
            local screen = text:match('Деньги перечислены на ваш банковский счёт.')
          if screen then
                    sampAddChatMessage("[ {800000}HitMan {ffffff}]: Контракт выполнен! {800000}Hitman Help {ffffff}автоматически сделает скриншот.", -1)
                    screenshot()
                    if data.options.screenshot == 1 then wait(750) end
                    if data.options.screenshot == 0 then wait(1200) end
            end
          end
        end
    как сделать так, чтобы "Деньги перечислены на ваш банковский счёт." не писалось в чат? т.е. типо сервер отправляет мне это сообщение в чат, но скрипт его читает и удаляет т.е. я его не вижу
     
  26. Alkasch226

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

    Регистрация:
    3 авг 2015
    Сообщения:
    19
    Симпатии:
    4
    После
    if text:find('Деньги перечислены на ваш банковский счёт.') then
    Поставь
    return false
     
  27. rewzeisch

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

    Регистрация:
    29 июл 2017
    Сообщения:
    76
    Симпатии:
    4
    если вставляю пишет после local end поставить, но это типа бред же да

    всё сделал, только return false поставил в самый конец функции.
     
    #5732 rewzeisch, 17 апр 2018
    Последнее редактирование модератором: 17 апр 2018
  28. yuy111

    yuy111 Знаток

    Регистрация:
    22 фев 2017
    Сообщения:
    101
    Симпатии:
    1
    script_name("Restore health")
    script_author("noname_noob")
    require "lib.moonloader"
    
    function main()
    while not isSampAvailable() do wait(100) end
        if not isSampfuncsLoaded() or not isSampLoaded() then return end
        while true do
        wait(0)
             if getCurrentCharWeapon(playerPed) == 24 then
                sampAddChatMessage("dailog", FFFFFF) wait(1)
             end
        end
    end
    
    планировалось чтобы писало dailog 1 раз, а он флудит. Как исправить?
     
  29. rewzeisch

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

    Регистрация:
    29 июл 2017
    Сообщения:
    76
    Симпатии:
    4
    я обычно в таких случаях ставлю wait(1000), мне помогает, хотя мне кажется так делают только быдло-кодеры (как я)
     
  30. yuy111

    yuy111 Знаток

    Регистрация:
    22 фев 2017
    Сообщения:
    101
    Симпатии:
    1
    А где wait ставить?
     
  31. #Northn

    #Northn Знаток

    Регистрация:
    10 авг 2017
    Сообщения:
    159
    Симпатии:
    29
    Он в бесконечном цикле и условие if постоянно истинно, по этому флудит.
     
  32. yuy111

    yuy111 Знаток

    Регистрация:
    22 фев 2017
    Сообщения:
    101
    Симпатии:
    1
    Как сделать авторп отыгровку оружия? Пытался, получилось Г.
    script_name("Restore health")
    script_author("noname_noob")
    require "lib.moonloader"
    
    function main()
    while not isSampAvailable() do wait(100) end
        if not isSampfuncsLoaded() or not isSampLoaded() then return end
        while true do
        wait(0)
             if getCurrentCharWeapon(playerPed) == 24 then
                sampAddChatMessage("dailog", FFFFFF) wait(1)
             end
        end
    end
     
  33. #Northn

    #Northn Знаток

    Регистрация:
    10 авг 2017
    Сообщения:
    159
    Симпатии:
    29
    Lua - RPgun(https://blast.hk/threads/13980/)
     
  34. rewzeisch

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

    Регистрация:
    29 июл 2017
    Сообщения:
    76
    Симпатии:
    4
    как сделать норм рандом, чтоб каждый раз разные числа были, помню там можно было через math.random или что-то подобное, но там всегда были одинаковые числа
     
  35. #Northn

    #Northn Знаток

    Регистрация:
    10 авг 2017
    Сообщения:
    159
    Симпатии:
    29
    Перед самим рандомом:
    math.randomseed(os.time())
     
    Bogach и rewzeisch нравится это.