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

wulfandr

Известный
637
260
Lua:
local sampev = require 'lib.samp.events'

function sampev.onShowDialog(id, style, title, button1, button2, text)
    if id == ID_ДИАЛОГА then sampSendDialogResponse(ID_ДИАЛОГА, 0 , false, false) end
    return false
end
одного достаточно ID_диалога
Lua:
if id == ID_ДИАЛОГА then sampSendDialogResponse(id, 0 , false, false) end
 
  • Bug
Реакции: chapo

Мира

Участник
455
9
Код:
    sampRegisterChatCommand("i ", function(arg)
        lua_thread.create(function()
            sampSendChat("/me "..arg)
        end)
    end)
как сделать срабатывание команды /i только на цифру/число?
 
У

Удалённый пользователь 248267

Гость
Как сделать что бы функция в беск цикле исполнялась только если активен CheckBox imgui если такое возможно,просто нужна функция пот чекбокс выполняется только в беск цикле
 

thedqrkway

Участник
247
11
Lua:
local sampev = require 'lib.samp.events'
local inicfg = require 'inicfg'
local mainIni = inicfg.load({
config =
    {
        day = 0,
        data = os.date('%x')
    }
}, "invites.ini")
if not doesFileExist('moonloader/config/invites.ini') then inicfg.save(mainIni, 'invites.ini') end
function main()
    sampRegisterChatCommand('ainv', function() sampAddChatMessage('{1E90FF} Invites: {FFFFFF} '..mainIni.config.day, -1) end)
    while true do
        wait(0)
        if mainIni.config.data ~= os.date('%x') then
            sampAddChatMessage('{1E90FF} New day, new invites', -1)
            mainIni.config.day = 0
            mainIni.config.data = os.date('%x')
            inicfg.save(mainIni, 'invites.ini')
        end
    end
end
function sampev.onServerMessage(color,text)
    if text:find('предложение вступить в вашу организацию.') then
        mainIni.config.day = mainIni.config.day + 1
        inicfg.save(mainIni, 'invites.ini')
    end
end
проблема, если я не нахожусь в игре в 0:00, то потом скрипт крашится и нужно удалять .ini файл.
 
У

Удалённый пользователь 341712

Гость
Lua:
local sampev = require 'lib.samp.events'
local inicfg = require 'inicfg'
local mainIni = inicfg.load({
config =
    {
        day = 0,
        data = os.date('%x')
    }
}, "invites.ini")
if not doesFileExist('moonloader/config/invites.ini') then inicfg.save(mainIni, 'invites.ini') end
function main()
    sampRegisterChatCommand('ainv', function() sampAddChatMessage('{1E90FF} Invites: {FFFFFF} '..mainIni.config.day, -1) end)
    while true do
        wait(0)
        if mainIni.config.data ~= os.date('%x') then
            sampAddChatMessage('{1E90FF} New day, new invites', -1)
            mainIni.config.day = 0
            mainIni.config.data = os.date('%x')
            inicfg.save(mainIni, 'invites.ini')
        end
    end
end
function sampev.onServerMessage(color,text)
    if text:find('предложение вступить в вашу организацию.') then
        mainIni.config.day = mainIni.config.day + 1
        inicfg.save(mainIni, 'invites.ini')
    end
end
проблема, если я не нахожусь в игре в 0:00, то потом скрипт крашится и нужно удалять .ini файл.
не так
Lua:
--tt

--ini
{
    day = os.date('%a')
}

--main 

--это вне беск цикла
if ini.day ~= os.date("%a") then
    --code
end
 
У

Удалённый пользователь 248267

Гость
Lua:
    if imgui.Button ('Enter house') then
        local num = text_buffer2
        sampSendChat ('/findihouse',num)
    end
пишет /findihouse укажите ид дома
Не учитывает аргумент текст бафера
 

Viem

