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

Dr.Dedivoevalifashist

Новичок
4
0
Возможно ли как то(при помощи библиотек каких либо) устроить подмену IP ?
То есть по запросу от сервера дать ответ скриптом(допустим на запрос ответить любым текстом/форматом но не существующего IP-Адреса)
up
 
У

Удалённый пользователь 448549

Гость
Помогите что куда, поч не работает?
Мне нужно эту строку, разобрать
lua:
 if text:find('(Жалоба/Вопрос) (.*)%[(%d+)%]: %(.*)') then
        local Rnickname, Rid, RtextP = text:match('(Жалоба/Вопрос) (.*)%[(%d+)%]: %(.*)')
        reports[#reports + 1] = {nickname = Rnickname, id = Rid, textP = RtextP}
    end


Посмотреть вложение 129978
Lua:
if (text:find('%(Жалоба/Вопрос%) %w+_%w+%[%d+%]: .+')) then
    local nickname, id, text = text:match('%(Жалоба/Вопрос%) (%w+_%w+)%[(%d+)%]: (.+)')
    sampAddChatMessage(string.format('nickname: %s | id: %s | text: %s', nickname, id, text))
end
 

nightaiga

Известный
302
118
возможно ли такую надпись(объект) сделать в скрипте на стенке
xX6SmD3ZFkI.jpg
 

mc_alex

Участник
151
24
скрипт не отключается, так и не разобрался в чём дело

Lua:
local active = false

function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('gus', gus)
    active = not active
    sampAddChatMessage('[Крутой скрипт] ' .. (active and 'включен' or 'выключен'), -1)
    while true do
        wait(100)
    end
end
 
function gus()
    if active then
        lua_thread.create(function()
            while true do
                wait(500)
                sampSendChat('qq')
            end
        end)
    end
end
 

Snoopcheg

Известный
151
82
скрипт не отключается, так и не разобрался в чём дело

Lua:
local active = false

function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('gus', gus)
    active = not active
    sampAddChatMessage('[Крутой скрипт] ' .. (active and 'включен' or 'выключен'), -1)
    while true do
        wait(100)
    end
end
 
function gus()
    if active then
        lua_thread.create(function()
            while true do
                wait(500)
                sampSendChat('qq')
            end
        end)
    end
end
Lua:
local active = false

function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('gus', gus)
    wait(-1)
end
 
function gus()
    active = not active
    sampAddChatMessage('[Крутой скрипт] ' .. (active and 'включен' or 'выключен'), -1)
    lua_thread.create(function()
        while active do
            wait(500)
            sampSendChat('qq')
        end
    end)
end
 

barjik

Известный
459
191
как проверить стоит ли персонаж на определенных координатах?
 
D

deleted-user-216129

Гость
как проверить стоит ли персонаж на определенных координатах?
Lua:
local x1, y1, z1 = getCharCoordinates(PLAYER_PED)
if getDistanceBetweenCoords3d(x1, y1, z1, 0.00, 0.00, 1.00) <= 1 then -- Вместо  0.00, 0.00, 1.00 - твои корды
    --> Ur code
end
Делай так, что-бы это работало корректно. Если будет работать плохо - увеличить число, а что-бы увеличить точность - уменьшь.
 
  • Нравится
  • Влюблен
Реакции: loverhasha и barjik

yoozee

Новичок
12
0
Lua:
[/B]
script_name("AdminHelper for Detroit RolePlay")
script_author("zabivnoy")
script_description("This script is designed to help the administrative staff of Detroit RolePlay")
local list = {
--  {cmd, send}
    {'t', '/pm id  Приятной игры на Detroit Roleplay'},
    {'', '/pm id '},
    {'offtop', '/pm id Уважаемый игрок, просьба не оффтопить. • Отличной игры! •'},
    {'y', '/pm id Уважаемый игрок, уточните вашу жалобу! • Отличной игры! •'},
    {'ad', '/pm id Уважаемый игрок будьте адекватнее!•'},
    {'ot', '/pm id Отказано • Веселой игры! •'},
    {'jb', '/pm id Уважаемый игрок, подайте жалобу в Свободную Группу (vk.com/detroitsg)!'},
    {'salam', '/pm id Приветствую! • Отличной игры! •'},
    {'oj', '/pm id Ожидайте. • Отличной игры! •'},
    {'rab', '/pm id Уважаемый игрок, работаем по вашей жалобе!'},
    {'lid', '/pm id Получить лидерку можно через покупку (/buylead) или пройдя отбор. • Отличной игры! •'},
    {'adm', '/pm id Получить админку можно через покупку (/buyadm) или выиграв в раздаче. • Отличной игры! •'},
}/
function main()
    while not isSampAvailable() do wait(0) end
    for i = 1, #list do
        sampRegisterChatCommand(list[i][1], function(arg)
            local id = tonumber(arg)
            if id then
                sampSendChat(list[i][2]:gsub('id', id))
            end
        end)
    end
    wait(-1)
end
[B]
.
почему не работает исправьте ошибку пожалуйста
 

Gorskin

t.me/gorskintgk
Проверенный
1,389
1,231
Lua:
[/B]
script_name("AdminHelper for Detroit RolePlay")
script_author("zabivnoy")
script_description("This script is designed to help the administrative staff of Detroit RolePlay")
local list = {
--  {cmd, send}
    {'t', '/pm id  Приятной игры на Detroit Roleplay'},
    {'', '/pm id '},
    {'offtop', '/pm id Уважаемый игрок, просьба не оффтопить. • Отличной игры! •'},
    {'y', '/pm id Уважаемый игрок, уточните вашу жалобу! • Отличной игры! •'},
    {'ad', '/pm id Уважаемый игрок будьте адекватнее!•'},
    {'ot', '/pm id Отказано • Веселой игры! •'},
    {'jb', '/pm id Уважаемый игрок, подайте жалобу в Свободную Группу (vk.com/detroitsg)!'},
    {'salam', '/pm id Приветствую! • Отличной игры! •'},
    {'oj', '/pm id Ожидайте. • Отличной игры! •'},
    {'rab', '/pm id Уважаемый игрок, работаем по вашей жалобе!'},
    {'lid', '/pm id Получить лидерку можно через покупку (/buylead) или пройдя отбор. • Отличной игры! •'},
    {'adm', '/pm id Получить админку можно через покупку (/buyadm) или выиграв в раздаче. • Отличной игры! •'},
}/
function main()
    while not isSampAvailable() do wait(0) end
    for i = 1, #list do
        sampRegisterChatCommand(list[i][1], function(arg)
            local id = tonumber(arg)
            if id then
                sampSendChat(list[i][2]:gsub('id', id))
            end
        end)
    end
    wait(-1)
end
[B]
.
почему не работает исправьте ошибку пожалуйста

Ошибка была на 19 строке:
script_name("AdminHelper for Detroit RolePlay")
script_author("zabivnoy")
script_description("This script is designed to help the administrative staff of Detroit RolePlay")

local list = {
--  {cmd, send}
    {'t', '/pm id  Приятной игры на Detroit Roleplay'},
    {'', '/pm id '},
    {'offtop', '/pm id Уважаемый игрок, просьба не оффтопить. • Отличной игры! •'},
    {'y', '/pm id Уважаемый игрок, уточните вашу жалобу! • Отличной игры! •'},
    {'ad', '/pm id Уважаемый игрок будьте адекватнее!•'},
    {'ot', '/pm id Отказано • Веселой игры! •'},
    {'jb', '/pm id Уважаемый игрок, подайте жалобу в Свободную Группу (vk.com/detroitsg)!'},
    {'salam', '/pm id Приветствую! • Отличной игры! •'},
    {'oj', '/pm id Ожидайте. • Отличной игры! •'},
    {'rab', '/pm id Уважаемый игрок, работаем по вашей жалобе!'},
    {'lid', '/pm id Получить лидерку можно через покупку (/buylead) или пройдя отбор. • Отличной игры! •'},
    {'adm', '/pm id Получить админку можно через покупку (/buyadm) или выиграв в раздаче. • Отличной игры! •'},
}

function main()
    while not isSampAvailable() do wait(0) end
    for i = 1, #list do
        sampRegisterChatCommand(list[i][1], function(arg)
            local id = tonumber(arg)
            if id then
                sampSendChat(list[i][2]:gsub('id', id))
            end
        end)
    end
    wait(-1)
end
 

YourAssistant

Участник
145
17
Lua:
sampSetChatInputText("1  3")
Можно при открытии чата через функцию и вставке в него текста сделать так, чтобы указатель появлялся например между 1 и 3, а не после?
 
Последнее редактирование:

Dr.Dedivoevalifashist

Новичок
4
0
Возможно ли как то(при помощи библиотек каких либо) устроить подмену IP ?
То есть по запросу от сервера дать ответ скриптом(допустим на запрос ответить любым текстом/форматом но не существующего IP-Адреса)
up
 

Smeruxa

smeruxa.ru
Проверенный
1,428
788

lovandog

Известный
223
97
Как вывести в чат символ процента? Когда я пытаюсь его вывести он просто не отображается