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

NookieONE

Участник
128
1
Код:
script_name("_")
script_author("_")
script_dependencies("SAMPFUNCS")

require 'lib.sampfuncs'
require 'lib.sampfuncs'
local sampev = 'lib.samp.events'
local raknet = 'lib.samp.raknet'

xxStatus = false

    CMD('xxon',
    function()
        if xxStatus == false then
            xxStatus = true
            sampAddChatMessage(string.format("{F5DEB3} Punishment: {ffffff}Вкл.."), 0xFFFFFF)
        else
            sampAddChatMessage(string.format("{F5DEB3} Punishment: {ffffff}Выкл."), 0xFFFFFF)
        end
    end)
--------------------------------------------------------------------------------
    CMD('xxoff',
    function()
        if xxStatus == true then
            xxStatus = false
            sampAddChatMessage(string.format("{F5DEB3}Punishment: {ffffffВыкл."), 0xFFFFFF)
        else
            sampAddChatMessage(string.format("{F5DEB3}Punishment: {ffffff}Не вкл."), 0xFFFFFF)
        end
    end)

--------------------------------------------------------------------------------
end

function getDistanceToPlayer(playerPed, hendlePed)
    local X, Y, Z = getCharCoordinates(hendlePed)
    local x, y = convert3DCoordsToScreen(X, Y, Z)
    local myX, myY, myZ = getCharCoordinates(playerPed)
    local myx, myy = convert3DCoordsToScreen(myX, myY, myZ)
    local distance = getDistanceBetweenCoords3d(X, Y, Z, myX, myY, myZ)
  return distance
end

function sampev.onServerMessage(color, text)
    if xxStatus == true then
        if string.find(string.upper(text), '>> ПМ от') ~= nil and string.find(string.upper(text), 'xx') ~= nil then
            local playerId = string.match (text, '%((%d+)%)%:')
            if playerId ~= nil then
                sampAddChatMessage(string.format("{F5DEB3} Punishment: {ffffff}Игрок {F5DEB3}%s[%d]{ffffff} .",
sampGetPlayerNickname(playerId), playerId), 0xFFFFFF)
                sampSendChat(string.format('/ТУТ_БУДЕТ_КОМАНДА %s', playerId))
            end
        end
    end
end
 

inf

Известный
77
89
Код:
script_name("_")
script_author("_")
script_dependencies("SAMPFUNCS")

require 'lib.sampfuncs'
require 'lib.sampfuncs'
local sampev = 'lib.samp.events'
local raknet = 'lib.samp.raknet'

xxStatus = false

    CMD('xxon',
    function()
        if xxStatus == false then
            xxStatus = true
            sampAddChatMessage(string.format("{F5DEB3} Punishment: {ffffff}Вкл.."), 0xFFFFFF)
        else
            sampAddChatMessage(string.format("{F5DEB3} Punishment: {ffffff}Выкл."), 0xFFFFFF)
        end
    end)
--------------------------------------------------------------------------------
    CMD('xxoff',
    function()
        if xxStatus == true then
            xxStatus = false
            sampAddChatMessage(string.format("{F5DEB3}Punishment: {ffffffВыкл."), 0xFFFFFF)
        else
            sampAddChatMessage(string.format("{F5DEB3}Punishment: {ffffff}Не вкл."), 0xFFFFFF)
        end
    end)

--------------------------------------------------------------------------------
end

function getDistanceToPlayer(playerPed, hendlePed)
    local X, Y, Z = getCharCoordinates(hendlePed)
    local x, y = convert3DCoordsToScreen(X, Y, Z)
    local myX, myY, myZ = getCharCoordinates(playerPed)
    local myx, myy = convert3DCoordsToScreen(myX, myY, myZ)
    local distance = getDistanceBetweenCoords3d(X, Y, Z, myX, myY, myZ)
  return distance
end

function sampev.onServerMessage(color, text)
    if xxStatus == true then
        if string.find(string.upper(text), '>> ПМ от') ~= nil and string.find(string.upper(text), 'xx') ~= nil then
            local playerId = string.match (text, '%((%d+)%)%:')
            if playerId ~= nil then
                sampAddChatMessage(string.format("{F5DEB3} Punishment: {ffffff}Игрок {F5DEB3}%s[%d]{ffffff} .",
sampGetPlayerNickname(playerId), playerId), 0xFFFFFF)
                sampSendChat(string.format('/ТУТ_БУДЕТ_КОМАНДА %s', playerId))
            end
        end
    end
end
local sampev = require 'lib.samp.events'
string.find(string.upper(text), 'xx')
как он найдет строчные буквы в заглавных?
 
Последнее редактирование:

NookieONE

Участник
128
1
Код:
script_name("_")
script_author("_")
script_dependencies("SAMPFUNCS")

