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

SAMP.ASI

Известный
223
53
Как проверить подключен ли игрок к серверу?
Например: estLiPlayer("ANDREY_RINGO") и если пользователь есть вернет true. Нужно без строгой привязки с регистру. Чтоб он при проверке на "ANDREY_RINGO" вернул 1 при условии, что играет "andRey_rinGo"
 

d3x.m4nt1s

Потрачен
48
60
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как проверить подключен ли игрок к серверу?
Например: estLiPlayer("ANDREY_RINGO") и если пользователь есть вернет true. Нужно без строгой привязки с регистру. Чтоб он при проверке на "ANDREY_RINGO" вернул 1 при условии, что играет "andRey_rinGo"
Код:
function isPlayerOnline(nick)
    nick = nick:lower()
    for i = 0, 999 do
        if sampIsPlayerConnected(i) and sampGetPlayerNickname(i):lower() == nick then
            return true
        end
    end
    return false
end
 
  • Нравится
Реакции: SAMP.ASI

kriv

Участник
37
3
string.format("%x", -1440097264) возвращает ffffffffaa29dc10 - как правильно сделать?
 

LinkelnAweil

Участник
122
7
Как получить ID ближайшего пикапа определенной модели? Если возможно, то пожалуйста дайте код.
 
Последнее редактирование:

TodFox

Известный
105
17
Первый скриптик. Не выводит состояние сударя в чат - в т/с он или нет. Что не так? :thinking:

Lua:
require "samp.events"
require "lib.moonloader"

function main()
    while not isSampfuncsLoaded() or not isSampLoaded() do wait(1000) end
       while not isSampAvailable() do wait(100) end
          sampRegisterChatCommand("test", incar)
          while true do
          wait(0)
  end
end

function incar()
if isCharSittingInAnyCar(PLAYER_HANDLE) then
sampAddChatMessage("{FFFFFF}+", -1)
else
sampAddChatMessage("{FFFFFF}-", -1)
  end
end
 

tlwsn

Известный
537
85
Сделал себе некую замену кил-листа. Как можно сделать, что бы вместо названия оружия с которого убил человек показывалася иконка самого оружия?
o3GULnd.png
 

Di3

Участник
432
20
В чем может быть проблема.

