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

Dmitriy Makarov

25.05.2021
Проверенный
2,482
1,113
Подскажите , пожалуйста, как работать с этими штуками, чтобы текст переводить в переменные.
. --- представляет все символы.
%a --- представляет все буквы.
%c --- представляет все управляющие символы.
%d --- представляет все цифры.
%l --- представляет все строчные буквы.
%p --- представляет все знаки препинания.
%s --- представляет все пробелы.
%u --- представляет все заглавными буквами.
%w --- представляет все алфавитно-цифровых символов.
%x --- представляет все шестнадцатеричные цифры.
%z --- символ с представлением 0.
Nick_Name[123] - %a+_%a+%[%d+%]
+ ставится тогда, если символов 1 или больше.
Так же, если есть квадратные скобки [ ], то перед ними нужно ставить %. %[текст%].
P.S: Есть еще несколько символов, перед которыми их нужно ставить, но я чет забыл..)
 
Последнее редактирование:
  • Нравится
Реакции: Domino и lorgon

Warflex

Участник
158
17
Lua:
function arm()
    local armour = getCharArmour(PLAYER_PED)
    if armour == 0 then
        sampSendChat("/me достав из сумки бронежилет надел его на себя")
        sampSendChat("/armour")
        if text:find("Вы надели бронежилет. Используйте /armour чтобы снять его или надеть ещё раз.") then
            return false
    else
        sampSendChat("/me сняв бронежилет выкинул его в сторону")
        sampSendChat("/armour")
            function sampev.onServerMessage(color, text)
                if text:find("Вы надели бронежилет. Используйте /armour чтобы снять его или надеть ещё раз.") then
                return false
                end
            end
        end
    end
end


Помогите, не работает, сверху мусор какой та написан кто давал мне ответ( не обижайся, но так и есть )
 
D

deleted-user-204957

Гость
Lua:
function arm()
    local armour = getCharArmour(PLAYER_PED)
    if armour == 0 then
        sampSendChat("/me достав из сумки бронежилет надел его на себя")
        sampSendChat("/armour")
        if text:find("Вы надели бронежилет. Используйте /armour чтобы снять его или надеть ещё раз.") then
            return false
    else
        sampSendChat("/me сняв бронежилет выкинул его в сторону")
        sampSendChat("/armour")
            function sampev.onServerMessage(color, text)
                if text:find("Вы надели бронежилет. Используйте /armour чтобы снять его или надеть ещё раз.") then
                return false
                end
            end
        end
    end
end


Помогите, не работает, сверху мусор какой та написан кто давал мне ответ( не обижайся, но так и есть )
Ты блять сверх разум и гений(серуха #2), посмотри какие тебе ответы давали и какой код ты юзаешь
 

Dmitriy Makarov

25.05.2021
Проверенный
2,482
1,113
Lua:
function arm()
    local armour = getCharArmour(PLAYER_PED)
    if armour == 0 then
        sampSendChat("/me достав из сумки бронежилет надел его на себя")
        sampSendChat("/armour")
        if text:find("Вы надели бронежилет. Используйте /armour чтобы снять его или надеть ещё раз.") then
            return false
    else
        sampSendChat("/me сняв бронежилет выкинул его в сторону")
        sampSendChat("/armour")
            function sampev.onServerMessage(color, text)
                if text:find("Вы надели бронежилет. Используйте /armour чтобы снять его или надеть ещё раз.") then
                return false
                end
            end
        end
    end
end


Помогите, не работает, сверху мусор какой та написан кто давал мне ответ( не обижайся, но так и есть )
Тебе же тут давали ответ https://www.blast.hk/threads/13892/post-471938
Lua:
local sampev = require 'lib.samp.events'

function arm()
    lua_thread.create(function()
        local armour = sampGetPlayerArmor(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))
        if armour == 0 then
            sampSendChat("/me достав из сумки бронежилет надел его на себя")
            wait(500)
            sampSendChat("/armour")
        else
            sampSendChat("/me сняв бронежилет выкинул его в сторону")
            wait(500)
            sampSendChat("/armour")
        end
    end)
end

function sampev.onServerMessage(color, text)
  if text:find("Вы надели бронежилет. Используйте /armour чтобы снять его или надеть ещё раз.") then
  return false
end
 

damag

Женюсь на официантке в моем любимом баре
Проверенный
1,152
1,194
Как брать инфу о нике с сайта?
Например у меня есть ник -Kirill_Lox, и надо найти есть у него имво.
с сайта arizona-rp.com/map/5
 

Warflex

Участник
158
17
Тебе же тут давали ответ https://www.blast.hk/threads/13892/post-471938
Lua:
local sampev = require 'lib.samp.events'

function arm()
    lua_thread.create(function()
        local armour = sampGetPlayerArmor(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))
        if armour == 0 then
            sampSendChat("/me достав из сумки бронежилет надел его на себя")
            wait(500)
            sampSendChat("/armour")
        else
            sampSendChat("/me сняв бронежилет выкинул его в сторону")
            wait(500)
            sampSendChat("/armour")
        end
    end)
end

function sampev.onServerMessage(color, text)
  if text:find("Вы надели бронежилет. Используйте /armour чтобы снять его или надеть ещё раз.") then
  return false
end
Ты блять сверх разум и гений(серуха #2), посмотри какие тебе ответы давали и какой код ты юзаешь


Откройте глаза и почекайте что мне надо какой код
 

Tema05

Известный
1,442
402
У меня есть ini файл на github. Что-бы получить данные я скачиваю это ini через downloadUrlToFile и просматриваю его. Но как можно сделать что-бы скрипт наоборот изменил файл на хостинге?
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,892
1,256
Откройте глаза и почекайте что мне надо какой код
Тебя чем мой код не устроил? Твой хук в функции в проверке - говно, задержек и потока нет - говно, твой код говно. Разницы между getCharArmour и sampGetPlayerArmor в твоем случае нет
 

Akionka

akionka.lua
Проверенный
742
500
У меня есть ini файл на github. Что-бы получить данные я скачиваю это ini через downloadUrlToFile и просматриваю его. Но как можно сделать что-бы скрипт наоборот изменил файл на хостинге?
На гитхабе никак, если тебе надо менять, то пиши свой сервер, который будет принимать http запросы и обрабатывать их
 

Eugene Crabs

Активный
544
30
if isCharOnFoot(1) then - если пед на ногах, блок кода после проверки выполнится
Стоит такое
Lua:
if pedd ~= -1 then
    resulte = isCharOnFoot(pedd)
end
if resulte == true then
-- код --
end

Выдает ошибку
[16:19:04.386261] (error) Программа1.lua: opcode '044B' call caused an unhandled exception
stack traceback:
[C]: in function 'isCharOnFoot'
Щас твое попробую. Если заработает - с меня лайк

Заработало вродь. А из-за чего не пахало на той версии?