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

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,942
1,308

Tak

Известный
178
70
Чё делать если оно не правильно распознает части тела?
Lua:
local weapons = require 'game.weapons'
local samp = require 'samp.events'

bodypart =
{'спина', 'голова', 'Плечо левой руки', 'Плечо правой руки', 'Левая рука', 'Правая рука', 'Левое бедро', 'Правое бедро', 'Левая нога', 'Правая нога', 'Правая голень', 'Левая голень', 'Левое предплечье', 'Правое предплечье', 'Левая ключица', 'Правая ключица', 'Шея', 'Челюсть'}




--usage: bodypart[1]
--output: торс

function samp.onSendGiveDamage(playerId, damage, weapon, bodypart)

    sampAddChatMessage('Ты нанес '..math.floor(damage)..' урона игроку '..sampGetPlayerNickname(playerId)..'['..playerId..'] сделав выстрел в '..getBodyPartName(bodypart)..' применив '..weapons.get_name(weapon), -1)
    -- P.S math.floor(value) -> округление числа, что бы не писало например 46.674563456346456

end

function getBodyPartName(bodypart)
if bodypart == 1 then
        return 'спина'
    end
    if bodypart == 2 then
        return 'голова'
    end
    if bodypart == 3 then
        return 'Плечо левой руки'
    end
    if bodypart == 4 then
        return 'Плечо правой руки'
    end
    if bodypart == 5 then
        return 'Левая рука'
    end
    if bodypart == 6 then
        return 'Правая рука'
    end
    if bodypart == 7 then
        return 'Левое бедро'
    end
        if bodypart == 8 then
        return 'Правое бедро'
    end
        if bodypart == 9 then
        return 'Левая нога'
    end
        if bodypart == 10 then
        return 'Правая нога'
    end

        if bodypart == 11 then
        return 'Правая голень'
    end
        if bodypart == 12 then
        return 'Левая голень'
    end
        if bodypart == 13 then
        return 'Левое предплечье'
    end
        if bodypart == 14 then
        return 'Правое предплечье'
    end
        if bodypart == 15 then
        return 'Левая ключица'
    end
        if bodypart == 16 then
        return 'Правая ключица'
    end
        if bodypart == 17 then
        return 'Шея'
    end
        if bodypart == 18 then
        return 'Челюсть'
    end
end
Есть информация каой id bodypart = какой части тела?
 

NetyEgo

Участник
164
10
при вызове imgui, если я там что то тыкаю, то мой персонаж дерётся, на даймонде очень мешате, как исправить? lockplayer стоит
так он не дерётся, а табличка ЗЗ выскакивает
 

Fott

Простреленный
3,470
2,387
Есть информация каой id bodypart = какой части тела?
Если бы,взял инфу отсюда
1588768314495.png
 

Tak

Известный
178
70

Deniska.lua

Участник
43
0
Всем привет, не подскажете - При виде сообщения в чате пишеться от меня сообщение , как сделать?
 

Dmitriy Makarov

25.05.2021
Проверенный
2,508
1,136
Всем привет, не подскажете - При виде сообщения в чате пишеться от меня сообщение , как сделать?
Lua:
local sampev = require 'lib.samp.events'


function sampev.onServerMessage(color, text)
    if text:find("Слово в чате") then
        lua_thread.create(function()
        wait(10)
        sampSendChat("Твой ответ")
        end)
    end
end
 
  • Нравится
Реакции: Deniska.lua

Fott

Простреленный
3,470
2,387
Попробуй эти id https://www.blast.hk/wiki/lua:sampsendgivedamage

Зачем getBodyPartName, когда можно просто: bodypart[id] - id это ключ, а вернет он значение. Это же основы массивов LUA. Почитать можно тут
Во,эти иды норм

Да ладно,мне кажется роли не играет это getBodyPartName, но вот когда добавил и инфу о получении урона,то в момент смерти я просто так и остаюсь с 0 хп
и все как будто замедленно в 1000 раз,но чат работает нормально
Lua:
local weapons = require 'game.weapons'
local samp = require 'samp.events'

bodypart = {'торс',  'пах',  'левая рука',  'правая рука',  'левая нога',  'правая нога', 'голова'}

function samp.onSendGiveDamage(playerId, damage, weapon, bodypart)
    sampAddChatMessage('Ты нанес '..math.floor(damage)..' урона игроку '..sampGetPlayerNickname(playerId)..'['..playerId..'] в '..getBodyPartName(bodypart)..' применив '..weapons.get_name(weapon), -1)
end
function samp.onSendTakeDamage(playerId, damage, weapon, bodypart)
     sampAddChatMessage('Ты получил '..math.floor(damage)..' единиц урона в '..getBodyPartName(bodypart)..'  от игрока '..sampGetPlayerNickname(playerId)..'['..playerId..'] от оружия - '..weapons.get_name(weapon), -1)
end
--P.S math.floor(value) -> округление числа, что бы не писало например 46.674563456346456

function getBodyPartName(bodypart) -- возможно немного костыльная функция получения названия части тела по иду
    if bodypart == 3 then
         return 'торс'
        end
    if bodypart == 4 then
        return 'пах'
         end
    if bodypart == 5 then
        return 'левую руку'
    end
       if bodypart == 6 then
        return 'правую руку'
    end
         if bodypart == 7 then
        return 'левую ногу'
    end

    if bodypart == 8 then
        return 'правую ногу'
    end
        if bodypart == 9 then
        return 'голову'
    end
end
 
Последнее редактирование:

Domino

Участник
326
15
Подскажите в чём беда
Lua:
[ML] (error) Roulette: A:\GTA 120K BY DAPO SHOW\moonloader\roulette.lua:104: bad argument #1 to 'pairs' (table expected, got nil)
stack traceback:
    [C]: in function 'pairs'
    A:\GTA 120K BY DAPO SHOW\moonloader\roulette.lua:104: in function <A:\GTA 120K BY DAPO SHOW\moonloader\roulette.lua:100>
[ML] (error) Roulette: Script died due to error. (1221B054)
 

Fott

Простреленный
3,470
2,387
Как сделать чтобы при вызове имгуи окна на команду не появлялся курсор
 

Tak

Известный
178
70
Подскажите в чём беда
Lua:
[ML] (error) Roulette: A:\GTA 120K BY DAPO SHOW\moonloader\roulette.lua:104: bad argument #1 to 'pairs' (table expected, got nil)
stack traceback:
    [C]: in function 'pairs'
    A:\GTA 120K BY DAPO SHOW\moonloader\roulette.lua:104: in function <A:\GTA 120K BY DAPO SHOW\moonloader\roulette.lua:100>
[ML] (error) Roulette: Script died due to error. (1221B054)
Пытается читать массив, но находит nil
 
  • Нравится
Реакции: Domino

Tak

Известный
178
70
Попроще , пожалуйста. Что конкретно нужно найти?)
Массив (набор каких-то значений, слов), в коде на 104 строке. Код пытается начать перебирать его ( pairs() ), но там пусто, а когда пусто - ошибка
Посмотри что это за переменная в pairs( тут ) на 104 строке, и попробуй проследить ее путь
 

Fott

Простреленный
3,470
2,387
проблема с функцией
function samp.onSendTakeDamage(playerId, damage, weapon, bodypart)
После смерти все становится медленным и у всех я стаю в афк,пока в меня не выстрелят еще один дополнительный раз,в чем может быть проблема?


Как сделать вывод функций onSendGiveDamage(playerId, damage, weapon, bodypart) и onSendTakeDamage(playerId, damage, weapon, bodypart) не в sampAddChatMessage,а в имгуи
 
Последнее редактирование: