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

scroll.

bud' chelovekom
Проверенный
4,164
1,450
В одном imgui.PushItemWidth я могу вводить сколько угодно душе символов,в другом огран из - за чего ? ☹️
1654537262620.png

govno:
imgui.Checkbox(u8"Текст", Mtext)
                imgui.SameLine()
                imgui.TextQuestion(u8'Текст')
                if Mtext.v then
                    imgui.SameLine()
                    CursorPos = imgui.GetCursorPos()
                    imgui.SetCursorPos(imgui.ImVec2(150, CursorPos.y))
                     if imgui.CollapsingHeader(u8"Настройки##headerMtext") then
                     imgui.PushItemWidth(175)
                     imgui.InputText(u8"Т", Mtextkey)
                     imgui.SameLine()
                     imgui.TextQuestion(u8"25")
                     imgui.Separator()
                     end
                    end
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,205
12,531
В одном imgui.PushItemWidth я могу вводить сколько угодно душе символов,в другом огран из - за чего ? ☹️
Посмотреть вложение 151312
govno:
imgui.Checkbox(u8"Текст", Mtext)
                imgui.SameLine()
                imgui.TextQuestion(u8'Текст')
                if Mtext.v then
                    imgui.SameLine()
                    CursorPos = imgui.GetCursorPos()
                    imgui.SetCursorPos(imgui.ImVec2(150, CursorPos.y))
                     if imgui.CollapsingHeader(u8"Настройки##headerMtext") then
                     imgui.PushItemWidth(175)
                     imgui.InputText(u8"Т", Mtextkey)
                     imgui.SameLine()
                     imgui.TextQuestion(u8"25")
                     imgui.Separator()
                     end
                    end
мб у тебя огран в Mtextkey = imgui.ImBuffer?
 
  • Нравится
Реакции: scroll.

sep

Известный
701
79
как сделать так чтобы все видели что я стою на месте но я был на других координатах ? и мог взаимодействовать с чемто
1) тут видно что я тп
function sampev.onSendPlayerSync(data)
data.position =
2) тут невидно всем что я тп но немогу взаимодействовать

код:
    sampRegisterChatCommand('tp1', function()
        active = not active
        if active then
            savedPos = {getCharCoordinates(PLAYER_PED)}
            setCharCoordinates(PLAYER_PED, 505.4677, -2359.3694, 1503.4286)
        else
            setCharCoordinates(PLAYER_PED, savedPos[1], savedPos[2], savedPos[3])
        end
    end)
    wait(-1)
end


function sampev.onSendPlayerSync()
    return not active
end
 

Tensay

Активный
165
51
Возможно ли подкачать необходимый шрифт, если его нет на компьютере. (мне нужен Bilya Layered BASE)
 

sep

Известный
701
79
Возможно ли подкачать необходимый шрифт, если его нет на компьютере. (мне нужен Bilya Layered BASE)
да легко скачай его и залей его в нужные папки
если ты делаешь свой скрипт то вот пример сразу говорю я могу ошибиться или не понять что ты хочешь
код:
if not doesFileExist('путь') then
downloadUrlToFile("https://github.com/ссылка на файл", 'путь')
end
 

quedasdas

Известный
4
0
Не получается сделать, чтобы оно не работало на пассажира, может кто помочь?
[ML] (error) XXXX: opcode '0448' call caused an unhandled exception
stack traceback:
[C]: in function 'isCharSittingInCar'
D:\GTA 140K BY DAPO SHOW\moonloader\XXXX:1366: in function 'callback'
...TA 140K BY DAPO SHOW\moonloader\lib\samp\events\core.lua:79: in function <...TA 140K BY DAPO SHOW\moonloader\lib\samp\events\core.lua:53>
[ML] (error) XXXX: Script died due to an error. (05346604)

Lua:
    if c10.v then
        for k, v in ipairs(getAllChars()) do
            if isCharInAnyCar(PLAYER_PED) then
            car = storeCarCharIsInNoSave(PLAYER_PED)
            local res, vid = sampGetCarHandleBySampVehicleId(car)        
            local res, id = sampGetPlayerIdByCharHandle(v)
            if res and isKeyDown(key.VK_R) and not sampIsChatInputActive() and not sampIsCursorActive() then
                if sampIsPlayerConnected(id) and not sampIsPlayerPaused(id) and not isPlayerDead(id) and not isCharSittingInCar(id, vid) then
                    local res, handle = sampGetCharHandleBySampPlayerId(id)
                    if res then
                        local X, Y, Z = getCharCoordinates(handle)
                        local pX,pY,pZ = getCharCoordinates(PLAYER_PED)
                        if getDistanceBetweenCoords3d(pX,pY,pZ,X,Y,Z) < GetRange.v then
                            name = sampGetPlayerNickname(id)
                            data.position = {X, Y, Z}
                            data.moveSpeed = {GetMoveSpeedx.v, GetMoveSpeedy.v, GetMoveSpeedz.v}
                            data.quaternion[1] = math.random(0, 1)
                            data.quaternion[2] = math.random(0, 1)
                            data.quaternion[3] = math.random(0, 1)
                            printStringNow('~g~[InCar] Troll ALL - ~r~'..name..' Player', 1500)
                        end
                    end
                end
            end
        end
    end
