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

ishi

Известный
493
110
Можно как-нибудь сделать, чтоб при увеличении количества полигонов в рендере функцией drawPolygon они не строились в симметричную геометрическую фигуру, а располагались как нужно мне?
Ну, короче контроль позиций полигонов в этой функции без дополнительной рисовки возможен?
 

FYP

Известный
Автор темы
Администратор
1,758
5,703
@Снежок нет, но это можно сделать с помощью функций для рисования кастомных примитивов
renderBegin(int type)
renderColor(int color)
renderVertex(float vX, float vY)
renderEnd()
 
  • Нравится
Реакции: ishi

shakur.02

Известный
12
1
Lua:
script_name ("Fishing")
script_author ("Dolbaeb")

require "lib.moonloader"
require "lib.sampfuncs"

function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
    while true do
    wait(0)
        e = sampTextdrawIsExists(2120)
        wait(100)
            sampAddChatMessage (e, #FA8072)
        example = sampTextdrawGetString(2120)
        local left = sampTextdrawGetString(2116)
            if  left == example then
            wait (1000)
            sampSendClickTextdraw(2116)
        end
        local down = sampTextdrawGetString(2117)
            if  down == example then
            wait (1000)
            sampSendClickTextdraw(2117)
        end
        local right = sampTextdrawGetString(2118)
            if  right == example then
            wait (1000)
            sampSendClickTextdraw(2118)
        end
        local up = sampTextdrawGetString(2119)
            if  up == example then
            wait (1000)
            sampSendClickTextdraw(2119)
        end
    end
    end
Есть хоть что то правильное?
 
Последнее редактирование:

makasinuch

Новичок
52
4
Как мне текст, который я ввел в диалоговом окне ( функция sampShowDialog ) записать например в sampAddChatMessage (тут должен быть мой текст)? Как я понял нужно делать переменные, но я чет не могу понять как это сделать
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Как мне текст, который я ввел в диалоговом окне ( функция sampShowDialog ) записать например в sampAddChatMessage (тут должен быть мой текст)? Как я понял нужно делать переменные, но я чет не могу понять как это сделать
Получить результат диалога с помощью функции sampHasDialogRespond
 

makasinuch

Новичок
52
4
Получить результат диалога с помощью функции sampHasDialogRespond
Подскажи как мне сделать, что бы вводимый текст соответствовал функциям? Я пробовал задать нумерацию но не получилось. На данный момент при записи в любой диалог значения задаются 2-м функциям, а мне нужно что бы отдельно записывало
Lua:
  if result == 0 then
        sampShowDialog(101, "Input", "Enter ammo for Deagle:", "Make", "Close", 1)
        end
        if result == 1 then
        sampShowDialog(102, "Input", "Enter ammo for Pestol:", "Make", "Close", 1)
        end

....

  result, button, list1, input1 = sampHasDialogRespond(101)
    cfg_number_deagle = input1
          for i = 1, cfg_number_deagle do
            sampSendClickTextdraw(8)
     end
        sampSendClickTextdraw(7)   
       result, button, list, input2 = sampHasDialogRespond(102)
       cfg_number_peastol = input2
            for i = 1, cfg_number_peastol do
            sampSendClickTextdraw(8)
        end
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Lua:
if result == 0 then
    sampShowDialog(101, "Input", "Enter ammo for Deagle:", "Make", "Close", 1)
end
if result == 1 then
    sampShowDialog(102, "Input", "Enter ammo for Pestol:", "Make", "Close", 1)
end

result, button, list1, input1 = sampHasDialogRespond(101)
if (result and button == 1) then
    cfg_number_deagle = input1
    for i = 1, cfg_number_deagle do
        sampSendClickTextdraw(8)
    end
    sampSendClickTextdraw(7)  
end

result, button, list, input2 = sampHasDialogRespond(102)
if (result and button == 1) then
    cfg_number_peastol = input2
    for i = 1, cfg_number_peastol do
        sampSendClickTextdraw(8)
    end
end
 

makasinuch

Новичок
52
4
Lua:
if result == 0 then
    sampShowDialog(101, "Input", "Enter ammo for Deagle:", "Make", "Close", 1)
end
if result == 1 then
    sampShowDialog(102, "Input", "Enter ammo for Pestol:", "Make", "Close", 1)
end

result, button, list1, input1 = sampHasDialogRespond(101)
if (result and button == 1) then
    cfg_number_deagle = input1
    for i = 1, cfg_number_deagle do
        sampSendClickTextdraw(8)
    end
    sampSendClickTextdraw(7) 
end

result, button, list, input2 = sampHasDialogRespond(102)
if (result and button == 1) then
    cfg_number_peastol = input2
    for i = 1, cfg_number_peastol do
        sampSendClickTextdraw(8)
    end
end
А как сделать что бы все значения, которые я записывал сохранялись? В данный момент если я записываю в 101 диалог, то в 102 удаляется значение ( и наоборот ).
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
А как сделать что бы все значения, которые я записывал сохранялись? В данный момент если я записываю в 101 диалог, то в 102 удаляется значение ( и наоборот ).
Ну ты их не перезаписывай.
 

Garrus

Известный
159
20
Можно ли как-то "спрятать" строку, чтоб её не было видно/она была "битая" при декомпилировании (актуально, например, для ключа шифрования)?
 

kmsfax

Известный
154
89
Хелпуйте. Мне нужно сделать так, чтобы урон по игроку со снайперской винтовки не проходил, когда он сидит в транспорте (На сервере где я играю, снайперка сносит FullHP с одного выстрела).

Если сделать так:
Lua:
function sampev.onSendGiveDamage(playerId, damage, weapon, bodypart)
    if weapon == 34 and not sampIsPlayerPaused(playerId) then
        return false
    end
end
То:
- Если игрок не в транспорте, урон по-нему не проходит.
- Если игрок в транспорте, урон по-нему пойдёт, но ХП снесёт не серверное (всё хп с одного выстрела), а -45.

Если сделать так:
Lua:
function sampev.onSendBulletSync(data)
    if data.targetType == 2 and data.weaponId == 34 then
        return false
    end
end
То:
- Если игрок в транспорте, то ему сносит всё ХП.
- Если изменить проверку data.targetType на 1, и игрок будет находится не в транспорте, то ему так же снесёт всё ХП.
- Если изменить data.weaponId на 23, а data.targetType вернуть на 2, то урон по игроку с SD не будет проходить (если он в машине). То есть со снайперки проходит, а с пистолета нет.

Так вот, что мне нужно сделать, чтобы урон по игроку не проходил со снайперской винтовки, когда тот находится в транспорте?
 

MISTER_GONWIK

Всефорумный гонщик
Всефорумный модератор
1,260
1,737
Хелпуйте. Мне нужно сделать так, чтобы урон по игроку со снайперской винтовки не проходил, когда он сидит в транспорте (На сервере где я играю, снайперка сносит FullHP с одного выстрела).

Если сделать так:
Lua:
function sampev.onSendGiveDamage(playerId, damage, weapon, bodypart)
    if weapon == 34 and not sampIsPlayerPaused(playerId) then
        return false
    end
end
То:
- Если игрок не в транспорте, урон по-нему не проходит.
- Если игрок в транспорте, урон по-нему пойдёт, но ХП снесёт не серверное (всё хп с одного выстрела), а -45.

Если сделать так:
Lua:
function sampev.onSendBulletSync(data)
    if data.targetType == 2 and data.weaponId == 34 then
        return false
    end
end
То:
- Если игрок в транспорте, то ему сносит всё ХП.
- Если изменить проверку data.targetType на 1, и игрок будет находится не в транспорте, то ему так же снесёт всё ХП.
- Если изменить data.weaponId на 23, а data.targetType вернуть на 2, то урон по игроку с SD не будет проходить (если он в машине). То есть со снайперки проходит, а с пистолета нет.

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

makasinuch

Новичок
52
4
Как проверить что я сделал выстрел??? Или хотя бы, что патрон уменьшился на 1