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

Hinаta

Известный
783
358
есть ли какая-то функция, которая узнавала бы прошлое оружие в руках?
Например, если у тебя было в руке до этого дубинка, оно писало бы что ты поставил ее на держатель. Если бы у тебя до этого была эмка, она бы писала что ты ее убрал в чехол
 

Madeo Capaldi

Участник
42
2
Бегает по координатам, но в конце кода не прожимает альт
Lua:
                                         local x, y, z = getCharCoordinates(PLAYER_PED)
                                          dist1 = getDistanceBetweenCoords3d(x, y, z, position.x , position.y, position.z)
                                       if  dist1 < 1 and textObject:find "для начала роста необходимо полить" then
                                                    
                                     active = true
                                                  
                                        if active then
                                                        
                        
                                        
                                            
                                           runToPoint (-1076.3603515625,-2510.2150878906,63.292007446289,false, false)
                                           runToPoint( -1085.8358154297, -2513.6645507813 , 62.838130950928, false, false)
                                           runToPoint(-1093.0344238281 , -2530.0080566406 , 63.410419464111, false,false  )
                                           wait(1000)
                                           local data = samp_create_sync_data('player')
                                           data.keysData = data.keysData + 1024
                                           data.send()
                                           runToPoint (-1085.5953369141 ,-2518.734375, 63.520053863525)
                                           wait(1000)
                                           local data = samp_create_sync_data('player')
                                           data.keysData = data.keysData + 1024
                                           data.send()
                                           wait(8000)
                                           runToPoint ( -1078.4129638672 ,-2506.0893554688, 62.33939743042)
                                          
                                                    runToPoint(position.x, position.y,position.z)
                                                    wait(2000)
                                                    
                                                    
                                                      if  dist1 < 3 then 
                                                        sampAddChatMessage ("Жмy альт для полива",-1)
                                                        local data = samp_create_sync_data('player')
                                                        data.keysData = data.keysData + 1024
                                                        data.send()
                                                     end
                                         end   
                                 end
 

MrDorlik

Известный
976
393
Бегает по координатам, но в конце кода не прожимает альт
Lua:
                                         local x, y, z = getCharCoordinates(PLAYER_PED)
                                          dist1 = getDistanceBetweenCoords3d(x, y, z, position.x , position.y, position.z)
                                       if  dist1 < 1 and textObject:find "для начала роста необходимо полить" then
                                                  
                                     active = true
                                                
                                        if active then
                                                      
                      
                                      
                                          
                                           runToPoint (-1076.3603515625,-2510.2150878906,63.292007446289,false, false)
                                           runToPoint( -1085.8358154297, -2513.6645507813 , 62.838130950928, false, false)
                                           runToPoint(-1093.0344238281 , -2530.0080566406 , 63.410419464111, false,false  )
                                           wait(1000)
                                           local data = samp_create_sync_data('player')
                                           data.keysData = data.keysData + 1024
                                           data.send()
                                           runToPoint (-1085.5953369141 ,-2518.734375, 63.520053863525)
                                           wait(1000)
                                           local data = samp_create_sync_data('player')
                                           data.keysData = data.keysData + 1024
                                           data.send()
                                           wait(8000)
                                           runToPoint ( -1078.4129638672 ,-2506.0893554688, 62.33939743042)
                                        
                                                    runToPoint(position.x, position.y,position.z)
                                                    wait(2000)
                                                  
                                                  
                                                      if  dist1 < 3 then
                                                        sampAddChatMessage ("Жмy альт для полива",-1)
                                                        local data = samp_create_sync_data('player')
                                                        data.keysData = data.keysData + 1024
                                                        data.send()
                                                     end
                                         end 
                                 end
С твоей стороны ничего и не будет происходить, ты синхру юзаешь, ее видит только сервер и другие игроки, юзай setgamekeystate
 
  • Нравится
Реакции: хромиус)

sssilvian

Активный
230
25
https://pastebin.com/jGbRvj7q У меня проблема в моем скрипте, я хочу добавить функцию, которая добавляет контрольную точку проигрывателя. Я набираю следующую команду: (/track ID), но не знаю, куда ее поместить. Может кто-нибудь мне помочь? Контрольная точка игрока такая:
1695911104825.png
 

Evgeniy_orb

Новичок
17
3
Как можно данный код заставить работать через асинхронный запрос?
LUA:
local response_d2
    response_d2 = requests.get('tyt ssilka')
    local nick = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))
    for n in response_d2.text:gmatch('[^\r\n]+') do
        if nick:find(n) then
            print("Script loaded, have fun")
            return true
        end
    end
    return false
