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

Rice.

Известный
Модератор
1,758
1,712
imgui.Begin("Name", main_window_state)
/a дублирует действия, можно сразу виндов = нот виндов


Можно как-то изменить размер imgui.Begin, например, нажатием на кнопку?
Lua:
local size = 0

--imgui
function imgui.OnDrawFrame()
    if size == 1 then imgui.SetNextWindowSize(imgui.ImVec2(500, 500), imgui.Cond.Always) end
    if size == 0 then imgui.SetNextWindowSize(imgui.ImVec2(200, 200), imgui.Cond.Always) end
    imgui.Begin('Test')
    if imgui.Button('Size big') then size = 1 end
    if imgui.Button('Size small') then size = 0 end
    imgui.End()
end
 
  • Нравится
Реакции: YourAssistant

b1coo

Участник
56
18
Подскажите код для создания визуальной GangZone для себя
Код:
require "lib.moonloader" -- подключение библиотеки
local sampev = require 'lib.samp.events' -- подключение евент
function main()
 if not isSampLoaded() or not isSampfuncsLoaded() then return end
 while not isSampAvailable() do wait(100) end
 -- бесконечная работа при запущенном сампе
function sampev.CreateGangZone(zoneId, squareStart, squareEnd, color)
 GangZoneCreate(80, 739.5, 180, 839.5, 0xFF0000FF)
 sampAddChatMessage(zoneId, color)
 sampAddChatMessage(squareStart, color)
 sampAddChatMessage(squareEnd, color)
 sampAddChatMessage(color, color)
 end
end
Пробую разные варианты, "GangZoneCreate" ничего не происходит
 

Dmitriy Makarov

25.05.2021
Проверенный
2,512
1,139
Подскажите код для создания визуальной GangZone для себя
Код:
require "lib.moonloader" -- подключение библиотеки
local sampev = require 'lib.samp.events' -- подключение евент
function main()
 if not isSampLoaded() or not isSampfuncsLoaded() then return end
 while not isSampAvailable() do wait(100) end
 -- бесконечная работа при запущенном сампе
function sampev.CreateGangZone(zoneId, squareStart, squareEnd, color)
 GangZoneCreate(80, 739.5, 180, 839.5, 0xFF0000FF)
 sampAddChatMessage(zoneId, color)
 sampAddChatMessage(squareStart, color)
 sampAddChatMessage(squareEnd, color)
 sampAddChatMessage(color, color)
 end
end
Пробую разные варианты, "GangZoneCreate" ничего не происходит
Когда-то для себя делал МО Хелпер. Код остался. Держи.
48d.jpg

Lua:
-- В начало куда-то
local gang_zones = {
    {1000, -1523, 358, -1486, 460, 0x50511919}, -- ID, left, up, right, down, color (ид, коорды каждых углов прямоугольника и цвет его)
    {1001, -1573, 283, -1469, 359, 0x50511919},
    {1002, -1554, 461, -1501, 501, 0x50511919},
    {1003, -1468, 482, -1243, 517, 0x50511919},
}

-- main
for i = 1, #gang_zones do
    addGangZone(gang_zones[i][1], gang_zones[i][2], gang_zones[i][3], gang_zones[i][4], gang_zones[i][5], gang_zones[i][6])
end

-- Отдельно. Это я у Xavier'a Adamson'a взял. Хз откуда он взял.
function addGangZone(id, left, up, right, down, color) -- Создание ганг-зоны.
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt16(bs, id)
    raknetBitStreamWriteFloat(bs, left)
    raknetBitStreamWriteFloat(bs, up)
    raknetBitStreamWriteFloat(bs, right)
    raknetBitStreamWriteFloat(bs, down)
    raknetBitStreamWriteInt32(bs, color)
    raknetEmulRpcReceiveBitStream(108, bs)
    raknetDeleteBitStream(bs)
end

function removeGangZone(id) -- Удаление ганг-зоны по ID (первый аргумент функции выше)
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt16(bs, id)
    raknetEmulRpcReceiveBitStream(120, bs)
    raknetDeleteBitStream(bs)
