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

kizn

q(≧▽≦q)
Всефорумный модератор
2,406
2,107
Почему-то текст в чате показывается неполностью:
Посмотреть вложение 96470

Вот код:
Lua:
function cmd_minihelp()
     sampAddChatMessage(red .. '[mini commands]' .. yellow .. ' Поиск дома: ' .. white .. '/fh ' .. green .. '[ID]' .. yellow .. '; Поиск бизнеса: ' .. white .. '/fb ' .. green .. '[ID] ааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааа' .. yellow ..
     '; ', -1)
     end
144 символа ограничение (вместе с твоими цветовыми тегами)
 

Tol4ek

Активный
217
56
Есть флаг в мимгуи, чтобы не показывался крестик в правом верхнем углу для закрытия окна?
 

Dmitriy Makarov

25.05.2021
Проверенный
2,508
1,136
Есть флаг в мимгуи, чтобы не показывался крестик в правом верхнем углу для закрытия окна?
В имгуи вторым аргументом imgui.Begin нужно передать nil, скорее всего в mimgui также, попробуй.
imgui.Begin("Title", nil)
 
  • Нравится
Реакции: Tol4ek

VRush

https://t.me/vrushscript
2,416
1,201
Почему-то текст в чате показывается неполностью:
Посмотреть вложение 96470

Вот код:
Lua:
function cmd_minihelp()
     sampAddChatMessage(red .. '[mini commands]' .. yellow .. ' Поиск дома: ' .. white .. '/fh ' .. green .. '[ID]' .. yellow .. '; Поиск бизнеса: ' .. white .. '/fb ' .. green .. '[ID] ааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааа' .. yellow ..
     '; ', -1)
     end
ограничение 150 символов
 

masterslaves

Потрачен
55
14
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Подскажите как переделать, чтобы регулировать размер блипов игроков, этот не пашет
Lua:
require('lib.moonloader')
require 'lib.sampfuncs'
local inicfg = require 'inicfg'
local samp = require 'samp.events'


function main()

 if not isSampLoaded() or not isSampfuncsLoaded() then
 return
 end
 while not isSampAvailable() do wait(100)
 end 
 
 while true do
 wait(0)
 result, ped = sampGetCharHandleBySampPlayerId(id)
  if result then
    local blip = addBlipForChar(ped)
    blip=changeBlipScale(Marker, 1)
  end
 end
end
 

Smeruxa

smeruxa.ru
Проверенный
1,407
754
Подскажите как переделать, чтобы регулировать размер блипов игроков, этот не пашет
Lua:
require('lib.moonloader')
require 'lib.sampfuncs'
local inicfg = require 'inicfg'
local samp = require 'samp.events'


function main()

if not isSampLoaded() or not isSampfuncsLoaded() then
return
end
while not isSampAvailable() do wait(100)
end

while true do
wait(0)
result, ped = sampGetCharHandleBySampPlayerId(id)
  if result then
    local blip = addBlipForChar(ped)
    blip=changeBlipScale(Marker, 1)
  end
end
end
функция не возвращает ничего + ид ничему не равен..
 
Последнее редактирование:

morti.

Участник
63
3
1620587841469.png

Вот у строки где информация про рейс сказано, что заработано за рейс 30.065$, но это значение изменчивое. Как это значение обозначить в коде:
Lua:
function hook.onServerMessage(color, text)
    if string.find(1, text, 'Рейс успешно завершен', true) then
  poleti = poleti + 1
end

  if string.find(1, text, 'заработано за рейс: ', true) then --: число заработка за рейс на скрине
    zarabotok = zarabotok --+(число заработка за рейс)
  end
end

Надеюсь понятно объяснил
 

Smeruxa

smeruxa.ru
Проверенный
1,407
754
Посмотреть вложение 96550
Вот у строки где информация про рейс сказано, что заработано за рейс 30.065$, но это значение изменчивое. Как это значение обозначить в коде:
Lua:
function hook.onServerMessage(color, text)
    if string.find(1, text, 'Рейс успешно завершен', true) then
  poleti = poleti + 1
end

  if string.find(1, text, 'заработано за рейс: ', true) then --: число заработка за рейс на скрине
    zarabotok = zarabotok --+(число заработка за рейс)
  end
end

Надеюсь понятно объяснил
Называется регулярные выражения, писал на счет этого тему - https://www.blast.hk/threads/62661/
Lua:
function samp.onServerMessage(clr, text)
    if text:find("Заработано за рейс: (%d+%.%d+)$") then
        local money = text:match("Заработано за рейс: (%d+%.%d+)$")
    end
