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

Hatiko

Известный
Проверенный
1,471
612
Люди, можете помочь, не могу понять почему не работает функция, которая проверяет на наличие открытия диалогового окна по идеи. Всё перепробовал, создал чистый скрипт с одним кодом, который ниже написал, все равно не работает. В консоль ничего не пишет, вообщем ничего не происходит.

Lua:
local hook = require 'lib.samp.events'

function hook.onShowDialog(dID, dStyle, title, button1, button2, text)
    if dID > 0 then print("raz")
    end
end
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,460
Люди, можете помочь, не могу понять почему не работает функция, которая проверяет на наличие открытия диалогового окна по идеи. Всё перепробовал, создал чистый скрипт с одним кодом, который ниже написал, все равно не работает. В консоль ничего не пишет, вообщем ничего не происходит.

Lua:
local hook = require 'lib.samp.events'

function hook.onShowDialog(dID, dStyle, title, button1, button2, text)
    if dID > 0 then print("raz")
    end
end
Внимательнее смотри лог moonloader, ищи по названию скрипта или по наименованию файла скрипта.
Скрипт moonloader должен иметь "сердце", чтобы жить, и этой сердцевиной является входная точка main() с циклом while true или wait(-1), которой у тебя нет.
 

Hatiko

Известный
Проверенный
1,471
612
Внимательнее смотри лог moonloader, ищи по названию скрипта или по наименованию файла скрипта.
Скрипт moonloader должен иметь "сердце", чтобы жить, и этой сердцевиной является входная точка main() с циклом while true или wait(-1), которой у тебя нет.
Все равно что-то не робит, в логах ничего не изменилось. Так в чём прикол, что все других функции робят из библиотеки событий, а вот эта нет.
Lua:
local imgui = require 'imgui'
local key = require 'vkeys'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local hook = require 'lib.samp.events'


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then
        return
    end
    while not isSampAvailable() do wait(100) end
  while true do
    wait(0)
  end
end


function hook.onShowDialog(dID, dStyle, title, button1, button2, text)
print("raz")
end
 
Последнее редактирование:

MrCold

Активный
364
118
У меня вопрос. Я не понимаю, что за команды с точкой, например: string.upper math.ceil string.format math.rad math.sin math.cos

И ещё я хочу узнать, что такое команда: tostring и tonumber
 

Neak

Известный
76
20
что делает данный код?
Код:
ob.x,ob.y,ob.z = getOffsetFromObjectInWorldCoords(object, 0.0, distance, 0.0)
и где вообще смотреть их значения, т.к. неизвестных мне символов очень много, в dev_wiki net
 
Последнее редактирование:

CatKnight

Известный
148
54
В ТЗ необходимо достать инф-ю по двум IP при помощи команды. Всё бы хорошо, но во время реквеста игра фризится на мгновение, которое доходит до 1 секунды (у меня по крайней мере). Пробовал делать через поток, но фриз все равно при обращении к сайту остаётся. Возможно ли как-нибудь избавится от него? Хочу, чтобы хотя бы игра продолжала нормально работать во время обработки запроса. Спасибо. Ниже кусок кода:
Lua:
local json_r_ip, err_r_ip = sockethttp.request('http://ip-api.com/json/' .. r_ip .. '?lang=ru');
local json_ip, err_ip = sockethttp.request('http://ip-api.com/json/' .. ip .. '?lang=ru');
if json_r_ip and json_ip then
    data_first_ip = cjson.decode(json_r_ip);
    data_second_ip = cjson.decode(json_ip);
end;
 

ufdhbi

Известный
Проверенный
1,455
861
В ТЗ необходимо достать инф-ю по двум IP при помощи команды. Всё бы хорошо, но во время реквеста игра фризится на мгновение, которое доходит до 1 секунды (у меня по крайней мере). Пробовал делать через поток, но фриз все равно при обращении к сайту остаётся. Возможно ли как-нибудь избавится от него? Хочу, чтобы хотя бы игра продолжала нормально работать во время обработки запроса. Спасибо. Ниже кусок кода:
Lua:
local json_r_ip, err_r_ip = sockethttp.request('http://ip-api.com/json/' .. r_ip .. '?lang=ru');
local json_ip, err_ip = sockethttp.request('http://ip-api.com/json/' .. ip .. '?lang=ru');
if json_r_ip and json_ip then
    data_first_ip = cjson.decode(json_r_ip);
    data_second_ip = cjson.decode(json_ip);