end
 
  • Нравится
Реакции: iEramur

sep

Известный
714
79
как запретить воспроизводить нужную анимацию полностью (анимацию курения)
и yкак узнать что эта за анимка ? название итд
ИМЕННО НЕ СБИВ АНИМАЦИИ А ПОЛНЫЙ ЗАПРЕТ НА ВОИСПРОИЗВЕДЕНИЕ АНИМАЦИИ
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,228
12,635
и yкак узнать что эта за анимка ? название итд
1643402035917.png

в коде перепутал рендер IFP и NAME (например на скрине на самом деле IFP = PED и NAME = JUMP_GLIDE)
Lua:
local font = renderCreateFont('Trebuchet MS', 10, 5)

function main()
    while not isSampAvailable() do wait(0) end
      
    while true do
        wait(0)
        local animId = sampGetPlayerAnimationId(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))
        local animName, animIfp = sampGetAnimationNameAndFile(animId)
        renderFontDrawText(font, '[ANIM] ID: '..animId..', IFP: '..animIfp..', NAME: '..animName, 700, 600, 0xFFFFFFFF, 0x90000000)
    end
end
Запрет:
Lua:
local sampev = require 'lib.samp.events'

function sampev.onApplyPlayerAnimation(playerId, IFP, NAME, frameDelta, loop, lockX, lockY, freeze, time)
    if playerId == select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)) then
        if IFP == 'НАЗВАНИЕ IFP' and NAME == 'НАЗВАНИЕ NAME' then
            return false
        end
    end
end
 
Последнее редактирование:
  • Нравится
Реакции: sep

sep

Известный
714
79
Посмотреть вложение 133842
в коде перепутал рендер IFP и NAME (например на скрине на самом деле IFP = PED и NAME = JUMP_GLIDE)
Lua:
local font = renderCreateFont('Trebuchet MS', 10, 5)

function main()
    while not isSampAvailable() do wait(0) end
   
    while true do
        wait(0)
        local animId = sampGetPlayerAnimationId(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))
        local animName, animIfp = sampGetAnimationNameAndFile(animId)
        renderFontDrawText(font, '[ANIM] ID: '..animId..', IFP: '..animIfp..', NAME: '..animName, 700, 600, 0xFFFFFFFF, 0x90000000)
    end
end
Запрет:
Lua:
local sampev = require 'lib.samp.events'

function sampev.onApplyPlayerAnimation(playerId, IFP, NAME, frameDelta, loop, lockX, lockY, freeze, time)
    if playerId == select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)) then
        if IFP == 'НАЗВАНИЕ IFP' and NAME == 'НАЗВАНИЕ NAME' then
            return false
        end
    end
end
я понимаю тут незя писать слОва типо спасибо итд НО ОЧЕНЬ ХОЧИТСЯ СПАСИБО + лайк 👍!!!!!
ps:модеры простите меня
 

Kegwineye.

Участник
478
21
Какая функция в ImGui отвечает за вертикальную линию?(Как imgui.Separator() только вверх)
 

DeKzer

Известный
515
222
Можно-ли как-то изменить полученные координаты? Допустим, я получил коорды своего педа, и мне надо к z плюсануть еще какое-то число
 

Kegwineye.

Участник
478
21
как сделать поиск сообщения ? Например {FFFF00}[Жалоба] и чтобы в чат вывадилась команда /ot ?
 

Dmitriy Makarov

25.05.2021
Проверенный
2,512
1,139
Какая функция в ImGui отвечает за вертикальную линию?(Как imgui.Separator() только вверх)

как сделать поиск сообщения ? Например {FFFF00}[Жалоба] и чтобы в чат вывадилась команда /ot ?
Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
    if text:find("{FFFF00}%[Жалоба%]") then -- Перед такими символами: ( ) . % + - * ? [ ] ^ $ - Всегда ставится %.
        lua_thread.create(function() wait(50)
            sampSendChat("/ot")
        end)
    end
end
 
  • Нравится
Реакции: Kegwineye.