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

ImPasha

Software Developer & System Administrator
Друг
1,789
2,141
Доброго времени суток. Подскажите пожалуйста, почему данный кусок кода не работает?
Lua:
sampShowDialog(9998, 'Текст', 'Введи Ваш текст', 'Далее', 'Закрыть', 1)
result, button, input1 = sampHasDialogRespond(9998)
if result
then
sampAddChatMessage(input1, -1)
end
В локальный чат ничего не выводится.
Надо юзать в цикле.
 

morelli_

Новичок
2
0
Преобразование происходит при записи или перезаписи переменной.
time = tonumber(time)
Пример:
string = tostring(string)
Спасибо за ответ, но..
я изменил строчку в моем коде "tonumber(time)" на "time = tonumber(time)", ничего не изменилось, сообщение в чат так и не выводится. Также пробовал назначать на разные кнопки, не работает.
 

Jason2222

Известный
180
3
Lua:
local num = sampGetCharHandleBySampPlayerId(select_id) and -1 or 0


Потому-что теряешь таргет.
Создай переменную за пределами main с булевым значением false. Например
job = false
При нажатии на VK_Z устанавливай job в true.
После этого проверяй - если job = true - отыгрывай РП и ставь в конце отыгровки job в false
Можно пример как это сделать? У меня не получилось как-то :DD
Код:
require "lib.moonloader"

script_name("Lawyer")
local job = false
function main()
   if not isSampfuncsLoaded() or not isSampLoaded() then return end
   while true do
   wait(0)
   local resTarget, tHandle = getCharPlayerIsTargeting(playerHandle)
   if resTarget and isKeyDown(VK_Z) then job = true
      _, pID = sampGetPlayerIdByCharHandle(tHandle)
        name = sampGetPlayerNickname(pID)
        RPNick = name:gsub('_', ' ') end
       elseif job = true then sampSendChat('/do Адвокат в руке держит синюю папку с документами.')
       wait(1000)
       sampSendChat('/me достал из папки дело №'..pID 'на имя '..RPNick)
       wait(1000)
       sampSendChat('/me начал составлять договор освобождения под залог и передал его '..RPNick)
       wait(1000)
       sampSendChat('/free '..pID)
       wait(1000)
   job = false
   end
   
   end
 

Qsany

Потрачен
464
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как уменьшить размер серверного текстдрава?
 

Qsany

Потрачен
464
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Шурик

Активный
216
43
Почему у меня игра перестала загружаться, а при нажатии на "Подключиться" вылезает ошибка с крашем:
Код:
SA-MP 0.3.7
Exception At Address: 0x0FE2D311
Base: 0x05E90000

Registers:
EAX: 0x00000004    EBX: 0x0BD001C0    ECX: 0x0177F6BC    EDX: 0x00000008
ESI: 0x0FE27C70    EDI: 0x0FE24C90    EBP: 0x0177F700    ESP: 0x0177F6BC
EFLAGS: 0x00210202

