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

MyRaXa229229

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

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,932
1,303
Как сделать проверку на растояние персонажа к пикапу за код буду очень благодарный
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,505
1,134
Код:
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,932
1,303
Код:
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,505
1,134
Здрасьте помогите, не работает команда
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,932
1,303

yarsuetolog

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

sanders

Потрачен
253
126
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как можно вытащить текст из диалога? Например при вводе команды /test открывается диалоговое окно, там написано "228 чит", нужно чтобы "228 чит" написало в чат
через хук onShowDialog(id, style, title, button1, button2, text)
 

mark0005675

Участник
30
3
Ребята помогите сделать диалог list вот сам код впишите туда пж
Код:
script_name("Сокращение команд для админов. Wol  | RPG ")
script_version("1.3")
script_author("Mark")
local samp = require 'samp.events'
local imgui = require 'imgui'
local encoding = require 'encoding' -- загружаем библиотеку
encoding.default = 'CP1251' -- указываем кодировку по умолчанию, она должна совпадать с кодировкой файла. CP1251 - это Windows-1251
u8 = encoding.UTF8 -- и создаём короткий псевдоним для кодировщика UTF-8

local test_text_buffer = imgui.ImBuffer(256)

function main()
repeat wait(0) until isSampAvailable()
wait(0)
sampAddChatMessage('{40E0D0}[FN] {FFFFFF}Скрипт загружен. {40E0D0}Автор: Caxap_Adams Вк автора : https://vk.com/lgbt2006 {40E0D0}', -1)
sampAddChatMessage('{40E0D0}[FN] {FFFFFF}Информация о командах - {40E0D0} Пропиши /infocmd Информация об авторе /infoscript', -1)

sampRegisterChatCommand('atool', cmdhelp)
sampRegisterChatCommand('fastpush', cmdhelps)
sampRegisterChatCommand('rod', rod)
sampRegisterChatCommand('ch', ch)
sampRegisterChatCommand('nosk', nosk)
sampRegisterChatCommand('obman', obman)
sampRegisterChatCommand('dokva', jalob)
sampRegisterChatCommand('rekl', rekl)
sampRegisterChatCommand('prosk', prosk)
sampRegisterChatCommand('pered', pered)
sampRegisterChatCommand('nerab', nerab)
sampRegisterChatCommand('wrc', wr)
sampRegisterChatCommand('js', js)
sampRegisterChatCommand('jsd', jsd)
sampRegisterChatCommand('mth', mt)
sampRegisterChatCommand('kk', kicks)
sampRegisterChatCommand('skk', popo)
sampRegisterChatCommand('sdok', sdok)
sampRegisterChatCommand('nabor', zganabor)
sampRegisterChatCommand('lolkek', lolkek)
sampRegisterChatCommand('atool1', shelp)
sampRegisterChatCommand('vipah', adminhelp)
sampRegisterChatCommand('dokvaw', dokvaw)
sampRegisterChatCommand('dokvaj', dokvaj)
sampRegisterChatCommand('dokwab', dokwab)
sampRegisterChatCommand('sm', smexy)
sampRegisterChatCommand('infocmd', infocmd)
sampRegisterChatCommand('infoscript', infoscript)

 while true do
  wait(0)
 end
end

function infocmd()
sampShowDialog(228, "Информация", "{40E0D0}Пропишите /atool что бы узнать сокращённые комманды\nПропишите /fastpush что бы узнать комманды с уже готовыми причинами\nПропишите /vipah что бы узнать команды которые стоят дахуя и которые у тебя есть\n", "Закрыть")
end

