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

sᴀxᴏɴ

саксофон
Всефорумный модератор
791
853
можно попобробнее про это?
Какая функция за это отвечает? Как узнать все ID (Самого текстдрава, кнопок)?
Закидываешь этот скрипт в папку мунлоадер, в игре пишешь /td_show и возле каждого текстдрава рисуется его id. Ищешь нужный тебе текстдрав, и вызываешь функцию sampSendClickTextdraw, в аргумент пишешь id текстдрава
 

Вложения

  • TextDraw.lua
    1.6 KB · Просмотры: 10
  • Нравится
Реакции: NoName_001

kreyN

Известный
78
13
Можете помочь с матчем?


1. Перевозка товаров [Склад №39 - Police Department SF] Оружие 11200 $0.80


Lua:
local num, numsklad, amount, price = line:match("{FFDF80}(%d+).{FFFFFF}%s[.*]%c(%d+)%s%-%s[%S+]%c%s[.*]%s(%d+)%s%$(%d+)")


X0z2dC-X9Ac.jpg
 

Hund dev.

Участник
47
2
Как сделать как тут?
1601137899799.png

при нажатии на какую из этих штук справа будет выводится содержимое
 

NoName_001

Участник
152
21
Можете помочь с матчем?


1. Перевозка товаров [Склад №39 - Police Department SF] Оружие 11200 $0.80


Lua:
local num, numsklad, amount, price = line:match("{FFDF80}(%d+).{FFFFFF}%s[.*]%c(%d+)%s%-%s[%S+]%c%s[.*]%s(%d+)%s%$(%d+)")
Lua:
local numsklad, amount, num, price = line:match('%[Склад %№(%d+) %- (.*)%] Оружие (%d+) %$(%d+)')
не забудь {цвет} поставить там, где надо
 
  • Нравится
Реакции: kreyN

Hund dev.

Участник
47
2
Как сделать так, чтобы при доставании оружия, отыгрывалась РП отыгровка?
(P.S. Ребят, я прекрасно изучил все другие скрипты, но мне нужно понять функцию через которое это делается, и ее работу)
 

NoName_001

Участник
152
21

Hund dev.

Участник
47
2
как сделать чекер мемберса, с последующем выводом его в тектдрав на экране?
 

NoName_001

Участник
152
21
Как сделать так, чтобы при доставании оружия, отыгрывалась РП отыгровка?
(P.S. Ребят, я прекрасно изучил все другие скрипты, но мне нужно понять функцию через которое это делается, и ее работу)
изучи этот исходник(нереклама:D)
 

Fott

Простреленный
3,461
2,374
Как сделать так, чтобы при доставании оружия, отыгрывалась РП отыгровка?
(P.S. Ребят, я прекрасно изучил все другие скрипты, но мне нужно понять функцию через которое это делается, и ее работу)
Выше Я скинул ссылку на скрипт с открытым кодом. Что ты ещё хочешь увидеть?
как сделать чекер мемберса, с последующем выводом его в тектдрав на экране?
Проверку на диалог и рендер думаю сделаешь сам
Lua:
function ev.onShowDialog(dialogId,s,t,b1,b2,text)
    for line in text:gmatch("[^\n]+") do
        if line:find('(.+)') then
              memb = line:match('(.+)') -- memb - ник чела
       end
   end
end
 

NoName_001

Участник
152
21
Все равно, не понимаю!
Расписал комментарии скрипта, который отправлял выше, еще больше. Если не поймешь, то на этом мои полномочия.. все..
Lua:
script_name('RP GUN') -- название скрипта
script_author('FORMYS') -- автор скрипта
script_description('RP GUN true function') -- описание скрипта

require "lib.moonloader" -- подключение библиотеки
local weapons = require 'lib.game.weapons' -- подключение библиотеки, отвечающей за оружия
local inicfg = require 'inicfg' -- подключение библиотеки, отвечающей за сохранение настроек
local keys = require "vkeys" -- подключение библиотеки, отвечающей за удобное написание кнопки(вместо ид - название)
local imgui = require 'imgui' -- подключение библиотеки, отвечающей за ImGui интерфейс
-- подключение библиотеки, отвечающей за правильный вывод кирилицы в чат
local encoding = require 'encoding' -- подкл
encoding.default = 'CP1251' -- стандарт кодировка
u8 = encoding.UTF8 -- русская кодировка

rpgun = false -- изначально выключенный скрипт
sex = 1 -- 0 женский, 1 мужской ПОЛ :D

function main() -- main - рабочая область
    if not isSampLoaded() or not isSampfuncsLoaded() then return end -- если не ПодгружнСамп() или не ПодгруженСампфункс() то вернуть(повторить)
    while not isSampAvailable() do wait(100) end -- пока не СампЗагружен() делать ждать(100мс)

    sampRegisterChatCommand("rpgun", cmd_rpgun) -- сампРегистрацияЧатКоманды("название", функция_отвечающая_за_команду)
    rp_thread = lua_thread.create_suspended(rp_weapons) -- якорь

    _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получение ида персонажа по его хенделу(получение твоего ида)
    nick = sampGetPlayerNickname(id) -- получение твоего ника по твоему иду
    
    while true do -- пока правда(пока игра включена) делать Ждать(0мс)
        wait(0)

    end