end;
Исходник - Гайд - Асинхронные HTTP запросы(https://blast.hk/threads/20532/)
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,460
Все равно что-то не робит, в логах ничего не изменилось. Так в чём прикол, что все других функции робят из библиотеки событий, а вот эта нет.
Lua:
local imgui = require 'imgui'
local key = require 'vkeys'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local hook = require 'lib.samp.events'


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then
        return
    end
    while not isSampAvailable() do wait(100) end
  while true do
    wait(0)
  end
end


function hook.onShowDialog(dID, dStyle, title, button1, button2, text)
print("raz")
end
Файл приложи.
 
У

Удалённый пользователь 126082

Гость
Как исправить?
Lua:
LJЁ  q4   >    T ЂQ Ђ4 'd > T ч4 % +  > 4 % 4 > 4 % 4 > / Q YЂ4 + > +      Tщ4 % 'Р> + + + 4 + '  + '  >:
:    : 4 + + 7+ 7    + 7
> 5
+ + 7: + + 7    :     + + 7
:
4 + 7+ 7    + 7+ 7    > ,  4 + > ,  + ' T А4 4 + 7+ 7    + 7
> 4 % (  > 4 + > 5 4 4 ) > 4 ) > / T ¦G ЂЂА    ЂЂАЂАlockPlayerControlfreezeCharPosition    wqqqmarkObjectAsNoLongerNeeded[Teleport]: Successful!.sampAddChatMessagePLAYER_PEDsetCharCoordinates
tonumbergetDistanceBetweenCoords2dLOLsetObjectCoordinates%getOffsetFromObjectInWorldCoordszyxTeleport..printStringNow
ttime
tdisttpsampRegisterChatCommand    waitisSampAvailableЂЁэ№ 4    >
  T    Ђ, 4 % +  % $(  >TЂ4 % ( >G Ђ"[Teleport] Write Delay Param! MS"[Teleport]: Delay Changed to sampAddChatMessage
tonumberЂЁэ¶мёѕ 4    >
  T    Ђ, 4 % +  % $(  >TЂ4 % ( >G Ђ%[Teleport] Write Distance Param! M%[Teleport]: Distance Changed to sampAddChatMessage
tostringЂЁэ¶мёж  G+   +  +  4 >:::  5 4    T:Ђ+ + + 4 4 >:::  + +  7 + 7 :  + +  7+ 7: 4 + 7 + 7> 5 4      'H
+ 7 + 7+ 7> ,  4
+ 4 > 4 + ' > 4 4 ) > 4
) > +    ,  G ААА    ЂЂlockPlayerControlfreezeCharPositionlinkObjectToInteriorsetObjectHeadingcreateObjectzanglegetHeadingFromVector2dPLAYER_PEDgetCharCoordinates
tblipgetTargetBlipCoordinateszyxs +  TЂ'С:  7 + 7:7 + 7:7 + 7:G ЂАzyx
positionsurfingVehicleId!    +      TЂ) H G Ђт 4   % > ) 3 3 3 3 '
'  'ф)      1
5
1
5
     1

5
1 1
:

1
:
0  ЂG   onSetPlayerPos onSendPlayerSync
tdist
ttime     main z x y z x y x y z x y lib.samp.eventsrequire
 

Ken Block

Известный
432
31
Lua:
if active then
    active = false
             sampSendDialogResponse(Did, 13, 1, 1) -- Дубинка
                     sampSendDialogResponse(Did, 13, 2, 1) -- Броник
                     sampSendDialogResponse(Did, 13, 3, 1) -- Маска
else
    active = true
             sampSendDialogResponse(Did, 13, 1, 1) -- Дубинка
             sampSendDialogResponse(Did, 13, 2, 1) -- Броник
             sampSendDialogResponse(Did, 13, 3, 1) -- Маска
end
Можно как то не вписывать повторно код после else ?