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

ШPEK

Известный
1,476
525
Надо что бы из этого текста выводился никнейм:
Код:
Диспетчер: Игрок {ffffff}Nick_Name{EEFF55} нуждается в такси, его вызов отправлен в общую очередь.

Я просто хочу удостоверится, правильно ли я сделал:
Lua:
Диспетчер: Игрок {ffffff}%a+_%a+{EEFF55} нуждается в такси, его вызов отправлен в общую очередь.

UPD: чёт не пашет, ниже полный код.

Lua:
script_name("TRP TAXI HELPER")
script_author("subtilize!")

local sampev = require 'lib.samp.events'
local report = 'Докладывает - Энтони Кэннон: Принял вызов, отправляюсь к клиенту.'

function main()
    if not isSampLoaded() and not isSampfuncsLoaded then return end
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand("tcall", cmd_calltake)
end

function sampev.onServerMessage(color, text)
    if text:find('Диспетчер: Игрок {ffffff}%a+_%a+{EEFF55} нуждается в такси, его вызов отправлен в общую очередь.') and calltake then
        sampSendChat('/takecall')
        sampSendChat('/r' ..report)
    end
end

function cmd_calltake(param)
    calltake = not calltake
    if calltake then
        printStringNow("TaxiHelper: active!", 1000)
    else
        printStringNow("TaxiHelper: not active!", 1000)
    end
end
Код:
Диспетчер:%sИгрок%s(%a+)_(%a+)%sнуждается%sв%sтакси,%sего%sвызов%sотправлен%sв%sобщую%sочередь.
p.s html коды при использовании хука не нужны. Html коды заменяет переменная color
Еще ты используешь text:find при этом используя регулярки, используй text:match
Достать ник можно так
Lua:
local name, surname = text:match("Диспетчер:%sИгрок%s(%a+)_(%a+)%sнуждается%sв%sтакси,%sего%sвызов%sотправлен%sв%sобщую%sочередь.")
Скобки используются чтобы брать инфу из текста в text:match
 
Последнее редактирование:

ШPEK

Известный
1,476
525
Ребята такой вопрос, я просто 0 можно сказать, помогите!
Короче, не работают Луа скрипты.
Куда надо закидать луа скрипты, именно в moonloader или moonloader/lib/?
Папка moonloader

Так что ли?

Lua:
script_name("TRP TAXI HELPER")
script_author("subtilize!")

local sampev = require 'lib.samp.events'
local report = 'Докладывает - Энтони Кэннон: Принял вызов, отправляюсь к клиенту.'

function main()
    if not isSampLoaded() and not isSampfuncsLoaded then return end
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand("tcall", cmd_calltake)
end

function sampev.onServerMessage(color, text)
    if calltake then
        if text:find('Диспетчер:%sИгрок%s(%a+)_(%a+)%sнуждается%sв%sтакси,%sего%sвызов%sотправлен%sв%sобщую%sочередь.') then
            sampSendChat('/takecall')
            sampSendChat('/r' ..report)
            return false
        end
    end
end

function cmd_calltake(param)
    calltake = not calltake
    if calltake then
        printStringNow("TaxiHelper: active!", 1000)
    else
        printStringNow("TaxiHelper: not active!", 1000)
    end
end
text:find замени на text:match
 
Последнее редактирование модератором:

tlwsn

Известный
537
85
Lua:
function main()
while not isSampAvailable() do wait(1000) end
 sampRegisterChatCommand('acapt', acapt)
while true do wait(0)
        if acapt then
            sampSendChat('/capture')
            wait(450)
        end
    end
end

function acapt()
    acapt = not acapt
end
чего за фигня тут? при запуске срипта сразу начинает флудить /capture
 

tlwsn

Известный
537
85
Lua:
function main()
    while not isSampAvailable() do wait(1000) end
    sampRegisterChatCommand('acapt', acapt)
    while true do wait(0) -- бесконечный цикл, поэтому и спамит
        if acapt then
            sampSendChat('/capture')
            wait(450)
            acapt = false -- просто надо де-активирвовать эту переменную и беск. цикл завершится
        end
    end
end
может я не правильно выразился, мне нужно что бы флудило, но только после активации команды. При том коде только скрипт запускаю сразу флудит/capture
 

ШPEK

Известный
1,476
525
может я не правильно выразился, мне нужно что бы флудило, но только после активации команды. При том коде только скрипт запускаю сразу флудит/capture
Lua:
local acapt = false

function main()
while not isSampAvailable() do wait(1000) end
sampRegisterChatCommand('acapt', acapt)
while true do wait(0)
        if acapt then
            sampSendChat('/capture')
            wait(450)
        end
    end
