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

TSIDEX

Известный
83
8
Помогите вывести несколько ников из одного параметра ini в код пожалуйста. Дайте знать как это оформить правильно, кавычки со скобками иник отказывается читать.

Что необходимо с несколькими никами -
Ини файл:
INI:
[dost]
lvl1 = {"Tsidex_Test", "Tsidex_Tsidex"}
Нужный код:
Код:
local ts = inicfg.load(nil, "test")
nicks = ts.dost.lvl1

Рабочий вариант, в случае которого иник читается лишь с 1 ником -
Ини:
INI:
[dost]
lvl1 = Tsidex_Test
Код:
Код:
local ts = inicfg.load(nil, "test")
nicks = {"" ..ts.dost.lvl1.. ""}
 

weiSez

Участник
48
2
здарова, может кто помочь с 3д текстом?
задача: сделать для скрипта функцию чтобы когда игрок писал /callsign *текст* то у него визуально появлялся 3д текст, закреплённый к машине, в которой он сидит. если же игрок не в машине то скрипт ничего делать не будет.
ну и так же если игрок вводит команду, а текст уже присутствует, то он заменяется на новое значение
потому что я догнать вообще не могу как это всё прописать

pzdc:
function callsignzxc(arg)
local _, Vehicle_car = storeCarCharIsIn (PLAYER_PED)
local X,Y,Z = getCharCoordinates(PLAYER_PED)
local result, intid = sampGetVehicleIdByCarHandle (Vehicle_car)
if result then
lua_thread.create(function ()
sampCreate3dText(arg, -1, X, Y, Z, 500, true, -1, Vehicle_car)
end)
end
end
 
Последнее редактирование:

ch1ps

Участник
101
3
при создании актёры через createChar задаётся стиль поведения актёра, я знаю только о 4, какие есть остальные и что они значат?
 

scroll.

bud' chelovekom
Проверенный
4,124
1,374
В одном imgui.PushItemWidth я могу вводить сколько угодно душе символов,в другом огран из - за чего ? ☹️
1654537262620.png

govno:
imgui.Checkbox(u8"Текст", Mtext)
                imgui.SameLine()
                imgui.TextQuestion(u8'Текст')
                if Mtext.v then
                    imgui.SameLine()
                    CursorPos = imgui.GetCursorPos()
                    imgui.SetCursorPos(imgui.ImVec2(150, CursorPos.y))
                     if imgui.CollapsingHeader(u8"Настройки##headerMtext") then
                     imgui.PushItemWidth(175)
                     imgui.InputText(u8"Т", Mtextkey)
                     imgui.SameLine()
                     imgui.TextQuestion(u8"25")
                     imgui.Separator()
                     end
                    end
 

chapo

чопа сребдс
Модератор
8,840
11,505
В одном imgui.PushItemWidth я могу вводить сколько угодно душе символов,в другом огран из - за чего ? ☹️
Посмотреть вложение 151312
govno:
imgui.Checkbox(u8"Текст", Mtext)
                imgui.SameLine()
                imgui.TextQuestion(u8'Текст')
                if Mtext.v then
                    imgui.SameLine()
                    CursorPos = imgui.GetCursorPos()
                    imgui.SetCursorPos(imgui.ImVec2(150, CursorPos.y))
                     if imgui.CollapsingHeader(u8"Настройки##headerMtext") then
                     imgui.PushItemWidth(175)
                     imgui.InputText(u8"Т", Mtextkey)
                     imgui.SameLine()
                     imgui.TextQuestion(u8"25")
                     imgui.Separator()
                     end
                    end
мб у тебя огран в Mtextkey = imgui.ImBuffer?
 
  • Нравится
Реакции: scroll.

sep

Известный
682
76
как сделать так чтобы все видели что я стою на месте но я был на других координатах ? и мог взаимодействовать с чемто
1) тут видно что я тп
function sampev.onSendPlayerSync(data)
data.position =
2) тут невидно всем что я тп но немогу взаимодействовать

код:
    sampRegisterChatCommand('tp1', function()
        active = not active
        if active then
            savedPos = {getCharCoordinates(PLAYER_PED)}
            setCharCoordinates(PLAYER_PED, 505.4677, -2359.3694, 1503.4286)
        else
            setCharCoordinates(PLAYER_PED, savedPos[1], savedPos[2], savedPos[3])
        end
    end)
    wait(-1)
end


function sampev.onSendPlayerSync()
    return not active
