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

trefa

Известный
Всефорумный модератор
2,097
1,233
Я понимаю, что в коде ниже я написал х?йню, но можно примерно таким же способом создавать таблицы?
Lua:
for i = 1, 3 do
  t..i = {}
  t..i[1] = "ggwp"
end
Таким кодом нет.
Lua:
for i = 1, 3 do
  _G.t[i] = {}
  _G.t[i][1] = "ggwp"
end
Таким да
 

ГОХА | GoxaShow

В АРМИИ С 12.12,ЗАКАЗЫ НЕ ДЕЛАЮ,ТУПЫЕ ВОПРОСЫ-НАХУ
Проверенный
1,871
1,873

trefa

Известный
Всефорумный модератор
2,097
1,233
Lua
Как сделать проверку, что бы когда вводишь команду любую, она не работала, а если после команды есть любой текст, то команда работает.
Пример:
Пишем в чат /n, ничего не происходит, а если написать /n и тут любой текст, то сработает
Lua:
function onSendRpc(id, bs)
    if id == 50 then
        local text = raknetBitStreamReadString(bs, raknetBitStreamReadInt32(bs))
        if #text:match("/%a+(.*)") < 1 then
            sampAddChatMessage("Используй: /"..text:match("/(%a+)").." ....", 0xffcecece)
            return false
        end
    end
end
 

MrCold

Активный
364
118
тут есть примеры, как достать из текста ник на string.gmatch?я наверное то, не просто так тут спросил как это делается
Тк если сука ты не знаешь, почитай, что пишут в интернете! я тебе дал направление, твоё дело, либо самому учиться, либо платить тому, кто выучил это.
Таким кодом нет.
Lua:
for i = 1, 3 do
  _G.t[i] = {}
  _G.t[i][1] = "ggwp"
end
Таким да
attempt to index field 't' (a nil value)
 
Последнее редактирование:

trefa

Известный
Всефорумный модератор
2,097
1,233
Тк если сука ты не знаешь, почитай, что пишут в интернете! я тебе дал направление, твоё дело, либо самому учиться, либо платить тому, кто выучил это.

attempt to index field 't' (a nil value)
Lua:
for i = 1, 3 do
  _G["t"..i] = {}
  _G["t"..i][1] = "ggwp"
end
Вот
 

ГОХА | GoxaShow

В АРМИИ С 12.12,ЗАКАЗЫ НЕ ДЕЛАЮ,ТУПЫЕ ВОПРОСЫ-НАХУ
Проверенный
1,871
1,873
А ты читал хоть что-нибудь оттуда? Паттерны смотрел? Читал про регулярные выражения на Lua?

Раз ты так немощен и ничего не понимаешь в этой жизни - кидай строку 3d текста.
Никакой уважающий себя человек не будет переписывать что-нибудь со скрина.
да, тк я ничего не нашел, решил написать сюда, еще специально написал, что "можно написать или показать как это делается", и что я получаю в итоге?
- "А ТЫ ЗНАЛ ЧТО ЕСТЬ ГУГАЛ В КАТОРАМ МОЖНО ИСКАТЬ, ПОХУЙ НАЙДЕШ ТО ЧО ТЕЬЕ НАДА ИЛИ НЕТ ГЛАВНОЕ ЧТО ИСКАТЬ МОЖНА"
ахуеть можно от такой информации, ты просишь пример как вообще из любого текста можно достать ник с _ , а тебе говорят посмотри паттерны на стринг , которым ты и пользуешьсч впервые
 

FBenz

Активный
328
40
Как сделать так что бы при нажатии сочетаний клавиш, на сервере в чате вводилась команда, но что бы сочетание клавиш можно было настраивать через ini файл
К примеру
В ini файле выставил первую кнопку и вторую, на сервере нажимаю сочетание этих клавиш и вызывается любая команда которая мне нужна
Ну чет типа такого:

Lua:
local inicfg = require 'inicfg'

local wdirect = getWorkingDirectory() -- берем путь к папке со скриптом. То бишь .../moonloader/
local setts = inicfg.load({
   keys = {
      key1 = 81,
      key2 = 69
   }
}, string.format("%s/settings.ini", wdirect)) -- задаем значение ini по умолчанию (если нет файла, если есть, значения будут взяты из него)

