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

Moorich

Потрачен
96
11
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
onApplyPlayerAnimation от SAMP.lua не видит анимацию когда игрока красят с балончика ( задыхается и пятится назад ), это не анимация совсем?
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,931
1,301
onApplyPlayerAnimation от SAMP.lua не видит анимацию когда игрока красят с балончика ( задыхается и пятится назад ), это не анимация совсем?
Это не сервер устанавливает анимацию отдышки, проверяй другой функцией
 
  • Нравится
Реакции: Eugene Crabs

_razor

t.me/sssecretway | ТГК: t.me/razor_code
Всефорумный модератор
1,952
3,230
onApplyPlayerAnimation от SAMP.lua не видит анимацию когда игрока красят с балончика ( задыхается и пятится назад ), это не анимация совсем?
Можно получить анимацию из OnFoot синхры или просто стандартными функциями
 

#Rewzeisch

Известный
120
10

Ты не понял вопроса, мне нужно лишь число людей которые в зоне стрима, а не перебор ников и id
 

Izvinisb

Известный
Проверенный
963
600
На код глянь, мне нужно задать ини число 0

Lua:
for k,v in ipairs(getAllChars()) do
    id = v
    nick = sampGetPlayerNickname(id)
    sampAddChatMessage(nick..'['..id..']')
end
Не будет пахать, ид это не хендл.
Ты не понял вопроса, мне нужно лишь число людей которые в зоне стрима, а не перебор ников и id
Два варианта: /how
Lua:
local state = false

function main()
   while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("how", HOW)
    wait(-1)
end

local countA = 0
local countB = 0

function HOW()
    state = not state
    if state then
        sampAddChatMessage('Включен', -1)
        local peds = getAllChars()
        local countA = #peds
        print(countA)      
    --[[
        for i, v in ipairs(peds) do
            if doesCharExist(v) and v ~= PLAYER_PED then -- Не считаем себя
                local _, id = sampGetPlayerIdByCharHandle(v) -- Не считаем NPC - ботов
                if _ then                
                    countB = countB + 1
                end
            end
        end
        print(countB)
        countB = 0
      ]]
        state = false
    end
end
 

qrlk

Известный
Друг
411
930
Как можно узнать сколько памяти игры занимает тот или иной скрипт и вообще возможно ли это?
 

Eugene Crabs

Активный
544
30
На код глянь, мне нужно задать ини число 0

Lua:
for k,v in ipairs(getAllChars()) do
    id = v
    nick = sampGetPlayerNickname(id)
    sampAddChatMessage(nick..'['..id..']')
end
Тогда вообще хз, код я так и не понял :- )

Ребят, есть вопрос чутка из геометрии. Есть короч отрезок. И есть определенное число, которое является длиной. Нужно из одной точки отрезка пустить эту длину и сделать так, чтобы она второй точкой ложилась на отрезок. Я пока не знаю как это делать, мы только до умножения и долей дошли
 

lorgon

Известный
656
272
Как можно узнать сколько памяти игры занимает тот или иной скрипт и вообще возможно ли это?
Не уверен в правильности лично для тебя. Но на просторах интернета нашёл функцию:
Lua:
function fsize (file)
        local current = file:seek()      -- get current position
        local size = file:seek("end")    -- get file size
        file:seek("set", current)        -- restore position
        return size
end
А вот путь до скрипта можешь и сам найти:
script.list()
Доп. инфа
 

qrlk

Известный
Друг
411
930
Не уверен в правильности лично для тебя. Но на просторах интернета нашёл функцию:
Lua:
function fsize (file)
        local current = file:seek()      -- get current position
        local size = file:seek("end")    -- get file size
        file:seek("set", current)        -- restore position
        return size
end
А вот путь до скрипта можешь и сам найти:
script.list()
Доп. инфа
Я имею в виду не размер файла, а размер аллоцированной этим скриптом памяти. Сколько памяти занимают переменные, таблицы и тп. У меня походу течёт память и я не понимаю как это можно отследить в условиях мунлодера.
 
  • Грустно
Реакции: lorgon

Izvinisb

Известный
Проверенный
963
600
upd
Почему происходит краш?
Lua:
sampRegisterChatCommand('findp', function(arg)
        if arg == '' then
            sampAddChatMessage('{FF0000}[Ошибка] {FF8C00}Укажите корректный ИД.', 0xFFFF0000)
        else
            if sampIsPlayerConnected(arg) then
                lua_thread.create(function()
                    for k,v in ipairs(getAllChars()) do
                        res, id_pres = sampGetPlayerIdByCharHandle(v)
                        nick_pres = sampGetPlayerNickname(id_pres)
                        if res then
                            if id == arg then
                                local posX, posY, posZ = getCharCoordinates(v)
                                local pPosX, pPosY, pPosZ = getCharCoordinates(PLAYER_PED)
                                if getDistanceBetweenCoords3d(posX, posY, posZ, pPosX, pPosY, pPosZ) <= 200.0 then
                                    wait(0)
                                    local wPosX, wPosY = convert3DCoordsToScreen(posX, posY, posZ)
                                    renderDrawBoxWithBorder(wPosX - 65 / 2, wPosY - 60, 65, 120, 0x00FFFFFF, 2, 0xFF40E0D0)
                                    sampAddChatMessage('{FF0000}[INFO] {FF8C00}Преступник '..nick_pres..'['..id_pres..'] - найден, выделен боксом', 0xFFFF0000)
                                end
                            end
                        end
                    end
                end)
            else
                sampAddChatMessage('{FF0000}[Ошибка] {FF8C00}Игрок не в сети.', 0xFFFF0000)
            end
        end
    end)
