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

Izvinisb

Известный
Проверенный
963
599
Как эмулировать нажатие ПКМ так чтоб над игроком, перед которым я стою, загорался зелёный треугольник? (setvirtualkeydown/setgamekeystate вроде как не воркают)
 
Последнее редактирование:

Albertio

Attention! Thanks for your attention.
887
717
Почему функция не выводит в чат сообщение?
Lua:
    sampRegisterChatCommand('get_distanse', function(idr)
        if idr == '' then
            sampAddChatMessage('{FF0000}[Ошибка] {FF8C00}Укажите корректный ИД.', 0xFFFF0000)
        else
            x_me, y_me, z_me = getCharCoordinates(playerPed)
            _, pl = sampGetPlayerIdByCharHandle(idr)
            if _ then
                x, y, z = getCharCoordinates(pl)
                distance = getDistanceBetweenCoords3d(x_me, y_me, z_me, x, y, z)
                sampAddChatMessage('{FF0000}[INFO] {FF8C00}Игрок в радиусе '..distance..' м. от вас', 0xFFFF0000)
            end
        end
    end)
Попробуй так
Lua:
sampRegisterChatCommand('get_distanse', function(idr)
    lua_thread.create(function()
        if idr == '' then
            sampAddChatMessage('{FF0000}[Ошибка] {FF8C00}Укажите корректный ИД.', 0xFFFF0000)
        else
            x_me, y_me, z_me = getCharCoordinates(playerPed)
            _, pl = sampGetPlayerIdByCharHandle(idr)
            if _ then
                x, y, z = getCharCoordinates(pl)
                distance = getDistanceBetweenCoords3d(x_me, y_me, z_me, x, y, z)
                sampAddChatMessage('{FF0000}[INFO] {FF8C00}Игрок в радиусе '..distance..' м. от вас', 0xFFFF0000)
            end
        end
    end)
end)
Как эмулировать нажатие ПКМ так чтоб над игроком, перед которым я стою, загорался зелёный треугольник? (setvirtualkeydown/setgamekeystate вроде как не воркают)
Подключал библиотеку vkeys?
Правая кнопка мыши:
VK_RBUTTON
KEY_HANDBRAKE
KEY_AIM
 
Последнее редактирование:

Izvinisb

Известный
Проверенный
963
599
Попробуй так
Lua:
sampRegisterChatCommand('get_distanse', function(idr)
    lua_thread.create(function()
        if idr == '' then
            sampAddChatMessage('{FF0000}[Ошибка] {FF8C00}Укажите корректный ИД.', 0xFFFF0000)
        else
            x_me, y_me, z_me = getCharCoordinates(playerPed)
            _, pl = sampGetPlayerIdByCharHandle(idr)
            if _ then
                x, y, z = getCharCoordinates(pl)
                distance = getDistanceBetweenCoords3d(x_me, y_me, z_me, x, y, z)
                sampAddChatMessage('{FF0000}[INFO] {FF8C00}Игрок в радиусе '..distance..' м. от вас', 0xFFFF0000)
            end
        end
    end)
end)

Подключал библиотеку vkeys?
Правая кнопка мыши:
VK_RBUTTON
KEY_HANDBRAKE
KEY_AIM
Работает, надо было юзать Handbrake и потом Rbutton. А ты случайно не знаешь как заменить Handbrake для setGameKeyState?
 

Wycmpblu

Известный
152
31
Я не уверен в этом гавнокоде, но проверь мб сработает

Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('vhmodel', get_vhmodel)
    while true do
        wait(0)
    end
end

function get_vhmodel(cmd)
    vhname = getNameOfVehicleModel(model)
    sampAddChatMessage(vhname, 0xFFFFFF)
end

Не, не робит

UPD: разобрался, вот код:
Lua:
function get_vhmodel(cmd)
    if isCharInAnyCar(PLAYER_PED) then -- проверка на транспорт
        local carhandle = storeCarCharIsInNoSave(PLAYER_PED)-- Получения handle транспорта
        local model = getCarModel(carhandle) -- Получение ИД транспорта
        vhname = getNameOfVehicleModel(model)
        sampAddChatMessage(vhname, -1)
    end
end
 

Joni Scripts

Известный
535
374
Как получить хэндл машины по ид, isCarModel вроде-бы не работает, ид машины 450
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,909
1,286
Как получить хэндл машины по ид, isCarModel вроде-бы не работает, ид машины 450
isCarModel проверяет является ли хендл той моделью, которая указана вторым аргументом
тебе вот это нужно: bool result, Vehicle car = sampGetCarHandleBySampVehicleId(int id)
 

Izvinisb

Известный
Проверенный
963
599
актуально

