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

Kosatik

Участник
113
20
Вопрос как сделать так чтобы человек сам выходил спустя 1 минуту с кара. И потом сам садился автоматом?
 

monolith04

Известный
71
6
В общем, сделал вот окно (см. скрин в спойлере), при нажатии на эти строчки слева, справа должен появляться другой текст/кнопка, НО, нажав на первую строчку (текст появился) перестают работать все следующие. Если с конца по порядку нажимать то работает, но в обратном порядке уже не будет работать. Почему так? Как это исправить?
sa-mp-078.png
Lua:
if organisations.v then
    imgui.SetNextWindowSize(imgui.ImVec2(630,500), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(fa.ICON_COG..u8' Настройки организаций', organisations, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)
    imgui.BeginChild("OrgSetList", imgui.ImVec2(210, 155), true)
      imgui.Columns(1, 'OrgSetList')
      if imgui.Selectable(u8'Общие', false) then common = true end
      if imgui.Selectable(u8'Министерство обороны', false) then orgmo = true end
      if imgui.Selectable(u8'Министерство здравоохранения', false) then health = true end
      if imgui.Selectable(u8'Министерство внутренних дел', false) then pd = true end
      if imgui.Selectable(u8'Средства массовой информации', false) then tv = true end
      if imgui.Selectable(u8'Правительство', false) then gov = true end
    imgui.EndChild()
    imgui.SameLine()
    imgui.BeginChild('OrgSet', imgui.ImVec2(0, 0), false)
    if common then
      imgui.Text('text1')
    elseif orgmo then
      imgui.Text('text2')
    elseif health then
      imgui.Button('button1')
    end
    imgui.EndChild()
    imgui.End()
  end
 

Kosatik

Участник
113
20
В общем, сделал вот окно (см. скрин в спойлере), при нажатии на эти строчки слева, справа должен появляться другой текст/кнопка, НО, нажав на первую строчку (текст появился) перестают работать все следующие. Если с конца по порядку нажимать то работает, но в обратном порядке уже не будет работать. Почему так? Как это исправить?
Lua:
if organisations.v then
    imgui.SetNextWindowSize(imgui.ImVec2(630,500), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(fa.ICON_COG..u8' Настройки организаций', organisations, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)
    imgui.BeginChild("OrgSetList", imgui.ImVec2(210, 155), true)
      imgui.Columns(1, 'OrgSetList')
      if imgui.Selectable(u8'Общие', false) then common = true end
      if imgui.Selectable(u8'Министерство обороны', false) then orgmo = true end
      if imgui.Selectable(u8'Министерство здравоохранения', false) then health = true end
      if imgui.Selectable(u8'Министерство внутренних дел', false) then pd = true end
      if imgui.Selectable(u8'Средства массовой информации', false) then tv = true end
      if imgui.Selectable(u8'Правительство', false) then gov = true end
    imgui.EndChild()
    imgui.SameLine()
    imgui.BeginChild('OrgSet', imgui.ImVec2(0, 0), false)
    if common then
      imgui.Text('text1')
    elseif orgmo then
      imgui.Text('text2')
    elseif health then
      imgui.Button('button1')
    end
    imgui.EndChild()
    imgui.End()
  end
Кинь полный код посмотрим что
 

Eugene Crabs

Активный
544
30
Ребят, пытаюсь подгрузить Lua Bridge на C++. Выдает следующую ошибку: "Lua headers must be included prior to LuaBridge ones". В чем может быть проблема и как её решить?
 

earthlord

Известный
135
34
Ребят, пытаюсь подгрузить Lua Bridge на C++. Выдает следующую ошибку: "Lua headers must be included prior to LuaBridge ones". В чем может быть проблема и как её решить?
покажи часть кода на плюсах где подключаешь хэдеры
 
  • Нравится
Реакции: Eugene Crabs

Eugene Crabs

Активный
544
30
покажи часть кода на плюсах где подключаешь хэдеры
Код:
#include "MyForm.h"
#include <Windows.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <LuaBridge.h>

p.s. Visual Studio 2019. Жалуется на то, что не может считать/найти (так и не понял) файл. Путь, который указан в LuaBridge: "<LuaBridge/detail/*Название*.h>
 

earthlord

Известный
135
34
Код:
#include "MyForm.h"
#include <Windows.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <LuaBridge.h>

p.s. Visual Studio 2019. Жалуется на то, что не может считать/найти (так и не понял) файл. Путь, который указан в LuaBridge: "<LuaBridge/detail/*Название*.h>
попробуй в начало файла LuaHelpers.h добавить
C++:
extern "C" {
# include "lua.h"
# include "lauxlib.h"
# include "lualib.h"
}
 
  • Нравится
Реакции: Eugene Crabs

Eugene Crabs

Активный
544
30
попробуй в начало файла LuaHelpers.h добавить
C++:
extern "C" {
# include "lua.h"
# include "lauxlib.h"
# include "lualib.h"
}
При добавлении в начало - ругается на табуляцию в LuaHelpers. После подгрузки lua библиотек - не ругается, но я не знаю, что с этим делать. Замена строчек на extern убрала ошибку, о которой я спрашивал, но скрипт все еще продолжает ругаться на "не удается открыть источник файл "LuaBridge/detail/*Название*.h""
 

Kosatik

Участник
113
20
Помогите захотел сделать тест аймгу и такая ошибка когда сделал



(error) testik.lua: ...SI\Pictures\morty winter medium pc\moonloader\testik.lua:9: '=' expected near 'not'
[ML] (error) testik.lua: Script died due to an error. (0BE42D2C)
 

Eugene Crabs

Активный
544
30
Помогите захотел сделать тест аймгу и такая ошибка когда сделал



(error) testik.lua: ...SI\Pictures\morty winter medium pc\moonloader\testik.lua:9: '=' expected near 'not'
[ML] (error) testik.lua: Script died due to an error. (0BE42D2C)
Проверь табуляцию в 9 строке

Как получить ники всех игроков в стриме?
Самое простое - брать массив с хэндлами всех персонажей и по хэндлу узнавать ник
 
  • Bug
Реакции: danywa

Pashyka

Участник
220
17
Помогите пожалуйста с закрытием диалога, дело в том, что после нахождения текста нужно закрыть диалог...
Lua:
if text:find("Вы получили $2100") and not text:find("говорит") and not text:find("- |") and not text:find("Тел.") and not text:find("News") and lovla == true or text:find("Вы получили $5500") and not text:find("говорит") and not text:find("- |") and not text:find("Тел.") and not text:find("News") and lovla == true then
        if sampIsDialogActive() then -- если активен какой-то диалог, то продолжаем
            did = sampGetCurrentDialogId() -- Получаем ID текущего диалога
            if did == 556 then
                sampSendDialogResponse(556,1,0)
                sampCloseCurrentDialogWithButton(0)
                return false
            end
        end
        lua_thread.create(function()
            lovla = false
            wait(10000)
            lovla = true
            sampAddChatMessage("Ловля активна снова", 0x00FF00)
        end)
    end