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

percheklii

Известный
737
275
как сделать чтобы показывало сколько человек стоит за стеной?
Код:
function main()
    while not isSampAvailable() do wait(100) end
    local font = renderCreateFont('Arial', 10, 13)

    while true do wait(0)
            for i = 0, sampGetMaxPlayerId() do
                local result, ped = sampGetCharHandleBySampPlayerId(i)
                if result then
                    xx, yy, zz = getActiveCameraCoordinates()
                    x, y, z = getCharCoordinates(ped)
                    if isLineOfSightClear(xx, yy, zz, x, y, z, false, true, true, true, true) then
                        if doesCharExist(ped) and isCharOnScreen(ped) then
                        renderFontDrawText(font, , 500, 500, -1)
                    end
                end
            end
        end
    end
end
 

Veit

Известный
83
19
Мне нужно отправлять json файл на сервер асинхронно. Отправлять нужно именно целый файл, не данные из него. На обычных запросах всё работает, но есть микрофриз, которого хотелось бы избежать при помощи асинхронности.
 

хуега)

РП игрок
Модератор
2,568
2,265
Мне нужно отправлять json файл на сервер асинхронно. Отправлять нужно именно целый файл, не данные из него. На обычных запросах всё работает, но есть микрофриз, которого хотелось бы избежать при помощи асинхронности.
В луа ее как таковой нет
 
Я получаю текст с текстдрава с иероглифами
Пример:
CAYC: ~y~KYC 90~n~~w~O POCA: ~b~~h~~h~5 . 15
Как получить этот же текст только в нормально

поменяй кодировку файла на cyrillic windows. там еще 4 цифры которые я не помню
 
  • Эм
Реакции: YarikVL

хуега)

РП игрок
Модератор
2,568
2,265
Даже при помощи сторонних либ никак?
@СоМиК, хелп (не пизди меня пожалуйста)

поменяй кодировку файла на cyrillic windows. там еще 4 цифры которые я не помню
Это не так работает, у тексдравов там своя шняга
 
Последнее редактирование:
  • Грустно
Реакции: joumey

joumey

Активный
195
43
поменяй кодировку файла на cyrillic windows. там еще 4 цифры которые я не помню
Windows-1251
Я получаю текст с текстдрава с иероглифами
Пример:
CAYC: ~y~KYC 90~n~~w~O POCA: ~b~~h~~h~5 . 15
Как получить этот же текст только в нормальном виде?
это не иероглифы, это цвета

Как это понимать? :/
1680266948346.png
1680266964698.png
1680266990361.png
1680266999929.png
 
Последнее редактирование:
  • Нравится
Реакции: YarikVL

хуега)

РП игрок
Модератор
2,568
2,265
Почему ипаирс и паирс одинаково работают?
1) названия переменных k и v появились не из неоткуда, а это сокращения от слова key - ключ и value - значение, а у тебя они как-то странно меняются местами)
2) первые два скрина: на первом скрине у тебя перебирается массив с помощью ipairs(), которая возвращает два значения (индекс значения и само значение) и ты их записываешь в переменные v, k (правильнее тут будет сделать наоборот, сначала k, потом v, а в случае с ipairs(), можно вообще ставить i - index). Выводишь ты переменную k, в которую ты записал значение из таблицы, т.е. в результате получается: "b, c". На втором скрине ты делаешь тоже самое, но с функцией pairs(), которая возвращает уже не идекс-значение, а ключ-значение, т.к. у тебя таблица tab является массивом (т.е. в ней нет строковых ключей), ключи будут равняться индексу значения.
3) третий и четвертый скрин: ты опускаешь значение и выводишь только индекс (3 скрин) и ключ (4 скрин). Как я написал выше: pairs() в массиве в виде ключа выводит индекс значения.


Если ты хочешь увидеть разницу между pairs() и ipairs(), то вот она:
Lua:
local t = {"кошка", "пес", "пидорок"}

print("pairs1:::::::::")

for k, v in pairs(t) do
    print(k, v) --[[ запринтит:
    1    кошка
    2    пес
    3    пидорок
    ]]
end

print("\nipairs1:::::::::")

for i, v in ipairs(t) do
    print(i, v) --[[ запринтит:
    1    кошка
    2    пес
    3    пидорок
    т.е. тоже самое
    ]]
end

Lua:
local t = { -- добавим в таблицу ключи
    ["Домашний питомец"] = "кошка",
    dog = "пес", -- ключи можно объявлять как с помощью [], так и как обычную переменную (если ключ на английском)
    [1] = "пидорок" -- тут мы укажем индекс
} -- не обращай внимания, что то было в одну строку, а это в несколько, просто так более читабильно

print("pairs1:::::::::")

for k, v in pairs(t) do
    print(k, v) --[[ запринтит:
    Домашний питомец    кошка
    1    пидорок
    dog    пес
    ]] -- заметь, что pairs() может не перебирать цикл по порядку, как ipairs(), из-за чего сначало вывело пидорка, а потом уже собаку
end

print("\nipairs1:::::::::")

