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

MLycoris

На вид оружие массового семяизвержения
Проверенный
1,976
2,213
Как в имгуи сделать так, чтобы чайлд не имел закруглений справа, а только слева?
скрыть границы чайлда и на их месте отрисовывать через дравлист
 

fibagr123

Известный
20
2
я уже чекал, но это не совсем то, что мне нужно. Там главный файл находится в директории moonloader, то есть спокойно подгружается сампом, а уже потом сам запускает все другие скрипты. Я же хочу, чтобы сам главный файл находился в папке, которая будет находиться в moonloader
 

chromiusj

модерирую шмодерирую
Модератор
5,964
4,294
я уже чекал, но это не совсем то, что мне нужно. Там главный файл находится в директории moonloader, то есть спокойно подгружается сампом, а уже потом сам запускает все другие скрипты. Я же хочу, чтобы сам главный файл находился в папке, которая будет находиться в moonloader
как пример(к сожалению не мог вспомнить примеры скриптов без обфусов, но с аналогичным подходом
 

qdIbp

Автор темы
Проверенный
1,447
1,195
Hello, how can I remove / disable the Damage Anims?

I'm trying to use this function but it's not enough.

setCharProofs(playerPed, false, false, false, true, false)
As an option
Lua:
local samp = require('lib.samp.events')

function samp.onSendGiveDamage(id, damage, gunId, bodypart)
    if id ~= 65535 then
        setCharHealth(playerPed, 100) -- instead of 100, some kind of hp counter
    end
end

There is a chance kick
 

Modsgs12345

Новичок
1
0
Я умею писать на пайтоне и с++. Друг мне скинул код на языке луа для отправки личных сообщений игрокам в игре Blockman Go. Я хотел изучить его с помощью информации в интернете и сделать тоже самое в пайтоне, но застрял на третьей строке кода. Можете объяснить что это или скинуть ресурсы где можно про это почитать поизучать.
GMItem["^FF00FF 089(русЯз)/^FF00FFЛсЛюбому"] = function(self)
for userIDD = 56644079, 56644079, 16 do
CGame.instance:getShellInterface():onSendMessage(Define.privateMessageType.inviteMsg, userIDD)
end
end
 
  • Клоун
Реакции: qdIbp

Samirca

Активный
217
28
1722080410264.png

Есть ли скрипт который убирает эту фигню?
 

ARMOR

Я креветка
Модератор
5,067
7,374
Посмотреть вложение 247694
Есть ли скрипт который убирает эту фигню?
Для R1
Lua:
function enableClassSelection(bValue) -- 1 или 0, true/false не подойдёт
    local pClassSelection = memory.getuint32(samp + 0x21A18C, true)
    memory.setint8(pClassSelection + 0x13, bValue, true)
end

Пример кода:
Lua:
local memory = require('memory')
local samp = getModuleHandle("samp.dll")
local bEnable = true;
function enableClassSelection(bValue)
    local pClassSelection = memory.getuint32(samp + 0x21A18C, true)
    memory.setint8(pClassSelection + 0x13, bValue, true)
end
function main()
    while not isSampAvailable() do wait(0) end
    while true do
        wait(0)
        if wasKeyPressed(49) then
            bEnable = not bEnable
            enableClassSelection(bEnable and 1 or 0)
        end
    end 
end
 

chromiusj

модерирую шмодерирую
Модератор
5,964
4,294
Если я хочу написать скрипт и выложить его, то как сделать код закрытым в .luac формате?
 
  • Нравится
Реакции: Samirca

fibagr123

Известный
20
2
imgui addon hotkey не дает зарегать бинд через лкм или пкм, а обычные клавиши a-z и 0-9 только по одной. Парный бинд получается только с шифтом, альтом и контролом.
Lua:
local binder = {
    {text = imgui.ImBuffer('first', 256), state = imgui.ImBool(false), keys = {v = {VK_RBUTTON, VK_1}}},
    {text = imgui.ImBuffer('second', 256), state = imgui.ImBool(false), keys = {v = {VK_RBUTTON, VK_2}}},
    {text = imgui.ImBuffer('third', 256), state = imgui.ImBool(false), keys = {v = {VK_RBUTTON, VK_3}}}
}
local tLastKeys = {}

-- main()
for i = 1, #binder do
        binder[i].bind = rkeys.registerHotKey(binder[i].keys.v, true, function ()
            sampAddChatMessage(binder[i].text.v, -1)
        end)
    end
-- OnDramFrame()
for i = 1, #binder do
            if binder[i] then
                imgui.ToggleButton('##toggleBinder' .. i, binder[i].state)
                imgui.SameLine()
                imgui.PushItemWidth(400)
                imgui.InputText('##test' .. i, binder[i].text)
                imgui.PopItemWidth()
                imgui.SameLine()
                if imgui.HotKey('##' .. i, binder[i].keys, tLastKeys, 100) then
                    rkeys.changeHotKey(binder[i].bind, binder[i].keys.v)
                end
                imgui.SameLine()
                if imgui.Button(u8'Удалить' .. '##' .. i) and #binder > 1 then
                    table.remove(binder, i)
                end
            end
        end
 

qdIbp

Автор темы
Проверенный
1,447
1,195
imgui addon hotkey не дает зарегать бинд через лкм или пкм, а обычные клавиши a-z и 0-9 только по одной. Парный бинд получается только с шифтом, альтом и контролом.
Lua:
local binder = {
    {text = imgui.ImBuffer('first', 256), state = imgui.ImBool(false), keys = {v = {VK_RBUTTON, VK_1}}},
    {text = imgui.ImBuffer('second', 256), state = imgui.ImBool(false), keys = {v = {VK_RBUTTON, VK_2}}},
    {text = imgui.ImBuffer('third', 256), state = imgui.ImBool(false), keys = {v = {VK_RBUTTON, VK_3}}}
}
local tLastKeys = {}

-- main()
for i = 1, #binder do
        binder[i].bind = rkeys.registerHotKey(binder[i].keys.v, true, function ()
            sampAddChatMessage(binder[i].text.v, -1)
        end)
    end
-- OnDramFrame()
for i = 1, #binder do
            if binder[i] then
                imgui.ToggleButton('##toggleBinder' .. i, binder[i].state)
                imgui.SameLine()
                imgui.PushItemWidth(400)
                imgui.InputText('##test' .. i, binder[i].text)
                imgui.PopItemWidth()
                imgui.SameLine()
                if imgui.HotKey('##' .. i, binder[i].keys, tLastKeys, 100) then
                    rkeys.changeHotKey(binder[i].bind, binder[i].keys.v)
                end
                imgui.SameLine()
                if imgui.Button(u8'Удалить' .. '##' .. i) and #binder > 1 then
                    table.remove(binder, i)
                end
            end
        end
попробуй
 

fibagr123

Известный
20
2
попробуй
Проблемы именно в регистрации, а не использование. Если первой клавишей является a-z 0-9, то сразу происходит регистрации без возможности добавления второй клавиши

попробуй
Написал разрабу, оказалось это так и должно быть
 
Последнее редактирование:
  • Вау
Реакции: qdIbp

everlight

Известный
288
55
How could I adjust the script I have? it should show a FOR SALE house, when it is for sale, it should just show TRACER until this model mark, when driving the car between houses, it should show which house is for sale and which house has FOR SALE on the roof.
Wu0gwqL.png



Lua:
require 'lib.moonloader'
pcall(require, 'sflua')

local text-size = 11
local font = renderCreateFont("arial black", textsize)

function main()
 while not isSampAvailable() do
 waiting(0)
 end

 while true do
 waiting(0)

 for i = 1, 1000 do
 local obj = sampGetObjectHandleBySampId(i)
 if doesObjectExist(obj) then
 local res, x, y, z = getObjectCoordinates(obj)
 if res then
 local objmodel = getObjectModel(obj)
 if objmodel == 19470 then
 local px, py, pz = getCharCoordinates(PLAYER_PED)
 local rad = getDistanceBetweenCoords3d(px, py, pz, x, y, z)
 if rad <= 1000 then
 local onScreen, cx, cy = convert3DCoordsToScreen(x, y, z)
 if onScreen then
 renderFontDrawText(font, "{FF0000}FOR SALE", cx, cy, 0xFFBEBEBE)
 end
 end
 end
 end
 end
 end
 end
end

19470 model ID > model ID is in my LUA but it doesnt show up text on my screen when im nearby to house who has FOR SALE thing on roof.