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

madrasso

Потрачен
883
325
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как сделать так, что бы окно сампа мигало? Ну, типо, в панельки..
 

GhettoHack

Новичок
1
0
всем беларусам здарова, кароче, я лох и нуб, но не об этом, все укроинцы и беларусы плес дайте хелп.
Какая функция взаимодействия с другим игроком? я шо то не вкуриваю, ну ка помогите, дай вам урожая в картоху
 

ШPEK

Известный
1,476
525
B
всем беларусам здарова, кароче, я лох и нуб, но не об этом, все укроинцы и беларусы плес дайте хелп.
Какая функция взаимодействия с другим игроком? я шо то не вкуриваю, ну ка помогите, дай вам урожая в картоху
Прочитай отдел "Разработка - Moonloader"
 

Petr_Sergeevich

Известный
Проверенный
707
297
Помогите с регулярками, пожалуйста.

Nickname_13[188]: блабла
[4]Example_X[13]: бла
Nickname[842]: блабла
[123abc]Nickname[61]: русскийтекст

Нужно получить последнее значение в скобках (id), независимо от никнейма.
Если ли ещё варианты получить id игрока, который написал сообщение в чат, кроме парсинга текста?
Ничего лучше этого не придумал(
(((message:match("%S+")):reverse()):match("%d+")):reverse()
Большое спасибо!
 
Последнее редактирование:

samespoon

Известный
163
20
Возможно ли через синхронизацию делать те вещи, которые делают эти функции?
Lua:
    popCarPanel(Vehicle car, int component, bool effectFlag)
    popCarDoor(Vehicle car, int door, bool visible)
И если можно, то через какую именно синхру(Vehicle, Unocuppied и т.д)
Присоединюсь, тоже интересуюсь подобным.

Кто-нибудь знает где можно посмотреть параметры, для использования с этой @FYP-овской функцией?
Lua:
function samp_create_sync_data(sync_type, copy_from_player)
    local ffi = require 'ffi'
    local sampfuncs = require 'sampfuncs'
    -- from SAMP.Lua
    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)))
    -- copy player's sync data to the allocated memory
    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
    -- function to send packet
    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
    -- metatable to access sync data and 'send' function
    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

function tr(arg)
    if arg ~= nil and tonumber(arg) then
        inf = arg
        ttr = not ttr
    end
end
Он выложил только параметры, которые можно использовать только в таких типах данных, как "player", "vehicle" и "bullet"(скорее даже тут не все), но там ведь ещё есть "passenger", "aim", "trailer", "unoccupied", "spectator". Подскажите мне их, пожалуйста.
 

Musaigen

abobusnik
Проверенный
1,603
1,361
Присоединюсь, тоже интересуюсь подобным.

Кто-нибудь знает где можно посмотреть параметры, для использования с этой @FYP-овской функцией?
Lua:
function samp_create_sync_data(sync_type, copy_from_player)
    local ffi = require 'ffi'
    local sampfuncs = require 'sampfuncs'
    -- from SAMP.Lua
    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)))
    -- copy player's sync data to the allocated memory
    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
    -- function to send packet
    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
    -- metatable to access sync data and 'send' function
    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

function tr(arg)
    if arg ~= nil and tonumber(arg) then
        inf = arg
        ttr = not ttr
    end
end
Он выложил только параметры, которые можно использовать только в таких типах данных, как "player", "vehicle" и "bullet"(скорее даже тут не все), но там ведь ещё есть "passenger", "aim", "trailer", "unoccupied", "spectator". Подскажите мне их, пожалуйста.
Открой в moonloader/lib/samp/synchronization.lua. Там структуры пакетов и т.д
 

Patrickkk

Участник
162
19
Помогите с регулярками, пожалуйста.

Nickname_13[188]: блабла
[4]Example_X[13]: бла
Nickname[842]: блабла
[123abc]Nickname[61]: русскийтекст

