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

EndoHokage

Активный
136
55
Поместил request.get(url) в бесконечный цыкл, мне нужно новые сообщения в телеге проверять, игра фризит при каждом запросе, как это можно исправить?
Lua:
function bottake()
    while true do
        wait(500)
        local info = requests.get(url)
    end
end

--url у меня выше обьявлена
Заранее спасибо
 

HarlyCloud

Потрачен
238
67
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как сделать через самп луа, чтоб не работал определённый пикап, или когда заходишь в определённую инту и что то происходило??
 

Dragynovv

Известный
257
209
Поместил request.get(url) в бесконечный цыкл, мне нужно новые сообщения в телеге проверять, игра фризит при каждом запросе, как это можно исправить?
Lua:
function bottake()
    while true do
        wait(500)
        local info = requests.get(url)
    end
end

--url у меня выше обьявлена
Заранее спасибо
насколько я знаю,она фризит не надолго,максимум секунды 2,при любом реквесте через эту залупу будет фризить,хоть время узнавай
 

Firus20016

Участник
148
15
Как записать таблицу в текстовый файл?
1581904209735.png
 

Quasper

Известный
835
354
Как записать таблицу в текстовый файл?
Посмотреть вложение 49603
использовать inicfg. На бх вики есть описание
с кодом что-то не так, скинь код так не очень ясна проблема, это невозможно решить пока мы не знаем в чем дело
С кодом всё в порядке, это сама библиотека requests такая, она фризит при любом запросе на несколько секунд потому что работает синхронно(т.е пока не получит ответ от сервера, работа скрипта не продолжится как и игры). Что бы избежать эти нюансы фип сделал функцию и гайд по асинхронным запросам
Поместил request.get(url) в бесконечный цыкл, мне нужно новые сообщения в телеге проверять, игра фризит при каждом запросе, как это можно исправить?
Lua:
function bottake()
    while true do
        wait(500)
        local info = requests.get(url)
    end
end

--url у меня выше обьявлена
Заранее спасибо
используй асинхронные запросы(в разделе луа есть тема с гайдом)
 
Последнее редактирование:
  • Нравится
Реакции: Firus20016 и Mamory

danrom

Новичок
1
0
Что вообще такое хендл? Я просто полный ноль и нихера не знаю.
 

HarlyCloud

Потрачен
238
67
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как сделать через самп луа, чтоб не работал определённый пикап, или когда заходишь в определённую инту и что то происходило??
 

Angr

Известный
291
99
Что вообще такое хендл? Я просто полный ноль и нихера не знаю.
Информация о тебе в сампе.

Как сделать через самп луа, чтоб не работал определённый пикап, или когда заходишь в определённую инту и что то происходило??
Посмотри в модификациях/читах, либо в интернете: «анти-казино»

Как через луа закрыть окно от .sf и .asi?
Он с ними не работает
Как записать таблицу в текстовый файл?
Посмотреть вложение 49603
Попробуй
 
Последнее редактирование:

deridane

Известный
7
0
Создаю диалог, шобы ввести туда id с которым буду взаимодействовать. Как получить этот id?, или вообще текст, что вводится в диалог?
Lua:
if list == 3 and button == 1 then
        
           sampShowDialog(228, "Хей бандит,", "Введи id того, кого хочешь связать, сладкий", "Оки", "Закрыть", 1)
        
        end
        local result, button,list, idknifebyid = sampHasDialogRespond(228)
        if result and not button == 1 then
           local NickNameknifebyid = sampGetPlayerNickname(idknifebyid)
           sampSendChat("/me резким движением руки достал нож")
           wait(500)
           sampSendChat("/todo не двигайся сучонок, иначе перережу тебе горло* подставив нож к "..NickNameknifebyid)
        end
Такой код у меня, не работает

Форсил вики, так и не понял как получить вводимый текст..
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,907
1,282
Что вообще такое хендл?
Указатель на что либо
Как сделать через самп луа, чтоб не работал определённый пикап, или когда заходишь в определённую инту и что то происходило??
Lua:
function events.onSendPickedUpPickup(id)
if id == нужный айди then
  sampAddChatMessage("123", -1)
  return false
