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

lemonager

;)
Всефорумный модератор
809
1,704
Спасибо огромное))))
Только вылазит ошибка: attempt to call field 'TextQuestion' (a nil value)
Lua:
function imgui.TextQuestion(text)
    imgui.TextDisabled('(?)')
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end

Снизу вставь куда-нибудь код этот. А потом уже используй
 
Последнее редактирование:
  • Нравится
Реакции: Renty

Dmitriy Makarov

25.05.2021
Проверенный
2,484
1,114
Там этого нету
Слепой чтоль? ;D
Ссылка напрямую ведет к посту с фиолетовым стилем
Screenshot_1.png
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,892
1,256
проблема в том что при написании скрипта не работает sampSendDialogResponse , заходит в /mn но не нажимает на нужное значение
function main()
if not isSampfuncsLoaded() or not isSampLoaded() then
return
end
while not isSampAvailable() do
wait(0)
end
sampAddChatMessage("{FFFF00}Dobro", -1)
while true do
wait(0)
if isKeyJustPressed(0x2D) then
sampSendChat("/home")
wait(500)
setVirtualKeyDown(0x0D, true)
wait(500)
setVirtualKeyDown(0x0D, false)
wait(500)
sampSendChat("/mn")
if sampIsDialogActive() then -- если активен какой-то диалог, то продолжаем
did = sampGetCurrentDialogId() -- ѕолучаем ID текущего диалога, чтобы скрипт срабатывал только на 101
if did == 27 then -- —равниваем 101 и текущий диалог
wait(500)
sampSendDialogResponse(27, 0x0D, 9, text)
wait(555)
end
end
end
end
end
"чтобы скрипт срабатывал только на 101" тогда почему проверка на 27 id?
в sampSendDialogResponse вторым аргументом нужно отправлять 0/1, а ты отправляешь enter
 

McLore

Известный
559
279
Код:
script_properties("work-in-pause")
local sp  = require 'lib.samp.events'
local encoding = require 'encoding'
local inicfg = require 'inicfg'
local notf = import 'imgui_notf.lua'
local imgui = require 'imgui'
local mem = require "memory"
local vkeys = require 'vkeys'
local fa = require 'fAwesome5'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local sw, sh = getScreenResolution()

show_main_window = imgui.ImBool(false)
show_stat_window = imgui.ImBool(false)

local fa_font = nil
local fa_glyph_ranges = imgui.ImGlyphRanges({ fa.min_range, fa.max_range })
function imgui.BeforeDrawFrame()
    if fa_font == nil then
        local font_config = imgui.ImFontConfig() -- to use 'imgui.ImFontConfig.new()' on error
        font_config.MergeMode = true
        fa_font = imgui.GetIO().Fonts:AddFontFromFileTTF('moonloader/resource/fonts/fa-solid-900.ttf', 13.0, font_config, fa_glyph_ranges)
    end
end


function imgui.OnDrawFrame()
    if show_main_window.v then
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(200, 200), imgui.Cond.FirstUseEver)
        imgui.Begin('test fontawesome', show_main_window, imgui.WindowFlags.NoCollapse)
        imgui.Button(fa.ICON_FA_TV .. ' TV')
        imgui.Button(fa.ICON_FA_LAPTOP .. ' Laptop')
        imgui.Button(fa.ICON_FA_AWARD .. ' Award')
        imgui.End()
    end

    if show_stat_window.v then
        imgui.SetMouseCursor(imgui.MouseCursor.None)
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirsUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.Begin(u8("Статистика##онл"), _, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoBringToFrontOnFocus + imgui.WindowFlags.NoSavedSettings + imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.NoTitleBar)
        _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
        nick = sampGetPlayerNickname(id)
        pinge = sampGetPlayerPing(id)
        hppal = sampGetPlayerHealth(id)
        arm = sampGetPlayerArmor(id)
        imgui.Text(string.format(u8"Ваш ник: %s [%s]", nick , id))
        imgui.End()
    end
end

function main()
    sampRegisterChatCommand("test",function() show_stat_window.v = not show_stat_window.v end)
    sampRegisterChatCommand("test1",function() show_main_window.v = not show_main_window.v end)
    while true do
        wait(0)
        if show_main_window.v or show_stat_window.v then
            imgui.Process = true
            if show_main_window.v then
                imgui.ShowCursor = true
            else
                imgui.ShowCursor = false
                imgui.LockPlayer = false
            end
        else
            imgui.Process = false
            imgui.LockPlayer = false
            imgui.ShowCursor = false
        end
    end
end

В чем может быть проблема , когда активирую show_stat_window.v почему то остается виден курсор , хотя в условии указал чтобы он отключался
 

Oreshka23

Известный
338
164
Помогите сделать проверку на ввод данных в команде, чтобы можно было ввести только одну цифру и чтобы не крашил скрипт ни при каких условиях
 

