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

fantavise

Потрачен
126
98
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Посмотреть вложение 103432
как значок вопроса сделать возле текста "Выключен"


Lua:
function imgui.OnDrawFrame()
    if main_window_state.v then
        local xPos, yPos = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(xPos-650, yPos-300), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(565, 350), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"checker test version by enlizmee | vk: vk.com/notfoundjs", main_window_state, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoScrollbar)
        imgui.GetStyle().WindowTitleAlign.x = 0.5
    
        if imgui.Checkbox(u8("##ONOFF"), itrunk) then
            SaveIni()
            msg(itrunk.v and "Itrunk успешно включен!" or "Itrunk Выключен!")
        end
        imgui.SameLine()
        if itrunk.v then
            imgui.TextColored(imgui.ImVec4(0, 143, 0, 1), u8("Включен"))
        else
            imgui.TextColored(imgui.ImVec4(252, 0, 0, 1), u8("Выключен"))
        end
        imgui.TextQuestion(u8"test")

        imgui.End()
    end
end



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
Lua:
            imgui.TextColored(imgui.ImVec4(0, 143, 0, 1), u8("Включен"))
        else
            imgui.TextColored(imgui.ImVec4(252, 0, 0, 1), u8("Выключен"))
        end
        imgui.SameLine()
        imgui.TextQuestion(u8"test")
 

copypaste_scripter

Известный
1,261
235
1625157011117.png

как убрать эти черные линии? рисую
renderFontDrawText(mod_font, '{8800FFFF}' .. "(579) Huntley (587) Euros (602) Alpha", 1400, 440, 0xFFFFFFFF)
 

shrug228

Активный
212
75

chapo

чопа сребдс // @moujeek
Модератор
8,867
11,565
как запретить нажимать на определенную строчку в диалоге
Lua:
local sampev = require 'lib.samp.events'

function sampev.onSendDialogResponse(dialogId, button, listboxId, input)
    if listboxId == 1 then
        sampAddChatMessage('долбаеб, выбери другое', -1)
        return false
    end
end
 
  • Нравится
Реакции: m1racles

CaJlaT

07.11.2024 14:55
Модератор
2,831
2,662
Lua:
local sampev = require 'lib.samp.events'

function sampev.onSendDialogResponse(dialogId, button, listboxId, input)
    if listboxId == 1 then
        sampAddChatMessage('долбаеб, выбери другое', -1)
        return false
    end
end
Если это арз или блевольв, то он не сможет снова открыть диалог, так как сервер будет думать, что диалог открыт, а при открытом диалоге нельзя писать команды
 

Fott

Простреленный
3,461
2,374
1. Как сделать проверку на то виден ли name tag игрока, или как оно там называется. На скрине обвел крч.
2. Как получить координаты полоски hp в name tag`e

1625164240831.png
 

m1racles

Активный
204
35
[ML] (error) ladno.lua: E:\GTA 140K BY DAPO SHOW\moonloader\ladno.lua:3: <name> or '...' expected near '2155'
[ML] (error) ladno.lua: Script died due to an error. (1012DE44)

Lua:
local sampev = require 'lib.samp.events'
function sampev.onSendDialogResponse(2155, button, listboxId, input)
    if listboxId == 3 then
        sampAddChatMessage('долбаеб, выбери другое', -1)
        return false
    end
end
function main()
    while not isSampAvailable() do wait(0) end
    while true do
        wait(0) 
            
    end
end
 

Fott

Простреленный
3,461
2,374
[ML] (error) ladno.lua: E:\GTA 140K BY DAPO SHOW\moonloader\ladno.lua:3: <name> or '...' expected near '2155'
[ML] (error) ladno.lua: Script died due to an error. (1012DE44)

Lua:
local sampev = require 'lib.samp.events'
function sampev.onSendDialogResponse(2155, button, listboxId, input)
    if listboxId == 3 then
        sampAddChatMessage('долбаеб, выбери другое', -1)
        return false
    end
end
function main()
    while not isSampAvailable() do wait(0) end
    while true do
        wait(0)
           
    end
end
Lua:
local sampev = require 'lib.samp.events'
function sampev.onSendDialogResponse(id, button, listboxId, input)
    if listboxId == 3 and id == 2155 then
        sampAddChatMessage('долбаеб, выбери другое', -1)
        return false
    end
end
function main()
    while not isSampAvailable() do wait(0) end
    while true do
        wait(0)
            
    end
end
 
  • Нравится
Реакции: m1racles

kizn

\ 0 _ 0 /
Всефорумный модератор
2,408
2,090
Если это арз или блевольв, то он не сможет снова открыть диалог, так как сервер будет думать, что диалог открыт, а при открытом диалоге нельзя писать команды
наоборот таки арз разрешает открывать новые диалоги при открытом текущем
 

Cosmo

Известный
Друг
653
2,724
Как сделать проверку на то виден ли name tag игрока, или как оно там называется. На скрине обвел крч.
Lua:
function isNameTagVisible(id)
    local function getBodyPartCoordinates(id, handle)
        local ffi = require "ffi"
        local getBonePosition = ffi.cast("int (__thiscall*)(void*, float*, int, bool)", 0x5E4280)
        local pedptr = getCharPointer(handle)
        local vec = ffi.new("float[3]")
        getBonePosition(ffi.cast("void*", pedptr), vec, id, true)
        return vec[0], vec[1], vec[2]
    end

    local function GetMaskStats(id)
        local StructPtr = readMemory(sampGetPlayerStructPtr(id), 4, true)
        local Element = getStructElement(StructPtr, 179, 2, false)
        if Element == 0 then return false else return true end
    end

    local res = false
    local pStSet = sampGetServerSettingsPtr()
    local NTdist = representIntAsFloat(readMemory(pStSet + 39, 4, false))
    local bool, v = sampGetCharHandleBySampPlayerId(id)
    if bool and isCharOnScreen(v) then
        local x, y, z = getBodyPartCoordinates(8, v)
        local xi, yi, zi = getActiveCameraCoordinates()
        local result = isLineOfSightClear(x, y, z, xi, yi, zi, true, false, false, true, false)
        local dist = math.sqrt( (xi - x) ^ 2 + (yi - y) ^ 2 + (zi - z) ^ 2 )
        if result and dist <= NTdist and GetMaskStats(id) then
            res = true
        end
    end
    return res
end
 
  • Нравится
Реакции: Fott

shrug228

Активный
212
75
Машина разбита, как узнать, сколько ХП изначально было(когда она была целая)?