Надо чтобы проверка при запуске скрипта происходила без подвисания, через asyncHttpRequest все робит но привязка к нику не робит.
p.S для тех кто не понял, если данный запрос выполнять то игра на пару секунд фризится, при втором варианте фриза нет но и проверки не проходят.
 
Последнее редактирование:
  • Эм
Реакции: nanobrick

sssilvian

Активный
230
25
https://pastebin.com/jGbRvj7q У меня проблема в моем скрипте, я хочу добавить функцию, которая добавляет контрольную точку проигрывателя. Я набираю следующую команду: (/track ID), но не знаю, куда ее поместить. Может кто-нибудь мне помочь? Контрольная точка игрока такая:
Посмотреть вложение 216305
1695912475268.png

А пока я нашел способ, но не могу убрать чекпоинт, если выполню функцию "ELSE" или отменю всплеск через команду.
 

kamila

Новичок
1
0
Can anyone help me with this script, when in chat apperas "PLAYER NICKNAME" kills "playernickname" | Weapon, i need script that automatically types /ar and FIRST PLAYER NICKNAME or ID, when i press any key like + .


Can anyone help me with this script when in chat "PLAYER NAME" kills "PLAYER NAME" | Weapon, I need a script that automatically enters /ar and NICK or FIRST PLAYER ID when I press any key like + .
 

Evgeniy_orb

Новичок
17
3
lua:
local RangGive = tonumber(arg2)
if RangGive >= 1 or RangGive <= 3 then
                nextday = timer+2*24*60*60
            elseif RangGive >= 4 or RangGive <= 6 then
                nextday = timer+3*24*60*60
            end
            if RangGive >= 7 or RangGive <= 10 then
                nextday = timer+5*24*60*60
            elseif RangGive >= 11 or RangGive <= 14 then
                nextday = timer+7*24*60*60
            end
            DateGiveRank_Next = os.date("%d.%m.%Y", nextday)
Как сделать чтобы если ввел в RangGive текст от 1 до 3 то timer+2 вышло?
С другими аналогично.
p.s ща криво работает не могу понять почему.
 

MrDorlik

Известный
976
393
Не) значения точно там меняться не будут, по крайней мере в ближайшие пару месяцев точно.
протести как вот это работает, в блокноте писал, и удали предыдущие сообщения чтоб тему не засорять
Lua:
local rangs = {
  {1, 3, 2},
  {4, 6, 3},
  {7, 10, 5},
  {11, 14, 7}
}

local RangGive = tonumber(arg2)

for k, v in ipairs(rangs) do
    if RangGive >= v[1] and RangGive <= v[2] then
        nextday = timer+v[3]*24*60*60
    end
end
 

Evgeniy_orb

Новичок
17
3
протести как вот это работает, в блокноте писал, и удали предыдущие сообщения чтоб тему не засорять
Lua:
local rangs = {
  {1, 3, 2},
  {4, 6, 3},
  {7, 10, 5},
  {11, 14, 7}
}

local RangGive = tonumber(arg2)

for k, v in ipairs(rangs) do
    if RangGive >= v[1] and RangGive <= v[2] then
        nextday = timer+v[3]*24*60*60
    end
end

Lua:
if RangGive >= 1 and RangGive <= 3 then
                nextday = timer+2*24*60*60
            elseif RangGive >= 4 and RangGive <= 6 then
                nextday = timer+3*24*60*60
            elseif RangGive >= 7 and RangGive <= 10 then
                nextday = timer+5*24*60*60
            elseif RangGive >= 11 and RangGive <= 14 then
                nextday = timer+7*24*60*60
            end
Я по твоему совету сделал заменил or на and и все норм стало, спасибо)
Лайк к сожалению не поставлю на пост ибо ты его снес.
 
  • Bug
Реакции: qdIbp

MrDorlik

Известный
976
393
Lua:
if RangGive >= 1 and RangGive <= 3 then
                nextday = timer+2*24*60*60
            elseif RangGive >= 4 and RangGive <= 6 then
                nextday = timer+3*24*60*60
            elseif RangGive >= 7 and RangGive <= 10 then
                nextday = timer+5*24*60*60
            elseif RangGive >= 11 and RangGive <= 14 then
                nextday = timer+7*24*60*60
            end
Я по твоему совету сделал заменил or на and и все норм стало, спасибо)
Лайк к сожалению не поставлю на пост ибо ты его снес.
ну мне через таблицы больше нравится, красивее) и тебе советую научиться, полезная штука
 
  • Нравится
Реакции: Evgeniy_orb

sssilvian

Активный
230
25
Как отобразить контрольную точку на игроке с помощью команды типа (/gibp ID) и удалить ее с помощью (/delbp)?
1695959181782.png