for i, v in ipairs(t) do
    print(i, v) --[[ запринтит:
    1    пидорок
    ]] -- ipairs() не видит строчные ключи, она работает только по индексам
end

вроде неплохие статьи по таблицам:
Вот еще раз статьи по таблицам, там более подробно рассказывается.
и вот еще одна статья, но уже более тяжелая, чем прошлые две
 
Последнее редактирование:

The Spark

Известный
653
672
Почему ипаирс и паирс одинаково работают?
Потому что у тебя просто массив.
ipairs работает как цикл for, перебирая массив часть таблицы.
pairs перебирает всю таблицу. Массив и словарь часть таблицы.

Lua:
local array = {1, 2, 3, "a"}
--[[
pairs and ipairs:
index/key = 1    value = 1
index/key = 2    value = 2
index/key = 3    value = 3
index/key = 4    value = a
]]

local dict = {["key"] = 1, ["key2"] = 2, ["key3"] = 3}
--[[
pairs:
key = key2    value = 2
key = key3    value = 3
key = key    value = 1

ipairs:
nothing
]]

local tab = {[0] = 1, [1] = 2, [2] = 3} -- {[0] = 1, 2, 3}
--[[
pairs:
key = 0    value = 1
index = 1    value = 2
index = 2    value = 3

ipairs:
index = 1    value = 2
index = 2    value = 3
]]

local tab2 = {1, 2, ["key"] = 1, ["key2"] = 2}
--[[
pairs:
index = 1    value = 1
index = 2    value = 2
key = key    value = 1
key = key2    value = 2

ipairs:
index = 1    value = 1
index = 2    value = 2
]]
 
  • Нравится
Реакции: хуега)

kwzInside

Участник
65
7
я первый день в луа, хотел создать авто /piss по клавише
скрипт чет не робит, подскажите что необходимо поменять
Lua:
[/B]
script_name('AutoPiss')
script_author('kwzInside')
script_description('Скрипт для облегчения ввода /piss')
require "lib.moonloader"
local tag = '[AutoPiss Lua]:'
function main()
if notisSamploaded() or not isSampfuncsLoaded() then return end
while not isSampAvailable() do wait(100) end
sampAddChatMessage(tag .. " script AutoPiss successfully loaded", 0xC71585)
while true do
wait(0)
if isKeyDown(VK_B)
and isKeyJustPressed(VK_O)
then 
sampSendChat("/piss")
end
end
end
[B]
 

Sadow

Известный
1,438
592
Как можно одну строку поделить на несколько? Допустим у меня есть строка: "dora, pampers, hui, pomidor". И мне надо её разделить на: "dora" "pampers" "hui" "pomidor". Желательно чтобы оно так перебиралось через цикл for
 

7 СМЕРТНЫХ ГРЕХОВ

Известный
515
159
LUA:
local array = {}

function sampev.onShowDialog(id, style, title, button1, button2, text)
    if title:find("Секонд%-хенды") then
        for line in text:gmatch('[^\r\n]+') do
            array[#array+1] = line
            print(line)
        end
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
      imgui.SetNextWindowSize(imgui.ImVec2(150, 200), imgui.Cond.FirstUseEver)
      imgui.Begin('SecondHend', main_window_state)
      imgui.Text("Статистика секондов \n" ..array)
      imgui.End()
    end
end
Как сделать правильно что бы оно считало все line записало их в массив и вывело в imgui.Text
У меня чет какая то хуйня -
1680275715212.png
 

хуега)

РП игрок
Модератор
2,568
2,265
Как можно одну строку поделить на несколько? Допустим у меня есть строка: "dora, pampers, hui, pomidor". И мне надо её разделить на: "dora" "pampers" "hui" "pomidor". Желательно чтобы оно так перебиралось через цикл for
Lua:
local str = "hello world from Lua"
for w in str:gmatch("%a+") do
    print(w) --[[запринтит:
        hello
        world
        from
        Lua
    ]]
end

LUA:
local array = {}

function sampev.onShowDialog(id, style, title, button1, button2, text)
    if title:find("Секонд%-хенды") then
        for line in text:gmatch('[^\r\n]+') do
            array[#array+1] = line
            print(line)
        end
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
      imgui.SetNextWindowSize(imgui.ImVec2(150, 200), imgui.Cond.FirstUseEver)
      imgui.Begin('SecondHend', main_window_state)
      imgui.Text("Статистика секондов \n" ..array)
      imgui.End()
    end
end
Как сделать правильно что бы оно считало все line записало их в массив и вывело в imgui.Text
У меня чет какая то хуйня - Посмотреть вложение 195693

Lua:
local array = {}

function sampev.onShowDialog(id, style, title, button1, button2, text)
    if title:find("Секонд%-хенды") then
        for line in text:gmatch('[^\r\n]+') do
            array[#array+1] = line
            print(line)
        end
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
      imgui.SetNextWindowSize(imgui.ImVec2(150, 200), imgui.Cond.FirstUseEver)
      imgui.Begin('SecondHend', main_window_state)
      for _, text in ipairs(array) do
          imgui.Text(text)
      end
      imgui.End()
    end
end
 
Последнее редактирование: