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

Kryptik

Участник
38
2
Так как я не гений, напишу тебе примерно как это выглядит через жопу, а ты там дальше разбирайся)
Lua:
local sampev = require 'lib.samp.events'
require 'lib.sampfuncs'
require "lib.moonloader"

local mathmaster = false

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(10) end
    sampRegisterChatCommand("captures", function() mathmaster = not mathmaster sampAddChatMessage("active", -1) end)
    while true do
    wait(0)
    end
end

function sampev.onServerMessage(clr, txt)
    if mathmaster then
        fnum, task, snum = txt:match("(%d+)%s+(.)%s+(%d+)")
        if fnum ~= nil and snum ~= nil then
            if task == "+" then sampAddChatMessage('result: '..fnum + snum,-1)
            elseif task == "-" then sampAddChatMessage('result: '..fnum - snum,-1)
            elseif task == "/" then sampAddChatMessage('result: '..fnum / snum,-1)
            elseif task == "*" then sampAddChatMessage('result: '..fnum * snum,-1)
            end
        end
    end
end
Посмотреть вложение 69326
в нем есть косяки, но в принципе пойдет)0
А возможно сделать через диалог? к примеру 1+1 в диалоге в котором обычно вводим параметр к примеру репорт
 
Последнее редактирование:
D

deleted-user-210352

Гость
как нибуть можно сделать чтоб при реконекте по нику скрипт крашил игру?
 

kizn

\ 0 _ 0 /
Всефорумный модератор
2,408
2,090
Как использовать fontawesome-иконки в начале текста с 1251 кодировкой?
При imgui.Text(u8''..fa.ICON_FA_CHILD..' Пример') выходит иконка и знак вопроса
Не надо предлагать делать сначала imgui.Text с иконкой, а потом с SameLine нужный текст, при чекбоксе это ломает мои затеи
 

S-Sirius

Известный
351
21
Как получить название части тела в который попал игрок через функцию onSendGiveDamage?(Не ID, а именно часть тела)
 

banan4eg

Известный
47
15
Как использовать fontawesome-иконки в начале текста с 1251 кодировкой?
При imgui.Text(u8''..fa.ICON_FA_CHILD..' Пример') выходит иконка и знак вопроса
Не надо предлагать делать сначала imgui.Text с иконкой, а потом с SameLine нужный текст, при чекбоксе это ломает мои затеи
imgui.Text(fa.ICON_FA_CHILD..u8' Пример')
 
  • Нравится
Реакции: kizn

Hund dev.

Участник
47
2
Помогите разобраться с функцией onShowDialog а именно,
1. Как сделать так, чтобы при открытии диалога скрипт сам выбирал определенную строку, и вводил туда свое значение?
К примеру (Сервера Аризоны)
При открытии скрипта, будет 2 Input Text, куда вводится число и цену за товар, после нажатия кнопки "Начать скупку" скрипт открывал диалог, после чего выбирал "Покупать товар", а после чего находил строку, к примеру "Дерево", а там вводил значения из imgui.InputText
 

banan4eg

Известный
47
15
Помогите разобраться с функцией onShowDialog а именно,
1. Как сделать так, чтобы при открытии диалога скрипт сам выбирал определенную строку, и вводил туда свое значение?
К примеру (Сервера Аризоны)
При открытии скрипта, будет 2 Input Text, куда вводится число и цену за товар, после нажатия кнопки "Начать скупку" скрипт открывал диалог, после чего выбирал "Покупать товар", а после чего находил строку, к примеру "Дерево", а там вводил значения из imgui.InputText
Удивительный сервер, за 7 лет, наверное ни разу не видел диалог с двумя инпут текстами, скинул бы скрин, было бы легче
 

samartinell1

Участник
98
14
А возможно сделать через диалог? к примеру 1+1 в диалоге в котором обычно вводим параметр к примеру репорт
примерно как в том примере, что я кидал. Включайте фантазию, старайтесь делать сами) По ссылке есть пример с инпутом
 

Hund dev.

Участник
47
2
Удивительный сервер, за 7 лет, наверное ни разу не видел диалог с двумя инпут текстами, скинул бы скрин, было бы легче
Нет, вы меня не так поняли. Открывается имгуи меню, и там уже 2 инпут текста.
1600605866309.png

Прикрепляю скрины что должен делать скрипт при нажатии кнопочки
1600605892805.png

он открывал диалог центрального рынка аризоны
1600605371699.png

Чтобы скрипт выбирал покупать товар, дальше
сам вводил название
1600605400197.png

после чего выбирал цвет
1600605426488.png

потом открывал диалог и нажимал "добавить на покупку"
1600605468634.png

и после чего выбирал из этого перечня товар
1600605510269.png

и выставлял цену и кол-во которые были введены в imgui.Input text (С СОХРАНЕНИЕМ В ИНИ!!!)
1600605558554.png

надеюсь понятно обьяснил, я только учусь, а разобрать действие функции не могу
 

Вложения

  • 1600605837316.png
    1600605837316.png
    33.1 KB · Просмотры: 84
Последнее редактирование:

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,808
Как получить название части тела в который попал игрок через функцию onSendGiveDamage?(Не ID, а именно часть тела)
Только создать свою таблицу или массив, и там хранить имена.
1600606065485.png
 
  • Нравится
Реакции: S-Sirius