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

Andrinall

Известный
701
518
Нет, ты как раз не указал цвет.... скопируй текст из moonloader.log
Благодарю за указание на цвет.. И представить не мог, что это влияет на результат в string.match() . В саму строку, получаемую клиентом, понятное дело.
1592492019483.png
 

AnWu

Известный
Всефорумный модератор
4,778
5,405
пацаны есть такой луа или клео чтоб выключал гос новостей, рацию, вип чат, рекламы, эфири СМИ, действия админов, короче всё кроме обычного чата и чтоб всё было по командам тоест если я хочу выключить только гос новости там напишу /gosoff типо можете такое что-то сделать?
Это тема не поиска скриптов. Тебе в раздел помощи GTA.
 

SHARLYBUTTOM

Известный
597
118
Как сделать что бы можно было деактивировать скрипт на команду такую же как и активация?
 

SHARLYBUTTOM

Известный
597
118
Код:
local ev = require('lib.samp.events')
act = false
local tag = "[WH]"
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
sampAddChatMessage(tag.. " Loaded", -1)
    sampRegisterChatCommand('lwh', function()
        act = not act
        if act then
            printStringNow("~y~WH:~y~ ~g~ON~g~", 1000)
        else
            printStringNow("~y~WH:~y~ ~g~OFF~g~", 1000)
        end
     end)
    while true do
        wait(0)
    end
end


function sampev.onCreate3DText(id, col, pos, dist, los, plid, vehid, text)
    if text:find('Лён') then
        return {id, col, pos, 200, false, plid, vehid, text}
    end
end

function sampev.onCreate3DText(id, col, pos, dist, los, plid, vehid, text)
    if text:find('Хлопок') then
        return {id, col, pos, 200, false, plid, vehid, text}
    end
end



В чём моя ошибка?
 

Rei

Известный
Друг
1,616
1,676
как хукать сообщения от других скриптов?
sampGetChatString
Код:
local ev = require('lib.samp.events')
act = false
local tag = "[WH]"
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
sampAddChatMessage(tag.. " Loaded", -1)
    sampRegisterChatCommand('lwh', function()
        act = not act
        if act then
            printStringNow("~y~WH:~y~ ~g~ON~g~", 1000)
        else
            printStringNow("~y~WH:~y~ ~g~OFF~g~", 1000)
        end
     end)
    while true do
        wait(0)
    end
end


function sampev.onCreate3DText(id, col, pos, dist, los, plid, vehid, text)
    if text:find('Лён') then
        return {id, col, pos, 200, false, plid, vehid, text}
    end
end

function sampev.onCreate3DText(id, col, pos, dist, los, plid, vehid, text)
    if text:find('Хлопок') then
        return {id, col, pos, 200, false, plid, vehid, text}
    end
end



В чём моя ошибка?
а что скрипт делать-то должен?
 
  • Нравится
Реакции: Tranzit

Anton Nixon

Известный
474
48
Код:
local ev = require('lib.samp.events')
act = false
local tag = "[WH]"
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
sampAddChatMessage(tag.. " Loaded", -1)
    sampRegisterChatCommand('lwh', function()
        act = not act
        if act then
            printStringNow("~y~WH:~y~ ~g~ON~g~", 1000)
        else
            printStringNow("~y~WH:~y~ ~g~OFF~g~", 1000)
        end
     end)
    while true do
        wait(0)
    end
end


function sampev.onCreate3DText(id, col, pos, dist, los, plid, vehid, text)
    if text:find('Лён') then
        return {id, col, pos, 200, false, plid, vehid, text}
    end
end

function sampev.onCreate3DText(id, col, pos, dist, los, plid, vehid, text)
    if text:find('Хлопок') then
        return {id, col, pos, 200, false, plid, vehid, text}
    end
end



В чём моя ошибка?
Lua:
local ev = require('lib.samp.events')
act = false
local tag = "[WH]"
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
sampAddChatMessage(tag.. " Loaded", -1)
    sampRegisterChatCommand('lwh', function()
        act = not act
        if act then
            printStringNow("~y~WH:~y~ ~g~ON~g~", 1000)
        else
            printStringNow("~y~WH:~y~ ~g~OFF~g~", 1000)
        end
     end)
    while true do
        wait(0)
    end
end


function sampev.onCreate3DText(id, col, pos, dist, los, plid, vehid, text)
    if text:find('Лён') then
        return {id, col, pos, 200, false, plid, vehid, text}
    end
    if text:find('Хлопок') then
        return {id, col, pos, 200, false, plid, vehid, text}
    end
end
 

CaJlaT

07.11.2024 14:55
Модератор
2,840
2,673
Как сделать что бы можно было деактивировать скрипт на команду такую же как и активация?
добавить глобальную переменную и переключать её
Lua:
local active = false

--в команде
active = not active

--там, где должно работать/не работать
if active then
 

Pu$$y

Участник
80
2
Can you make string.find absolute? For example, I want it to find "Meth" ONLY, If I use find.string it finds "Methmanol" too for example, any word that has "Meth" will be found, how to disable that?
 

Rei

