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

accord-

Потрачен
436
79
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Это:
?
Да, спасиб
 
D

deleted-user-139653

Гость
я вообще ничего не трогал, оно крашить начало😐
log:
fuckpass.lua: opcode '0432' call caused an unhandled exception
stack traceback:
    [C]: in function 'getCharInCarPassengerSeat'
    C:\Games\ARIZONA GAMES\bin\Arizona\moonloader\fuckpass.lua:30: in function 'getPassengersInCurrentCar'
    C:\Games\ARIZONA GAMES\bin\Arizona\moonloader\fuckpass.lua:7: in function <C:\Games\ARIZONA GAMES\bin\Arizona\moonloader\fuckpass.lua:2>
[12:10:24.068783] (error)    fuckpass.lua: Script died due to an error. (4646C364)
Такая же проблема была, по непонятной причине код переставал работать через некоторое время.
 

Julimba

Участник
108
10
qq, вопросики по mimgui
1) Возможно ли как то сделать какую то деталь отдельным цветом?
К примеру separator, можно ли сделать, чтобы SeparatorRed выдавал красную полоску, а SeparatorWhite белую полоску?

2) Как изменить длину того же самого separator в определенном месте
заранее спасибо
 

chromiusj

$IWishYouSweetDreams
Модератор
5,734
4,027
Возможно ли как то сделать какую то деталь отдельным цветом?
 
  • Нравится
Реакции: Julimba

Carl_Henderson

Участник
35
8
Помогите, дайте код чтобы при входе в игру писал "[HB]: Добро пожаловать" желательно с комментариями
 
  • Ха-ха
Реакции: Sadow

Sanchez.

Известный
705
189
Помогите, дайте код чтобы при входе в игру писал "[HB]: Добро пожаловать" желательно с комментариями
Lua:
require 'lib.moonloader'

function main() -- функция, которая вызывается при запуске скрипта
    while not isSampAvailable() do wait(0) end
   
    sampAddChatMessage('[HB] Добро пожаловать!', -1) -- выводим сообщение в чат (первый аргумент - сообщение, которое выведется, -1 - белый цвет)

    while true do
        wait(0)
       
    end
end
советую тебе посмотреть thechampguess, там основа есть
 

Carl_Henderson

Участник
35
8
Lua:
require 'lib.moonloader'

function main() -- функция, которая вызывается при запуске скрипта
    while not isSampAvailable() do wait(0) end
  
    sampAddChatMessage('[HB] Добро пожаловать!', -1) -- выводим сообщение в чат (первый аргумент - сообщение, которое выведется, -1 - белый цвет)

    while true do
        wait(0)
      
    end
end
советую тебе посмотреть thechampguess, там основа есть
Спасибо огромное, а можно чтобы надпись [HB] была синей?
 

Carl_Henderson

Участник
35
8
И можете помочь ещё кое с чем? Я не понимаю как сделать так чтобы при надписи в чат /cc выводилась какая либо надпись, помогите с кодом тоже желательно прокомментировал всё
 
  • Эм
Реакции: YarikVL

YarikVL

Известный
Проверенный
4,744
1,815
Я не понимаю как сделать так чтобы при надписи в чат /cc
выводилась какая либо надпись
Можно выводить через:
Или через:
помогите с кодом тоже желательно прокомментировал всё
Раздел сделать всё за тебя:
 

Julimba

Участник
108
10
qq, вопрос такой на засыпку.
Представим ситуацию, у меня хукается чат и все сообщения, которые хукаются идут в mimgui, как мне сделать в mimgui, чтобы каждая новая хукнутая строчка шла друг под другом, а не заменяла прошлую строку
 

YarikVL

Известный
Проверенный
4,744
1,815
qq, вопрос такой на засыпку.
Представим ситуацию, у меня хукается чат и все сообщения, которые хукаются идут в mimgui, как мне сделать в mimgui, чтобы каждая новая хукнутая строчка шла друг под другом, а не заменяла прошлую строку
В событии добавляй значение text в таблицу:
table.insert(t, text)

А в mimgui выводи через цикл for значения таблицы.
 

Julimba

Участник
108
10
В событии добавляй значение text в таблицу:
table.insert(t, text)

А в mimgui выводи через цикл for значения таблицы.
Где то я допустил ошибку, хелп плз

Lua:
local hook = require 'lib.samp.events'

local killeR = { -- Создал таблицу
   
}

-- newframe

for k,v in pairs(killeR) do
    imgui.Text(k, v)
end

function hook.onPlayerDeathNotification(killerId, killedId, reason) -- хукает килл лист
    if isGameWindowForeground() and not isPauseMenuActive() and not isGamePaused() and killerId ~= 65534 and killerId ~= nil then
        local nickK = sampGetPlayerNickname(killerId)
        table.insert(killeR, nickK)
    end
end

Сама ошибка:

[ML] (error) mimusGUIS.lua: C:\Users\User\Desktop\kichiro\moonloader\mimusGUIS.lua:154: bad argument #1 to 'Text' (cannot convert 'number' to 'const char *')
stack traceback:
[C]: in function 'Text'
C:\Users\User\Desktop\kichiro\moonloader\mimusGUIS.lua:154: in function '_draw'
...sers\User\Desktop\kichiro\moonloader\lib\mimgui\init.lua:107: in function <...sers\User\Desktop\kichiro\moonloader\lib\mimgui\init.lua:91>
[ML] (error) mimusGUIS.lua: Script died due to an error. (0175F1AC)
 

YarikVL

Известный
Проверенный
4,744
1,815
Где то я допустил ошибку, хелп плз

Lua:
local hook = require 'lib.samp.events'

local killeR = { -- Создал таблицу
  
}

-- newframe

for k,v in pairs(killeR) do
    imgui.Text(k, v)
end

function hook.onPlayerDeathNotification(killerId, killedId, reason) -- хукает килл лист
    if isGameWindowForeground() and not isPauseMenuActive() and not isGamePaused() and killerId ~= 65534 and killerId ~= nil then
        local nickK = sampGetPlayerNickname(killerId)
        table.insert(killeR, nickK)
    end
end

Сама ошибка:

[ML] (error) mimusGUIS.lua: C:\Users\User\Desktop\kichiro\moonloader\mimusGUIS.lua:154: bad argument #1 to 'Text' (cannot convert 'number' to 'const char *')
stack traceback:
[C]: in function 'Text'
C:\Users\User\Desktop\kichiro\moonloader\mimusGUIS.lua:154: in function '_draw'
...sers\User\Desktop\kichiro\moonloader\lib\mimgui\init.lua:107: in function <...sers\User\Desktop\kichiro\moonloader\lib\mimgui\init.lua:91>
[ML] (error) mimusGUIS.lua: Script died due to an error. (0175F1AC)
Попробуй заменить это:
imgui.Text(k, v)
На это:
imgui.Text(k.." "..v)

Может еще нужно будет u8 юзать если у тебя русский текст.
 
  • Нравится
Реакции: Julimba