Stack:
+0000: 0x00000000   0x00000000   0x0BD002CC   0x0BD00D58
+0010: 0x0BD4ED68   0x0FE1FF70   0x0BD001C0   0x0FE24C90
+0020: 0x0BD002CC   0x0BD00D58   0x0BD001C0   0x5898DAF8
+0030: 0x0FE27CE0   0x0177F6D8   0x0177F72C   0x0FF69540
+0040: 0x00000000   0x0BD001C0   0x5894280D   0x0BD001C0
+0050: 0x0BD01380   0x0177F718   0x0BD01380   0x0BD02898
+0060: 0x00000003   0x0BD0367C   0x0BD001C0   0x00000004
+0070: 0x0177F834   0x58964360   0x00000000   0x0BD01230
+0080: 0x0BD001F0   0x0177F81C   0x589473EB   0x0BD001C0
+0090: 0x00000000   0x00000000   0x00000010   0x58947560
+00A0: 0x09E1A19C   0x00000002   0x0FDF9572   0x0BD001C0
+00B0: 0x00000000   0xFFFFFFFF   0x00000002   0x0BD001C0
+00C0: 0x09E1A19C   0x0177F840   0x00000001   0x0FF11E40
+00D0: 0x0177F7F4   0x0BD001C0   0x0BD001C0   0x00000000
+00E0: 0x0177F82C   0x0177F8BC   0x0177F93C   0x0177FD50
+00F0: 0x084D0000   0x00000048   0x0177F7F8   0x00000023
+0100: 0x00000000   0x00000007   0x0177F8BC   0x767E2F50
+0110: 0x77E7CC0C   0x0BD001C0   0x00000001   0x00000001
+0120: 0x00000001   0x00000000   0x0FFC5810   0x0FE15790
+0130: 0x0FFC5814   0x6E6F6F6D   0x0072646C   0x0FF2911C
+0140: 0x0FFC5810   0x00000007   0x0000000F   0x0FFC8C84
+0150: 0x0177F93C   0x00000001   0x09E07900   0x0FE13E61
+0160: 0x0BD001C0   0x00000004   0x0BD001C0   0x00000003
+0170: 0x0177F824   0x00000002   0x0177F8F8   0x0FF6F5FC
+0180: 0x00000007   0x0177F904   0x0FEE6AA6   0x0BD001C0
+0190: 0x03CCA2F4   0x09E1A190   0x00000004   0x00000000
+01A0: 0x00000000   0x00000000   0x00000000   0x00000000
+01B0: 0x00000001   0x00000001   0x00000001   0x20776500
+01C0: 0x69726373   0x203A7470   0x00030100   0x00000000
+01D0: 0x0000000F   0x0FF782FF   0x0FF77590   0x00000000
+01E0: 0x03DB33F8   0x0177F898   0x0177F89C   0x00000000
+01F0: 0x00000023   0x00000027   0x0177F8AC   0x00000000
+0200: 0x09E12FE8   0x0000005C   0x00000000   0x0177F93C
+0210: 0x00000038   0x00000045   0x00000003   0x0BD00270
+0220: 0x0BD00100   0x0177F918   0x58947AD3   0x0177F94C
+0230: 0x00000000   0x0FFC5814   0x00000001   0x0177F924
+0240: 0x0FF6D14E   0x00000003   0x0177F930   0x0FE0708C
+0250: 0x03CCA2F4   0x09E1A190   0x00000004   0x0FFC5730
+0260: 0x00000000   0x0177F90C   0x0177F98C   0x0FF67F78
+0270: 0x00000001   0x0177F998   0x0FEE75E5   0x0FF86474

SCM Op: 0x0, lDbg: 0 LastRendObj: 0

Game Version: US 1.0
 
Последнее редактирование:

ShuffleBoy

Известный
Друг
753
425
Почем когда у меня игра перестала загружаться, а при нажатии на "Подключиться" вылезает ошибка с крашем:
Код:
SA-MP 0.3.7
Exception At Address: 0x0FE2D311
Base: 0x05E90000

Registers:
EAX: 0x00000004    EBX: 0x0BD001C0    ECX: 0x0177F6BC    EDX: 0x00000008
ESI: 0x0FE27C70    EDI: 0x0FE24C90    EBP: 0x0177F700    ESP: 0x0177F6BC
EFLAGS: 0x00210202

