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

Glockersik

Участник
86
3
Lua:
local sampev = require "lib.samp.events"

function sampev.onServerMessage(color, msg)
b=0;
    if msg:find('Вы получили 1 предмет') then
    b=b+1
    elseif msg:find('Вы получили 15 предметов') then
    b=b+15
    end
end


function main()

if not isSampLoaded () or not IsSampfuncsLoaded then return end
while not isSampLoaded do wait (100)

sampRegsterChatCommand ('/zarabotok',zarabotok)

end.
function zarabatok ()
if zarabatok = true then
sampAddChatMessage ("Заработок началася",-1)
while zarabatok=true do
lua_thread.create (sampev.onServerMessage)

end
end;

else
sampAddChatMessage ("Заработок закончился",-1)

sampShowDialog(1337,'{FF5656}Заработок', 'Заработано =' , 0') -- Здесь создается табличка и в эту табличку записывается сам доход
end
end

end


Помогите пожалуйста , хочу написать скрипт, который создаст табличку и при выполнении работы будет обновлять счетчик . Спасибо!
 

Drinkins

Участник
38
0
Есть ли в LUA какая нибудь функция грубоговоря замены текста?
Например: я на англ. написал "test" нажал enter а в чат сделало на русском "привет".
 

777qwerty777

Известный
62
18
Lua:
local sampev = require "lib.samp.events"

function sampev.onServerMessage(color, msg)
b=0;
    if msg:find('Вы получили 1 предмет') then
    b=b+1
    elseif msg:find('Вы получили 15 предметов') then
    b=b+15
    end
end


function main()

if not isSampLoaded () or not IsSampfuncsLoaded then return end
while not isSampLoaded do wait (100)

sampRegsterChatCommand ('/zarabotok',zarabotok)

end.
function zarabatok ()
if zarabatok = true then
sampAddChatMessage ("Заработок началася",-1)
while zarabatok=true do
lua_thread.create (sampev.onServerMessage)

end
end;

else
sampAddChatMessage ("Заработок закончился",-1)

sampShowDialog(1337,'{FF5656}Заработок', 'Заработано =' , 0') -- Здесь создается табличка и в эту табличку записывается сам доход
end
end

end


Помогите пожалуйста , хочу написать скрипт, который создаст табличку и при выполнении работы будет обновлять счетчик . Спасибо!
Lua:
local sampev = require "lib.samp.events"
b = 0
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('zarabatok', function()
        zarabatok = not zarabatok
        sampAddChatMessage("Заработок "..(zarabatok and "начался" or "закончился"), -1)
        if not zarabatok then sampShowDialog(1337, "{FF5656}Заработок", "Заработано = "..b, "x", _, 0) b = 0 end
    end)
end

function sampev.onServerMessage(color, msg)
  if zarabatok and msg:find('Вы получили (%d+) предмет') then
      b = b + msg:match("Вы получили (%d+) предмет")
  end
end

Есть ли в LUA какая нибудь функция грубоговоря замены текста?
Например: я на англ. написал "test" нажал enter а в чат сделало на русском "привет".
string.gsub?
 
  • Нравится
Реакции: Glockersik

Glockersik

Участник
86
3
Подскажите пожалуйста , как сделать так , чтобы пользователь ввел информацию и потом ее вывести
 

Petr_Sergeevich

Известный
Проверенный
707
296
У кого-нибудь есть корректная реализация left trim для символов? Поделитесь, пожалуйста.
Например,
"00123", "0" -> "123"
"001500", "0" -> "1500"
"336253", "3" -> "6253"
(Убирает определенный символ с начала строки)

Мой вариант:
Lua:
function LTrim(text, ch)
    local result = ""
    for i = 1, #text do
        if text:sub(i, i) == ch then
            result = result..ch
        end
      
        if text:sub(i, i) ~= ch then
            return text:sub(#result+1, #text)
        end
    end
    return ""
end
 
Последнее редактирование:

штейн

Известный
Проверенный
1,001
687
как мне в
Lua:
AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness = 1.0f);
сделать 4 цвета типа градиент как в
Lua:
AddRectFilledMultiColor(const ImVec2& a, const ImVec2& b, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left);
 

gedwadion

Известный
56
17
Первый скриптик. Не выводит состояние сударя в чат - в т/с он или нет. Что не так? :thinking:

Lua:
require "samp.events"
require "lib.moonloader"

function main()
    while not isSampfuncsLoaded() or not isSampLoaded() do wait(1000) end
       while not isSampAvailable() do wait(100) end
          sampRegisterChatCommand("test", incar)
          while true do
          wait(0)
  end
end

function incar()
if isCharSittingInAnyCar(PLAYER_HANDLE) then
sampAddChatMessage("{FFFFFF}+", -1)
else
sampAddChatMessage("{FFFFFF}-", -1)
  end
end


Lua:
if isCharInAnyCar(PLAYER_PED) then
  ..
else
  ..
end

Подскажите пожалуйста , как сделать так , чтобы пользователь ввел информацию и потом ее вывести

Получения аргумента из чата /f ...

Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('f', getArgs) -- регистрируем команду
    wait(-1)
end

function getArgs(args)
    sampAddChatMessage(args, -1) -- args - аргумент команды /f [arg]
end

Либо же через хук RPC (onSendChat) чата, в зависимости от того, что тебе необходимо.
 
  • Нравится
Реакции: TodFox

kotov

Участник
128
12
Как в Imgui убрать вот эту хрень справа, снизу которая меняет размер окна?
3d4bde26cbe8f3b8844e160821d552de.png
 

Glockersik

Участник
86
3
Помогите пожалуйста , чтобы скрипт считывал информацию со строчки ( вот так выглядит ) :

Name | server | number | poss
 

777qwerty777

Известный
62
18
Как в Imgui убрать вот эту хрень справа, снизу которая меняет размер окна?
3d4bde26cbe8f3b8844e160821d552de.png
Lua:
imgui.Begin('beg', woto, imgui.WindowFlags.NoResize)

Помогите пожалуйста , чтобы скрипт считывал информацию со строчки ( вот так выглядит ) :

Name | server | number | poss
Lua:
local name, server, number, poss = string.match(text, "(.+) | (.+) | (.+) | (.+)")
 
  • Нравится
Реакции: TodFox и kotov

kotov

Участник
128
12
d2d652643881a561905481d81811fc51.png

А как такие кнопки делать? Это же не просто imgui.Button. И ещё как сделать название окна по центру
 

Glockersik

Участник
86
3
Ребят , почему метка не ставится?
Lua:
local sampev = require "lib.samp.events"

function main ()
if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('hm',hm)
   
    function hm(id)
    if hm(id)>=999 then
    sampSendChat('Вы ввели неверное число',-1)
    else
    local f = io.open("moonloader/house.txt","r+")
    while hm(id)=true do
    local id,x,y,z = string.match(house, "(.+) | (.+) | (.+) | (.+)")
    result = setBlipCoordinates(blip,x, y,z)
    end
   
    elseif hm(id)<=0 then
    sampSendChat('Вы ввели неверное число',-1)
    else
    local f = io.open("moonloader/house.txt","r+")
    while hm(id)=true do
    local id,x,y,z = string.match(house, "(.+) | (.+) | (.+) | (.+)")
    result = setBlipCoordinates(blip,x, y,z)
   
    end
    end
 

TodFox

Известный
105
17
Должен выводить данные о Т/С в TextDrow закрепленный на машинах в зоне прорисовки. По команде не хочет работать (/af). Что не так? Заранее спасибо братаники :)
Lua:
require "lib.moonloader"

function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  local font = renderCreateFont("Arial", 10, 12)
  while not isSampAvailable() do wait(100) end
  active = 0
  sampRegisterChatCommand("af", active)
    if not isPauseMenuActive() and isPlayerPlaying(playerHandle) then -- Игрок не на паузе и в игре
    while true do -- цикл
      wait(0)
       if active == 1 then -- Если активировали командой -> идем дальше
        for a = 1, 2000 do -- от 1 до 2000 допустымых моделей
         local doorStatus = getCarDoorLockStatus(carhandle)-- получаем статус дверей
          if doorStatus == 0 then
          doorStatus = "{00cc00}Unlocked"
end
          if doorStatus == 2 then
          doorStatus = "{cc0000}Locked"
end
     local model = getCarModel(carhandle) -- модель машины
     local namecar = getNameOfVehicleModel(model) -- название
     local health = getCarHealth(carhandle) -- хп машины
     local X, Y, Z = getOffsetFromCarInWorldCoords( carhandle, 0.0, 0.0, 0.0)
     local resul = isPointOnScreen(X, Y, Z, 0.0) -- точка на экране в радиусе, если есть - то..
     if resul then
     local wposX, wposY = convert3DCoordsToScreen(X, Y, Z)-- Игровые 3д координаты в экранные
     renderFontDrawText(font, string.format("{00ff00}%s {cc00cc}%d %s\n{ff0000}%d", namecar, model, doorStatus, health), wposX, wposY, color)
     renderDrawPolygon(wposX, wposY, 5, 5, 30, 0, col)
             end
           end
         end
       end
     end
   end
function active()
  if active == 0 then
       active = 1
   else
       active = 0
     end
end