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

Licht

Известный
238
32
Как получить чёткие координаты местоположения игрока (меня).
(не /save)
 

Scott Invisible

Известный
25
1
Как создать команду, функцией которой будет:
/command ID(который я укажу) TEXT
/command1 ID(который я уже указал в 1 строке)
 

no3jour

Участник
55
0
PHP:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    while not sampIsLocalPlayerSpawned() do wait(100) end
    while true do
        wait(0)
        if isKeyDown(VK_X) and isKeyJustPressed(VK_1) then
            sampAddChatMessage("{ffff00}Входящее: "..u8:decode(pstext.v).." Отправитель: "..u8:decode(psnick.v).."", (type and '0x'..other.color or 0xf50575))
            wait(7000)
            sampAddChatMessage("{ffff00}Входящее: "..u8:decode(pstext2.v).." Отправитель: "..u8:decode(psnick.v).."", (type and '0x'..other.color or 0xf50575))
        end
        if isKeyDown(VK_X) and isKeyJustPressed(VK_2) then
            sampAddChatMessage("{FFFFFF}- "..u8:decode(pctext.v).." "..u8:decode(pcnick.v).."", (type and '0x'..other1.color or 0xf50575))
            wait(6000)
            sampAddChatMessage("{FFFFFF}- "..u8:decode(pctext.v).." "..u8:decode(pcnick.v).."", (type and '0x'..other1.color or 0xf50575))
        end 
        if isKeyDown(VK_X) and isKeyJustPressed(VK_3) then
           cmd_apodstava()
        end 
        if isKeyDown(VK_X) and isKeyJustPressed(VK_4) then
           sampAddChatMessage("{ff4500}[/arep] "..prnick..": {ffd700}"..prtext.."", (type and '0x'..other2.color or 0xf50575))
        end
        if isKeyDown(VK_X) and isKeyJustPressed(VK_C) then -- активация по нажатию клавиши X
            main_window_state.v = not main_window_state.v -- переключаем статус активности окна, не забываем про .v
        end
        imgui.Process = main_window_state.v -- теперь значение imgui.Process всегда будет задаваться в зависимости от активности основного окна                    
    end
end

local script_patch_config = 'podstava-tools'
local scriptConfig = cfg.load({
    inputs = {
        psnick = '';
        pstext = '';
        pstext2 = '';
        pctext = '';
        pctext2 = '';
        pcnick = '';
        patext = '';
        patext2 = '';
        panick = '';
        pref = '';
        prtext = '';
        prnick = '';
    }
}, script_patch_config)


local psnick = imgui.ImBuffer(''..scriptConfig.inputs.psnick, 256)
local pstext = imgui.ImBuffer(''..scriptConfig.inputs.pstext, 256)
local pstext2 = imgui.ImBuffer(''..scriptConfig.inputs.pstext2, 256)
local pctext = imgui.ImBuffer(''..scriptConfig.inputs.pctext, 256)
local pctext2 = imgui.ImBuffer(''..scriptConfig.inputs.pctext2, 256)
local pcnick = imgui.ImBuffer(''..scriptConfig.inputs.pcnick, 256)
local panick = imgui.ImBuffer(''..scriptConfig.inputs.panick, 256)
local patext = imgui.ImBuffer(''..scriptConfig.inputs.patext, 256)
local patext2 = imgui.ImBuffer(''..scriptConfig.inputs.patext2, 256)
local pref = imgui.ImBuffer(''..scriptConfig.inputs.pref, 256)
local prtext = imgui.ImBuffer(''..scriptConfig.inputs.prtext, 256)
local prnick = imgui.ImBuffer(''..scriptConfig.inputs.prnick, 256)

local other1 = {
    color = 'ffffff'
}
local other2 = {
    color = 'ff4500'
}

ошибки

PHP:
stack traceback:
    D:\GTA SAN ANDREAS\moonloader\podstava.lua: in function 'cmd_report'
    D:\GTA SAN ANDREAS\moonloader\podstava.lua:42: in function <D:\GTA SAN ANDREAS\moonloader\podstava.lua:25>
[19:57:28.280295] (error)    FpsControl: Script died due to an error. (4307EDEC)
[19:58:54.394287] (script)    ML-AutoReboot: Loading "D:\GTA SAN ANDREAS\moonloader\podstava.lua"...
[19:58:54.394287] (system)    Loading script 'D:\GTA SAN ANDREAS\moonloader\podstava.lua'...
[19:58:54.394287] (debug)    New script: 0BB6E4CC
[19:58:54.428287] (system)    FpsControl: Loaded successfully.
[19:59:02.200282] (error)    FpsControl: D:\GTA SAN ANDREAS\moonloader\podstava.lua:42: attempt to concatenate global 'prtext' (a nil value)
stack traceback:
    D:\GTA SAN ANDREAS\moonloader\podstava.lua: in function <D:\GTA SAN ANDREAS\moonloader\podstava.lua:25>
