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

Viem

Известный
49
5
Кто знает, как поменять скорость JetPack без изменения скорости игры)
Знаю что через память, нужен конкретно код если есть.
 

moreveal

Известный
Проверенный
852
525
что не так в коде?
хочу что бы выводил мой ник и айди, ну это выводит.ну и что бы оно снизу выводило в каком т/с я нахожусь
вот код
Lua:
events = require 'samp.events'
require 'lib.moonloader'
require 'lib.sampfuncs'
activate = false

font_hud = renderCreateFont("BigNoodleTitlingCyr", 16)
local cars = {"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","Luggage","Stairs","Boxville","Tiller","UtilityTrailer"}
local _, carid = sampGetVehicleIdByCarHandle(storeCarCharIsInNoSave(PLAYER_PED))
local carname = cars[carid - 399]


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    local myVehHandle = storeCarCharIsInNoSave(PLAYER_PED)
    sampRegisterChatCommand("carh", carh)
    sampRegisterChatCommand("tp", tp)
    sampRegisterChatCommand("del", asd)
    sampRegisterChatCommand("damag", damag)
    while true do
        renderFontDrawText(font_hud, 'Имя: '..sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))..' ['.. select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))..' ]', 500, 680, 0xFFFFFFFF)
        renderCreateFont(font_hud, 'Имя ебучего авто: '..cars[select(2, sampGetVehicleIdByCarHandle(storeCarCharIsInNoSave(PLAYER_PED))) - 399, 680, 0xFFFFFFFF])
            wait(0)
    end
end

Lua:
local events = require 'samp.events'
require 'lib.moonloader'
require 'lib.sampfuncs'
activate = false

font_hud = renderCreateFont("BigNoodleTitlingCyr", 16)

local cars = {"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","Luggage","Stairs","Boxville","Tiller","UtilityTrailer"}


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    sampRegisterChatCommand("carh", carh)
    sampRegisterChatCommand("tp", tp)
    sampRegisterChatCommand("del", asd)
    sampRegisterChatCommand("damag", damag)

    while true do
        wait(0)

        local playerid = select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))
        if isCharInAnyCar(PLAYER_PED) then
            local myVehHandle = storeCarCharIsInNoSave(PLAYER_PED)
            local carid = select(2, sampGetVehicleIdByCarHandle(myVehHandle))
            local carname = cars[carid - 399]
            renderFontDrawText(font_hud, 'Имя: '..sampGetPlayerNickname(playerid)..' [ '..playerid..' ]\nИмя ебучего авто: '..carname, 500, 680, 0xFFFFFFFF)
        else
            renderFontDrawText(font_hud, 'Имя: '..sampGetPlayerNickname(playerid)..' [ '..playerid..' ]', 500, 680, 0xFFFFFFFF)
        end
    end
end
 
Последнее редактирование:
  • Влюблен
Реакции: meowkins

ewin

Известный
675
369
Писал что-то типо чекер мемберса, хотел рендерить на экран. Нахожу строку, сохраняю в массив, но вылазиет вот это:
1605103338980.png

Код:

Lua:
if string.find(text, 'Состав:') then
    found = true
end
if found then
    if string.find(text, '.+_.+%[%d+%] (.+)') then
        checker = string.find(text, '(.+_.+%[%d+%] .+)')
        table.insert(arr_members, checker)
        lua_thread.create(function()
            wait(1000)
            sampAddChatMessage(arr_members[1], -1)
            found = false
        end)
    end
end
 

ReYaGo

Участник
38
5
Ищу скрипт, который отключит определенную анимацию.
Нужно отключить анимацию закрытия двери за собой при посадке в автомобиль.
Буду благодарен, $
 

|DEVIL|

Известный
359
273
Как называется элемент в имгуи, который можно сворачивать и разворачивать?
1605104978506.png
 

kizn