end
 

Tensay

Активный
168
52
Возможно ли подкачать необходимый шрифт, если его нет на компьютере. (мне нужен Bilya Layered BASE)
 

sep

Известный
682
76
Возможно ли подкачать необходимый шрифт, если его нет на компьютере. (мне нужен Bilya Layered BASE)
да легко скачай его и залей его в нужные папки
если ты делаешь свой скрипт то вот пример сразу говорю я могу ошибиться или не понять что ты хочешь
код:
if not doesFileExist('путь') then
downloadUrlToFile("https://github.com/ссылка на файл", 'путь')
end
 

quedasdas

Известный
4
0
Не получается сделать, чтобы оно не работало на пассажира, может кто помочь?
[ML] (error) XXXX: opcode '0448' call caused an unhandled exception
stack traceback:
[C]: in function 'isCharSittingInCar'
D:\GTA 140K BY DAPO SHOW\moonloader\XXXX:1366: in function 'callback'
...TA 140K BY DAPO SHOW\moonloader\lib\samp\events\core.lua:79: in function <...TA 140K BY DAPO SHOW\moonloader\lib\samp\events\core.lua:53>
[ML] (error) XXXX: Script died due to an error. (05346604)

Lua:
    if c10.v then
        for k, v in ipairs(getAllChars()) do
            if isCharInAnyCar(PLAYER_PED) then
            car = storeCarCharIsInNoSave(PLAYER_PED)
            local res, vid = sampGetCarHandleBySampVehicleId(car)        
            local res, id = sampGetPlayerIdByCharHandle(v)
            if res and isKeyDown(key.VK_R) and not sampIsChatInputActive() and not sampIsCursorActive() then
                if sampIsPlayerConnected(id) and not sampIsPlayerPaused(id) and not isPlayerDead(id) and not isCharSittingInCar(id, vid) then
                    local res, handle = sampGetCharHandleBySampPlayerId(id)
                    if res then
                        local X, Y, Z = getCharCoordinates(handle)
                        local pX,pY,pZ = getCharCoordinates(PLAYER_PED)
                        if getDistanceBetweenCoords3d(pX,pY,pZ,X,Y,Z) < GetRange.v then
                            name = sampGetPlayerNickname(id)
                            data.position = {X, Y, Z}
                            data.moveSpeed = {GetMoveSpeedx.v, GetMoveSpeedy.v, GetMoveSpeedz.v}
                            data.quaternion[1] = math.random(0, 1)
                            data.quaternion[2] = math.random(0, 1)
                            data.quaternion[3] = math.random(0, 1)
                            printStringNow('~g~[InCar] Troll ALL - ~r~'..name..' Player', 1500)
                        end
                    end
                end
            end
        end
    end
end
 
Последнее редактирование:
  • Bug
Реакции: Odd Enough

Ayaka***

Новичок
20
0
Lua:
require "lib.moonloader"



local sampev = require 'samp.events'



function sampev.onServerMassage(color, text)



 if string.find(text, 'Вы надели аксессуар. Чтобы снять, повторите действие.', 1, true) then



  return false



 end



end
Скрипт загрузился, видно в консоли, но не работает. Что делать?
 

YourAssistant

Участник
144
17
Lua:
require "lib.moonloader"



local sampev = require 'samp.events'



function sampev.onServerMassage(color, text)



 if string.find(text, 'Вы надели аксессуар. Чтобы снять, повторите действие.', 1, true) then



  return false



 end



end
Скрипт загрузился, видно в консоли, но не работает. Что делать?
В string.find только три параметра, и то последний не обязателен.
Lua:
text:find('Вы надели аксессуар. Чтобы снять, повторите действие.')
 

abbv

Потрачен
120
41
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как сделать скриншот экрана игры и сохранить его в нужную мне директорию?
 

JustFedot

Известный
329
329
Утро доброе, как можно перехватить локальное сообщение? (не от сервера)
Задача - Удалить из чата сообщение "Audio stream: " Большое спасибо.
 
Последнее редактирование:

chapo

чопа сребдс
Модератор
8,840
11,505
Утро доброе, как можно перехватить локальное сообщение? (не от сервера)
Задача - Удалить из чата сообщение "Audio stream: " Большое спасибо.
поставь значение audiomsg на false в sa-mp.cfg
или юзай jmp хук
 
  • Ха-ха
  • Влюблен
Реакции: F0RQU1N and и JustFedot