[19:59:02.200282] (error)    FpsControl: Script died due to an error. (0BB6E4CC)
[20:01:05.070278] (script)    ML-AutoReboot: Loading "D:\GTA SAN ANDREAS\moonloader\podstava.lua"...
[20:01:05.070278] (system)    Loading script 'D:\GTA SAN ANDREAS\moonloader\podstava.lua'...
[20:01:05.070278] (debug)    New script: 4488EA1C
[20:01:05.113279] (system)    FpsControl: Loaded successfully.
[20:02:10.272283] (error)    FpsControl: D:\GTA SAN ANDREAS\moonloader\podstava.lua:33: attempt to index global 'pstext' (a nil value)
stack traceback:
    D:\GTA SAN ANDREAS\moonloader\podstava.lua: in function <D:\GTA SAN ANDREAS\moonloader\podstava.lua:25>
[20:02:10.272283] (error)    FpsControl: Script died due to an error. (4488EA1C)
 

getsdfssdfsdfs

Участник
45
0
Lua:
if isKeyDown(VK_1) and isKeyJustPressed(VK_3) then
    if isCharInAnyCar(PLAYER_PED) then
    local carhandle = storeCarCharIsInNoSave(PLAYER_PED)
    local idcar = getCarModel(carhandle)
    print(idcar)
    end
end

Не работает на других игроков, мне надо чтоб писало модель авто ближайшего ко мне игрока
 

Angr

Известный
291
99
Lua:
if isKeyDown(VK_1) and isKeyJustPressed(VK_3) then
    if isCharInAnyCar(PLAYER_PED) then
    local carhandle = storeCarCharIsInNoSave(PLAYER_PED)
    local idcar = getCarModel(carhandle)
    print(idcar)
    end
end

Не работает на других игроков, мне надо чтоб писало модель авто ближайшего ко мне игрока
Lua:
if isKeyDown(VK_1) and isKeyJustPressed(VK_3) then
    local pPedX, pPedY, pPedZ = getCharCoordinates(PLAYER_PED)
    local bools, handle =  findAllRandomVehiclesInSphere(pPedX, pPedY, pPedZ, 222, false, true) -- Первая ТС в стриме
        if bools then
        local idcar = getCarModel(handle)
        print(idcar)
        end
end
 
  • Нравится
Реакции: getsdfssdfsdfs

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
какой функцией можно вызвать краш с подобной окошкой
45120
 

Scott Invisible

Известный
25
1
Как получить ID ближайшего к тебе персонажа и совершить к нему какое-либо действие? Например игрок находится от тебя на 30 метров, я нажимаю кнопку с биндом /showpass и когда он подходит ко мне на определенное расстояние ему показывается паспорт?
 

Double Tap Inside

Известный
Проверенный
1,916
1,256
Как дать скрипту свойство, которое защитит его от перезагрузки? (Reload All)
Если чел ctrl+r нажал, чтобы мой скрипт оно не трогало. И тому подобное.
 

getsdfssdfsdfs

Участник
45
0
Lua:
if isKeyDown(VK_1) and isKeyJustPressed(VK_3) then
    local pPedX, pPedY, pPedZ = getCharCoordinates(PLAYER_PED)
    local bools, handle =  findAllRandomVehiclesInSphere(pPedX, pPedY, pPedZ, 222, false, true) -- Первая ТС в стриме
        if bools then
        local idcar = getCarModel(handle)
        print(idcar)
        end
end
Блин, а для полученного ид авто написать таблицу, типо если допустим ид авто 411 то вместо ида будет название авто т.е Инфернус?

Пытался это сделать по типу этого:
Код:
function GetZone()
    local x, y, z = GetCoordinates()
    local znnm = getNameOfZone(x, y, z)
    for k, v in pairs(zones) do znnm = znnm:gsub(k, v) end
    return znnm
end



zones =
{
    ['PER1'] = "Pershing Square",
    ['SAN_AND'] = "San Andreas",
    ['COM'] = "Commercial Area",
    ['BLUF'] = "Verdant Bluffs",
    ['LMEX'] = "Little Mexico",
    ['ELCO'] = "El Corona",
    ['CONF'] = "Conference Center",
    ['VERO'] = "Verona Beach",
    ['MAR'] = "Cause",
    ['SMB'] = "Santa Maria Beach",
    ['ROD'] = "Rodeo Drive",
    ['LA'] = "Los Santos",
    ['LAIR'] = "LS Airport",
    ['LDT'] = "Los Santos Center",
    ['MULINT'] = "Mallholland Crossroads",
    ['GLN'] = "Glen Park",
    ['CHC'] = "Las Colinas",
    ['JEF'] = "Jefferson",
    ['ELS'] = "East Los Santos",
    ['LFL'] = "Las Flores",
    ['EBE'] = "East Beach",
    ['LIND'] = "Willowfield",
    ['PLS'] = "Sevilles Boulevard",
    ['LDOC'] = "Los Santos Port",
    ['MKT'] = "Market",
    ['CauseKST'] = "Cause 'Market'",
    ['VIN'] = "Vinewood Street",
    ['SUN'] = "Temple Drive",
    ['MUL'] = "Mallholland"
}