[
Lua:
forma = '/ban 1000 1 test'
    if forma:find('/(%w+)%s+(%d+)%s+(.*)') then
nakforma,idnick = forma:match('/(%w+)%s*(%d+)%s*(.*)')
    if idnick  >= 0 and idnick <= 999  then  -- ОТ Этого крашит. Не понимаю в чем проблема.
   -- code
end
end


В переменной idnak чистое число,а скрипт крашется. В чем проблема?
 
Последнее редактирование:

d3x.m4nt1s

Потрачен
48
60
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В чем может быть проблема.

[
Lua:
forma = '/ban 1000 1 test'
    if forma:find('/(%w+)%s+(%d+)%s+(.*)') then
nakforma,idnick = forma:match('/(%w+)%s*(%d+)%s*(.*)')
    if idnick  >= 0 and idnick <= 999  then  -- ОТ Этого крашит. Не понимаю в чем проблема.
   -- code
end
end


В переменной idnak чистое число,а скрипт крашется. В чем проблема?

Попробуй добавить idnick = tonumber(idnick), нельзя сравнивать строки с числами.

Первый скриптик. Не выводит состояние сударя в чат - в т/с он или нет. Что не так? :thinking:

Lua:
require "samp.events"
require "lib.moonloader"

function main()
    while not isSampfuncsLoaded() or not isSampLoaded() do wait(1000) end
       while not isSampAvailable() do wait(100) end
          sampRegisterChatCommand("test", incar)
          while true do
          wait(0)
  end
end

function incar()
if isCharSittingInAnyCar(PLAYER_HANDLE) then
sampAddChatMessage("{FFFFFF}+", -1)
else
sampAddChatMessage("{FFFFFF}-", -1)
  end
end
PLAYER_HANDLE -> PLAYER_PED

Параметр keysData
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,657
2,550
не , это именно имгуи
Запустить окно с некоторыми флагами, в бесконечном цикле быдлить и делать imgui.Process = true, imgui.ShowCursor = false и устанавливать true при некоторых случаях ( запуске другого окна например )
С чего начать изучать ImGui?
https://blast.hk/threads/19292
Подскажите, как сделать.
Если название скрипта было изменено, то thisScript():unload()
Проверять thisScript().path

В чем может быть проблема.

[
Lua:
forma = '/ban 1000 1 test'
    if forma:find('/(%w+)%s+(%d+)%s+(.*)') then
nakforma,idnick = forma:match('/(%w+)%s*(%d+)%s*(.*)')
    if idnick  >= 0 and idnick <= 999  then  -- ОТ Этого крашит. Не понимаю в чем проблема.
   -- code
end
end


В переменной idnak чистое число,а скрипт крашется. В чем проблема?
tonumber(idnick)

Сделал себе некую замену кил-листа. Как можно сделать, что бы вместо названия оружия с которого убил человек показывалася иконка самого оружия?
o3GULnd.png
Подгружать шрифт из папки с ГТА (gtaweap.ttf если не ошибаюсь) и оттуда вытачкивать иконки по ИДшникам, нет, это не фото, его нужно как шрифт грузить.

Первый скриптик. Не выводит состояние сударя в чат - в т/с он или нет. Что не так? :thinking:

Lua:
require "samp.events"
require "lib.moonloader"

function main()
    while not isSampfuncsLoaded() or not isSampLoaded() do wait(1000) end
       while not isSampAvailable() do wait(100) end
          sampRegisterChatCommand("test", incar)
          while true do
          wait(0)
  end
end

function incar()
if isCharSittingInAnyCar(PLAYER_HANDLE) then
sampAddChatMessage("{FFFFFF}+", -1)
else
sampAddChatMessage("{FFFFFF}-", -1)
  end
end
Такой функции нет
if isCharInAnyCar(playerPed) then

string.format("%x", -1440097264) возвращает ffffffffaa29dc10 - как правильно сделать?
А что тебе нужно? Клист игрока?
 

tlwsn

Известный
537
85
Подгружать шрифт из папки с ГТА (gtaweap.ttf если не ошибаюсь) и оттуда вытачкивать иконки по ИДшникам, нет, это не фото, его нужно как шрифт грузить.
Как его юзать если у меня есть иды ганов?
 
Последнее редактирование:

Petr_Sergeevich

Известный
Проверенный
707
298
Помогите перевести на Lua, пожалуйста
Код:
writeMemory(hGTA, 0x4B35A4, 0xF18B, 2, "byte")
 

Glockersik

Участник
86
3
Подскажите пж , что нужно написать , чтобы скрипт при активации считывал с чата определенную строку ?
 

Glockersik

Участник
86
3
Lua:
local sampev = require "lib.samp.events"

function sampev.onServerMessage(color, msg)
b=0;
    if msg:find('Вы получили 1 предмет') then
    b=b+1
    elseif msg:find('Вы получили 15 предметов') then
    b=b+15
    end
end


function main()

if not isSampLoaded () or not IsSampfuncsLoaded then return end
while not isSampLoaded do wait (100)

sampRegsterChatCommand ('/zarabotok',zarabotok)

end.
function zarabatok ()
if zarabatok = true then
sampAddChatMessage ("Заработок началася",-1)
while zarabatok=true do
lua_thread.create (sampev.onServerMessage)

end
end;

else
sampAddChatMessage ("Заработок закончился",-1)

sampShowDialog(1337,'{FF5656}Заработок', 'Заработано =' , 0') -- Здесь создается табличка и в эту табличку записывается сам доход
end
end

end


Помогите пожалуйста , хочу написать скрипт, который создаст табличку и при выполнении работы будет обновлять счетчик . Спасибо!