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

tropical5466

Известный
28
20
Как сделать скриншот? И можно ли его сохранить в определённую папку?
Код:
local ffi = require 'ffi'
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then
        return
    end
    while not isSampAvailable() do
        wait(100)
    end
   
    while true do
        if(wasKeyPressed(key.VK_F2)) then
            screen()
        end
    end
end

function screen()
    local rwcam = ffi.cast("void* *", 0xB6F97C)
    local TakeScreenshot = ffi.cast("void(__cdecl*)(void *, const char*)", 0x5D0820) -- TakeScreenshot()
    local p = "moonloader\\screens\\" .. os.date("%d.%m.%Y %H.%M.%S.png")
    TakeScreenshot(rwcam, p)
end
 
  • Нравится
  • Влюблен
Реакции: Fellespe. и RTD

DeMoN3D

Известный
366
77
Приветствую всех. У меня есть вот такой вот код, сразу скажу, что писал его не я:
Lua:
-- Библиотеки
require "lib.moonloader"
require "lib.sampfuncs"
local hook = require('lib.samp.events')

local jb = nil
local id = nil
local activ = false

function main()
    while not isSampfuncsLoaded() or not isSampLoaded() do wait(1000) end
    while not isSampAvailable() do wait(5000) end
    sampRegisterChatCommand('rep', cmd_rep)
   
    wait(-1)
end

 function cmd_rep(param)
        jb = param
        sampProcessChatInput('/mn')
        activ = true
    end
   
function hook.onShowDialog(id, style, title, btn, btn, text)
    if activ then
        if title:find('Меню игрока') then
            sampSendDialogResponse(id, 1, 4, nil)
            return false
        end
        if title:find('Связь с') then
            sampSendDialogResponse(id, 1, nil, id..','.. jb)
            activ = false
            return false
        end
    end
end

Задумка такая: При вводе в чат "/rep Привет, админы" скрипт должен сам вводить команду "/mn" (меню на адвансе) переходить к пятой строчке вниз, открывать эту строчку, затем там появляется другой диалог, в который скрипт должен вписать всё, что было после "/rep " и отправить админам.
Но используя вышеуказанный код, при вводе /rep в чат, хоть просто "/rep" хоть "/rep Привет213" игра просто зависает.
В moonloader.log ничего нет, никаких ошибок, варнингов, ничего.
Надеюсь вы мне поможете, заранее спасибо.
 

asocial demon

Потрачен
175
14
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Кто может скинуть любой код на отправку или эмуляцию отправки RPC, вообще не понял как его заполнять :с
Надеюсь на понимание
 

ШPEK

Известный
1,474
525
Кто может скинуть любой код на отправку или эмуляцию отправки RPC, вообще не понял как его заполнять :с
Надеюсь на понимание
В полезных функциях есть

Приветствую всех. У меня есть вот такой вот код, сразу скажу, что писал его не я:
Lua:
-- Библиотеки
require "lib.moonloader"
require "lib.sampfuncs"
local hook = require('lib.samp.events')

local jb = nil
local id = nil
local activ = false

function main()
    while not isSampfuncsLoaded() or not isSampLoaded() do wait(1000) end
    while not isSampAvailable() do wait(5000) end
    sampRegisterChatCommand('rep', cmd_rep)
  
    wait(-1)
end

 function cmd_rep(param)
        jb = param
        sampProcessChatInput('/mn')
        activ = true
    end
  
function hook.onShowDialog(id, style, title, btn, btn, text)
    if activ then
        if title:find('Меню игрока') then
            sampSendDialogResponse(id, 1, 4, nil)
            return false
        end
        if title:find('Связь с') then
            sampSendDialogResponse(id, 1, nil, id..','.. jb)
            activ = false
            return false
        end
    end
end

Задумка такая: При вводе в чат "/rep Привет, админы" скрипт должен сам вводить команду "/mn" (меню на адвансе) переходить к пятой строчке вниз, открывать эту строчку, затем там появляется другой диалог, в который скрипт должен вписать всё, что было после "/rep " и отправить админам.
Но используя вышеуказанный код, при вводе /rep в чат, хоть просто "/rep" хоть "/rep Привет213" игра просто зависает.
В moonloader.log ничего нет, никаких ошибок, варнингов, ничего.
Надеюсь вы мне поможете, заранее спасибо.
sampSendChat используй
 
  • Нравится