require 'lib.sampfuncs'
require 'lib.sampfuncs'
local sampev = 'lib.samp.events'
local raknet = 'lib.samp.raknet'

xxStatus = false

    CMD('xxon',
    function()
        if xxStatus == false then
            xxStatus = true
            sampAddChatMessage(string.format("{F5DEB3} Punishment: {ffffff}Вкл.."), 0xFFFFFF)
        else
            sampAddChatMessage(string.format("{F5DEB3} Punishment: {ffffff}Выкл."), 0xFFFFFF)
        end
    end)
--------------------------------------------------------------------------------
    CMD('xxoff',
    function()
        if xxStatus == true then
            xxStatus = false
            sampAddChatMessage(string.format("{F5DEB3}Punishment: {ffffffВыкл."), 0xFFFFFF)
        else
            sampAddChatMessage(string.format("{F5DEB3}Punishment: {ffffff}Не вкл."), 0xFFFFFF)
        end
    end)

--------------------------------------------------------------------------------
end

function getDistanceToPlayer(playerPed, hendlePed)
    local X, Y, Z = getCharCoordinates(hendlePed)
    local x, y = convert3DCoordsToScreen(X, Y, Z)
    local myX, myY, myZ = getCharCoordinates(playerPed)
    local myx, myy = convert3DCoordsToScreen(myX, myY, myZ)
    local distance = getDistanceBetweenCoords3d(X, Y, Z, myX, myY, myZ)
  return distance
end

function sampev.onServerMessage(color, text)
    if xxStatus == true then
        if string.find(string.upper(text), '>> ПМ от') ~= nil and string.find(string.upper(text), 'xx') ~= nil then
            local playerId = string.match (text, '%((%d+)%)%:')
            if playerId ~= nil then
                sampAddChatMessage(string.format("{F5DEB3} Punishment: {ffffff}Игрок {F5DEB3}%s[%d]{ffffff} .",
sampGetPlayerNickname(playerId), playerId), 0xFFFFFF)
                sampSendChat(string.format('/ТУТ_БУДЕТ_КОМАНДА %s', playerId))
            end
        end
    end
end


Возможно такое в CLEO написать?
 

NARVELL

Известный
71
10
sampSendDialogResponse() некорректно работает при использовании в диалогах 5-го стиля (имеющий колонки). Как выбрать пункт диалога не используя эту функцию или может как-то иначе её нужно использовать?
 

Dark_Knight

Me, me and me.
Друг
4,078
2,095
Никак. И все норм должен отправлять. Скорее всего, ты чет не правильно делаешь.
 

kraft1k

Вынь х*й из головы и все получится © hnnssy
Друг
1,480
1,168
sampSendDialogResponse() некорректно работает при использовании в диалогах 5-го стиля (имеющий колонки). Как выбрать пункт диалога не используя эту функцию или может как-то иначе её нужно использовать?
Ну прям самый х*ёвый варик, через эмуляцию...
 
  • Нравится
Реакции: Config

NARVELL

Известный
71
10
Ну прям самый х*ёвый варик, через эмуляцию...
setVirtualKeyDown() не работает в диалоге.

Никак. И все норм должен отправлять. Скорее всего, ты чет не правильно делаешь.
sampSendDialogResponse(22, 1, 40, "")
ID введён верно, строка в диалоге тоже, что тут может быть не правильно?

Давно заметил эту проблему, просто отказался от использования. А сейчас вот прям очень надо.
 

NARVELL

Известный
71
10

FYP

Известный
Автор темы
Администратор
1,763
5,906
setVirtualKeyDown() не работает в диалоге.


sampSendDialogResponse(22, 1, 40, "")
ID введён верно, строка в диалоге тоже, что тут может быть не правильно?

Давно заметил эту проблему, просто отказался от использования. А сейчас вот прям очень надо.
опкод не обновлялся с 0.3x, может быть пакет имеет дополнительные параметры. попробуй сначала sampSetCurrentDialogListItem(40) + sampCloseCurrentDialogWithButton(1), и если не поможет, то используя раклоггер отследи что отправляется при нажатии и отправляй rpc самостоятельно.
 
  • Нравится
Реакции: kraft1k

NARVELL

Известный
71
10
Данные серверные или локальные?
Серверные.

опкод не обновлялся с 0.3x, может быть пакет имеет дополнительные параметры. попробуй сначала sampSetCurrentDialogListItem(40) + sampCloseCurrentDialogWithButton(1), и если не поможет, то используя раклоггер отследи что отправляется при нажатии и отправляй rpc самостоятельно.
Попробую, спасибо.

UPD: sampSetCurrentDialogListItem(40) не работает в этом стиле.
 
Последнее редактирование: