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

g305noobo

Известный
Модератор
344
623
Есть некоторые объекты, которые невозможно отследить из sampev.OnCreateObject или sampev.OnCreatePickup, но они присутствуют в getAllObjects. Какой сампев с этим связан? или эти объекты уже существуют в одиночной игре. Например, посмотрите видео ниже.
There are some objects which can't be traced from sampev.OnCreateObject or sampev.OnCreatePickup, But they are present in getAllObjects. Which sampev is associated with that ? or those object already exist in singleplayer. For example check the below video as well.

SAMP events are a wrapper for processing RakNet packets coming from the server and the objects which the game creates itself will not be there.
In your case, most likely your line is rendered when the distance check is triggered.

To cancel creation or change an object you need to hook game functions, which you can find here -> https://github.com/DK22Pac/plugin-sdk/tree/master/plugin_sa/game_sa

ааа сукаааа, как сделать чтобы работал скрипт работал с Х времени до У времени
Lua:
        local start, finish = 1514, 1515
        if tonumber(os.date("%H%M")) < start then
            active = false
        elseif tonumber(os.date("%H%M")) >= finish then
            active = true
        end
     
        while active == true do
            sampAddChatMessage(""..os.date("%H%M%S"),-1)
            wait(1000)
        end
мой код не работает, ясто раз изменил

edit: фул скрипт
Lua:
require "lib.moonloader"
require "lib.samp.events"
local sampev = require "lib.samp.events"
local active = false

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    while true do
        wait(0)
       
        local start, finish = 1514, 1515
        if tonumber(os.date("%H%M")) < start then
            active = false
        elseif tonumber(os.date("%H%M")) >= finish then
            active = true
        end
       
        while active == true do
            sampAddChatMessage(""..os.date("%H%M%S"),-1)
            wait(1000)
        end
       
    end
end
должно работать
Lua:
local start = {hour = 0, min = 0}
local finish = {hour = 1, min = 4}
local active = false

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    while true do
        wait(0)
        
        local h, m = tonumber(os.date("%H")), tonumber(os.date("%M"))
        
        if h >= start.hour and h < finish.hour then
            active = true
        elseif h == finish.hour and m <= finish.min then
            active = true
        else
            active = false
        end

        if active then
            sampAddChatMessage(""..os.date("%H:%M:%S"), -1)
            wait(1000)
        end
    end
end
 
Последнее редактирование:
  • Нравится
Реакции: copypaste_scripter

eqzzz

Участник
123
20
Как сделать что-бы при наводке на BeginChild он увеличивался, а при отводке уменьшался
Используй функцию IsItemHoreverd()

Мне нужна помощь, я думаю, это сложно, но я не могу найти другого примера сценария, из которого я мог бы черпать вдохновение. Я объясню вам, что я хочу сделать: скрипт с командой (/checklic <name>), которая собирает некоторую информацию из https://www.rpg.b-zone.ro/players/general/<name>. , точнее, лицензионные часы (эти):
231817

После сбора количества лицензионных часов скрипт вернет следующую строку:
через sampAddChatMessage:
Flying: X, Sailing: X, Fishing: X, Weapon: X, Materials: X.
Пожалуйста, помогите мне, я продолжал искать примеры сценариев, которые могут это сделать, но не смог.
Открывай этот сайт, а затем ищи эту информацию через find()

Попробуй так
Lua:
for _, v in pairs(getAllChars()) do
            if isCharOnScreen(v) then
                local model = getCharModel(v)
                local _, x, y, z = getCharCoordinates(v)
                local x1, y1 = convert3DCoordsToScreen(x,y,z)
                local x2,y2,z2 = getCharCoordinates(PLAYER_PED)
                local x10, y10 = convert3DCoordsToScreen(x2,y2,z2)
                local distance = string.format("%.0f", getDistanceBetweenCoords3d(x, y, z, x2, y2, z2))
              
                --code
              
            end
        end
 
Последнее редактирование:

Hahker

Новичок
28
5
как сделать так, чтобы эта строка была белым цветом?

Lua:
renderFontDrawText(fontList, nicknameText..idText..lvlText, x, renderPosY, data.lists[v.listid].color)
 
  • Нравится
Реакции: h001ly

sVor

Активный
187
101
как сделать так, чтобы эта строка была белым цветом?

Lua:
renderFontDrawText(fontList, nicknameText..idText..lvlText, x, renderPosY, data.lists[v.listid].color)
Lua:
renderFontDrawText(fontList, nicknameText..idText..lvlText, x, renderPosY, 0xFFFFFFFF) -- ну или -1 поставь, тоже самое будет
 
  • Нравится
Реакции: Hahker

вайега52

Налуашил состояние
Модератор
2,976
3,094

MLycoris

На вид оружие массового семяизвержения
Проверенный
1,974
2,209
А как сделать лимит скорости что бы в случае превышения этого лимита что то происходило?
проверку делай
Lua:
if getCharSpeed(хендл педа) > 10 then
    sampAddChatMessage('Скорость больше 10',-1)
end
 

MLycoris

На вид оружие массового семяизвержения
Проверенный
1,974
2,209
Это типа можно впихать в условие кнопки или в while True?
если тупа в кнопку вставишь оно сработает раз при нажатии, если в беск цикл, то проверять скорость будет постоянно. Подучи основы луа, лишним не будет
 
D

deleted-user-139653

Гость
wtf, в чем косяк?

Lua:
local RakLua = require("RakLua")
RakLua.defineSampLuaCompatibility()

