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

Pu$$y

Участник
80
2
Lua:
require 'lib.moonloader'
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage("{f62f98}HealthHack", -1)
    while true do
    wait(0)
    local health = getCharHealth(PLAYER_PED)
        if wasKeyPressed(VK_P) and health < 90 then
            health = health + 10
        end
    end
end
Yeah, Thanks, sampRegisterChatCommand was just a typo.


well "health" is only an argument, not the character's health

How so? It's already defined and If it's less than 90 you can use the healthack. That sounds normal to me or am I wrong?
 

James Hawk

Известный
919
218
да, но я попровил код, ведь из-за этого ошибка может быть
Единственная ошибка - неуказание цвета. В остальном код рабочий
L7IEr7I.png
 

EvilCoder

Участник
147
1
короче, биндер сделал на imgui. Как сделать взаимодействие с игроком на ПКМ? ЧТо бы если на человека навел ПКМ, вылезла менюшка с моим биндером. Биндер на F2 активируется
 

James Hawk

Известный
919
218
у него вместо sampAddChatMessage было sampRegisterChatCommand
Странно, видать у меня глаза уже совсем замыленные и я видел тот же текст. Тогда признаю, здесь я неправ

короче, биндер сделал на imgui. Как сделать взаимодействие с игроком на ПКМ? ЧТо бы если на человека навел ПКМ, вылезла менюшка с моим биндером. Биндер на F2 активируется
На первой странице этой темы в стандартных вопросах есть код относительно прицеливания на игрока. Бери часть оттуда и запускай имгуи
 

Pu$$y

Участник
80
2
Health is only your own value, you created it :)
You are changing your own value, not a value from the game
Then this should work normally:
Lua:
require 'lib.moonloader'
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage("{f62f98}HealthHack, -1)
    while true do
    wait(0)
    local oldhealth = getCharHealth(PLAYER_PED)   
        if wasKeyPressed(VK_P) and oldhealth < 90 then
            setCharHealth (PLAYER_PED, oldhealth + 10)
        end
    end
end

But since almost all servers now use server-related health values, It can't work.
 

Di3

Участник
432
20
Че за херня.
Получаю текст с диалога.
Беру нужную строку. Проверяю ее в массиве
Lua:
massiv = {
['че то тут'] = 'и тут тоже',
['че то тут2'] = 'и тут тоже2',
}

if massiv[textstring] then
--code
end
В итоге нихера не работает. Текст без цветовых кодов,пробелов и прочей поеботы. Текст 100% такой какой и в массиве,из за чего может не проходить условие?
 

James Hawk

Известный
919
218
Then this should work normally:
Lua:
require 'lib.moonloader'
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage("{f62f98}HealthHack, -1)
    while true do
    wait(0)
    local oldhealth = getCharHealth(PLAYER_PED)  
        if wasKeyPressed(VK_P) and oldhealth < 90 then
            setCharHealth (PLAYER_PED, oldhealth + 10)
        end
    end
end

But since almost all servers now use server-related health values, It can't work.
Mostly, it depends on your server. But now code is good
 

Kuharz

Известный
407
154
До сих пор нужна хелпа.
Получилось сделать так, что при вызове функции nname в консоль sf пишет все аккаунты из user_name, но мне нужно немного по-другому.
Если текущий ник на сервере совпадает с тем, что в v['user_name'], то мне выводило следующий. Т.е. если я на аккаунт Nick_Name, то мне в print выдавало следующий аккаунт, т.е. Test_Name, далее если мой ник Test_Name, то выдавало следующий - Three_Name
Lua:
function nname ()
    for i, v in ipairs(accounts) do
        if v['server_ip'] == select(1, sampGetCurrentServerAddress()) and v['user_name'] == sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) then
            newname = v['user_name']
            sampSetLocalPlayerName(newname)
            recon = true
    end
                print('Аккаунт № '..i.." "..v['user_name'])
    end
end

Так выглядит accounts
Код:
[{"user_name":"Nick_Name","server_ip":"185.169.134.68","user_password":"123321","gauth_secret":"MTIzNDU2Nzg5MTIz","user_textdrawpass":"1337"},{"user_name":"Test_Name","server_ip":"185.169.134.68","user_password":"321123","user_textdrawpass":"1337","gauth_secret":"MTIzNDU2Nzg5MTIz"},{"user_name":"Three_Name","server_ip":"185.169.134.68","user_password":"321123","user_textdrawpass":"1337","gauth_secret":"MTIzNDU2Nzg5MTIz"}]
 

molimawka

Известный
Друг
443
655
До сих пор нужна хелпа.
Получилось сделать так, что при вызове функции nname в консоль sf пишет все аккаунты из user_name, но мне нужно немного по-другому.
Если текущий ник на сервере совпадает с тем, что в v['user_name'], то мне выводило следующий. Т.е. если я на аккаунт Nick_Name, то мне в print выдавало следующий аккаунт, т.е. Test_Name, далее если мой ник Test_Name, то выдавало следующий - Three_Name
Lua:
function nname ()
    for i, v in ipairs(accounts) do
        if v['server_ip'] == select(1, sampGetCurrentServerAddress()) and v['user_name'] == sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) then
            newname = v['user_name']
            sampSetLocalPlayerName(newname)
            recon = true
    end
                print('Аккаунт № '..i.." "..v['user_name'])
    end
end

Так выглядит accounts
Код:
[{"user_name":"Nick_Name","server_ip":"185.169.134.68","user_password":"123321","gauth_secret":"MTIzNDU2Nzg5MTIz","user_textdrawpass":"1337"},{"user_name":"Test_Name","server_ip":"185.169.134.68","user_password":"321123","user_textdrawpass":"1337","gauth_secret":"MTIzNDU2Nzg5MTIz"},{"user_name":"Three_Name","server_ip":"185.169.134.68","user_password":"321123","user_textdrawpass":"1337","gauth_secret":"MTIzNDU2Nzg5MTIz"}]


Lua:
function nname ()
    for i, v in ipairs(accounts) do
        if v['server_ip'] == select(1, sampGetCurrentServerAddress()) and v['user_name'] == sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) then
            newname = v['user_name']
            sampSetLocalPlayerName(newname)
            recon = true
            if accounts[i+1] then
                print('Next account № '..i+1..' '..accounts[i+1]['user_name'])
            end
        end
        print('Аккаунт № '..i.." "..v['user_name'])
    end
end
 
  • Нравится
Реакции: Kuharz

Kuharz

Известный
407
154
Lua:
function nname ()
    for i, v in ipairs(accounts) do
        if v['server_ip'] == select(1, sampGetCurrentServerAddress()) and v['user_name'] == sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) then
            newname = v['user_name']
            sampSetLocalPlayerName(newname)
            recon = true
            if accounts[i+1] then
                print('Next account № '..i+1..' '..accounts[i+1]['user_name'])
            end
        end
        print('Аккаунт № '..i.." "..v['user_name'])
    end
end
Спасибо.
Как еще добавить оповещение, если следующий ник не найден? Т.е. в конфиге 3 ника и 4-й уже не находит, чтобы написало типо sampAddChatMessage("Больше аккаунтов нет", -1)
 

DeMoN3D

Известный
366
77
Спасибо.
Как еще добавить оповещение, если следующий ник не найден? Т.е. в конфиге 3 ника и 4-й уже не находит, чтобы написало типо sampAddChatMessage("Больше аккаунтов нет", -1)
после восьмой строки(кода, который тебе скинули выше) добавь
Lua:
else
    print('not found')
 
  • Нравится
Реакции: Kuharz