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

Sadow

Известный
1,427
592
хз, попробуй в аргумент кнопки ввести nil
Я уже нашёл. -1 писать. Но как можно видеть то что ввёл человек в диалог? А то не работает.
Код:
[ML] (error) test.lua: D:\Games\morty summer low\moonloader\test.lua:305: attempt to concatenate global 'input' (a nil value)
stack traceback:
    D:\Games\morty summer low\moonloader\test.lua:305: in function 'callback'
    ...mes\morty summer low\moonloader\lib\samp\events\core.lua:80: in function <...mes\morty summer low\moonloader\lib\samp\events\core.lua:54>
[ML] (error) test.lua: Script died due to an error. (23FED4D4)
 

whyega52

Eblang головного мозга
Модератор
2,839
2,779
ок

объясните пж как сделать курд, открывал скрипты, нихуя не понял
курдмастер?
нашел на компе вот такой
Lua:
function CoordMaster(px, py, pz, step, time)
    local x, y, z = getCharCoordinates(PLAYER_PED) -- твои коорды
    local d = getDistanceBetweenCoords3d(px, py, pz, x, y, z) -- дистанция до метки
    if d <= step then -- если дистанция меньше длины шага
        setCharCoordinates(PLAYER_PED, px, py, pz) -- тп тебя на метку
    else -- если дистанция больше длины шага

        local dx, dy, dz = px - x, py - y, pz - z
        x = x + step / d * dx
        y = y + step / d * dy
        z = z + step / d * dz
        setCharCoordinates(PLAYER_PED, x, y, z) -- телепортируешь себя
        wait(time) -- задержка в тп
        CoordMaster(px, py, pz, step, time)
    end
end
 
  • Нравится
Реакции: XRLM

whyega52

Eblang головного мозга
Модератор
2,839
2,779
Почему начали крашить скрипты, где есть проверка на афк?
Код:
[19:48:18.455478] (error)    UncRvnaka: opcode '0B5C' call caused an unhandled exception
stack traceback:
    [C]: in function 'sampIsPlayerPaused'
    C:\ВАЖНОЕ!!!\сборка софт\moonloader\unc.lua:51: in function <C:\ВАЖНОЕ!!!\сборка софт\moonloader\unc.lua:36>
stack traceback:
    [C]: in function 'create'
    C:\ВАЖНОЕ!!!\сборка софт\moonloader\unc.lua:36: in function 'callback'
    ...АЖНОЕ!!!\сборка софт\moonloader\lib\samp\events\core.lua:79: in function <...АЖНОЕ!!!\сборка софт\moonloader\lib\samp\events\core.lua:53>
[19:48:18.461473] (error)    UncRvnaka: Script died due to an error. (0B0FDEB4)
 

ARMOR

Мне кажется, я всё проебал
Модератор
5,018
7,093
Почему начали крашить скрипты, где есть проверка на афк?
Код:
[19:48:18.455478] (error)    UncRvnaka: opcode '0B5C' call caused an unhandled exception
stack traceback:
    [C]: in function 'sampIsPlayerPaused'
    C:\ВАЖНОЕ!!!\сборка софт\moonloader\unc.lua:51: in function <C:\ВАЖНОЕ!!!\сборка софт\moonloader\unc.lua:36>
stack traceback:
    [C]: in function 'create'
    C:\ВАЖНОЕ!!!\сборка софт\moonloader\unc.lua:36: in function 'callback'
    ...АЖНОЕ!!!\сборка софт\moonloader\lib\samp\events\core.lua:79: in function <...АЖНОЕ!!!\сборка софт\moonloader\lib\samp\events\core.lua:53>
[19:48:18.461473] (error)    UncRvnaka: Script died due to an error. (0B0FDEB4)
Кириллицу из названия папок в пути к игре убери
 

Sadow

