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

штейн

Известный
Проверенный
1,001
687
Lua:
local response, err = httpRequest('POST', {'http://f0320362.xsph.ru/add.php', data = 'id='..random..'sum=1000'})
if err then error(err) end
requests.lua:153: No url specified for request
ЧЕ ЕМУ НАДО ОТ МЕНЯЯЯЯЯЯЯЯ


ещё попробовал:
Lua:
httpRequest("http://f0320362.xsph.ru/add.php", 'id='..random..'&sum=1000', function(response, code, headers, status)
    if response then
        print('OK', status)
    else
        print('Error', code)
    end
end)
Error Параметр задан неверно.
ну ало помогите спасите
 

FBenz

Активный
328
40
Попробуй во второй аргумент ID скина передать.
Пробовал, тогда выбивает ошибку, что неправильно используется функция.
Посмотрел в КЛЕО аналоги, сделал те же опкоды, получилось так:
Lua:
requestModel('#SWAT')
loadAllModelsNow()
local peshPed = createChar(23, '#SWAT', x, y, z)
Но все равно создает стоящего сиджея.


Upd: Разобрался. Может кому поможет, пример попробую добавить в описание функции:
В описании функции не было примера, но выглядеть использование должно так:
Lua:
requestModel(2) -- Запрашиваем модель педа (скин) с нужным id. В данном случае id скина - это скин Messer (Челик в панамке).
loadAllModelsNow() -- Загружаем все запрошенные модели
local resu = hasModelLoaded(2) -- Проверяем, загружена ли модель педа с нужным id.
if not resu then
    sampAddChatMessage('{6600FF}Fck u') -- Если нет, мы об этом узнаем
else
    local peshPed = createChar(4, 2, x, y, z) -- Если да, то создаем педа
    -- createChar(int поведение педа, int id загруженной модели, х, у, z)
    -- Модель обязательно должна быть загружена. Если нет, то создаст обычного сиджея.
    -- Поведение игрока (В данном случае 4 - пешеход муж. пола) определяет отношение к другим педам
end
 
Последнее редактирование:

Leo_Mendes

Известный
52
3
Последнее редактирование:
  • Нравится
Реакции: The Spark

Данекк

Известный
39
0
как искать 3d текст с определённым текстом в Lua, желательно код с примером, и вычислять расстояние до него
 

Leo_Mendes

Известный
52
3
Как скрыть TextDraw (сервера), не удалить, так как взаимодействие с TextDraw'om есть??
И как считывать цвет TextDraw'a???
 

astynk

Известный
Проверенный
742
530
Lua:
local result, ped = getCharPlayerIsTargeting(player)
    if result and isKeyJustPressed(vkeys.VK_G) then
        if result then
            result, playerid = sampGetPlayerIdByCharHandle(target)
                for i = 1, #array.clist do
                    if array.clist[i] == sampGetPlayerColor(id) then
                    sampSendChat('/medhelp '..playerid..' '..array.prices[i])
                end
            end
        end
    end
Код работает по сути, в логах нет ошибок, но в самой игре действий никаких не происходит
Как минимум в 4-ой строчке надо ped вместо target.
как искать 3d текст с определённым текстом в Lua, желательно код с примером, и вычислять расстояние до него
Проходишь циклом по всем 3д текстам, и при помощи sampget3dtextinfobyid вычисляешь что тебе нужно.
Как скрыть TextDraw (сервера), не удалить, так как взаимодействие с TextDraw'om есть??
И как считывать цвет TextDraw'a???
Получить цвет - samptextdrawsetboxcolorandsize
Скрыть не получится, только удалить. Если нужно будет работать с ним, можно заранее сохранить нужные данные.
 

Leo_Mendes

Известный
52
3
Как минимум в 4-ой строчке надо ped вместо target.

Проходишь циклом по всем 3д текстам, и при помощи sampget3dtextinfobyid вычисляешь что тебе нужно.

Получить цвет - samptextdrawsetboxcolorandsize
Скрыть не получится, только удалить. Если нужно будет работать с ним, можно заранее сохранить нужные данные.
Если у меня взаимодействует сколько бензина осталось в баке, то не убрать я так понял??
 

FYS

Потрачен
982
236
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Попробуй во второй аргумент ID скина передать.
Есть же пример :\
35959
 

Drinkins

Участник
38
0
Подскажите, пожалуйста. Есть ли какой нибудь способ убрать F1 и F4 (точнее их значение)? Что F1 открывает помощь по SAMP, F4 после смерти - смену скина. Я знаю, что есть ASI который отключает, но мне бы именно для LUA код.
 

Kuharz

Известный
401
153
Судя по вики у потока есть статус
yieldedприостановлен

как добиться этого статуса? При terminate я получаю статус dead...
 

DeniPolis

Участник
114
12
Если у меня взаимодействует сколько бензина осталось в баке, то не убрать я так понял??
Можно удалять (не знаю как, я деревяшка), просто каждый раз при входе в машину генерируется новый текстдрав, и насколько я помню каждая цифра = удаление старой, создание новой
 

rakzo

Известный
99
3
Почему не работает этот луа скрипт? зарание спасибо.
script_name("[ANTI-AFK]")
script_author("[MOL]")
script_version("v0.1")
script_properties("work-in-pause")
local memory = require 'memory'
function main()
sampRegisterChatCommand("aafk", main)
while true do
wait(0)
function patch()
sampAddChatMessage("ANTI-AFK ON", 0xFFFFA500)
writeMemory(7634870, 1, 1, 1)
writeMemory(7635034, 1, 1, 1)
memory.fill(7623723, 144, 8)
memory.fill(5499528, 144, 6)
end
 

lemonager

;)
Всефорумный модератор
809
1,701
Почему не работает этот луа скрипт? зарание спасибо.
Lua:
local memory = require 'memory'

function main()
while not isSampAvailable() do wait(100) end
sampRegisterChatCommand("aafk", blast)
while true do wait(0) 
if state then 
   writeMemory(7634870, 1, 1, 1)
   writeMemory(7635034, 1, 1, 1)
   memory.fill(7623723, 144, 8)
   memory.fill(5499528, 144, 6)
    end
  end
end

function blast()
state = not state
if state then
   sampAddChatMessage("ANTI-AFK ON", 0xFFFFA500) 
   else
   sampAddChatMessage("ANTI-AFK OFF", 0xFFFFA500)
  end
end
Попробуй..
 
Последнее редактирование:

kotov_

Участник
44
6
Как сделать проверку ip ? Если ip будет не подлинный, скрипт не будет работать.