end

function acapt()
    acapt = not acapt
end

Помогайте, СКРИПТ: roleplay_guns
Помогайте, СКРИПТ: roleplay_guns
Помогайте, СКРИПТ: roleplay_guns
Помогайте, СКРИПТ: roleplay_guns
Помогайте, СКРИПТ: roleplay_guns




[16:21:18.775339] (system) Session started.
[16:21:18.775339] (debug) Module handle: 65270000

MoonLoader v.023-beta loaded.
Developers: FYP, hnnssy, EvgeN 1137

Copyright (c) 2016, BlastHack Team
Избранное - Lua - ASI - MoonLoader(https://www.blast.hk/moonloader/)

[16:21:18.775339] (info) Working directory: F:\sexygta\moonloader
[16:21:18.775339] (debug) FP Control: 800C001F
[16:21:18.775339] (system) Installing pre-game hooks...
[16:21:18.776340] (system) Hooks installed.
[16:21:23.296598] (debug) Initializing opcode handler table
[16:21:23.296598] (debug) package.path = .\?.lua;F:\sexygta\moonloader\lib\?.lua;F:\sexygta\moonloader\lib\?\init.lua;F:\sexygta\moonloader\?.lua;F:\sexygta\moonloader\?\init.lua;.\?.luac;F:\sexygta\moonloader\lib\?.luac;F:\sexygta\moonloader\lib\?\init.luac;F:\sexygta\moonloader\?.luac;F:\sexygta\moonloader\?\init.luac
[16:21:23.296598] (debug) package.cpath = F:\sexygta\moonloader\lib\?.dll;
[16:21:23.296598] (system) Loading script 'F:\sexygta\moonloader\deddosouru c-bug.luac'...
[16:21:23.297598] (debug) New script: 01AB7C34
[16:21:23.313599] (system) LEGAL C-BUG: Loaded successfully.
[16:21:23.313599] (system) Loading script 'F:\sexygta\moonloader\roleplay_guns.lua'...
[16:21:23.314599] (debug) New script: 01AC63DC
[16:21:23.326600] (system) roleplay_guns.lua: Script terminated. (01AC63DC)
[16:21:23.326600] (error) F:\sexygta\moonloader\roleplay_guns.lua:5: module 'encoding' not found:
no field package.preload['encoding']
no file '.\encoding.lua'
no file 'F:\sexygta\moonloader\lib\encoding.lua'
no file 'F:\sexygta\moonloader\lib\encoding\init.lua'
no file 'F:\sexygta\moonloader\encoding.lua'
no file 'F:\sexygta\moonloader\encoding\init.lua'
no file '.\encoding.luac'
no file 'F:\sexygta\moonloader\lib\encoding.luac'
no file 'F:\sexygta\moonloader\lib\encoding\init.luac'
no file 'F:\sexygta\moonloader\encoding.luac'
no file 'F:\sexygta\moonloader\encoding\init.luac'
no file 'F:\sexygta\moonloader\lib\encoding.dll'
[16:21:50.198137] (system) Installing post-load hooks...
[16:21:50.199137] (system) Hooks installed.
[16:26:15.612318] (system) Unloading...
[16:26:15.613318] (system) LEGAL C-BUG: Script terminated. (01AB7C34)
[16:26:15.675321] (system) Session terminated.




Помогайте, СКРИПТ: roleplay_guns
Помогайте, СКРИПТ: roleplay_guns
Помогайте, СКРИПТ: roleplay_guns
Помогайте, СКРИПТ: roleplay_guns
Помогайте, СКРИПТ: roleplay_guns
Ошибка в самом скрипте
 
Последнее редактирование модератором:

ШPEK

Известный
1,476
525
Как сделать что если в чате сообщение (ник всегда разный):
Код:
Диспетчер: Игрок {ffffff}Nikita_Mamkin{EEFF55} нуждается в такси, его вызов отправлен в общую очередь.
То...
Lua:
require "lib.moonloader"
local ev = require "samp.events"

function main()
  wait(-1)
end

function ev.onServerMessage(color, text)
  if text:match("Диспетчер:%sИгрок%s%a+_%a+%sнуждается%sв%sтакси,%sего%sвызов%sотправлен%sв%sобщую%sочередь.") then
-- code
end
end
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,650
2,534
Я не шарик, но это не пашет.
Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
  if text:find('Диспетчер: Игрок %{ffffff%}%a+_%a+{%EEFF55%} нуждается в такси, его вызов отправлен в общую очередь.') then
    --code
  end
end
SAMP.Lua ещё скачай