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

W1ll04eison

Участник
328
19
1)Подскажите, почему если я напишу свой id, к примеру: /id 12 или же часть своего ника, к примеру: /id gabr, то скрипт ничего не выводит.
2)Также, подскажите, почему если игрока нет на сервере под определенным id'om или же под определенным ником, то скрипт не выводит вот эту строку:
'sampAddChatMessage('Игрок не найден', -1)'

Сам код:
lua:
    sampRegisterChatCommand('id', function(pam)
                if #pam ~= 0 then
                    for id, nick in pairs(getAllIds()) do
                        if string.lower(nick):find(string.lower(pam)) then
                            if sampIsPlayerConnected(id) then
                                local score = sampGetPlayerScore(id)
                                local nick = sampGetPlayerNickname(id)
                                sampAddChatMessage('*  Ник:{FFFFFF} ' ..nick:gsub(pam, "{00BFFF}"..pam.."{FFFFFF}").. ' {00BFFF}| ID:{FFFFFF} ' ..id.. " {00BFFF}| Уровень:{FFFFFF} " ..score, 0x00BFFF)
                            else
                                sampAddChatMessage('Игрок не найден', -1)
                            end
                        end
                        if id == tonumber(pam) then
                            if sampIsPlayerConnected(tonumber(pam)) then
                                local score = sampGetPlayerScore(id)
                                local nick = sampGetPlayerNickname(id)
                                sampAddChatMessage('*  Ник:{FFFFFF} ' ..nick.. ' {00BFFF}| ID:{FFFFFF} ' ..id.. " {00BFFF}| Уровень:{FFFFFF} " ..score, 0x00BFFF)
                            else
                                sampAddChatMessage('Игрок не найден', -1)
                            end
                        end
                    end
                else
                    sampAddChatMessage("Ты что с ума сошел? Где Переменная после '/id'???", -1)

                end
    end)
 
    --вне main
    function getAllIds()
    local table = {}
    for i = 0, 1000 do
        if sampIsPlayerConnected(i) and sampGetPlayerNickname(i) then
            table[i] = sampGetPlayerNickname(i)
        end
    end
    return table
end
 

moreveal

Известный
Проверенный
927
621
1)Подскажите, почему если я напишу свой id, к примеру: /id 12 или же часть своего ника, к примеру: /id gabr, то скрипт ничего не выводит.
потому что эта функция не работает на локального игрока, проверяй другими способами
 

tor1

Активный
168
44
Привет, могу ли я как-то удалить объект из рук персонажа (мешок), сбросить/уронить его никак не получается
 

moreveal

Известный
Проверенный
927
621
Why I use sampSendClickTextdraw(11705) but the script don't click in the telephone?

Посмотреть вложение 141317
11705 is the model number, you need to use the textdraw ID, hook the OnShowTextdraw event, and find out the textdraw ID that has a modelId equal to 11705
also you can try this script (type "showtdid" in the sampfuncs console)

p.s: often textdraws have dynamic IDs, so it's worth focusing on other data - for example, the same model number, as well as the position of the textdraw, its size, etc.
 

Вложения

  • td+did.lua
    2.1 KB · Просмотры: 3
  • Нравится
Реакции: halfastrc

moreveal

Известный
Проверенный
927
621
How can I do this, what kind of function I need to use to get the size of the textdraw?
And thx for the help
this library will help a lot in this
then, you can use rpc event processing
Lua:
local sampev = require 'samp.events' -- you can find the events you need and their arguments here: lib/samp/events.lua

function sampev.onShowTextDraw(id, data)
    print(data.modelId, data.position.x, data.position.y)
end
1648363485708.png
 
  • Нравится
Реакции: halfastrc

wintreist

Активный
308
71
Привет, пишу скрипт для себя на аризоне на пилота, и проблема возникла с взятием самолёта: наступаю на пикап, жму альт, появляется диалог с самолётами в аэропорту.
Разбиваю строки диалога кодом:
разбитие диалога на строки:
local textes = {}
for i in text:gmatch('(.-)\n') do table.insert(textes, i) end
далее пробегаюсь по массиву в поисках нужного самолёта:

Lua:
for key, val in pairs(textes) do
    if val:find('Shamal', 1, true) then
        checkneed = true
        sampSendDialogResponse(dialogId, 1, key-2, nil)
        break
    end
end
if checkneed == false then sampSendDialogResponse(dialogId, 0, nil, nil) end
return false
и в 4й строке отправляю ответ диалогу если нашел нужный самолёт, в 8 отправляю диалогу, что я его закрываю, и в 9 не показываю диалог
8+9 строки работают как часы, диалог закрывается, и я могу открыть новый, а вот 4я посылает меня нахрен, и не берёт самолёт, просто ничего не происходит.
P.S: в 4й строке key-2, потому что у 0й строки диалога 2 индекс в массиве строк
up
 

VoloRate

Новичок
1
1
Всем привет! Начал заниматься Lua скриптингом, а именно imgui. У меня вот вопрос, какие библиотеки нужны чтобы создать имгуи окно и в нем были кнопки, по типу команды 1, ты нажимаешь на эту кнопку а там команды определенные в ряд
 
  • Ха-ха
Реакции: Sadow

Rice.

Известный
Модератор
1,756
1,621
Функция:
Lua:
function sampGetListboxItemByText(text, plain)
    if not sampIsDialogActive() then return -1 end
        plain = not (plain == false)
    for i = 0, sampGetListboxItemsCount() - 1 do
        if sampGetListboxItemText(i):find(text, 1, plain) then
            return i
        end
    end
    return -1
end
Пример для твоего случая:
Lua:
for line in text:gmatch("[^\n]+") do
    lua_thread.create(function()
        wait(1)
        local cont = sampGetListboxItemByText('Shamal')
        sampSendDialogResponse(dialogId, 1, cont, nil)
    end)
end