Почему работает только на одну машину?
Lua:
sampRegisterChatCommand('collizion', function()
        colz = not colz
        if colz then
            for k,v in ipairs(getAllVehicles()) do
                veh = storeCarCharIsInNoSave(playerPed)
                if isCharInAnyCar(PLAYER_PED) then
                    setCarCollision(v, false)
                    setCarCollision(veh, true)
                end
            end
        end
    end)
в 11 строке проблемка, там переменная id откуда-то появилась.
Lua:
if id == arg then
 

Izvinisb

Известный
Проверенный
963
600
Спасибо что подметил, исправил, но краш - остался
Криво слегка работает, но работает. я хз как оно должно быть😧
Lua:
function main()
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('Загружен', -1)
    sampRegisterChatCommand('findp', function(arg) state = not state
   
        if arg == nil then
         sampAddChatMessage('{FF0000}[Ошибка] {FF8C00}Укажите корректный ИД.', 0xFFFF0000)
        else
       
        if state then
            if sampIsPlayerConnected(arg) then
                lua_thread.create(function()
                    local peds = getAllChars()
                    for k, v in ipairs(peds) do
                        if doesCharExist(v) and v ~= PLAYER_PED then
                        res, id_pres = sampGetPlayerIdByCharHandle(v)
                        if res then
                            nick_pres = sampGetPlayerNickname(id_pres)
                            --if id_pres == arg then
                                local posX, posY, posZ = getCharCoordinates(v)
                                local pPosX, pPosY, pPosZ = getCharCoordinates(PLAYER_PED)
                                if getDistanceBetweenCoords3d(posX, posY, posZ, pPosX, pPosY, pPosZ) <= 200.0 then
                                    wait(0)
                                    local wPosX, wPosY = convert3DCoordsToScreen(posX, posY, posZ)
                                    renderDrawBoxWithBorder(wPosX - 65 / 2, wPosY - 60, 65, 120, 0x00FFFFFF, 2, 0xFF40E0D0)
                                    sampAddChatMessage('{FF0000}[INFO] {FF8C00}Преступник '..nick_pres..'['..id_pres..'] - найден, выделен боксом', 0xFFFF0000)
                                end
                            --end
                            end
                        end
                    end
                end)
            else
                sampAddChatMessage('{FF0000}[Ошибка] {FF8C00}Игрок не в сети.', 0xFFFF0000)
            end
        end
        end
    end)
    wait(-1)
end
 

#Rewzeisch

Известный
120
10
Как сделать так чтобы метка серверная убиралась скриптом когда перс подбегает или забегает в нее?


Lua:
--- Основа есть, но вот с условиями затрудняюсь

raknetEmulRpcReceiveBitStream(37, bs)
raknetDeleteBitStream(bs)
sampAddChatMessage("checkpoint has been deleted.", -1)
 

Yepremyan

Новичок
2
0
Я создал фейк чат но что-то не работает можете помочь?


Код:
script_name("RankUpTheScript")

script_author("Vro")

require "lib.moonloader"



function main()

    if not isSampfuncsLoaded() or not isSampLoaded() then return end

    while not isSampAvailable() do wait(100) end

  sampRegisterChatCommand("fmed", fchat)

 

        wait(0)

        if isKeyDown(VK_CONTROL) then

            if isKeyJustPressed(VK_NUMPAD0) then

                sampSendEnterVehicle(65535, false)

                local bs = raknetNewBitStream()

                raknetEmulPacketReceiveBitStream(PACKET_DISCONNECTION_NOTIFICATION, bs)

                raknetDeleteBitStream(bs)

            end

        end

    end

end





function fmed(arg)

    if not arg:match("(.-)%s+(.*)") then

        sampAddChatMessage("{AFAFAF}/fmed [ник игрока] [сумма]", #00CDCE)

       return

    end

    arg1, = arg:match("(.-)%s+(.*)")

    sampAddChatMessage("eeefefef " ..arg1.. " Вы выдали мед.карту " , #00CDCE)

end
 
Последнее редактирование:

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,931
1,301
Я создал фейк чат но что-то не работает можете помочь?


Код:
script_name("RankUpTheScript")

script_author("Vro")

require "lib.moonloader"



function main()

    if not isSampfuncsLoaded() or not isSampLoaded() then return end

    while not isSampAvailable() do wait(100) end

  sampRegisterChatCommand("fmed", fchat)



        wait(0)

        if isKeyDown(VK_CONTROL) then

            if isKeyJustPressed(VK_NUMPAD0) then

                sampSendEnterVehicle(65535, false)

                local bs = raknetNewBitStream()

                raknetEmulPacketReceiveBitStream(PACKET_DISCONNECTION_NOTIFICATION, bs)

                raknetDeleteBitStream(bs)

            end

        end

    end

end





function fmed(arg)

    if not arg:match("(.-)%s+(.*)") then

        sampAddChatMessage("{AFAFAF}/fmed [ник игрока] [сумма]", #00CDCE)

       return

    end

    arg1, = arg:match("(.-)%s+(.*)")

    sampAddChatMessage("eeefefef " ..arg1.. " Вы выдали мед.карту " , #00CDCE)

end
1585599220516.png
запятую убери