end
 

Fomikus

Известный
Проверенный
474
347
Lua:
<div class="map-icon business-state-8 business-not-sale" style="top:984.888px;left:941.849px;background:url(/images/business_0.gif)" title="" data-toggle="tooltip" data-html="true" data-original-title="<div class='text-center'>Аренда транспорта</div>"></div><div class="map-icon business-state-2 business-not-sale" style="top:554.411px;left:1001.988px;background:url(/images/business_0.gif)" title="" data-toggle="tooltip" data-html="true" data-original-title="<div class='text-center'>Магазин 24/7</div>"></div>
<div class="map-icon business-state-8 business-not-sale" style="top:984.888px;left:941.849px;background:url(/images/business_0.gif)" title="" data-toggle="tooltip" data-html="true" data-original-title="<div class='text-center'>Аренда транспорта</div>"></div><div class="map-icon business-state-2 business-not-sale" style="top:554.411px;left:1001.988px;background:url(/images/business_0.gif)" title="" data-toggle="tooltip" data-html="true" data-original-title="<div class='text-center'>Магазин 24/7</div>"></div>

Как сделать цикл для каждого класса, название которого начинается на map-icon
Обычные регулярки возвращают текст между началом класса и последним </div>
Нужно чтобы вернул параметры внутри класса(В примере их два)
Первое -
business-state-8 business-not-sale" style="top:984.888px;left:941.849px;background:url(/images/business_0.gif)" title="" data-toggle="tooltip" data-html="true" data-original-title="<div class='text-center'>Аренда транспорта</div>"></div>

Второе -
business-state-2 business-not-sale" style="top:554.411px;left:1001.988px;background:url(/images/business_0.gif)" title="" data-toggle="tooltip" data-html="true" data-original-title="<div class='text-center'>Магазин 24/7</div>"></div>
Ну или гайд где взять HTML Parser для lua
 

morti.

Участник
63
3
Написал луа который выводит информацию диалога в чат, но не работает, вот лог из moonloader.log
Код:
[00:53:19.758870] (error)    for rio.lua: D:\Games\ARIZONA GAMES\bin\Arizona\moonloader\for rio.lua:2: attempt to call global 'require' (a string value)
stack traceback:
    D:\Games\ARIZONA GAMES\bin\Arizona\moonloader\for rio.lua:2: in main chunk

Код луашника:
Lua:
require = 'lib.moonloader'
local sampev = require 'lib.samp.events'
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
      wait(0)
    end
end

  
function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
sampAddChatMessage(dialogId, -1 )
sampAddChatMessage(style, -1)
sampAddChatMessage(title, -1)
sampAddChatMessage(button1, -1)
sampAddChatMessage(button2, -1)
sampAddChatMessage(text, -1)
 end

Самое забавное, что если первым поставить local sampev = require 'lib.samp.events', а require = 'lib.moonloader' вторым, то все работает. Возникает вопрос, почему не работает вышесказанный код? Почему нужно переставлять местами sampev и require?
 

ROBERT PUSHER

Известный
305
213
Написал луа который выводит информацию диалога в чат, но не работает, вот лог из moonloader.log
Код:
[00:53:19.758870] (error)    for rio.lua: D:\Games\ARIZONA GAMES\bin\Arizona\moonloader\for rio.lua:2: attempt to call global 'require' (a string value)
stack traceback:
    D:\Games\ARIZONA GAMES\bin\Arizona\moonloader\for rio.lua:2: in main chunk

Код луашника:
Lua:
require = 'lib.moonloader'
local sampev = require 'lib.samp.events'
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
      wait(0)
    end
end


function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
sampAddChatMessage(dialogId, -1 )
sampAddChatMessage(style, -1)
sampAddChatMessage(title, -1)
sampAddChatMessage(button1, -1)
sampAddChatMessage(button2, -1)
sampAddChatMessage(text, -1)
end

Самое забавное, что если первым поставить local sampev = require 'lib.samp.events', а require = 'lib.moonloader' вторым, то все работает. Возникает вопрос, почему не работает вышесказанный код? Почему нужно переставлять местами sampev и require?
Зачем ты подключаешь moonloader? В коде он тебе не нужен, проверки на инициализацию можно сократить доrepeat wait(0) until isSampAvailable() and isSampfuncsLoaded(), а while true do wait(0) на wait(-1),ошибка в том, что ты неправильно подключаешь мун, require('moonloader')