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

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,892
1,256
Тогда мой персонаж телепортируется на пикап, мне нужно что б мой чел как стоял так и стоит но серверу прошло что данный пикап взял игрок
Функция не телепортирует тебя на пикап
 

MyRaXa229229

Участник
90
0
Как сделать проверку на растояние персонажа к пикапу за код буду очень благодарный
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,892
1,256
Как сделать проверку на растояние персонажа к пикапу за код буду очень благодарный
float X, float Y, float Z = getPickupCoordinates(Pickup pickup) float positionX, float positionY, float positionZ = getCharCoordinates(Ped ped) float distance = getDistanceBetweenCoords3d(float x1, float y1, float z1, float x2, float y2, float z2)
 
  • Нравится
Реакции: MyRaXa229229

MyRaXa229229

Участник
90
0
float X, float Y, float Z = getPickupCoordinates(Pickup pickup) float positionX, float positionY, float positionZ = getCharCoordinates(Ped ped) float distance = getDistanceBetweenCoords3d(float x1, float y1, float z1, float x2, float y2, float z2)
Код:
function sampev.onCreatePickup(id, model, pickupType, position)
    if Pickup == 1 then
        sampAddChatMessage(string.format("Появился пикап: %d ID", id), 0x00DD00)
        float X, float Y, float Z = getPickupCordinates(id)
        float positionX, float positionY, float positionZ = getCharCoordinates(Ped ped)
        float distance = getDistanceBetweenCoords3d(float X, float Y, float Z, float positionX, float positionY, float positionZ)
        if float distance < 5 then
            sampSendPickedUpPickup(pickupid)
        end
    end
end
Что не так жалует ся на float X, float Y, float Z = getPickupCordinates(id)
 

Dmitriy Makarov

25.05.2021
Проверенный
2,481
1,113
Код:
function sampev.onCreatePickup(id, model, pickupType, position)
    if Pickup == 1 then
        sampAddChatMessage(string.format("Появился пикап: %d ID", id), 0x00DD00)
        float X, float Y, float Z = getPickupCordinates(id)
        float positionX, float positionY, float positionZ = getCharCoordinates(Ped ped)
        float distance = getDistanceBetweenCoords3d(float X, float Y, float Z, float positionX, float positionY, float positionZ)
        if float distance < 5 then
            sampSendPickedUpPickup(pickupid)
        end
    end
end
Что не так жалует ся на float X, float Y, float Z = getPickupCordinates(id)
x, y, z = getPickupCoordinates(Pickup pickup)
posX, posY, posZ = getCharCoordinates(Ped ped)
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,892
1,256
Код:
function sampev.onCreatePickup(id, model, pickupType, position)
    if Pickup == 1 then
        sampAddChatMessage(string.format("Появился пикап: %d ID", id), 0x00DD00)
        float X, float Y, float Z = getPickupCordinates(id)
        float positionX, float positionY, float positionZ = getCharCoordinates(Ped ped)
        float distance = getDistanceBetweenCoords3d(float X, float Y, float Z, float positionX, float positionY, float positionZ)
        if float distance < 5 then
            sampSendPickedUpPickup(pickupid)
        end
    end
end
Что не так жалует ся на float X, float Y, float Z = getPickupCordinates(id)
Lua:
function sampev.onCreatePickup(id, model, pickupType, pos)
    if Pickup == 1 then
        sampAddChatMessage(string.format("Появился пикап: %d ID", id), 0x00DD00)
        X, Y, Z = getCharCoordinates(1)
        dist = getDistanceBetweenCoords3d(pos.x, pos.y, pos.z, X, Y, Z)
        if dist < 5 then
            sampSendPickedUpPickup(id)
        end
    end
end
 
  • Нравится
Реакции: MyRaXa229229

Lucifer Melton