Belo4ka_belka

Известный
191
7
Здравствуйте, не подскажете как сделать такую палитру? Может у кого уже готовая даже есть, буду очень благодарен (её не помешало бы в полезные функции закинуть).
sa-mp-155.png
 

danywa

Активный
358
50
как можно реализовать если перс заспавнился на сервере то писал привет округ?или по другому проверка на спавн
 

McLore

Известный
559
279
как можно реализовать если перс заспавнился на сервере то писал привет округ?или по другому проверка на спавн
Код:
script_name("Example script")

function main()
   while not isSampAvailable() do wait(100) end
   repeat
      wait(0)
   until sampIsLocalPlayerSpawned()
   sampAddChatMessage("Персонаж заспавнился", -1)
end
 

atomlin

Известный
581
388
Можешь подсказать как сделать чтобы команда которая зарегистрирована в майне выолняла,то ч то в бесконечном цикле?

Lua:
local rr = false

function main()
    sampRegisterChatCommand("robit", cmd_vot)
    while true do
    wait(0)
        if isPlayerPlaying(playerHandle) and rr then
            sampAddChatMessage('vrode tak', -1)
        end
    end
end

function cmd_bot
    rr = not rr
    if rr then
        sampAddChatMessage('on', -1)
    else
        sampAddChatMessage('off', -1)
    end
end
 

Izvinisb

Известный
Проверенный
964
598
Помогите сделать проверку на ввод данных в команде, чтобы можно было ввести только одну цифру и чтобы не крашил скрипт ни при каких условиях
Lua:
function somefunc(param)
    if tonumber(param) ~= nil and tonumber(param) >= 0 and tonumber(param) < 10 then
        return sampAddChatMessage('Вы ввели: '..param, -1)
    end
end
 

neverlane

t.me/neverlane00
Друг
1,000
1,138
Код:
script_properties("work-in-pause")
local sp  = require 'lib.samp.events'
local encoding = require 'encoding'
local inicfg = require 'inicfg'
local notf = import 'imgui_notf.lua'
local imgui = require 'imgui'
local mem = require "memory"
local vkeys = require 'vkeys'
local fa = require 'fAwesome5'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local sw, sh = getScreenResolution()

show_main_window = imgui.ImBool(false)
show_stat_window = imgui.ImBool(false)

local fa_font = nil
local fa_glyph_ranges = imgui.ImGlyphRanges({ fa.min_range, fa.max_range })
function imgui.BeforeDrawFrame()
    if fa_font == nil then
        local font_config = imgui.ImFontConfig() -- to use 'imgui.ImFontConfig.new()' on error
        font_config.MergeMode = true
        fa_font = imgui.GetIO().Fonts:AddFontFromFileTTF('moonloader/resource/fonts/fa-solid-900.ttf', 13.0, font_config, fa_glyph_ranges)
    end
end


function imgui.OnDrawFrame()
    if show_main_window.v then
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(200, 200), imgui.Cond.FirstUseEver)
        imgui.Begin('test fontawesome', show_main_window, imgui.WindowFlags.NoCollapse)
        imgui.Button(fa.ICON_FA_TV .. ' TV')
        imgui.Button(fa.ICON_FA_LAPTOP .. ' Laptop')
        imgui.Button(fa.ICON_FA_AWARD .. ' Award')
        imgui.End()
    end

    if show_stat_window.v then
        imgui.SetMouseCursor(imgui.MouseCursor.None)
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirsUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.Begin(u8("Статистика##онл"), _, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoBringToFrontOnFocus + imgui.WindowFlags.NoSavedSettings + imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.NoTitleBar)
        _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
        nick = sampGetPlayerNickname(id)
        pinge = sampGetPlayerPing(id)
        hppal = sampGetPlayerHealth(id)
        arm = sampGetPlayerArmor(id)
        imgui.Text(string.format(u8"Ваш ник: %s [%s]", nick , id))
        imgui.End()
    end
end

function main()
    sampRegisterChatCommand("test",function() show_stat_window.v = not show_stat_window.v end)
    sampRegisterChatCommand("test1",function() show_main_window.v = not show_main_window.v end)
    while true do
        wait(0)
        if show_main_window.v or show_stat_window.v then
            imgui.Process = true
            if show_main_window.v then
                imgui.ShowCursor = true
            else
                imgui.ShowCursor = false
                imgui.LockPlayer = false
            end
        else
            imgui.Process = false
            imgui.LockPlayer = false
            imgui.ShowCursor = false
        end
    end
end

В чем может быть проблема , когда активирую show_stat_window.v почему то остается виден курсор , хотя в условии указал чтобы он отключался
Попробуй использовать так
imgui.Process = show_stat_window.v or show_main_window.v
imgui.ShowCursor = not show_stat_window.v or show_main_window.v