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

FYP

Известный
Автор темы
Администратор
1,764
5,924
Народ опять проблема появилась, в общем я загружаю спрайты картинок этой функции id = loadSprite("PIC") допустим, но у я хочу перезаписать старые спрайты на новые с этим же id как мне это сделать, как их можно выгрузить? В клео это легко делается опкодом 0391: release_textures, ее аналог функции removeTextureDictionary() не работает, спрайты также старые висят в памяти и не перезаписываются на новые
должна работать. есть код для проверки?

и еще объясните мне эту функцию int texture = renderLoadTextureFromFile(zstring file) я пока не понял, как мне указать нужные картинки из TXD файла их названия, а не номер текстуры

как я не использовал эту функцию он эту ошибку выдает
attempt to call global 'renderLoadTextureFromFile' (a nil value)
как ее обойти как пользоваться этой функцией, объясните пожалуйста
эта функция из SAMPFUNCS, без него работать не будет. она загружает текстуру из обычного изображения, png, bmp и т.д.
 

Chel555

Новичок
32
6
должна работать. есть код для проверки?


эта функция из SAMPFUNCS, без него работать не будет. она загружает текстуру из обычного изображения, png, bmp и т.д.
тут такая проблема что той функции id = loadSprite("PIC") не указать определенный номер, он сам задается в переменную id, и если я загружу 128 вроде текстур то все они исчезают из экрана, типо перегруз, лимит превысил, нужна помощь, хотелось бы юзать эту функцию а не из SAMPFUNCS

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

Hatiko

Известный
Проверенный
1,512
628
Есть ли какой-то способ удалять какие-то файлы, например txt?
 

Neak

Известный
76
20
Как взять пикап с синхрой, если на сервере не пофикшен способ, скажите, пожалуйста
 
1,417
1,032
Как взять пикап с синхрой, если на сервере не пофикшен способ, скажите, пожалуйста
координаты пикапа, или рядом с пикапом
Lua:
function sendOnfootSync(x, y, z)
    local _, myId = sampGetPlayerIdByCharHandle(PLAYER_PED)
    local data = allocateMemory(68)
    sampStorePlayerOnfootData(myId, data)
    setStructFloatElement(data, 6, x, false)
    setStructFloatElement(data, 10, y, false)
    setStructFloatElement(data, 14, z, false)
    sampSendOnfootData(data)
    freeMemory(data)
end
потом
Lua:
sampSendPickedUpPickup(pickup id)
 
  • Нравится
Реакции: checkdasound

T1cKz

Известный
595
245
Как сделать так что бы при считывании сообщения в чат скрипт писал команду которая активировала другой скрипт???
 

GamerGold

Новичок
1
0
Всем привет, есть вопросы по lua. Тему создал, но там только просмотры, а ответов - нет. Решил написать сюда.
В общем, пишу скрипт для адвокатов, для упрощения игры. Проблема заключается в том, что нет окна выбора с игроком, а если оно и есть - то при выборе игрока другие диалоги не показывает.
Скрипт должен выводить игроков в зоне стрима (или в определенном радиусе) в списке, далее я выбираю игрока, выбираю действие 1 или действие 2, дальше идет окно ввода цифр, и отправка команды. Что-то получается, но руки.. Хех..)
Код есть:

Lua:
script_name('adv_helper')
require 'lib.moonloader'

dialog1 = false
dialog2 = false
dialog3 = false
dialog4 = false

nicks = {}
name = ""
id = 0

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait (1000) end
    sampRegisterChatCommand('adv', pList)
    while true do
    wait(0)
        if dialog1 then
            sampSetCurrentDialogListItem(0)
            repeat
                wait(0)
                local res, button, list, input = sampHasDialogRespond(50)
                    if button == 0 then
                        _ = sampCloseCurrentDialogWithButton(0)
                    else
                    name = nicks[list+1]
                    for o = 0, 1000 do
                        if sampIsPlayerConnected(o) then
                            if sampGetPlayerNickname(o) == name then
                            id = o
                            dialog_selected()
                        end
                    end
                end
            end
            if dialog2 then
                sampSetCurrentDialogListItem(0)
                repeat
                    wait(0)
                    local res, button, list, input = sampHasDialogRespond(51)
                until res
                if button == 0 then
                    _ = sampCloseCurrentDialogWithButton(0)
                else
                if list == 0 then
                    dialog_cash()
                end
                if list == 1 then
                dialog_bank()
                end
            end
        end
            if dialog3 then
            sampSetCurrentDialogListItem(0)
            repeat
                wait(0)
                local res, button, list, input = sampHasDialogRespond(52)
            until res
            if button == 0 then
                _ = sampCloseCurrentDialogWithButton(0)
            activate()
            else
            if list == 0 then
                if input then
                    sampSendChat(string.format("/free %d 1 %d", id, input))
                    activate()
                end
            activate()
            end
        end
            if dialog4 then
            sampSetCurrentDialogListItem(0)
            repeat
                wait(0)
                local res, button, list, input = sampHasDialogRespond(53)
            until res
            if button == 0 then
                _ = sampCloseCurrentDialogWithButton(0)
            activate()
            else
            if list == 1 then
                if input then
                    sampSendChat(string.format("/free %d 2 %d", id, input))
                activate()
                end
            activate()
            end
        end
    end
    end
