Вопросы по 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
 
Последнее редактирование:
34
0
Скинь весь лог
Код:
[13:46:24.034180] (error)    test: ...ARIZONA GAMES\bin\Arizona\moonloader\test.luac:0: attempt to concatenate global 'nickname' (a nil value)
stack traceback:
    ...ARIZONA GAMES\bin\Arizona\moonloader\test.luac: in function 'callback'
    ...NA GAMES\bin\Arizona\moonloader\lib\samp\events\core.lua:82: in function <...NA GAMES\bin\Arizona\moonloader\lib\samp\events\core.lua:54>
[13:46:24.036178] (error)    test: Script died due to an error. (1228AA14)
 

Izvinisb

Известный
Проверенный
963
600
Код:
[13:46:24.034180] (error)    test: ...ARIZONA GAMES\bin\Arizona\moonloader\test.luac:0: attempt to concatenate global 'nickname' (a nil value)
stack traceback:
    ...ARIZONA GAMES\bin\Arizona\moonloader\test.luac: in function 'callback'
    ...NA GAMES\bin\Arizona\moonloader\lib\samp\events\core.lua:82: in function <...NA GAMES\bin\Arizona\moonloader\lib\samp\events\core.lua:54>
[13:46:24.036178] (error)    test: Script died due to an error. (1228AA14)
Я тебе ответил выше, не спи
 

CaJlaT

07.11.2024 14:55
Модератор
2,836
2,674
Как боту задать идти на определение координаты?
 

черный кот

Известный
167
184
Почему не работает функция? Передаю в аргументы данные таблицы, типа mainIni.test
Lua:
function switchSettings(func)
    if not func then
        func = true
    else
        func = false
    end
end
 

Biuti

Участник
165
8
ка сделать что бы скрипт сам понимал то что перед ним нужное диалоговое окно? Типо как autopass
 

astynk

Известный
Проверенный
741
532
Почему не работает функция? Передаю в аргументы данные таблицы, типа mainIni.test
Lua:
function switchSettings(func)
    if not func then
        func = true
    else
        func = false
    end
end
Аргумент func существует только внутри функции, и его замена никак не влияет на таблицу.
Lua:
function switchParam(name)
    mainIni[name] = not mainIni[name]
end

switchParam('test') -- переключит значение mainIni.test
 
  • Нравится
Реакции: черный кот

Rei

Известный
Друг
1,616
1,674
Аргумент func существует только внутри функции, и его замена никак не влияет на таблицу.
Lua:
function switchParam(name)
    mainIni[name] = not mainIni[name]
end

switchParam('test') -- переключит значение mainIni.test
а можно ли как-то передать аргументом bool переменную, чтобы так же можно было переключить, не используя ини?
 

enyag

Известный
345
12
как сделать чередование эмулирования нажатий клавиш?
 

_Benya_

Участник
82
37
а можно ли как-то передать аргументом bool переменную, чтобы так же можно было переключить, не используя ини?
Зачем передавать ? Создай глобальную bool переменную и используй её в любых функциях.
ка сделать что бы скрипт сам понимал то что перед ним нужное диалоговое окно? Типо как autopass
Если диалог серверный
Проверяй по ID диалога, либо по заголовку.
 

Biuti

Участник
165
8
Зачем передавать ? Создай глобальную bool переменную и используй её в любых функциях.

Если диалог серверный
Проверяй по ID диалога, либо по заголовку.
мне нужна функция что бы скрипт определял то что именно в это окно нужно вводить символы, по типу того как сделан autopassword
 

_Benya_

Участник
82
37
мне нужна функция что бы скрипт определял то что именно в это окно нужно вводить символы, по типу того как сделан autopassword
  • Узнай ID нужного тебе серверного диалога
  • Проверяй на открытия этот именно диалог, если открыт нужный, выполняй свой код.
Самый простой пример:
Lua:
if sampIsDialogActive(555) then  --- 555 это ID диалога
    -- твой код
end
 
  • Нравится
Реакции: Biuti