function cmdhelp()
sampShowDialog(228, "CmdList", "{ffffff}/ow         Выдать оварн\n /aj         выдать ajail\n /aw         выдать аварн\n         /wr      выдать warn\n         /pl         просмотреть логи игрока\n        /dr         выдать дроп\n         /ocr окар\n         /acr         акар\n         /offaj         выдать аджаил в оффе\n         /ipb     дать пизды пидору\n         /aim     аимунка \n         /im     имунка \n         /odost     одоступ\n         /dost      dostup\n         /fk     фраклист \n         /offow     offowarn/n         /offaw         /offawarn\n         /awoff     /awarnoff\n         /owoff     /owarnoff\n         /drop  /dr\n         /makehelper /mkh\n         /setl     /setleader\n         /makeleader     /mkl \n         /makeadmin     /mka\n         /avozvrat     /avz\n         /givegun     /gg\n   ", "Закрыть" )
 end
 
 function infoscript()
 sampShowDialog(228, "Info Caxap_Adams", "{ffffff}Привет этот скрипт создал Caxap_Adams Это же {ff0000}Caxap {ffffff}Adams\n Вконтакте Caxap_Adams'a https://vk.com/lgbt2006\n Запомните ЭТОТ СКРИПТ БЛЯТЬ СОЗДАЛ САХАРОК\n Для сервера Way Of Life RPG\n  ", "Ok")
 end
 
 function adminhelp()
 sampShowDialog(228, "ЦЕ САХАР ", "{ff0000}/dokva запросить пруфы по жалобе\n/dokvaw запросить пруфы на варн\n/dokvaj запросить пруфы на jail\n/sm смекси закинуть нахуй сделано для хуй поймни кому\n  ", "Ok")
 end
 
 function dokvaw(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/aj '..id..'  999999 доки на варн ')
 end
 
  function smexy(id)
 local nick = sampGetPlayerNickname(id)
  sampSendChat('/smexy '..id..' 99999 доки в вк')
 end
 
 function cmdhelps()
sampShowDialog(228, "CmdList", " {ff0000}/dokva ID - {{ff0000}}Потребовать док-ва\n {F0E68C} /dr ID - {FFFFFF}наказать за не работу {F0E68C}\n {40E0D0}/rod ID - {FFFFFF}Заблокировать за оск. род.\n {F0E68C}| {40E0D0}/pered ID - {FFFFFF}Заблокировать за передачу {F0E68C}\n  {40E0D0}/ch ID - {FFFFFF}Заблокировать за  вред читы {F0E68C}\n {40E0D0}/nosk ID - {FFFFFF}Заблокировать за оскорбление в нике\n /rekl ID - {FFFFFF}Заблокировать за рекламу {F0E68C}\n {40E0D0}/prosk ID - {FFFFFF}Заблокировать за оск. проекта\n /wrc ID - {FFFFFF}Выдать варн за читы{F0E68C}\n {40E0D0} /mth ID - {FFFFFF}Выдать мут за оск{F0E68C}\n {40E0D0}/ /kk ID - {FFFFFF}Кик за помеху{F0E68C}\n {40E0D0}/skk ID - {FFFFFF}Тихий кик\n {40E0D0}/sdok - ID у кого не снято ограничение на /ajail {F0E68C}\n {F0E68C}/nabor набор в зга если вы га\n    ", "Закрыть ")
 end
 
 function rod(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/banan '..id..'  Оскорбление родных')
 end

function popo(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/skicked '..id..'  relog')
 end

function lolkek(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/a Скрипт успешно запущен и работает введи /chelp ')
 end

function sdok(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/aj '..id..'  30 жалоба отпиши в вк')
 end

function zganabor(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/a Идёт набор в ЗГА от 16 лвл админки кто желает вступить + в чат')
 end

function kicks(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/kk '..id..'  помеха')
 end

function mt(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/mute '..id..' 10 Оск')
 end

function js(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/jail '..id..' 15 Читы')
 end

function jsd(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/jail '..id..' 15 ДМ')
 end

function wrc(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/warn '..id..'  Читы')
 end

function jalobs(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/ajoff '..id..' 99999  Жалоба отпиши в вк')
 end

function jalob(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/aj '..id..' 99999  Жалоба отпиши в вк')
 end
 
 function nerab(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/dr '..id..' 15 не работаешь')
 end
    
function ch(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/banan '..id..' Вред серверу')
 end

function nosk(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/banan '..id..'  Оскорбление в нике')
 end

function rekl(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/banan '..id..'  Реклама')
 end

function prosk(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/banan '..id..'  Оскорбление проекта')
 end

function pered(id)
 local nick = sampGetPlayerNickname(id)
 sampSendChat('/banan '..id..'  Взломан/Передан/Продан')
 end
 
cmds = {
    ['/owarn'] = '/ow',
    ['/awarn'] = '/aw',
    ['/ajail'] = '/aj',
    ['/mute'] = '/mt',
    ['/warn'] = '/wr',
    ['/plog'] = '/pl',
    ['/drop'] = '/dr',
    ['/ipban'] = '/ipb',
    ['/offajail'] = '/offaj',
    ['/ocar'] = '/ocr',
    ['/acar'] = '/acr',
    ['/aimunka'] = '/aim',
    ['/imunka'] = '/im',
    ['/dostup'] = '/dost',
    ['/odostup'] = '/odost',
    ['/adminy'] = '/admins',
    ['/fraklist'] = '/fk',
    ['/offowarn'] = '/offow',
    ['/offawarn'] = '/offaw',
    ['/awarnoff'] = '/awoff',
    ['/owarnoff'] = '/owoff',
    ['/drop'] = '/dr',
    ['/makehelper'] = '/mkh',
    ['/setleader'] = '/setl',
    ['/makeleader'] = '/mkl',
    ['/makeadmin'] = '/mka',
    ['/avozvrat'] = '/avz',
    ['/givegun'] = '/gg',
}

function samp.onSendCommand(CMD)
    for k, v in pairs(cmds) do
        if CMD:find(v) then
            CMD = CMD:gsub(v, k)
            return {CMD}
        end
    end
end