Нужно получить последнее значение в скобках (id), независимо от никнейма.
Если ли ещё варианты получить id игрока, который написал сообщение в чат, кроме парсинга текста?
Ничего лучше этого не придумал(
(((message:match("%S+")):reverse()):match("%d+")):reverse()
Большое спасибо!
Lua:
id = string.match(text, '%[(%d+)%]:.+')
 
  • Нравится
Реакции: Petr_Sergeevich

madrasso

Потрачен
883
325
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как отправить текст, в диалог ввода?
Например: Привет.
Диалог с 1 кнопкой.
Что бы вводил и сразу нажимал ентер.
 

Petr_Sergeevich

Известный
Проверенный
707
297
Можно ли как-нибудь создать диалог с текстом и с одной кнопкой подтверждения? Если да, то как это сделать?
sampShowDialog(id, "Заголовок", "Текст", "Далее", "Выход", 1) - только без кнопки "Выход"

Ещё есть два диалоговых окна, в которые нужно вводить информацию.
Получается так, что инфа одного диалога сохраняется в другом, как это можно исправить? Чтобы они отдельно записывались. Код примерно такой:

Код:
        submenu = {
            {
                title = "Номер лотерейного билета",
                onclick = function()
                    sampShowDialog(dialogLotto, "Заголовок", string.format("{ffffff}Введите номер лотерейного билета\nТекущее значение: %s", inputLotto), "Принять", "Выход", 1)
                    lua_thread.create(function()
                        while true do
                            wait(0)
                            local result, button, list, inputL = sampHasDialogRespond(dialogLotto)
                            inputLotto = inputL
                        end
                    end)
                end
            },

В отдельном подпункте тоже самое, только другой ID диалога, вводимое значение input
 
Последнее редактирование:

Toopie

Новичок
29
2
helo amerika
я недавно (вчера) начал учить луа ну сам язык понятен выучил не учил
хочу задать пару вопросов
1) где взять список всех функций сампа или как оно там ну типа sampSendChat и т.д. в wiki чет хуй знает ну короче блять.
2) где посмотреть список функций imgui желательно (ох ну пиздец как желательно) на русском ну типа че за че отвечает
3) да
4) где посмотреть да и че вообще такое хуки ну типа как я понимаю вот открылся у юзера диалог и это приходит в луа а потом в луа как то где то надо подшаманить и типа samp.OnDialogOpen(id, title, text, button1, button2, style или да) или это не хуки. ну что такое тогда хуки.
5) да.
вот запятые на всякий случай ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
 
  • Нравится
Реакции: atiZZZ

Frapsy

Известный
Проверенный
393
227
helo amerika
я недавно (вчера) начал учить луа ну сам язык понятен выучил не учил
хочу задать пару вопросов
1) где взять список всех функций сампа или как оно там ну типа sampSendChat и т.д. в wiki чет хуй знает ну короче блять.
2) где посмотреть список функций imgui желательно (ох ну пиздец как желательно) на русском ну типа че за че отвечает
3) да
4) где посмотреть да и че вообще такое хуки ну типа как я понимаю вот открылся у юзера диалог и это приходит в луа а потом в луа как то где то надо подшаманить и типа samp.OnDialogOpen(id, title, text, button1, button2, style или да) или это не хуки. ну что такое тогда хуки.
5) да.
вот запятые на всякий случай ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1. start | BlastHack — DEV_WIKI(https://www.blast.hk/wiki)
2. Dear ImGui(https://blast.hk/threads/19292/)
3. Да.
4. SAMP.Lua(https://blast.hk/threads/14624/)
5. Да.
 
  • Нравится
Реакции: Toopie

Toopie

Новичок
29
2
1. start | BlastHack — DEV_WIKI(https://www.blast.hk/wiki)
2. Dear ImGui(https://blast.hk/threads/19292/)
3. Да.
4. SAMP.Lua(https://blast.hk/threads/14624/)
5. Да.
Ага, понял, спасибо большое
На счет imgui, что такое 0.1f, и вообще чего это за float значения везде, включая цвета? а где-нибудь можно посмотреть вообще документацию imgui на русском?