until input
end
end
end

function pList()
    pList = {}
    for i = 0, 1000 do
        if sampIsPlayerConnected(i) then
            local _, actor = sampGetCharHandleBySampPlayerId(i)
            if doesCharExist(actor) then
                nick = sampGetPlayerNickname(i)
                table.insert(nicks,nick)
            end
        end
    end
    dialog()
end

function dialog()
    stream = ""
    for n = 1, #nicks do
        stream = string.format("%s\n%s[%d]", stream, nicks[n], id)
    end
    dialog1()
    sampShowDialog(50, "Игроки в зоне стрима", stream, "Закрыть", "", 2)
end
function dialog_selected()
    dialog2()
    sampShowDialog(51, "Выбран игрок: %s[%d] | LVL: %d", name, id, sampGetPlayerScore(id), "Наличные\nБанк", "Закрыть", "", 2)
end

function dialog_cash()
    dialog3()
    sampShowDialog(52, string.format("Выбран игрок: %s[%d] | LVL: %d", name, id, sampGetPlayerScore(id), "Введите текст сообщения \t\t", "Закрыть", "", 1))
end
function dialog_bank()
    dialog4()
    sampShowDialog(53, string.format("Выбран игрок: %s[%d] | LVL: %d", name, id, sampGetPlayerScore(id), "Введите текст сообщения \t\t", "Закрыть", "", 1))
end

function activate()
    activate = not activate
end

function dialog1()
    dialog1 = not dialog1
end
function dialog2()
    dialog2 = not dialog2
end
function dialog3()
    dialog3 = not dialog3
end
function dialog4()
    dialog4 = not dialog4
end
Буду благодарен за помощь.
 

Cat_Dog

Новичок
1
0
1. Как сделать чтобы у меня всегда в игре открывался чат на "T", не зависимо от того, какая расскладка на клавиатуре? Сейчас я могу открыть чат на "Т" только в том случае, если расскладка английская, на русской расскладке не открывается, бесит постоянный дрочь с переключением регистра (Траблы именно из-за Мунлодера).

2. Когда использую AutoHotKey скрипты, в игре флуд варнингами и краш постоянно. Как это исправить?

3. Если есть тут игроки прям шарящие за все это, помогите нубу в личке в ВК пожалуйста...
 

realgangster

Участник
37
0
Как сделать так что бы при считывании сообщения в чат скрипт писал команду которая активировала другой скрипт???

Lua:
hook = require 'samp.events'

function hook.onServerMessage(color, msg)
    if msg == 'сообщение' then
    sampProcessChatInput("/команда")
end

вроде бы оно :)
 

T1cKz

Известный
595
245
Ладно *знотоки*, внимание вопрос: Как сделать здесь вызов функции?
Код:
if string.find(message, "АВХАВЗАЗАВЗ") then

return true
 

AnWu

Известный
Всефорумный модератор
4,777
5,402
Мне нужно что бы луа активил луа, потому как по-другому нельзя прыгнуть на функцию
Чем не катит стандарт работа со скриптами?
Версия
v.023LuaScript script = script.get(int scriptId)
v.015LuaScript s = thisScript()
v.015LuaScript s = script.load(string file)
v.015LuaScript s = script.find(string name)
[TBODY] [/TBODY]
[TBODY] [/TBODY]


Ладно *знотоки*, внимание вопрос: Как сделать здесь вызов функции?
Код:
if string.find(message, "АВХАВЗАЗАВЗ") then

return true

func("ti loh")
 

Cquint

Активный
249
76
1. Как сделать чтобы у меня всегда в игре открывался чат на "T", не зависимо от того, какая расскладка на клавиатуре? Сейчас я могу открыть чат на "Т" только в том случае, если расскладка английская, на русской расскладке не открывается, бесит постоянный дрочь с переключением регистра (Траблы именно из-за Мунлодера).
CLEO - Fix opening inputbox on a different layout(https://blast.hk/threads/18884/), мунлоадер тут к чему?
2. Когда использую AutoHotKey скрипты, в игре флуд варнингами и краш постоянно. Как это исправить?
CLEO - asi - [ 0.3.7 ] ANTICRASHER(https://blast.hk/threads/8357/)
Ты вообще не в ту тему зашёл, мне кажется