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

Di3

Участник
432
20
Кликер написал,но как сделать задержку 500 мс перед нажатием не понимаю.Если пишу wait(500) перед sendkey,то не работает :(
Lua:
require "lib.moonloader"
local hook = require 'lib.samp.events'

grogger = false


function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand("cl",
    function()
        grogger = not grogger
        if grogger then printStringNow("Cl = ON", 500)
        else printStringNow("Cl = OFF", 500)
    end
end)
end


function hook.onShowTextDraw(textdrawId, data)
    if textdrawId > 3 then
    if grogger then
        if data.text:find("Y") then
            sendKey(64)
        elseif data.text:find("N") then
            sendKey(128)
        end
    end
    end
end

function sendKey(key)
    local _, myId = sampGetPlayerIdByCharHandle(PLAYER_PED)
    local data = allocateMemory(68)
    sampStorePlayerOnfootData(myId, data)
    setStructElement(data, 36, 1, key, false)
    sampSendOnfootData(data)
    freeMemory(data)
end
В другом потоке сделай
 

HOG

Известный
48
16
как отправить себе русские символы вк, используя 5.4 метод?
 

CyberSuslik

Участник
88
12
Есть скрипт, действия которого происходят только при введении команды.

так вот, что более оптимальней юзать в таком скрипте в цикле while true do, wait(0) или wait(-1) ?
 

Falion

Новичок
3
0
Помогите, как сделать взаимодействие с игроком и что бы в чат сообщало, что Начал/закончил взаимодействовать с игроком

Lua:
script_name('Mafia') -- название скрипта
script_author('ThomasReward') -- автор скрипта

local tag = '[Mafia]' -- переменные
local main_color = 0xffffff
local main_color_text = "{5A90CE}"
local white_color = "{FFFFFF}"
local se = require 'lib.samp.events'
local sampev = require "lib.samp.events"
local vk = require 'vkeys'
require 'lib.moonloader'

function main() -- основная функция
    if not isSampfuncsLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
        sampRegisterChatCommand("selectt", dselect)
        sampRegisterChatCommand("menu", dialog)
        sampRegisterChatCommand("frisk", frisk) -- Обыск человека №1
        sampRegisterChatCommand("frisk1", frisk1) -- Обыск человека №2
        sampRegisterChatCommand("frisk3", frisk3) -- Обыск человека №4
        sampRegisterChatCommand("frisk2", frisk2) -- Обыск человека №3
      sampAddChatMessage("{FFFFFF}• {ff3821}[Mafia Helper] {FFFFFF}Script loaded | Author: {C0C0C0}vk.com/k.anthony", main_color)
      sampAddChatMessage("{FFFFFF}• {fded54}[Подсказка] {FFFFFF}Используйте {ff3821}/menu {FFFFFF}для запуска главного меню", main_color)
    while true do
        wait(0)
        local resultMain, buttonMain, listMain = sampHasDialogRespond(109)
        if resultMain == true then
            if buttonMain == 1 then
                if listMain == 0 then
                    sampShowDialog(1000, "{ff3821}[Mafia] {FFFFFF}Cписок команд", string.format("{ffffff}Команда \t{ffffff}Описание \n{ffbf00}/f \t{ffffff}Рация мафии \n{ffbf00}/fn \t{ffffff}OOC Рация мафии \n{ffbf00}/invite \t{ffffff}Принять в организацию \n{ffbf00}/uninvite \t{ffffff}Уволить из организации \n{ffbf00}/bizwar \t{ffffff}Забить стрелу за бизнес \n{ffbf00}/sellmafiabiz \t{ffffff}Продать права на крышевание бизнеса \n{ffbf00}/find \t{ffffff}Посмотреть онлайн организации \n{ffbf00}/place \t{ffffff}Занять поле на ферме \n{ffbf00}/selldrugs \t{ffffff}Продать наркотики \n{ffbf00}/givepatr \t{ffffff}Передать патроны \n{ffbf00}/giveguns \t{ffffff}Передать ед.оружия\n {ffbf00}/tie,/untie \t{ffffff}Связать/развязать игрока \n{ffbf00}/offphone \t{ffffff}Отобрать и выключить/включить телефон игрока \n{ffbf00}/bag,/unbag \t{ffffff}Надеть/снять мешок с игрока \n{ffbf00}/gag \t{ffffff}Заткнуть игрока \n{ffbf00}/object \t{ffffff}Поставить предмет \n{ffbf00}/offblack \t{ffffff}Добавить/удалить игрока в ЧС оффлайн \n{ffbf00}/blackinfo \t{ffffff}Проверить на нахождение в ЧС \n{ffbf00}/frisk \t{ffffff}Обыскать человека"), "ОК", "Выход", 5)
                end               
                if listMain == 1 then
                    sampShowDialog(1000, "{ff3821}[Mafia] {FFFFFF}Настройки", string.format("{ff3821}[1] {FFFFFF}Не найдено."), "OK", "Выход", 2)               
                end   
                if listMain == 2 then
                    sampShowDialog(1000, "{ff3821}[Mafia] {FFFFFF}Автор скрипта", string.format("{FFFFFF}Разработчик: {ffbf00}Thomas Reward \n{FFFFFF}VK - {ffbf00}vk.com/k.anthony \n{FFFFFF}Mail - {ffbf00}gattodesign@mail.ru"), "OK", "Выход", 0)
                end                   
            end
        end
    end
end

function dialog() -- диалог
    sampShowDialog(109, '{ff3821}[Mafia] {FFFFFF}Главная', string.format("{ff3821}[1] {FFFFFF}Помощь \n{ff3821}[2] {FFFFFF}Настройки \n{ff3821}[3] {FFFFFF}Автор скрипта"), "OK", "Выход", 2)
end

function frisk()
    sampSendChat("/me начал обыскивать карманы штанов человека сидящего напротив", -1)
    lua_thread.create(function() -- Создаем новый поток
        wait(2000) -- Ждём 5 секунд
        sampSendChat("/do Что находиться в кармане жертвы?", -1) -- Выводим текст в чат
        wait(2000)
        sampAddChatMessage("{fded54}[Подсказка] {FFFFFF}Если что-то есть, то пишите /frisk1 , если нет, то пишите /frisk2", main_color)
    end) -- Тут наш поток умирает :(
end
function frisk1()
    sampSendChat("/me изъял предметы и открыв окно, выкинул их", -1)
    lua_thread.create(function() -- создаём поток, без него никак
        wait(2000)
        sampSendChat("/me начал щупать жертву на обнаружение жучков", -1)
        wait(2000)
        sampSendChat("/do На теле жертвы имеются жучки?", -1)
        wait(2000)
        sampAddChatMessage("{fded54}[Подсказка] {FFFFFF}Если есть, то пишите /frisk3 , если нет, то пишите /frisk4", main_color)
    end)
end
function frisk2()
    sampSendChat("/me начал щупать жертву на обнаружение жучков", -1) -- обязательно ставить "-1" == если не ставить будут ошибки.
    lua_thread.create(function()
        wait(2000)
        sampSendChat("/do На теле жертвы имеются жучки?", -1)
        wait(2000)
        sampAddChatMessage("{fded54}[Подсказка] {FFFFFF}Если есть, то пишите /frisk3", main_color)
    end)
end
function frisk3()
    sampSendChat("/me отцепил жучок с жертвы, затем выкинул жучок на асфальт", -1)
end
 

kotov

Участник
128
12
Есть строка
Lua:
"*Любой текст*Nick_Name*Любой текст*"
Как мне сделать?
Lua:
"*Любой текст*Nick_Name[ID]*Любой текст*"
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,136
sampAddChatMessage("сообщение", - 1)
Кодировку Windows 1251
Здравствуйте, вы видимо не в курсе, что VK API принимает сообщения именно в кодировке UTF-8.
как отправить себе русские символы вк, используя 5.4 метод?
Либо подключать библиотеку encoding и переводить текст в UTF-8, либо слать сообщение в PHP скрипт и там переводить в UTF-8.