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

ewin

Известный
675
369
Шо вы тут развели алёу

Все фигня, давай по новой.

Lua:
-- в начало:

if not doesDirectoryExist("moonloader\\config") then -- создание папки, если ее нет
    createDirectory("moonloader\\config")
end

if not doesFileExist("moonloader\\config\\test.ini") then -- создать ini файл, если отсутствует
    local f = io.open("moonloader\\config\\test.ini", "a")
    f:write(
        "[config]\nconfig1=true\nconfig2=false\nconfig3=nil" -- \n = enter(перенос строки)
    )
    f:close()
end

local inicfg                 = require "inicfg" -- подгрузка библиотеки
local directIni             = "moonloader\\config\\test.ini" -- установка файла, из которого будут браться настройки
local mainIni                 = inicfg.load(nil, directIni)
local stateIni                 = inicfg.save(mainIni, directIni)

-- После того, как вы создали/подгрузили файл с настройками, их можно импортировать в переменную.

--Например:
local popka            = imgui.ImBool(mainIni.config.config1) --true
Всё равно крашится после того как убираю папку(у меня своя папка для хранения конфигов) чтобы проверить будет ли она создаваться.
 

nightaiga

Известный
262
95
Как сделать чтобы при нанесении определённого входящего урона, было действие в виде кнопки или команды
 

Fott

Простреленный
3,436
2,280
Как сделать чтобы при нанесении определённого входящего урона, было действие в виде кнопки или команды
Lua:
require('samp.events').onSendGiveDamage = function(playerId, damage, weapon, bodypart)
    if damage == 34 then --вместо 34 кол-во урона
        sampSendChat('/fuck') -- вместо /fuck свою команду
    end
end
 
  • Нравится
Реакции: nightaiga

NoName_001

Участник
152
20
Всё равно крашится после того как убираю папку(у меня своя папка для хранения конфигов) чтобы проверить будет ли она создаваться.
N:/.../папка с гта - пкм - свойства - безопасность - изменить - галочку на разрешить у "запись"(или изменения, точного названия не помню) на всех пользователей. Ещё можно убрать атрибут "только для чтения". Попробуй выписать строки создания папки в другой скрипт.
 

neverlane

t.me/neverlane00
Друг
998
1,133
как сделать создание ини кфг файла если он отсутствует? + аналогично с переменными (я на рукожопил и мне приходится отправлять ини кфг с имеющимися переменными и папками, а это не даёт сделать автообновление)
я так вижу тебе никто нормально не может помочь
Lua:
--подключаем либу для взаимодействия с INI
local inicfg = require('inicfg')

--создаем стандартную таблицу с настройками
local defIni = {
    config = {
        enable = false,
        posx = 123,
        posy = 321
    }
}
--название файла с настройками.
--примичание:
--    если хочешь сделать настройки не в папке конфиг делай так: "../папка_с_настройками/название.ini"
local inifile = 'scriptsettings.ini'
-- папка, где будет хранится ini файл с настройками
local inifolderpath = 'moonloader//config'
if not doesDirectoryExist(inifolderpath) then -- если нет папки
    createDirectory(inifolderpath) -- создадим папку
end
--попробуем загрузить ini файл с настройками, если его не будет, будут стандартные настройки которые мы указали выше
local mainIni = inicfg.load(defIni,inifile)
-- ну и сохраним файл, на всякий если его не будет
inicfg.save(mainIni,inifile)
 
Последнее редактирование:
  • Нравится
Реакции: kreyN

Володя111

Новичок
7
0
Подскажите метод который проверяет включен ли чат или нет типа когда я набираю текст в клаве в чат чтобы скрипт не срабатывал когда чат открыт
 

kizn

О КУ)))
Всефорумный модератор
2,404
2,060
ещё 1 вопрос как нажать на кнопку например Z и чтобы в чат вывелось сообщение например о активации скрипта?
Lua:
local act = false
require 'lib.moonloader'

function main()
while not isSampAvailable() do wait(0) end
while true do wait(0)
if isKeyJustPressed(VK_Z) then
act = not act
sampAddChatMessage(act and 'Скрипт включен!' or 'Скрипт выключен!', -1)
end
if act then
-- твой скрипт
end
    end
end
 

enyag

Известный
345
12
как сделать чтобы скрипт брал номер серийника и отправлял его в таблицу вместе с ником?
 

SamCamino

Участник
33
1
Извините, а как узнать заведен ли двигатель машины, если игрок сидит на водительском месте. Если поможите большое спасибо)
 
Последнее редактирование модератором:

wulfandr

Известный
637
260
Извините, а как узнать заведен ли двигатель машины, если игрок сидит на водительском месте. Если поможите большое спасибо)




можно лукос, я стараюсь ведь🙃
цитаты by SC
Lua:
Ped ped = getDriverOfCar(Vehicle car) -- возврат водителя по машине
bool state = isCarEngineOn(Vehicle car) -- проверка включен ли двигатель
 
  • Нравится
Реакции: SamCamino

NoName_001

Участник
152
20
я так вижу тебе никто нормально не может помочь
Lua:
--подключаем либу для взаимодействия с INI
local inicfg = require('inicfg')

--создаем стандартную таблицу с настройками
local defIni = {
    config = {
        enable = false,
        posx = 123,
        posy = 321
    }
}
--название файла с настройками.
--примичание:
--    если хочешь сделать настройки не в папке конфиг делай так: "../папка_с_настройками/название.ini"
local inifile = 'scriptsettings.ini'
-- папка, где будет хранится ini файл с настройками
local inifolderpath = 'moonloader//config'
if not doesDirectoryExist(inifolderpath) then -- если нет папки
    createDirectory(inifolderpath) -- создадим папку
end
--попробуем загрузить ini файл с настройками, если его не будет, будут стандартные настройки которые мы указали выше
local mainIni = inicfg.load(defini,inifile)
-- ну и сохраним файл, на всякий если его не будет
inicfg.save(mainIni,inifile)
А почему у меня строчка inicfg.save(mainIni,inifile)(если ее закомментировать, то все ок) выдает вечную загрузку скрипта(loading script name ... в консоли)?
Lua:
require 'lib.moonloader'
local inicfg = require('inicfg')

--создаем стандартную таблицу с настройками
local defIni = {
    config = {
        enable = false,
        posx = 123,
        posy = 321
    }
}
--название файла с настройками.
--примичание:
--    если хочешь сделать настройки не в папке конфиг делай так: "../папка_с_настройками/название.ini"
local inifile = 'scriptsettings.ini'
-- папка, где будет хранится ini файл с настройками
local inifolderpath = 'moonloader//config'
if not doesDirectoryExist(inifolderpath) then -- если нет папки
    createDirectory(inifolderpath) -- создадим папку
end
--попробуем загрузить ini файл с настройками, если его не будет, будут стандартные настройки которые мы указали выше
local mainIni = inicfg.load(defini,inifile)
-- ну и сохраним файл, на всякий если его не будет
inicfg.save(mainIni,inifile)
function main()
    repeat wait(0) until isSampAvailable() and isSampfuncsLoaded()
    while true do
        wait(0)
    end
end
PS: настройки, как я понял, записываются в несуществующий файл, а сам он не создается.


И еще, получается при каждом включении скрипта перезаписываются настройки?
 

NoName_001

Участник
152
20
Какой метод вводит в чат сообщение
Lua:
sampSendChat('text') -- отправить сообщение в чат
sampProcessChatInput('текст')-- что и первое, но можно использовать команды из других скриптов
sampAddChatMessage('text', -1) -- вывести сообщение (локальное) в чат