Известный
1,427
592
Я уже нашёл. -1 писать. Но как можно видеть то что ввёл человек в диалог? А то не работает.
Код:
[ML] (error) test.lua: D:\Games\morty summer low\moonloader\test.lua:305: attempt to concatenate global 'input' (a nil value)
stack traceback:
    D:\Games\morty summer low\moonloader\test.lua:305: in function 'callback'
    ...mes\morty summer low\moonloader\lib\samp\events\core.lua:80: in function <...mes\morty summer low\moonloader\lib\samp\events\core.lua:54>
[ML] (error) test.lua: Script died due to an error. (23FED4D4)
Я смог решить проблему)

Как сделать проверку на резкую смену координат?
 

whyega52

Eblang головного мозга
Модератор
2,839
2,779
как сделать такую синхру как в курдах/рванках, тип для себя ты на месте стоишь, а для других хуяришь куда нибудь?
В место setcharcoord делай через data.position

Типа такого
Lua:
function sendPacketSync(posX,posY,posZ) -- создаем функцию, в которой мы будем указывать что мы хотим отправить
    local data = samp_create_sync_data("player") -- с помощью функции Фипа объявляем объект data структуры stOnFootData
    data.position = {posX,posY,posZ - 0.7} -- обращаемся к data и указываем массив с координатами, на которых мы будем находиться для сервера
    data.quaternion[2] = math.random(0.00, 1.00) -- ставим рандомный кватернион вращения по Y для нашего персонажа
    data.moveSpeed = {0,0,1} -- устанавливаем мувспид по Z - 1, чтобы наш пед взлетал вверх из под игрока
    data.send() -- отправляем пакет на сервер
end

function samp_create_sync_data(sync_type, copy_from_player) -- функция Фипа
    local ffi = require 'ffi'
    local sampfuncs = require 'sampfuncs'
    local raknet = require 'samp.raknet'
    require 'samp.synchronization'
    copy_from_player = copy_from_player or true
    local sync_traits = {
        player = {'PlayerSyncData', raknet.PACKET.PLAYER_SYNC, sampStorePlayerOnfootData},
        vehicle = {'VehicleSyncData', raknet.PACKET.VEHICLE_SYNC, sampStorePlayerIncarData},
        passenger = {'PassengerSyncData', raknet.PACKET.PASSENGER_SYNC, sampStorePlayerPassengerData},
        aim = {'AimSyncData', raknet.PACKET.AIM_SYNC, sampStorePlayerAimData},
        trailer = {'TrailerSyncData', raknet.PACKET.TRAILER_SYNC, sampStorePlayerTrailerData},
        unoccupied = {'UnoccupiedSyncData', raknet.PACKET.UNOCCUPIED_SYNC, nil},
        bullet = {'BulletSyncData', raknet.PACKET.BULLET_SYNC, nil},
        spectator = {'SpectatorSyncData', raknet.PACKET.SPECTATOR_SYNC, nil}
    }
    local sync_info = sync_traits[sync_type]
    local data_type = 'struct ' .. sync_info[1]
    local data = ffi.new(data_type, {})
    local raw_data_ptr = tonumber(ffi.cast('uintptr_t', ffi.new(data_type .. '*', data)))
    if copy_from_player then
        local copy_func = sync_info[3]
        if copy_func then
            local _, player_id
            if copy_from_player == true then
                _, player_id = sampGetPlayerIdByCharHandle(PLAYER_PED)
            else
                player_id = tonumber(copy_from_player)
            end
            copy_func(player_id, raw_data_ptr)
        end
    end
    local func_send = function()
        local bs = raknetNewBitStream()
        raknetBitStreamWriteInt8(bs, sync_info[2])
        raknetBitStreamWriteBuffer(bs, raw_data_ptr, ffi.sizeof(data))
        raknetSendBitStreamEx(bs, sampfuncs.HIGH_PRIORITY, sampfuncs.UNRELIABLE_SEQUENCED, 1)
        raknetDeleteBitStream(bs)
    end
    local mt = {
        __index = function(t, index)
            return data[index]
        end,
        __newindex = function(t, index, value)
            data[index] = value
        end
    }
    return setmetatable({send = func_send}, mt)
end
 
Последнее редактирование:

Sadow

Известный
1,427
592
Как сделать проверку на спавн? (Резкую смену координат)