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

shizzard

Участник
150
7
1595432563134.png
как сделать так, что если бы содержимое комбо было равно другому комбо, то писало что-то
 

Hideme Flow

Известный
558
193
из моего скрипта
Lua:
-----------------------------------------------ПОДКЛЮЧЕНИЕ JSON-----------------------------------------------
local stats = {} -- пустой массив для создания файла, он же переменная с JSON
local configDir = getWorkingDirectory().."\\config\\DayStats.json"
jsoncfg = {
    save = function(data, path)
        if doesFileExist(path) then os.remove(path) end
        if type(data) ~= 'table' then return end
        local f = io.open(path, 'a+')
        local writing_data = encodeJson(data)
        f:write(writing_data)
        f:close()
    end,
    load = function(path)
        if doesFileExist(path) then
          local f = io.open(path, 'a+')
          local data = decodeJson(f:read('*a'))
          f:close()
          return data
        end
    end
}
if not doesDirectoryExist(getWorkingDirectory().."\\config") then createDirectory(getWorkingDirectory().."\\config") end
if not doesFileExist(configDir) then jsoncfg.save(stats, configDir) else stats = jsoncfg.load(configDir) end
-----------------------------------------------ПОДКЛЮЧЕНИЕ JSON-----------------------------------------------




--Там, где нужно сохранять данные
stats[date].champ3.score = stats[date].champ3.score + tonumber(score)
jsoncfg.save(stats, configDir)
[ML] (error) CaJlaT TOP: C:\Users\User\Desktop\zborka\moonloader\HotKeySave.lua:18: bad argument #1 to 'read' (invalid format)
помоги
 

nimblay

Участник
34
0
Как сделать так что при появлении на экране определенного текста(DisplayGameText) нажималась определенная кнопка
и еще почти тоже самое только с диалогом, при определенном id диалога нажимался например enter
 

sep

Известный
673
76
Lua:
memory = require 'memory'

local original = 0

function main()
    while not isSampAvailable() do wait(0) end
    while true do
        wait(0)
        if wasKeyPressed(0x23) then
            enableDialog(true)
            printString('Dialog Showed', 2000)
        elseif wasKeyPressed(0x24) then
            enableDialog(false)
            printString('Dialog Hided', 2000)
        end
    end
end

local function enableDialog(bool)
    memory.setint32(sampGetDialogInfoPtr()+40, bool and 1 or 0, true)
    sampToggleCursor(bool)
end
непашет
 

darkjer

Активный
134
68
code:
local memory = require 'memory'

local original = 0

function main()
    while not isSampAvailable() do wait(0) end
    while true do
        wait(0)
        if wasKeyPressed(0x23) then
            enableDialog(true)
            printString('Dialog Showed', 2000)
        elseif wasKeyPressed(0x24) then
            enableDialog(false)
            printString('Dialog Hided', 2000)
        end
    end
end

function enableDialog(bool)
    memory.setint32(sampGetDialogInfoPtr()+40, bool and 1 or 0, true)
    sampToggleCursor(bool)
end
 
  • Нравится
Реакции: sep

_Benya_

Участник
82
37
Как сделать так что при появлении на экране определенного текста(DisplayGameText) нажималась определенная кнопка
и еще почти тоже самое только с диалогом, при определенном id диалога нажимался например enter
Хуки на диалог и текст, как нажать кнопки думаю разберешься, в Wiki и на сайте все есть.

Lua:
local sampev = require "lib.samp.events" -- В начало скрипта.




function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
    if dialogId == 322 then
        -- код
    end
end


function sampev.onDisplayGameText(style, time, text)
    if text:find("текст") then
        -- код
    end
end
 

poofe

Известный
896
239
Помогите, уменя есть РВХ я когда добываю бронзу у меня сразу скрипт ломается и надо делть релог кто поможет? допишите мне тут код позязязя в чатик
 

4e6ypek51

Участник
41
2
Как сделать появление imgui.Button после активации чекбокса? Ну и соответственно пропадание её при деактивации
 

sep

Известный
673
76
Как сделать появление imgui.Button после активации чекбокса? Ну и соответственно пропадание её при деактивации
я новечок если что сильно не пинайте
код:
local dooom = imgui.ImBool(false)


  imgui.Checkbox(u8'111', dooom)
  if dooom.v then
  if imgui.Button(u8'ТЕКСТ') then
    lua_thread.create(function()
          sampSendChat('ТЕКСТ')
    end)
  end
end

если надо чтобы чекбокс сохранялся после перезахода тогда урок 7
 
Последнее редактирование:

trefa

Известный
Всефорумный модератор
2,097
1,233
я новечок если что сильно не пинайте
код:
local dooom = imgui.ImBool(false)


  imgui.Checkbox(u8'111', dooom)
  if dooom.v then
  if imgui.Button(u8'ТЕКСТ') then
    lua_thread.create(function()
          sampSendChat('ТЕКСТ')
    end)
  end
end

если надо чтобы чекбокс сохранялся после перезахода тогда урок 7
Зачем создавать поток? Ты же не юзаешь задержки.
 

sep

Известный
673
76
Зачем создавать поток? Ты же не юзаешь задержки.
тут тоже мне 0 задержка не нужна но без потока не пашет
код:
sampRegisterChatCommand('gan', function(param)
      lua_thread.create(function()
          wait(0)
          sampSetChatInputEnabled(true)
          sampSetChatInputText('/sellgun /selldrugs  /makegun 2 50')
      end)
  end)

+ я предупредил что я навечек
+ я привел пример кода вздруг ему надо будет задержку добавить
+ просил не бить меня сильно )
+ старался помочь человеку
+ спасибо тебе за то что ты меня поправил будут знать в дальнейшем как говарится сто лет учись ...
 
Последнее редактирование:

CaJlaT

Овощ
Модератор
2,809
2,623
тут тоже мне 0 задержка не нужна но без потока не пашет
код:
sampRegisterChatCommand('gan', function(param)
      lua_thread.create(function()
          wait(0)
          sampSetChatInputEnabled(true)
          sampSetChatInputText('/sellgun /selldrugs  /makegun 2 50')
      end)
  end)

+ я предупредил что я навечек
+ я привел пример кода вздруг ему надо будет задержку добавить
+ просил не бить меня сильно )
+ старался помочь человеку
+ спасибо тебе за то что ты меня поправил будут знать в дальнейшем как говарится сто лет учись ...
Тут без потока работать не будет, ибо нужна минимальная задержка, иначе функции вызываются моментально (после ввода команды чат не успеет закрыться, а ты его открываешь снова), поэтому тут и НУЖНА нулевая задержка
 
  • Нравится
Реакции: sep