Известный
Друг
1,616
1,676
Тип ВХ на Лён и Хлопок с далека.
тебе скорее всего сервак не будет издалека отправлять его
если у этой херни помимо 3д текста появляется еще и текстурка растения, то можешь просто свой 3д текст создавать на ее месте, а серверный в ретёрн фолз закидывать
 

Youngever

Известный
22
1
Хотелось бы что бы скрипт выполнял эту функцию с моим актёром. Как это сделать? Я глупый.
Код:
local car = storeCarCharIsInNoSave(PLAYER_PED)
    result, s = sampGetVehicleIdByCarHandle(car)
     BS = raknetNewBitStream()
     raknetBitStreamWriteInt32(BS, s)
     raknetBitStreamWriteInt32(BS, -1)
     raknetBitStreamWriteInt32(BS, -1)
     raknetBitStreamWriteInt32(BS, 4)
     raknetSendRpc(96, BS)
     raknetDeleteBitStream(BS)
 

Anton Nixon

Известный
474
48
Вот рабочий варик, но как по мне лучше в диалог записывать админов, а не в чат...
Lua:
sampRegisterChatCommand("checker", function()
    local admins = {} -- создание пустого массива
    file = io.open(getGameDirectory() .. "\\moonloader\\config\\checker\\checker.ini", "r+")
    for line in file:lines() do
        local nick, lvl = line:match('(.+) (%d+)')
        admins[#admins+1] = {nick = nick, lvl = lvl} -- заполнение массива
    end
    file:close()
    table.sort(admins, function(a, b) return tonumber(a.lvl) > tonumber(b.lvl) end) -- сортировка списка по лвл админки
    for k, v in pairs(admins) do
        sampAddChatMessage(v.nick..' ('..v.lvl..')', color_checker.admin[tonumber(v.lvl)]) -- вывод в чат
    end
end)
Переделал код под рендер, сейчас выводит только последнюю строчку из файла, как сделать чтобы все выводилось?
Содержимое ini файла:
Код:
Anton_Nixon 6
Petya_Vasechkin 5
Ivan_Ivanov 4
Sasha_Petrov 3
Pavel_Tereshkin 2
Dasha_Kirushina 1
Итог, как оно выходит:
sa-mp-002.png

Сам код:
Lua:
require "lib.moonloader"
require "lib.sampfuncs"
local inicfg = require 'inicfg'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local key = require 'vkeys'

local show_check = false

local color_checker = {
    admin = {
        [1]="2dbae0",
        [2]="2dbae0",
        [3]="8612b8",
        [4]="2e4ebf",
        [5]="34eb5b",
        [6]="009122",
    },
    leader = {
        [1]="0xe5ff00",
        [2]="0x0011ff",
        [3]="0x943915",
        [4]="0xff54f1",
        [5]="0xff7817",
        [6]="0x007a0e",
        [7]="0xd80fdb",
        [8]="0xf2c200",
        [9]="0x8f2df7",
        [10]="0x02cccc",
        [11]="0x2e825c",
        [12]="0xc4007c",
        [13]="0xcf0000",
    }
}

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    initializeRender()
    sampAddChatMessage("чекер загружен", -1)
    if not doesDirectoryExist('moonloader\\config\\checker') then createDirectory('moonloader\\config\\checker') end
    sampRegisterChatCommand("checker", function()
       show_check = not show_check
    end)

    while true do
        
        if show_check then
            local admins = {} -- создание пустого массива
            file = io.open(getGameDirectory() .. "\\moonloader\\config\\checker\\checker.ini", "r+")
            for line in file:lines() do
                local nick, lvl = line:match('(.+) (%d+)')
                admins[#admins+1] = {nick = nick, lvl = lvl} -- заполнение массива
            end
            file:close()
            table.sort(admins, function(a, b) return tonumber(a.lvl) > tonumber(b.lvl) end) -- сортировка списка по лвл админки
            for k, v in pairs(admins) do
                --sampAddChatMessage(v.nick..' ('..v.lvl..')', color_checker.admin[tonumber(v.lvl)]) -- вывод в чат
                AdminText = "Администраторы в сети:\n"
                for b = 0, 1001 do
                    if sampIsPlayerConnected(b) then
                        name = sampGetPlayerNickname(b)
                    end
                    adminStreamed = sampGetCharHandleBySampPlayerId(b)
                    adminPaused = sampIsPlayerPaused(b)
                    for i = 1, #admins do
                        if adminPaused then
                            adminList = string.format("{%s}%d. %s[%d] {FF0000}AFK", color_checker.admin[tonumber(v.lvl)], i, v.nick, b) 
                        end
                        if adminStreamed then
                            adminList = string.format("{%s}%d. %s[%d] #", color_checker.admin[tonumber(v.lvl)], i, v.nick, b)
                        else
                            adminList = string.format("{%s}%d. %s[%d]", color_checker.admin[tonumber(v.lvl)], i, v.nick, b)
                        end
                        AdminText = string.format("%s %s\n", AdminText, adminList)
                    end
                    break
                end
            end
            renderFontDrawText(sfont, AdminText, 1120, 400, 0xffffffff)
        end
        wait(0)
    end
end

function initializeRender()
    sfont = renderCreateFont("Arial", 9, 13)
end
 
Последнее редактирование: