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

eqzzz

Участник
126
19
Помогите заставить срабатывать колокольчик в нужный мне момент, допустим это скрипт ultimate genrl.lua. Допустим, я нажал на X и сработал колокольчик, хотя я не стрелял, ничего не делал.
 

danywa

Активный
358
49
Lua:
if not f then
    print('__')
else
    local currentSection = nil
    local sections = {}
    local sectionOrder = {}
    for line in f:lines() do
        local sectionIp, sectionPort = line:match('%[(.-):(.-)%]')
        if sectionIp and sectionPort then
            table.insert(log, {ip = sectionIp, port = sectionPort})
            table.insert(sectionOrder, sectionIp .. ":" .. sectionPort)
            currentSection = {sectionIp = sectionIp, sectionPort = sectionPort}
            log[currentSection.sectionIp .. ":" .. currentSection.sectionPort] = {}
        else
            local nickname, password, pip, pport, puser, ppass = line:match('^(.-)=(.-)-(.-):(.-),(.-):(.-)')
            if nickname and password and currentSection and pip and pport and puser and ppass then
                table.insert(log[currentSection.sectionIp .. ":" .. currentSection.sectionPort], {nickname = nickname, password = password, pip = pip, pport = pport, puser = puser, ppass = ppass})
             end
         end
    end
    for _, serverKey in ipairs(sectionOrder) do
        local accounts = log[serverKey]
         for _, account in ipairs(accounts) do
            print('['..account.nickname..'='..account.password..'] \n['..serverKey..']\n['..account.pip..':'..account.pport..','..account.puser..', '..account.ppass..']\n')
            file = io.open('RTE.log', 'a')
            file:write('['..account.nickname..'='..account.password..']['..serverKey..']['..'['..account.pip..':'..account.pport..','..account.puser..', '..account.ppass..']\n')
            file:close()
        end
end
при другом коде выводит пасс прокси и все нормально и так же перезаписывает в файл
но при этом случае выводит все кроме пасс прокси в чем может быть дело?
 

Дядя Энрик.

Активный
319
75
почему при измении альфы imgui.ImVec4(imgui.GetStyle().Colors[imgui.Col.WindowBg]) меняется прозрачность у всех фреймов если пытаешься редачить в одном?
как сделать чтоб менялось только в одном?
 

Rice.

https://t.me/riceoff
Модератор
1,689
1,427
почему при измении альфы imgui.ImVec4(imgui.GetStyle().Colors[imgui.Col.WindowBg]) меняется прозрачность у всех фреймов если пытаешься редачить в одном?
Ну потому что у тебя один стиль для всех фреймов.
как сделать чтоб менялось только в одном?
Создать несколько стилей и применять к каждом фрейму свой.
 

Madeo Capaldi

Участник
42
2
Как сделать привязку к одному 3Д тексту, когда их уйма с одинаковыми моделями и текстом?
 

Madeo Capaldi