Lua:
local tCarsName = {"Landstalker", "Bravura", "Buffalo", "Linerunner", "Perrenial", "Sentinel", "Dumper", "Firetruck", "Trashmaster", "Stretch", "Manana", "Infernus",
"Voodoo", "Pony", "Mule", "Cheetah", "Ambulance", "Leviathan", "Moonbeam", "Esperanto", "Taxi", "Washington", "Bobcat", "Whoopee", "BFInjection", "Hunter",
"Premier", "Enforcer", "Securicar", "Banshee", "Predator", "Bus", "Rhino", "Barracks", "Hotknife", "Trailer", "Previon", "Coach", "Cabbie", "Stallion", "Rumpo",
"RCBandit", "Romero","Packer", "Monster", "Admiral", "Squalo", "Seasparrow", "Pizzaboy", "Tram", "Trailer", "Turismo", "Speeder", "Reefer", "Tropic", "Flatbed",
"Yankee", "Caddy", "Solair", "Berkley'sRCVan", "Skimmer", "PCJ-600", "Faggio", "Freeway", "RCBaron", "RCRaider", "Glendale", "Oceanic", "Sanchez", "Sparrow",
"Patriot", "Quad", "Coastguard", "Dinghy", "Hermes", "Sabre", "Rustler", "ZR-350", "Walton", "Regina", "Comet", "BMX", "Burrito", "Camper", "Marquis", "Baggage",
"Dozer", "Maverick", "NewsChopper", "Rancher", "FBIRancher", "Virgo", "Greenwood", "Jetmax", "Hotring", "Sandking", "BlistaCompact", "PoliceMaverick",
"Boxvillde", "Benson", "Mesa", "RCGoblin", "HotringRacerA", "HotringRacerB", "BloodringBanger", "Rancher", "SuperGT", "Elegant", "Journey", "Bike",
"MountainBike", "Beagle", "Cropduster", "Stunt", "Tanker", "Roadtrain", "Nebula", "Majestic", "Buccaneer", "Shamal", "hydra", "FCR-900", "NRG-500", "HPV1000",
"CementTruck", "TowTruck", "Fortune", "Cadrona", "FBITruck", "Willard", "Forklift", "Tractor", "Combine", "Feltzer", "Remington", "Slamvan", "Blade", "Freight",
"Streak", "Vortex", "Vincent", "Bullet", "Clover", "Sadler", "Firetruck", "Hustler", "Intruder", "Primo", "Cargobob", "Tampa", "Sunrise", "Merit", "Utility", "Nevada",
"Yosemite", "Windsor", "Monster", "Monster", "Uranus", "Jester", "Sultan", "Stratum", "Elegy", "Raindance", "RCTiger", "Flash", "Tahoma", "Savanna", "Bandito",
"FreightFlat", "StreakCarriage", "Kart", "Mower", "Dune", "Sweeper", "Broadway", "Tornado", "AT-400", "DFT-30", "Huntley", "Stafford", "BF-400", "NewsVan",
"Tug", "Trailer", "Emperor", "Wayfarer", "Euros", "Hotdog", "Club", "FreightBox", "Trailer", "Andromada", "Dodo", "RCCam", "Launch", "PoliceCar", "PoliceCar",
"PoliceCar", "PoliceRanger", "Picador", "S.W.A.T", "Alpha", "Phoenix", "GlendaleShit", "SadlerShit", "Luggage A", "Luggage B", "Stairs", "Boxville", "Tiller",
"UtilityTrailer"}

-- imgui

if isCharInAnyCar(PLAYER_PED) then
    local veh = storeCarCharIsInNoSave(PLAYER_PED)
    local carModel = getCarModel(veh)
    imgui.Text(u8(tCarsName[carModel - 399]..'['..carModel..']'))
end
Почему не компилит?
Lua:
function main()
    print('Loaded')
    local f = io.open(FilePathLuac, 'D:\\Dsamp\\binder_servers.lua')
    f:write(string.dump(loadfile('D:\\Dsamp\\moonloader\\binder_servers.lua')))
    f:close()
end
/get_distance [ID]
Lua:
function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('get_distance', function(param) state = not state
    idr = tonumber(param)

           if not param:match('(%d+)') then
            state = false
            return sampAddChatMessage('Введите корректный ид', -1)
        end
        if state then
            local x_me, y_me, z_me = getCharCoordinates(PLAYER_PED)
            local _, pl = sampGetCharHandleBySampPlayerId(idr)
            if _ then
                local x, y, z = getCharCoordinates(pl)
                local distance = getDistanceBetweenCoords3d(x_me, y_me, z_me, x, y, z)
                sampAddChatMessage('{FF0000}[INFO] {FF8C00}Игрок в радиусе '..math.floor(distance)..' м. от вас', 0xFFFF0000)
                state = false
            else
                sampAddChatMessage('{FF0000}[INFO] {FF8C00}Игрока нет в зоне стрима', 0xFFFF0000)
                state = false
            end
        end
    end)
    wait(-1)
end
 

Izvinisb

Известный
Проверенный
963
599
хелп. На сервере при вводе команды /admins в чате одновременно появляются ники/иды админов которые в онлайне. Так вот... как отправлять на эти ID-шники /sms поочередно с задержкой?
Lua:
function sampev.onServerMessage(color, text)
    if state then
        lua_thread.create(function()
            if text:find("AFK") then
                wait(100)
                if text:match("%[(%d+)%]") then
                    local pid = text:match("%[(%d+)%]")
                    sampSendChat('/sms '..pid..' zdarov')
                end
            end
        end)
    end  
end
UP. (если заносить в таблицу, то все ID-ы под первым индексом)
 

~Justie~

Участник
133
25
Почему если я закрываю окно A imgui и сразу же открываю окно B, на том же месте, что и A, то у B размер такой же, как и у A? Ему задержка нужна или че
В imgui.SetNextWindowSize указаны совершенно разные значения

Закрываю окно A и открываю B вот так:
*в окне A*
Lua:
if imgui.Button(u8'Закрыть') then
    windowA.v = false
    windowB.v = true
end
 
Последнее редактирование: