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

7 СМЕРТНЫХ ГРЕХОВ

Известный
524
164
Только что как раз пробовал -
1707671342774.png


При выходе с игры нету принтов :(

Только что как раз пробовал -
1707671342774.png


При выходе с игры нету принтов :(
Помогло удаление GameExitFixbyRomelo.sf
 
Последнее редактирование:
  • Грустно
Реакции: minxty

tsunamiqq

Участник
433
17
Как сделать что-бы при наводке на BeginChild он увеличивался, а при отводке уменьшался
 

P U L V I L I Z A T O R

Участник
94
29
Есть такое событие как onSendTakeDamage, которое вызывается только когда урон осуществляется по игроку. Подскажите как получать ту же информацию, что дает это событие, но только если урон был осуществлен по машине.
 

denis2222

Известный
24
5
Есть такое событие как onSendTakeDamage, которое вызывается только когда урон осуществляется по игроку. Подскажите как получать ту же информацию, что дает это событие, но только если урон был осуществлен по машине.
может тут глянь https://www.blast.hk/threads/88790/
 
  • Нравится
Реакции: P U L V I L I Z A T O R

decidelater

Новичок
6
0
Есть некоторые объекты, которые невозможно отследить из 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.

 

Slavka Priore

Активный
114
38
Как кликнуть по текстдраву, но только не по айдишнику, а по его координатам(x, y)? И можно ли как-то сделать через for, чтобы оно прокликивало по нескольким текст дравам, причем именно по их координатам. И также, как сделать проверку: Пустой ли текстдрав? То есть в аризоне в инвентаре есть пустые клетки(без предметов), а есть не пустые(с предметами). Мне нужно сделать проверку, если ли какойто предмет в какомто текст драве с какимито координатами
 

chromiusj

Известный
Модератор
5,656
3,959
Как кликнуть по текстдраву, но только не по айдишнику, а по его координатам(x, y)? И можно ли как-то сделать через for, чтобы оно прокликивало по нескольким текст дравам, причем именно по их координатам. И также, как сделать проверку: Пустой ли текстдрав? То есть в аризоне в инвентаре есть пустые клетки(без предметов), а есть не пустые(с предметами). Мне нужно сделать проверку, если ли какойто предмет в какомто текст драве с какимито координатами
смотри по data.position
 

copypaste_scripter

Известный
1,295
249
ааа сукаааа, как сделать чтобы работал скрипт работал с Х времени до У времени
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
 
  • Вау
Реакции: recxvery

coderko61

Участник
55
0
ребят, нужно сделать поиск персонажей и объектов. пробовал сам, не пашет. скидываю поиск на объекты. нужно что бы он ещё искал игроков и все в одном цикле. помогите, парни
Lua:
for _, v in pairs(getAllObjects()) do
            if isObjectOnScreen(v) then
                local model = getObjectModel(v)
                local _, x, y, z = getObjectCoordinates(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
 

g305noobo

Известный
Модератор
307
477
Есть некоторые объекты, которые невозможно отследить из 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

Участник
122
19
Как сделать что-бы при наводке на 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
0
как сделать так, чтобы эта строка была белым цветом?

Lua:
renderFontDrawText(fontList, nicknameText..idText..lvlText, x, renderPosY, data.lists[v.listid].color)
 

sVor

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

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