Stack:
+0000: 0x00000000   0x00000000   0x0BD002CC   0x0BD00D58
+0010: 0x0BD4ED68   0x0FE1FF70   0x0BD001C0   0x0FE24C90
+0020: 0x0BD002CC   0x0BD00D58   0x0BD001C0   0x5898DAF8
+0030: 0x0FE27CE0   0x0177F6D8   0x0177F72C   0x0FF69540
+0040: 0x00000000   0x0BD001C0   0x5894280D   0x0BD001C0
+0050: 0x0BD01380   0x0177F718   0x0BD01380   0x0BD02898
+0060: 0x00000003   0x0BD0367C   0x0BD001C0   0x00000004
+0070: 0x0177F834   0x58964360   0x00000000   0x0BD01230
+0080: 0x0BD001F0   0x0177F81C   0x589473EB   0x0BD001C0
+0090: 0x00000000   0x00000000   0x00000010   0x58947560
+00A0: 0x09E1A19C   0x00000002   0x0FDF9572   0x0BD001C0
+00B0: 0x00000000   0xFFFFFFFF   0x00000002   0x0BD001C0
+00C0: 0x09E1A19C   0x0177F840   0x00000001   0x0FF11E40
+00D0: 0x0177F7F4   0x0BD001C0   0x0BD001C0   0x00000000
+00E0: 0x0177F82C   0x0177F8BC   0x0177F93C   0x0177FD50
+00F0: 0x084D0000   0x00000048   0x0177F7F8   0x00000023
+0100: 0x00000000   0x00000007   0x0177F8BC   0x767E2F50
+0110: 0x77E7CC0C   0x0BD001C0   0x00000001   0x00000001
+0120: 0x00000001   0x00000000   0x0FFC5810   0x0FE15790
+0130: 0x0FFC5814   0x6E6F6F6D   0x0072646C   0x0FF2911C
+0140: 0x0FFC5810   0x00000007   0x0000000F   0x0FFC8C84
+0150: 0x0177F93C   0x00000001   0x09E07900   0x0FE13E61
+0160: 0x0BD001C0   0x00000004   0x0BD001C0   0x00000003
+0170: 0x0177F824   0x00000002   0x0177F8F8   0x0FF6F5FC
+0180: 0x00000007   0x0177F904   0x0FEE6AA6   0x0BD001C0
+0190: 0x03CCA2F4   0x09E1A190   0x00000004   0x00000000
+01A0: 0x00000000   0x00000000   0x00000000   0x00000000
+01B0: 0x00000001   0x00000001   0x00000001   0x20776500
+01C0: 0x69726373   0x203A7470   0x00030100   0x00000000
+01D0: 0x0000000F   0x0FF782FF   0x0FF77590   0x00000000
+01E0: 0x03DB33F8   0x0177F898   0x0177F89C   0x00000000
+01F0: 0x00000023   0x00000027   0x0177F8AC   0x00000000
+0200: 0x09E12FE8   0x0000005C   0x00000000   0x0177F93C
+0210: 0x00000038   0x00000045   0x00000003   0x0BD00270
+0220: 0x0BD00100   0x0177F918   0x58947AD3   0x0177F94C
+0230: 0x00000000   0x0FFC5814   0x00000001   0x0177F924
+0240: 0x0FF6D14E   0x00000003   0x0177F930   0x0FE0708C
+0250: 0x03CCA2F4   0x09E1A190   0x00000004   0x0FFC5730
+0260: 0x00000000   0x0177F90C   0x0177F98C   0x0FF67F78
+0270: 0x00000001   0x0177F998   0x0FEE75E5   0x0FF86474

SCM Op: 0x0, lDbg: 0 LastRendObj: 0

Game Version: US 1.0
Ищи несовместимые моды и пр, мунлоадер тут причем?
 

Qsany

Потрачен
464
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как вот такое в луа перевести ?

CLEO:
     0226: 2@ = actor $Player_Actor health
     0AD3: 3@ = format "%d hp" 2@
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,650
2,535
Есть какая нибудь функция, которая определяет хендл игрока, который нанёс вам урон из оружия?
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,761
5,368
Есть какая нибудь функция, которая определяет хендл игрока, который нанёс вам урон из оружия?
SAMP.Lua ищи событие получения урона, takeDamage.
Как вот такое в луа перевести ?

CLEO:
     0226: 2@ = actor $Player_Actor health
     0AD3: 3@ = format "%d hp" 2@
Lua:
local result, id = sampGetPlayerIdByCharHandle(handle)
local hp
if result then
    hp = sampGetPlayerHealth(id)
end
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,761
5,368
Можешь кинуть пример?
onSendTakeDamage - видимо это нужно ловить
Lua:
function SE.onSendTakeDamage(h1, h2)
-- Но вот что тут ловить я пока еще не разобрался. Жди от других ребят ответа, я сейчас не могу опытным путём проверить :(
end