Известный
49
5
Lua:
    tCarsName = {
        [400] = "Mercedes-Benz GL-350", [401] = "Hyunday Accent", [402] = "Mercedes E63", [403] = "MAN TGS", [404] = "Mazda 626",
        [405] = "Toyota Chaser", [406] = "ZIL", [407] = "Firetruck MAZ", [408] = "IVECO", [409] = "Porshe Panamero",
        [410] = "Audi S8", [411] = "Renault Laguna", [412] = "Mitsubishi Galant", [413] = "ARMY BUS", [414] = "MAZ bus",
        [415] = "BMW M6", [416] = "Ford Hospital", [417] = "Leviathan", [418] = "Volkswagen Transporter", [419] = "Volkswagen R32",
        [420] = "Skoda SuperB TAXI", [421] = "Nissan 300ZX", [422] = "UAV Bukhanka", [423] = "Mr Whoopee", [424] = "Smart",
        [425] = "MI-24", [426] = "BMW M5 F90", [427] = "GAZ Police", [428] = "Volkswagen Sber", [429] = "Mercedes-Benz A45 AMG",
        [430] = "Predator", [431] = "MAZ", [432] = "Rhino", [433] = "Grad", [434] = "Hotknife",
        [435] = "Article Trailer", [436] = "Mercedes-AMG CLS 53", [437] = "Mercedes Rodina", [438] = "Audi RS5", [439] = "LADA 112",
        [440] = "GAZ", [441] = "RC Bandit", [442] = "VAZ 2101", [443] = "KAMAZ 53212", [444] = "Monster", 
        [445] = "Volkswagen Passat", [446] = "Squalo", [447] = "Sparrow", [448] = "Electro Bike-Pizza",
        [451] = "Lamborghini Huracan", [452] = "Speeder", [453] = "Reefer", [454] = "Tropic",
        [455] = "Flatbed", [456] = "GAZ Hlebovozka", [457] = "Golf Car", [458] = "Dodge Grand Caravan", [459] = "Ford Focus",
        [460] = "Skimmer", [461] = "BMW HP4", [462] = "Electro Bike", [463] = "Harley Davidson",  [464] = "RC Baron",
        [465] = "RC Raider", [466] = "BMW M5", [467] = "Lada 2107", [468] = "Sanchez", [469] = "Robinson R44",
        [470] = "Tiger", [471] = "Quad", [472] = "Coastg", [473] = "Dinghy", [474] = "Lada Samara",
        [475] = "BMW X5", [476] = "Rustler", [477] = "BMW M4", [478] = "Lada Pricep", [479] = "Toyota Subaru",
        [480] = "Porshe Turbo S", [481] = "BMX", [482] = "Mercedes-Benz V250", [483] = "GAZ Vector Next", [484] = "Family yacht",
        [485] = "Chevrolet Corvette", [486] = "Dozer", [487] = "Maverick", [488] = "Robinson R44 NEWS", [489] = "Cadillac Escalade",
        [490] = "Range Rover Sport", [491] = "Nissan Silvia", [492] = "Lada 2114", [493] = "Jetmax", [494] = "Bugatti Chiron",
        [495] = "Tesla Cybertruck", [496] = "Skoda SuperB", [497] = "Robinson R44 Police", [498] = "LAZ-669P", [499] = "GAZ-53",
        [500] = "Jeep Grand Cherokee", [501] = "RC Goblin", [502] = "Tesla Model S", [503] = "Ford GT", [504] = "Dodge Viper",
        [505] = "Toyota Land Cruiser", [506] = "Audi R8", [507] = "Hyunday Solaris", [508] = "UAZ-452", [509] = "Bike",
        [510] = "Mountain Bike", [511] = "Beagle", [512] = "Cropduster", [513] = "Stuntplane", [514] = "Mercedes-Benz Actros",
        [515] = "YAZ-210", [516] = "Ford Focus RS", [517] = "RAF-2203", [518] = "ERAZ-762", [519] = "Shamal",
        [520] = "Hydra", [521] = "IZH Planeta-5", [522] = "Yamaha R1", [523] = "Motorcycle Police", [524] = "Cement Truck",
        [525] = "Towtruck", [526] = "Opel Kadett", [527] = "Lada Pro Sport", [528] = "Grobovozka", [529] = "BMW M5",
        [530] = "Forklift", [531] = "Tractor", [532] = "Combine Harvester", [533] = "BMW M5", [534] = "Volkswagen Polo",
        [535] = "Porshe Cayenne", [536] = "Audi RS6", [537] = "Freight (Train)", [538] = "Brownstreak (Train)", [539] = "Vortex",
        [540] = "Lada Priora", [541] = "MB AMG GT", [542] = "Lada Niva", [543] = "MB sls", [544] = "Firetruck MAN",
        [545] = "Zhiguli", [546] = "Lada 2109", [547] = "Kia Cee'd", [548] = "Cargobob", [549] = "ZAZ-968",
        [550] = "Alfa Romeo", [551] = "Mitsubishi Lancer Evolution", [552] = "Lada", [553] = "Nevada", [554] = "GAZ Gazel",
        [555] = "CMS C3D(Invalidka)", [556] = "Monster A", [557] = "Monster B", [558] = "Subaru Impreza", [559] = "RR Phantom",
        [560] = "Audi TT RS", [561] = "Moskvich-427", [562] = "Nissan GTR", [563] = "Raindance", [564] = "RC Tiger",
        [565] = "VAZ 2108", [566] = "VAZ 2104", [567] = "Toyota Camry", [568] = "Bandito", [569] = "Freight Flat Trailer (Train)",
        [570] = "Streak Trailer (Train)", [571] = "Kart", [572] = "Mower", [573] = "Dune", [574] = "Pochta",
        [575] = "GAZ-M-20(Pobeda)", [576] = "Moskvich-408", [577] = "AT400", [578] = "URAL", [579] = "Mercedes-Benz G63",
        [580] = "Mercedes-Benz AMG C63S", [581] = "Suzuki RGSX", [582] = "Ford Transit", [583] = "Tug", [584] = "Petrol Trailer",
        [585] = "Mercedes-Maybach", [586] = "Wayfarer", [587] = "Mazda MX-5", [588] = "Hotdog", [589] = "Opel Astra H",
        [590] = "Freight Box Trailer (Train)", [591] = "Article Trailer 3", [592] = "Andromada", [593] = "Dodo", [594] = "RC Cam",
        [595] = "Launch", [596] = "Audi A6 Police", [597] = "Mercedes-Maybach Police", [598] = "Ford Focus Police", [599] = "UAZ Police",
        [600] = "Delorean DMC-12", [601] = "BTR", [602] = "BMW M2", [603] = "Mercedes C63", [604] = "Skoda Y",
        [605] = "Rocket", [606] = "Baggage Trailer A", [607] = "Baggage Trailer B", [608] = "Tug Stairs Trailer", [609] = "GAZ 3307",
        [610] = "Farm Trailer", [611] = "Utility Trailer", [612] = "Toyota Avensis", [613] = "Mercedes-AMG GT 63S ", [794] = "Audi Q8",
        [1800] = "Lexus LX", [1801] = "Mercedes-Benz GLE Coupe", [1802] = "Volkswagen Amarok", [1803] = "Toyota Prius", [1804] = "Opel Cruze",
        [1805] = "Toyota Camry 2010", [1806] = "Toyota Corolla", [1807] = "Audi RS7", [1808] = "Audi A8 2020", [1809] = "Mazda 6",
        [1810] = "Halloween Cabriolet", [1811] = "Bolnica", [1812] = "Mercedes-Benz W198", [1813] = "Katafalk", [1814] = "Kia Ceed",
        [1816] = "Premium Raverick",
    }
Имеем такой массив.

Почему #tCarsName = 0 ? Если должно вернуть количество элементов этого массива
 

trefa

Известный
Всефорумный модератор
2,097
1,233
Lua:
    if imgui.Button ('Enter house') then
        local num = text_buffer2
        sampSendChat ('/findihouse',num)
    end
пишет /findihouse укажите ид дома
Не учитывает аргумент текст бафера
Я думаю тебе надо ещё подучить основы луа, неправильно ты засунул переменную в строку.
 
У

Удалённый пользователь 248267

Гость
Я думаю тебе надо ещё подучить основы луа, неправильно ты засунул переменную в строку.
Код:
if imgui.Button ('Enter house') then
        res,num = text_buffer2
        if res then
        sampSendChat ('/findihouse',num)
        end
    end
попробовал еще так,можешь подсказать в чем проблема,и помочь ее решить?)