function main()
    sampRegisterChatCommand('setKey', saveKey) -- Регаем команду /savekey *id клавиши 1* *id клавиши 2*
    
    while true do -- беск цикл е-майо
     wait(0)
        if isKeyDown(setts.keys.key1) and wasKeyPressed(setts.keys.key2) then
           ---- Твой код, шо тебе там надо при нажатии
        end
    end
end

function saveKey(arg) -- функа для сохранения id клавиш в ini
   local setts.keys.key1, setts.keys.key2 = string.match(arg, '(%d+) (%d+)') -- вытаскиваем из команды айди клавиш и записываем в массив на место значений предыдущих
   inicfg.save(sets, wdirect.."/settings.ini") -- сохраняем в путь *moonloader/settings.ini*
end
На работу не проверял, написал на коленке от балды, проверки на nil и проч сам добавишь.
(Не бейте) :D
 
  • Нравится
Реакции: Albertio

MrCold

Активный
364
118
да, тк я ничего не нашел, решил написать сюда, еще специально написал, что "можно написать или показать как это делается", и что я получаю в итоге?
- "А ТЫ ЗНАЛ ЧТО ЕСТЬ ГУГАЛ В КАТОРАМ МОЖНО ИСКАТЬ, ПОХУЙ НАЙДЕШ ТО ЧО ТЕЬЕ НАДА ИЛИ НЕТ ГЛАВНОЕ ЧТО ИСКАТЬ МОЖНА"
ахуеть можно от такой информации, ты просишь пример как вообще из любого текста можно достать ник с _ , а тебе говорят посмотри паттерны на стринг , которым ты и пользуешьсч впервые
В 99% то, что ты ищешь есть в интернете, ну или на бх. Есть очень много примеров работы с паттернами. Я научился за 1 день, ты может и раньше научишься, если не будешь думать, что кто-то тебе обязан в чём-то.
 

Dmitriy Makarov

25.05.2021
Проверенный
2,481
1,113
на луа пишут скриптецы ток для сампа чтоль?
для каких игра еще можно писать?
 

MrCold

Активный
364
118
Спасибо, конечно, но не подходит, нужно что то другое... но если возможно чеоез samp events, то будет неплохо)
Ну слушай, тут тебе дали очень хороший пример. Если хочешь скрипт - иди плати деньги. Повторяю: ТУТ НИКТО НИКОМУ НИЧЕГО НЕ ОБЯЗАН ДЕЛАТЬ. Эта тема создана для ПОМОЩИ, а не для работ. Запомни это пожалуйста.
 

MrCold

Активный
364
118
Я тебя понимаю, благодарен за помощь этому человеку, но это мне не поможет, намного усложняет мне код, поэтому мне нужна другая помощь
Смотри, ставишь проверку на то, что нажата ли клавиша или нет в бесконечном цикле (isKeyJustPressed(int key) - ID клавиш найдёшь в инете). Потом идёт работа с inicfg (примеров на бх дохуя и больше про неё, но можешь почитать документацию о ней также загуглив). Потом, если клавиши/клавиша была нажата ты используешь sampSendChat("твой текст") для отправки сообщения на сервер. Всё.
 

MrCold

Активный
364
118
А можно ссылочку на примеру из бх или другого источника и да спасибо за объяснение
в правом верхнем углу есть поиск. Гуглишь главные слова, по типу inicfg или т.п. и тебе всё выводит, дальше ручками сам.
 

Akionka

akionka.lua
Проверенный
742
500
на луа пишут скриптецы ток для сампа чтоль?
для каких игра еще можно писать?
Garry's mod, Roblox, World of Warcraft.

Вообще язык этот можно встроить в почти любую игру =) Но кто напишет API...


upd: ещё майнкрафт мод есть opencomputers или чет такое
 
Последнее редактирование:
  • Нравится
Реакции: FBenz

FBenz

Активный
328
40
Не хочу что бы это было через регистрацию команд
Так сделай не через регистрацию, кто мешает
Я тебя понимаю, благодарен за помощь этому человеку, но это мне не поможет, намного усложняет мне код, поэтому мне нужна другая помощь
Негласное правило: "Спасибо = Мне нравится". Какая помощь тебе нужна? Что конкретно тебе не понятно?


Тврщи такой вопрос. Что означает Model pedtype в функции:
Lua:
Ped ped = createCharInsideCar(Vehicle car, Model pedtype, int model)
С int model все ясно - скин. А педтип? Где его взять и как указать?
Или я что-то путаю?))
 
Последнее редактирование:
  • Нравится
Реакции: Albertio