end

function cmd_rpgun() -- функция и ее название
    rpgun = not rpgun -- переключить Ложь на Правду(т.е. включить скрипт)
    if rpgun then -- если рпгун(т.е. если он включен), то
        sampAddChatMessage("РП оружие включено", -1) -- сампВыдатьСообщение('текст', белыйЦвет)
        rp_thread:run() -- переход к якорю
    else -- иначе
        sampAddChatMessage("РП оружие выключено", -1) -- выдать сообщение
        rp_thread:terminate() -- завершить переход к якорю
    end -- конец
end - конец фукнции

function rp_weapons() -- якорная функция
    local gunOn = {} -- массив
    local gunOff = {} -- массив
    local gunPartOn = {} -- массив
    local gunPartOff = {} -- массив
    local oldGun = nil --
    local nowGun = getCurrentCharWeapon(PLAYER_PED) --
    local rpTakeNames = {{"из-за спины", "за спину"}, {"из кармана", "в карман"}, {"из пояса", "на пояс"}, {"из кобуры", "в кобуру"}} -- действия персонажа
    local rpTake = {
        [2]=1, [5]=1, [6]=1, [7]=1, [8]=1, [9]=1, [14]=1, [15]=1, [25]=1, [26]=1, [27]=1, [28]=1, [29]=1, [30]=1, [31]=1, [32]=1, [33]=1, [34]=1, [35]=1, [36]=1, [37]=1, [38]=1, [42]=1, -- оружия, которые могут находиться на спине
        [1]=2, [4]=2, [10]=2, [11]=2, [12]=2, [13]=2, [41]=2, [43]=2, [44]=2, [45]=2, [46]=2, -- оружие, которое может быть в кармане
        [3]=3, [16]=3, [17]=3, [18]=3, [39]=3, [40]=3, --оружия - пояс
        [22]=4, [23]=4, [24]=4 -- пистолеты
    }
    
    for id, weapon in pairs(weapons.names) do -- для Ид(номер оружия), названия оружия в Парсинге(переборе массива) массива, созданного в библиотеке weapons(подгружали в начале)
        --sampAddChatMessage(id .. " - " .. weapon, -1)

        if (id == 3 or (id > 15 and id < 19)) then -- 3 16 17 18 (for gunOn)
            gunOn[id] = sex and 'снял' or 'сняла'
        else
            gunOn[id] = sex and 'достал' or 'достала'
        end

        if (id == 3 or (id > 15 and id < 19) or (id > 38 and id < 41)) then -- 3 16 17 18 39 40 (for gunOff)
            gunOff[id] = sex and 'повесил' or 'повесила'
        else
            gunOff[id] = sex and 'убрал' or 'убрала'
        end

        if id > 0 then
            gunPartOn[id] = rpTakeNames[rpTake[id]][1]
            gunPartOff[id] = rpTakeNames[rpTake[id]][2]
        end
    end

    while true do
        wait(0)
        if nowGun ~= getCurrentCharWeapon(PLAYER_PED) then
            oldGun = nowGun
            nowGun = getCurrentCharWeapon(PLAYER_PED)
            if oldGun == 0 then
                sampAddChatMessage("/me " .. gunOn[nowGun] .. " " .. weapons.get_name(nowGun) .. " " .. gunPartOn[nowGun], -1)
            else
                if nowGun == 0 then
                    sampAddChatMessage("/me " .. gunOff[oldGun] .. " " .. weapons.get_name(oldGun) .. " " .. gunPartOff[oldGun], -1)
                else
                    sampAddChatMessage("/me " .. gunOff[oldGun] .. " " .. weapons.get_name(oldGun) .. " " .. gunPartOff[oldGun] .. ", после чего " .. gunOn[nowGun] .. " " .. weapons.get_name(nowGun) .. " " .. gunPartOn[nowGun], -1)
                end
            end
        end
    end
end
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
Как сделать как тут?Посмотреть вложение 69982
при нажатии на какую из этих штук справа будет выводится содержимое

Как сделать так, чтобы при доставании оружия, отыгрывалась РП отыгровка?
(P.S. Ребят, я прекрасно изучил все другие скрипты, но мне нужно понять функцию через которое это делается, и ее работу)
 

sᴀxᴏɴ

саксофон
Всефорумный модератор
791
853
Всем привет надях решил писать скрипты на луа. Решил вывксти первое сообщение когда запускаешь самп "Привет мир!" а получается какие-то ироглефы. Помогите пж.

1601132411459.png

вот скрин
Кодировку файла измени на CP1251