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

shrug228

Активный
212
77
Почему при использовании script.load игра зависает?
Lua:
                local newScript = script.load("D:\\SAMP_CHEATS\\moonloader\\resource\\ENG_v3.55_VisualAccessories_by_chapo_v3.55.lua")
                if newScript == nil then
                    print('script '..toLoad[i]..' was not loaded :(')
                else
                    print(newScript.filename..' loaded!')
                end
Использовать, как аргумент просто название скрипта без пути пробовал?
 

meowprd

Тот самый Котовский
Проверенный
1,297
736
да. Даже если сделать так, то все работает норм:
Lua:
    sampfuncsRegisterConsoleCommand('loadlua', function(arg)
        script.load(arg)
    end)
а так игра зависает

*** Скрытый текст не может быть процитирован. ***
Дома буду, закину код, гляну твой за одно
 
  • Влюблен
Реакции: chapo

chapo

tg/inst: @moujeek
Всефорумный модератор
9,238
12,671
Использовать, как аргумент просто название скрипта без пути пробовал?
мне надо загружать скрипты не из папки moonloader, прочитай мой ответ выше (через вызов функции через консоль все работает), проблема не в пути
 

W1ll04eison

Известный
330
19
Почему не выводит количество ответов, дату и т.д?
По типу:
Дата Ответы PayDay Зарплата
12.12.2021 12 14 420000
Всего: Ответы: 12 PayDay: 14 Зарплата: 420000


А выводит только лишь в окне imgui вот так:
Дата Ответы PayDay Зарплата

Всего: Ответы: 0 PayDay: 0 Зарплата: 0


Lua:
                local file = io.open('moonloader\\config\\ASupport\\pm.ini', "r")
                local data, dataText, payday, strData, aHour, aOtvet = {}, {}, {}, "", 0, 0
                if file ~= nil then
                    for line in file:lines() do
                        if string.find(line, "%[(.+)|.+%] PayDay") then
                            local S1 = string.match(line, "%[(.+)|.+%] PayDay")
                            if payday[S1] ~= nil then
                                payday[S1] = payday[S1] + 1
                            else
                                payday[S1] = 1
                            end
                            aHour = aHour + 1
                        end
                        if string.find(line, "%[(.+)|.+%] .."..myName.."%[%d+%] to .+%[%d+%]: .+") then
                            local S1, S2 = string.match(line, "%[(.+)|.+%] ..("..myName.."%[%d+%] to .+%[%d+%]: .+)")
                            if strData == S1 then
                                data[#data] = data[#data] + 1
                            else
                                strData = S1
                                data[#data + 1] = 1
                                dataText[#data] = S1
                            end
                            aOtvet = data[#data] + 1
                        end
                    end
                    io.close(file)   
                    
                    Dntext = ''
                    for k, v in pairs(data) do
                        if payday[dataText[k]] == nil then payday[dataText[k]] = 0 end
                        Dntext = string.format("%s\t%s\t%s\t%s\n%s", dataText[k], data[k], payday[dataText[k]], (payday[dataText[k]] * 30000))
                    end
                    Dntext = "Дата\tОтветы\tPayDay\tЗарплата\n"..Dntext..'\nВсего:\tОтветы: '..aOtvet..'\tPayDay: '..aHour..'\tЗарплата: '..(aHour * 30000)
                end
                
                
                
                
                imgui.Text(u8(Dntext)) --- находится в окне imgui
 

YourAssistant

Участник
145
17
что это должно делать вообще? в чем суть?
Переменной присваивается последняя строка из чата, в ней ищется образец соответствующий паттерну, если обнаруживается - помещается в mark_patrol(i), если строка меняется и образец отличается, то он помещается в mark_patrol(i + 1) и так далее.
 

meowprd

Тот самый Котовский
Проверенный
1,297
736
да. Даже если сделать так, то все работает норм:
Lua:
    sampfuncsRegisterConsoleCommand('loadlua', function(arg)
        script.load(arg)
    end)
а так игра зависает

*** Скрытый текст не может быть процитирован. ***

Скрытое содержимое для пользователя(ей): chapo


1639431133853.png


для урона обработчик onSendTakeDamage
 
  • Нравится
Реакции: shrug228 и chapo

meowprd

Тот самый Котовский
Проверенный
1,297
736
нет, ранее эти же скрипты не были загружены. завтра попробую, спасибо
в идеале, если ты это будешь куда-то добавлять в скрипты, то добавь проверку на созданную директорию и загрузку скрипта, смог ли он загрузиться
 

MAHEKEH

Известный
2,002
503
как правильно юзать эту функцию
Lua:
bool result = isPlayerDead(Player player)
?
то есть мне нужно проверить что мой персонаж живой, до этого я использовал так
Lua:
if isPlayerDead(PLAYER_PED)
либо так
Lua:
if not isPlayerDead(PLAYER_PED)
( если не живой )
только потом заметил что это вообще не работает