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

tor1

Известный
171
46
Может кто сделать скрипт? Когда персонаж встает на указанные координаты, то отправляет в чат сообщение. Координаты и сообщение потом сам впишу. Пробовал сделать, но выходит коряво. Спасибо
/coords X Y Z -- активация, если нужны статичные координаты - сам поправишь
/coords -- принудительная деактивация
Немного изменил, сделал чтобы искало постоянно, а не по команде, после того как нейдет - выведет текст и выключится
 

Вложения

  • coords.lua
    890 байт · Просмотры: 8
Последнее редактирование:

FakeSince

Активный
226
50
Хочу сделать автологин на отправке пакета. Нашел слив какого-то мода этого проекта, получил что при авторизации игроку нужно заполнить просто строку password (ниже код pawn), как правильно сделать отправку на сервер 215 пакета с данными password?
Код:
            } else if (strcmp(call, "OnPlayerStartLogin") == 0) {

                new
                    password[64 + 1];

                BS_IgnoreBits(bs, 40);
                BS_ReadString32(bs, password);

                #if defined OnPlayerStartLogin
                    OnPlayerStartLogin(playerid, password);
                #endif
 

kidstuff

Известный
13
9
Как сделать проверку на наличие записи в mysql через luasql?
Lua:
local mysql = require "luasql.mysql"

local env = assert(mysql.mysql())
local con = assert(env:connect("db", "root", "root", "localhost"))

function sql()
    if assert(con:execute([[SELECT EXISTS(SELECT count FROM `123` WHERE number = 3)]])) then
        res = assert(con:execute([[UPDATE `123` SET count = count + 1 WHERE number = 3]]))
    else
        res = assert(con:execute([[INSERT INTO `123` (`count`, `number`) VALUES (3, 3)]]))
    end
end
Условие не работает, выполняется код только после if, после else не выполняется. Код для примера
 

moreveal

Известный
988
723
как можно узнать что именно в луашнике вызывает краш игры? вылеты происходят спонтанно (во всяком случае я не смог проследить никакой закономерности) и, разумеется, не беспокоят, если на время убрать луашник из папки - из чего делаю вывод, что проблема в нем, лог муна чистый, крашлог.аси ругается на lua51.dll

Как сделать проверку на наличие записи в mysql через luasql?
Lua:
local mysql = require "luasql.mysql"

local env = assert(mysql.mysql())
local con = assert(env:connect("db", "root", "root", "localhost"))

function sql()
    if assert(con:execute([[SELECT EXISTS(SELECT count FROM `123` WHERE number = 3)]])) then
        res = assert(con:execute([[UPDATE `123` SET count = count + 1 WHERE number = 3]]))
    else
        res = assert(con:execute([[INSERT INTO `123` (`count`, `number`) VALUES (3, 3)]]))
    end
end
Условие не работает, выполняется код только после if, после else не выполняется. Код для примера
проверять количество возвращённых строк - cur:numrows() > 0
https://keplerproject.github.io/luasql/manual.html тут можешь найти все, что тебе нужно

ну и мой добрый совет - не юзай мускул в скрипте, ну ряльно, вскрывается кем угодно и чел, который хочет, дропнет тебе таблицу нахуй; лучше использовать запросы к своему серверу, благо бесплатных хостингов много - также, не помню названия, но есть хостинг за 30р/мес, если интересует - позже скажу название, знания в php требуются минимальные, также могу дать рабочий пример
более того, если чел стоит долго в афк, а в скрипте активное подключение - выход из афк может затянуться до 10-12 секунд, т.к. переподключение занимает много времени; раньше пытался пофиксить, вроде кое как смог поддерживать соединение активным, но уже забыл, поэтому не помогу :(
связаться в вк можем если чо
 
Последнее редактирование:

chapo

tg/inst: @moujeek
Всефорумный модератор
9,235
12,655
как узнать/изменить скролл многострочного инпута в имгуи или мимгуи?
 

W1ll04eison

Известный
330
19
1)Подскажите, почему если я напишу свой id, к примеру: /id 12 или же часть своего ника, к примеру: /id gabr, то скрипт ничего не выводит.
2)Также, подскажите, почему если игрока нет на сервере под определенным id'om или же под определенным ником, то скрипт не выводит вот эту строку:
'sampAddChatMessage('Игрок не найден', -1)'

Сам код:
lua:
    sampRegisterChatCommand('id', function(pam)
                if #pam ~= 0 then
                    for id, nick in pairs(getAllIds()) do
                        if string.lower(nick):find(string.lower(pam)) then
                            if sampIsPlayerConnected(id) then
                                local score = sampGetPlayerScore(id)
                                local nick = sampGetPlayerNickname(id)
                                sampAddChatMessage('*  Ник:{FFFFFF} ' ..nick:gsub(pam, "{00BFFF}"..pam.."{FFFFFF}").. ' {00BFFF}| ID:{FFFFFF} ' ..id.. " {00BFFF}| Уровень:{FFFFFF} " ..score, 0x00BFFF)
                            else
                                sampAddChatMessage('Игрок не найден', -1)
                            end
                        end
                        if id == tonumber(pam) then
                            if sampIsPlayerConnected(tonumber(pam)) then
                                local score = sampGetPlayerScore(id)
                                local nick = sampGetPlayerNickname(id)
                                sampAddChatMessage('*  Ник:{FFFFFF} ' ..nick.. ' {00BFFF}| ID:{FFFFFF} ' ..id.. " {00BFFF}| Уровень:{FFFFFF} " ..score, 0x00BFFF)
                            else
                                sampAddChatMessage('Игрок не найден', -1)
                            end
                        end
                    end
                else
                    sampAddChatMessage("Ты что с ума сошел? Где Переменная после '/id'???", -1)

                end
    end)
 
    --вне main
    function getAllIds()
    local table = {}
    for i = 0, 1000 do
        if sampIsPlayerConnected(i) and sampGetPlayerNickname(i) then
            table[i] = sampGetPlayerNickname(i)
        end
    end
    return table
end
 

moreveal

Известный
988
723
1)Подскажите, почему если я напишу свой id, к примеру: /id 12 или же часть своего ника, к примеру: /id gabr, то скрипт ничего не выводит.
потому что эта функция не работает на локального игрока, проверяй другими способами
 

tor1

Известный
171
46
Привет, могу ли я как-то удалить объект из рук персонажа (мешок), сбросить/уронить его никак не получается