end
 
Последнее редактирование:
  • Bug
Реакции: Odd Enough

Ayaka***

Новичок
20
0
Lua:
require "lib.moonloader"



local sampev = require 'samp.events'



function sampev.onServerMassage(color, text)



 if string.find(text, 'Вы надели аксессуар. Чтобы снять, повторите действие.', 1, true) then



  return false



 end



end
Скрипт загрузился, видно в консоли, но не работает. Что делать?
 

YourAssistant

Участник
145
17
Lua:
require "lib.moonloader"



local sampev = require 'samp.events'



function sampev.onServerMassage(color, text)



 if string.find(text, 'Вы надели аксессуар. Чтобы снять, повторите действие.', 1, true) then



  return false



 end



end
Скрипт загрузился, видно в консоли, но не работает. Что делать?
В string.find только три параметра, и то последний не обязателен.
Lua:
text:find('Вы надели аксессуар. Чтобы снять, повторите действие.')
 

abbv

Потрачен
119
40
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как сделать скриншот экрана игры и сохранить его в нужную мне директорию?
 

JustFedot

legends never die 🕊️
357
378
Утро доброе, как можно перехватить локальное сообщение? (не от сервера)
Задача - Удалить из чата сообщение "Audio stream: " Большое спасибо.
 
Последнее редактирование:

chapo

tg/inst: @moujeek
Всефорумный модератор
9,205
12,531
Утро доброе, как можно перехватить локальное сообщение? (не от сервера)
Задача - Удалить из чата сообщение "Audio stream: " Большое спасибо.
поставь значение audiomsg на false в sa-mp.cfg
или юзай jmp хук
 
  • Ха-ха
  • Влюблен
Реакции: F0RQU1N and и JustFedot

sep

Известный
701
79
Утро доброе, как можно перехватить локальное сообщение? (не от сервера)
Задача - Удалить из чата сообщение "Audio stream: " Большое спасибо.
/audiomsg и все )))))))))))))))

поставь значение audiomsg на false в sa-mp.cfg
или юзай jmp хук
/audiomsg ку а так проще
di-JA6ZM6.png
 

BANINI

Участник
63
3
Помогите пазязя

Пытался сделать чтобы в окне imgui данные обновлялись, но чего-то не выходит. Выдает такую ошибку:
[14:31:30.386274] (error) ChatLua.lua: D:\GTA 140K BY DAPO SHOW\moonloader\ChatLua.lua:42: attempt to concatenate global 'money' (a nil value)
stack traceback:
D:\GTA 140K BY DAPO SHOW\moonloader\ChatLua.lua:42: in function '_draw'
D:\GTA 140K BY DAPO SHOW\moonloader\lib\mimgui\init.lua:107: in function <D:\GTA 140K BY DAPO SHOW\moonloader\lib\mimgui\init.lua:91>
[14:31:30.386274] (error) ChatLua.lua: Script died due to an error. (1C89634C)
И так на каждую переменную :_(

Вот сам кривой код:

Кодик:
require "moonloader"
require "sampfuncs"
require "lib.moonloader"
encoding = require "encoding"
inicfg = require "inicfg"
encoding.default = "CP1251"
u8 = encoding.UTF8

local imgui = require 'mimgui'
local vkeys = require 'vkeys'
local memory = require 'memory'

local wm = require 'windows.message'

local new = imgui.new
local renderWindow = new.bool()
local sizeX, sizeY = getScreenResolution()

function update()
    lua_thread.create(function()
        while true do
            wait(100)
            
            _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получение своего id (нужно, чтобы получить свой пинг)
            money = getPlayerMoney(myid) -- получаем кол-во денег
            ping = sampGetPlayerPing(myid) -- получаем пинг
            fps = memory.getfloat(0xB7CB50, true) -- получение фпс
            health,_draw = sampGetPlayerHealth(myid)
            nick = sampGetPlayerNickname(PLAYER_PED)
            
        end
    end)
end

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(player)
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) -- Укажем положение окна по центру и выставим оффсет 0.5, чтобы рендер шёл от середины окна
        imgui.SetNextWindowSize(imgui.ImVec2(200, 150), imgui.Cond.FirstUseEver) -- Укажем размер
        imgui.Begin(u8"Оконо САМП", renderWindow)
        imgui.Text(u8"Хай! Ку-ку")
        imgui.Text(string.format(u8"хуй знает что это: %s", renderWindow[0]))
        imgui.Text(u8"Ваш ник: " ..nick)
        imgui.Text(u8"Денег: " ..money)
        imgui.Text(u8"Пинг: " ..ping)
        imgui.Text(u8"FPS: " ..fps)
        imgui.Text(u8"health: " ..health)
        imgui.End()
    end
)

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    addEventHandler('onWindowMessage', function(msg, wparam, lparam) -- Сама функция, в которой будем обрабатывать горячие клавиши. Обратите внимание, что данный способ является наиболее верным в плане оптимизации.
        if msg == wm.WM_KEYDOWN or msg == wm.WM_SYSKEYDOWN then -- Если клавиша нажата
            if wparam == vkeys.VK_X then -- И если это клавиша X
                renderWindow[0] = not renderWindow[0] -- Переключаем состояние рендера
            end
            update()
        end
    end)
    wait(-1)
end