function main()
    RakLua.registerHandler(RakLuaEvents.INCOMING_RPC,
    function(id, bs)
        if id == 134 then
            local textdraw = {}
            textdraw.id = bs:readInt16()
            textdraw.flags = bs:readInt8()
            textdraw.letterWidth = bs:readFloat()
            textdraw.letterHeight = bs:readFloat()
            textdraw.letterColor = bs:readInt32()
            textdraw.lineWidth = bs:readFloat()
            textdraw.lineHeight = bs:readFloat()
            textdraw.boxColor = bs:readInt32()
            textdraw.shadow = bs:readInt8()
            textdraw.outline = bs:readInt8()
            textdraw.backgroundColor = bs:readInt32()
            textdraw.style = bs:readInt8()
            textdraw.selectable = bs:readInt8()
            textdraw.positionX = bs:readFloat()
            textdraw.positionY = bs:readFloat()
            textdraw.modelId = bs:readInt16()
            textdraw.rotationX = bs:readFloat()
            textdraw.rotationY = bs:readFloat()
            textdraw.rotationZ = bs:readFloat()
            textdraw.zoom = bs:readFloat()
            textdraw.color = bs:readInt16()
            textdraw.color2 = bs:readInt16()
            textdraw.textLen = bs:readInt16()
            textdraw.text = bs:readString(textdraw.textLen)
            local res = onShowTextDraw(textdraw)
            if res then
                local writeOffset = bs:getWriteOffset(res)
                bs:resetWritePointer()
                bs:writeInt16(res[1])
                bs:writeInt8(res[2])
                bs:writeFloat(res[3])
                bs:writeFloat(res[4])
                bs:writeInt32(res[5])
                bs:writeFloat(res[6])
                bs:writeFloat(res[7])
                bs:writeInt32(res[8])
                bs:writeInt8(res[9])
                bs:writeInt8(res[10])
                bs:writeInt32(res[11])
                bs:writeInt8(res[12])
                bs:writeInt8(res[13])
                bs:writeFloat(res[14])
                bs:writeFloat(res[15])
                bs:writeInt16(res[16])
                bs:writeFloat(res[17])
                bs:writeFloat(res[18])
                bs:writeFloat(res[19])
                bs:writeFloat(res[20])
                bs:writeInt16(res[21])
                bs:writeInt16(res[22])
                bs:writeInt16(res[23]:len())
                bs:writeString(res[23])
                bs:setWriteOffset(writeOffset)
            end
        end
    end)
end

function onShowTextDraw(textdraw)
    textdraw.text = textdraw.text:gsub("~w~galaxy%-rpg%.online~n~", "")
    return {textdraw}
end
 
Последнее редактирование модератором:

kyrtion

Известный
1,320
485
wtf, в чем косяк? вообще нихера не происходит, даже не выводит error через принт
читает, но не записывает


Lua:
local RakLua = require("RakLua")
RakLua.defineSampLuaCompatibility()

function main()
    RakLua.registerHandler(RakLuaEvents.INCOMING_RPC,
    function(id, bs)
        if id == 134 then
            local textdraw = {}
            textdraw.id = bs:readInt16()
            textdraw.flags = bs:readInt8()
            textdraw.letterWidth = bs:readFloat()
            textdraw.letterHeight = bs:readFloat()
            textdraw.letterColor = bs:readInt32()
            textdraw.lineWidth = bs:readFloat()
            textdraw.lineHeight = bs:readFloat()
            textdraw.boxColor = bs:readInt32()
            textdraw.shadow = bs:readInt8()
            textdraw.outline = bs:readInt8()
            textdraw.backgroundColor = bs:readInt32()
            textdraw.style = bs:readInt8()
            textdraw.selectable = bs:readInt8()
            textdraw.positionX = bs:readFloat()
            textdraw.positionY = bs:readFloat()
            textdraw.modelId = bs:readInt16()
            textdraw.rotationX = bs:readFloat()
            textdraw.rotationY = bs:readFloat()
            textdraw.rotationZ = bs:readFloat()
            textdraw.zoom = bs:readFloat()
            textdraw.color = bs:readInt32()
            textdraw.textLen = bs:readInt16()
            textdraw.text = bs:readString(textdraw.textLen)
            local res = onShowTextDraw(textdraw)
            if res then
                bs:resetWritePointer()
                bs:writeInt16(res[1])
                bs:writeInt8(res[2])
                bs:writeFloat(res[3])
                bs:writeFloat(res[4])
                bs:writeInt32(res[5])
                bs:writeFloat(res[6])
                bs:writeFloat(res[7])
                bs:writeInt32(res[8])
                bs:writeInt8(res[9])
                bs:writeInt8(res[10])
                bs:writeInt32(res[11])
                bs:writeInt8(res[12])
                bs:writeInt8(res[13])
                bs:writeFloat(res[14])
                bs:writeFloat(res[15])
                bs:writeInt16(res[16])
                bs:writeFloat(res[17])
                bs:writeFloat(res[18])
                bs:writeFloat(res[19])
                bs:writeFloat(res[20])
                bs:writeInt32(res[21])
                bs:writeInt16(res[22]:len())
                bs:writeString(res[22])
            end
        end
    end)
end

function onShowTextDraw(textdraw)
    if textdraw.id == 7 then
        return false
    else
        print("error")
    end
end
Может функция не та. Нужно выбрать функции для исполнении после триггерами.
function sampev.onShowTextDraw (как там полностью, узнаешь)

UPD: упс. Не до конца читал код. В конце функции думал для триггера.