О КУ)))
Всефорумный модератор
2,405
2,057
Писал что-то типо чекер мемберса, хотел рендерить на экран. Нахожу строку, сохраняю в массив, но вылазиет вот это:
Посмотреть вложение 75420
Код:

Lua:
if string.find(text, 'Состав:') then
    found = true
end
if found then
    if string.find(text, '.+_.+%[%d+%] (.+)') then
        checker = string.find(text, '(.+_.+%[%d+%] .+)')
        table.insert(arr_members, checker)
        lua_thread.create(function()
            wait(1000)
            sampAddChatMessage(arr_members[1], -1)
            found = false
        end)
    end
end
string.match а не string.find в переменной checker
 
  • Нравится
Реакции: ewin

Artur158947

Известный
10
0
Помогите пожалуйста как сделать проверку скрипта на тот сервер на который он будет привязан, а имеено только на нем будет работать?
 

Jendosik

Участник
211
12
Ищу скрипт, который отключит определенную анимацию.
Нужно отключить анимацию закрытия двери за собой при посадке в автомобиль.
Буду благодарен, $
Lua:
    if isCharInAnyCar(PLAYER_PED) == true then
        sampAddChatMessage('Car lock',-1)
        sampSendChat('/lock')
 
  • Ха-ха
Реакции: earthlord

ewin

Известный
675
369
каждый раз вычитать от прошлого значения нужное по оси Y :/
пытался :/, в итоге тупо не рендерит массив
Lua:
for i=1, #arr_members do
    renderFontDrawText(font_checker, "Игроки в сети:", sw / 10, sh / 3, 0xFFFFFFFF)
    renderFontDrawText(font_checker, arr_members[i], x, y, 0xFFFFFFFF)
    y = y+20
end

UPD: понял в чем ошибка
 

#NoViKoV

Известный
56
9
В imgui окошко не дает вывести картинку в формате png име
нно с ПРОЗРАЧНЫМ фоном. Картинку с залитым фоном выводит.

Фиксится? Видел в других скриптах с прозрачным фоном картинки выводились без проблем.

Lua:
до мейна
img = imgui.CreateTextureFromFile(getGameDirectory() .. "/moonloader/resource/images/logo.png")

function imgui.OnDrawFrame()
    if not main_window_state.v then
        imgui.Process = false
    end
    if main_window_state.v then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(500, 300), imgui.Cond.FirstUseEver)
        imgui.Begin(fa.ICON_MAXCDN.."  Mafia Helper", main_window_state, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoScrollbar + imgui.WindowFlags.NoScrollWithMouse + imgui.WindowFlags.NoMove) -- + imgui.WindowFlags.NoResize
        if imgui.Button(u8'Кнопка') then
            themes.SwitchColorTheme(2)
        end
        img = img1
        imgui.Image(img, imgui.ImVec2(400, 200))
     
     
        imgui.BeginChild("Themes", imgui.ImVec2(150, 200), true)
            for i, value in ipairs(themes.colorThemes) do
                if imgui.RadioButton(u8(value), checked_radio, i) then
                    themes.SwitchColorTheme(i)
                end
            end
        imgui.EndChild()
        imgui.SameLine()
        imgui.BeginChild("img", imgui.ImVec2(200, 200), true)
        imgui.Text(u8"Привет милый, это текст")
        imgui.EndChild()

        imgui.End()
    end
end
 

Вложения

  • photo.png
    photo.png
    231.6 KB · Просмотры: 92
Последнее редактирование:

pxux

Новичок
10
0
как найти игроков в радиусе, если ты находишься в интерьере?

Lua:
                        for players = 0, sampGetMaxPlayerId(true) do
                            _, handle = sampGetCharHandleBySampPlayerId(players)
                            if _ then
                                px, py, pz = getCharCoordinates(PLAYER_PED)
                                xx , yy , zz = getCharCoordinates(handle)
                                if getDistanceBetweenCoords3d(px, py, pz, xx, yy, zz) <= 50 then
                                
                                end
                            end
                        end