end
end
Создаю диалог, шобы ввести туда id с которым буду взаимодействовать. Как получить этот id?, или вообще текст, что вводится в диалог?
Lua:
if list == 3 and button == 1 then
      
           sampShowDialog(228, "Хей бандит,", "Введи id того, кого хочешь связать, сладкий", "Оки", "Закрыть", 1)
      
        end
        local result, button,list, idknifebyid = sampHasDialogRespond(228)
        if result and not button == 1 then
           local NickNameknifebyid = sampGetPlayerNickname(idknifebyid)
           sampSendChat("/me резким движением руки достал нож")
           wait(500)
           sampSendChat("/todo не двигайся сучонок, иначе перережу тебе горло* подставив нож к "..NickNameknifebyid)
        end
Такой код у меня, не работает

Форсил вики, так и не понял как получить вводимый текст..
sampHasDialogRespond нужно использовать в бесконечном цикле, он возвращает 4 аргумента: bool == true если ответ на диалог был отправлен, номер кнопки, номер строки(если стиль диалога с выбором в списке), текст - он тебе и нужен
while true do wait(0) result, button, list, text = sampHasDialogRespond(123) if result and button == 1 then sampAddChatMessage(text, -1) end end
 
  • Влюблен
Реакции: deridane

Moorich

Потрачен
96
11
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Поломал голову, ребят.
Если создать в Imgui 2 Inputtext тогда они заполняются синхронно, а как их разделить не писав ничего в "Ковычки", оставить их пустые.
типо:

(ковычки именно пустые)
Lua:
imgui.InputText(" ", text_one)
imgui.InputText(" ", text_two)
Если писать в один из их, то заполняются оба.
как их разделить? Причем первый перестает работать, а второй когда заполняешь, заполняется и первый.

Не понимаю как разделять их,самый тупой способ до которого додумался, в ковычки в первый InputText 1 пробел, во второй 2 пробела. Но проблема в том что пробелы отображаются как символы и получается не ровно, а надо оставить именно пустые ковычки или без отображения.
 
Последнее редактирование:

Jora2412

Новичок
12
0
Lua:
require "lib.moonloader"
local sampev = require "lib.samp.events"

function sampev.onServerMessage(color, text)
    if text:find('Собеседование в радиоцентр СФ завершилось') then
        sampSendChat("/new")
        sampAddChatMessage("Отмените набор или назначьте время нового.", 0x007DFF)
        return false
    end
end
всё работает, но есть вопрос, при появлении указанного текста в чате, он там не отображается, это можно как-то исправить?
 

Anton Nixon

Активный
474
48
Lua:
require "lib.moonloader"
local sampev = require "lib.samp.events"

function sampev.onServerMessage(color, text)
    if text:find('Собеседование в радиоцентр СФ завершилось') then
        sampSendChat("/new")
        sampAddChatMessage("Отмените набор или назначьте время нового.", 0x007DFF)
        return false
    end
end
всё работает, но есть вопрос, при появлении указанного текста в чате, он там не отображается, это можно как-то исправить?
Там где return убрать false
Поломал голову, ребят.
Если создать в Imgui 2 Inputtext тогда они заполняются синхронно, а как их разделить не писав ничего в "Ковычки", оставить их пустые.
типо:

(ковычки именно пустые)
imgui.InputText(" ", text_one)
imgui.InputText(" ", text_two)
Если писать в один из их, то заполняются оба.
как их разделить? Причем первый перестает работать, а второй когда заполняешь, заполняется и первый.

Не понимаю как разделять их,самый тупой способ до которого додумался, в ковычки в первый InputText 1 пробел, во второй 2 пробела. Но проблема в том что пробелы отображаются как символы и получается не ровно, а надо оставить именно пустые ковычки или без отображения.
Вообще в ковычках указывается название для твое поля InputText, которое пишется справа от этого поля, если оно тебе не нужно, то в ковычках указываешь ## и любой текст
Lua:
imgui.InputText(u8'##text', text_one)
А вообще ты переменные создавал для этих инпутов?
Вот тебе тема, разбирайся)) ТЫК
 
Последнее редактирование:
  • Нравится
Реакции: Moorich

Moorich

Потрачен
96
11
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Там где return убрать false

Вообще в ковычках указывается название для твое поля InputText, которое пишется справа от этого поля, если оно тебе не нужно, то в ковычках указываешь ## и любой текст
Lua:
imgui.InputText(u8'##text', text_one)
Спасибо большое, это конечно костыльно, но фиксит мою проблему, надо главное чтобы текст в каждом был разный)) если будет одинаковый баг останется.