Реакции: DeMoN3D

checkdasound

Известный
Проверенный
963
410
Как записывать vector3d в битстрим? Например позицию.
Вот так?
Lua:
raknetBitStreamWriteFloat(bs, x)
raknetBitStreamWriteFloat(bs, y)
raknetBitStreamWriteFloat(bs, z)
 
  • Нравится
Реакции: asocial demon

imring

Ride the Lightning
Всефорумный модератор
2,361
2,546
Как записывать vector3d в битстрим? Например позицию.
Вот так?
Lua:
raknetBitStreamWriteFloat(bs, x)
raknetBitStreamWriteFloat(bs, y)
raknetBitStreamWriteFloat(bs, z)
да
Lua:
-- вырезка с самп.луа
BitStreamIO.vector3d = {
    read = function(bs)
        local x, y, z =
            raknetBitStreamReadFloat(bs),
            raknetBitStreamReadFloat(bs),
            raknetBitStreamReadFloat(bs)
        return Vector3D(x, y, z)
    end,
    write = function(bs, value)
        -- вот этот самый код
        raknetBitStreamWriteFloat(bs, value.x)
        raknetBitStreamWriteFloat(bs, value.y)
        raknetBitStreamWriteFloat(bs, value.z)
    end
}
 
  • Нравится
Реакции: ShuffleBoy и checkdasound

asocial demon

Потрачен
175
14
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Срочно кликер по текстдраву на команду
дам 23 руб кто напишет)
Lua:
sampSendClickTextdraw(int id)
Вы находитесь в разделе "Разработка" (само название уже должно выдавать смысл сего раздела).
Пожалуйста, не сорите здесь просьбами о написании какой-то программы (т.е. требуете уже готовый продукт). В некоторых подразделах имеется специальная тема с правилами для того или иного раздела. Если для раздела доступны префиксы, то вставляйте их не как попало или не ставьте вовсе.
 

Terratomorf

Известный
315
58
У меня есть кликер по текстдраву 306 когда открывается меню и там появляется этот текстдрав он на него кликает но потом почему-то зависатет камера вот код и как добавить задержку?
Код:
script_name('AutoTextdrawClicker by Dessgun')
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    sampRegisterChatCommand("click", cmd_bot)
        while true do
        wait(0)
        if isPlayerPlaying(playerHandle) and enabled then
---------------------------------------------------------------------------
if sampTextdrawIsExists(306)then

sampSendClickTextdraw(306)

end

---------------------------------------------------------------------------

    end
end
 

asocial demon

Потрачен
175
14
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
У меня есть кликер по текстдраву 306 когда открывается меню и там появляется этот текстдрав он на него кликает но потом почему-то зависатет камера вот код и как добавить задержку?
Код:
script_name('AutoTextdrawClicker by Dessgun')
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    sampRegisterChatCommand("click", cmd_bot)
        while true do
        wait(0)
        if isPlayerPlaying(playerHandle) and enabled then
---------------------------------------------------------------------------
if sampTextdrawIsExists(306)then

sampSendClickTextdraw(306)

end

---------------------------------------------------------------------------

    end
end
если камера зависает то
Lua:
restoreCamera()
чтобы задержку добавить создай поток lua_thread.create
 

lorgon

Известный
656
271
Долгое время писал на Java перешёл на lua и начал думать, ну вот к примеру у меня есть String пустой, и мне надо проверить пустой ли String, в Java я бы сделал так
Код:
if (String != null) {
-- не пустой
} else {
-- пустой
}
Как это сделать в lua
 

asocial demon

Потрачен
175
14
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Долгое время писал на Java перешёл на lua и начал думать, ну вот к примеру у меня есть String пустой, и мне надо проверить пустой ли String, в Java я бы сделал так
Код:
if (String != null) {
-- не пустой
} else {
-- пустой
}
Как это сделать в lua
Lua:
 if string = nil then -- nil - нулевое значение
-- не пустой
else
-- пустой