Активный
164
57
Привет помогите с кодом менюшка работает но вот кнопки закрыть не работают
Код:
 function checker()
    while sampIsDialogActive() do
        wait(0)
        local result, button, listitem, input = sampHasDialogRespond(228)
        if result and listitem == 0 then
            sampAddChatMessage('{00FF00}/ds ID - Посмотреть доступы FD | {1E90FF} /ods ID - Посмотреть доступы Основателя', -1)
        elseif result and listitem == 1 then
            sampAddChatMessage('{FFFFFF}/jl - Посадить в Джайл | /ps - Посадить в Присон', -1)
            sampAddChatMessage('{FFFFFF}/wrn - Выдать варн | /kk - Выгнать с сервера', -1)
            sampAddChatMessage('{FFFFFF}/mt - Выдать мут', -1)
        elseif result and listitem == 2 then
            sampAddChatMessage('{00FF00}/bn - Забанить на 1 день | /bnn - Забанить навсегда', -1)
            sampAddChatMessage('{00FF00}/bni - Забанить ип | /bno - Забанить в оффлайн', -1)
            sampAddChatMessage('{00FF00}/tbn - Забанить на время | /adw id - Выдать Админ варн', -1)
            sampAddChatMessage('{00FF00}/adwo - Снять админ варн | /mkh id - Назначить хелпером', -1)
            sampAddChatMessage('{00FF00}/mkl ID - Назначить Лидером (только себя) | /fg id - Ударить по лицу', -1)
        elseif result and listitem == 3 then
            sampAddChatMessage('{0000FF}/sk - Тихо кикнуть | /offl ID - Снять лидера в оффлайн', -1)
            sampAddChatMessage('{0000FF}/mka - Выдать админку (1-12) | /asl - Продать хату (владелец должен быть оффлайн)', -1)
            sampAddChatMessage('{0000FF}/gzc - Красить терру | /sld - Снять с Лидерки', -1)
            sampAddChatMessage('{0000FF}/dr - Забрать кмд у админа | /ow - Выдать варн Основателя', -1)
            sampAddChatMessage('{0000FF}/owo - Снять варн Основателя | /sbn - Выдать тихий бан', -1)
            sampAddChatMessage('{0000FF}/offow - Выдать варн Основателя в оффлайн | /offaw - Выдать варн Администратора в оффлайн', -1)
            sampAddChatMessage('{0000FF}/aj - Посадить в Админ тюрьму  | /acr - Создать {FFFF00}Super Car{FF0000} Admins Team', -1)
            sampAddChatMessage('{0000FF}/offaj - Посадить в Админ тюрьму в оффлайн', -1)
        elseif result and listitem == 4 then
            sampAddChatMessage('{FFFF00}/lg - Проверить Админ логи | /alg - Проверить логи выдачи', -1)
            sampAddChatMessage('{FFFF00}/plg - Проверить логи игрока | /stl - Назначить Лидером', -1)
            sampAddChatMessage('{FFFF00}/avz - Секретная Админка | /offad - Снять с Админа в оффлайн', -1)
            sampAddChatMessage('{FFFF00}/psk - Выдать Админку (0-16) | /mku - Выдать Админку (1-10)', -1)
            sampAddChatMessage('{FFFF00}/ipb - Забанить по IP | /ocr - Создать кар {FF0000}Admins Team {0000FF}» ™Создатель™ «', -1)
        elseif result and listitem == 5 then
            sampAddChatMessage('{FF0000}/vr - Отправить в виртуальный мир | /cr - крашнуть игрока', -1)
            sampAddChatMessage('{FF0000}/oc - Чат Основателя | /logk - Анти Убийство ', -1)
        elseif result and listitem == 6 then
            sampAddChatMessage('{FF69B4}/setpl - Выдать уровень промо-кода | /gn - цветное оружие ', -1)
            sampAddChatMessage('{FF69B4}/sx - Послать на звезду | /vs - Выдать аварн + оварн + аджайл + дроп ', -1)
            sampAddChatMessage('{FF69B4}/gs - Выдать сертификат | /nh - Запретить варны и баны', -1)
            sampAddChatMessage('{FF69B4}/chatc - Сменить цвет чата /a | /k - Скрыться из /adminy', -1)
            sampAddChatMessage('{FF69B4}/t - Писать кмд за другого| /amt - Выдать мут в /a', -1)
            sampAddChatMessage('{FF69B4}/amn - Амниситя (Снятие всех наказаний)', -1)
        elseif result and listitem == 7 then
             sampAddChatMessage('Об Создателе: {00FFFF}Скрипт Создан Администратором WoL RPG', -1)
             sampAddChatMessage('Об Создателе: {FFFF00}» ™Создатель™ « | John_Hamilton', -1)
             sampAddChatMessage('Об Создателе: {FF0000}ВК создателя - https://vk.com/rubrikaa', -1)
        end
    end
end
 

ОРААА

Новичок
5
0
Здрасьте помогите, не работает команда
Lua:
script_name('HelperRinok')

require "lib.moonloader"
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100)

        sampRegisterChatCommand('test', test)
    end

    function test()
        sampAddChatMessage("rabotaet", 0xFFFFFF)
end
 

Dmitriy Makarov

25.05.2021
Проверенный
2,481
1,113
Здрасьте помогите, не работает команда
Lua:
script_name('HelperRinok')

require "lib.moonloader"
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100)

        sampRegisterChatCommand('test', test)
    end

    function test()
        sampAddChatMessage("rabotaet", 0xFFFFFF)
end
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100)

        sampRegisterChatCommand('test', test)
        wait(-1)
    end
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,892
1,256

yarsuetolog

Участник
67
7
как можно вытащить текст из диалога? Например при вводе команды /test открывается диалоговое окно, там написано "228 чит", нужно чтобы "228 чит" написало в чат