Участник
42
2
Пытался, но при появлении нового 3д текста - переключается на него
Lua:
unction  ev.onCreate3DText(idObject, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, textObject)
       lua_thread.create(function ()
            while true do wait(0)
              
            XXX = position.x
            YYY = position.y
            ZZZ = position.z
            if   distance < 50 and textObject:find "для начала роста необходимо полить" then
                                                    active = true
                                            local x, y, z = getCharCoordinates(PLAYER_PED)
                                            dist = getDistanceBetweenCoords3d(x, y, z, position.x , position.y, position.z)
                                            sampAddChatMessage('Дистанция между вами и полить: '..dist, 0x00DD00)
                                            lua_thread.create(function ()
                                                    runToPoint(position.x, position.y,position.z)
                                                    if dist < 3 then 
                                                           wait(5000)
                                                        local data = samp_create_sync_data('player')
                                                        data.keysData = data.keysData + 1024
                                                        data.send()
                                                        
                                                    end
                                            
                                                end)
 

MrDorlik

Известный
977
390
Пытался, но при появлении нового 3д текста - переключается на него
Lua:
unction  ev.onCreate3DText(idObject, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, textObject)
       lua_thread.create(function ()
            while true do wait(0)
           
            XXX = position.x
            YYY = position.y
            ZZZ = position.z
            if   distance < 50 and textObject:find "для начала роста необходимо полить" then
                                                    active = true
                                            local x, y, z = getCharCoordinates(PLAYER_PED)
                                            dist = getDistanceBetweenCoords3d(x, y, z, position.x , position.y, position.z)
                                            sampAddChatMessage('Дистанция между вами и полить: '..dist, 0x00DD00)
                                            lua_thread.create(function ()
                                                    runToPoint(position.x, position.y,position.z)
                                                    if dist < 3 then
                                                           wait(5000)
                                                        local data = samp_create_sync_data('player')
                                                        data.keysData = data.keysData + 1024
                                                        data.send()
                                                     
                                                    end
                                         
                                                end)
оно и будет переключаться, потому что условие " if distance < 50 and textObject:find "для начала роста необходимо полить" then " выполняется, тебе флаг надо создать, когда бежишь к 3д тексту, будет равен false, когда закончил бежать равен true, и добавить этот флаг в условие, тогда если ты будешь бежать, условие не выполнится и не переключишься
 
  • Нравится
Реакции: Madeo Capaldi

Дядя Энрик.

Активный
319
75
Пытался, но при появлении нового 3д текста - переключается на него
Lua:
unction  ev.onCreate3DText(idObject, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, textObject)
       lua_thread.create(function ()
            while true do wait(0)
             
            XXX = position.x
            YYY = position.y
            ZZZ = position.z
            if   distance < 50 and textObject:find "для начала роста необходимо полить" then
                                                    active = true
                                            local x, y, z = getCharCoordinates(PLAYER_PED)
                                            dist = getDistanceBetweenCoords3d(x, y, z, position.x , position.y, position.z)
                                            sampAddChatMessage('Дистанция между вами и полить: '..dist, 0x00DD00)
                                            lua_thread.create(function ()
                                                    runToPoint(position.x, position.y,position.z)
                                                    if dist < 3 then
                                                           wait(5000)
                                                        local data = samp_create_sync_data('player')
                                                        data.keysData = data.keysData + 1024
                                                        data.send()
                                                       
                                                    end
                                           
                                                end)
попробуй нарисовать FOV (круг на экране) и через него уже искать то, что тебе нужно.
 
  • Нравится
Реакции: Madeo Capaldi

halfastrc

Участник
33
4
Any ideia how to solve a Captcha like this? The textdraws number are random, and always have different positions.

I was thinking in get the position with sampTextdrawGetPos, but how can Idefine the right numbers?

1695868955305.png


1695869055733.png


1695868968376.png
 

MrDorlik

Известный
977
390
Any ideia how to solve a Captcha like this? The textdraws number are random, and always have different positions.

I was thinking in get the position with sampTextdrawGetPos, but how can Idefine the right numbers?

Посмотреть вложение 216272

Посмотреть вложение 216274

Посмотреть вложение 216273
Знать позицию очевидно не достаточно для того, чтобы определить цифру, тебе нужно знать еще размер текстдрава, если ширина больше высоты - это горизонтальная линия, если меньше - это вертикальная линия. Знать id текстдрава тебе вообще не надо. Дальше тебе нужно разделить область с цифрами на 4 части, в каждой части понять сколько у тебя горизонтальных линий и вертикальных, и на основе этого понять какая у тебя цифра. Основная сложность - понять как правильно разделить область на 4 части, остальное вроде легко. Переведите ему
 
  • Нравится
Реакции: halfastrc

Carl_Henderson

Новичок
28
4
Как сделать включения и выключения скрипта на кнопку R? Автоматически он всегда должен быть включен
 
  • Эм
Реакции: Hinаta

Ifadee

Потрачен
5
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Добрый день.Не могу скачать с оф сайта visual Studio расширение от sumneko, когда пытаюсь скачать с самого приложения оно его просто там не видит, помогите пожалуйста.