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

realgangster

Участник
37
0
if .. or .. then
Lua:
for i, k in pairs(chars) do
  local model = getCharModel(k)
  if model == 228 or model == 9 then
    -- code
  end
end
Lua:
        if model ==  265 or 266 or 267
             or 281 or 282 or 283
             or 284 or 285 or 286 and distance <= 5.0 then
                 sampAddChatMessage(distance, -1)

Начинает флудить шлак, а при:

Lua:
       if model ==  265  and distance <= 5.0 then
                 sampAddChatMessage(distance, -1)

всё хорошо, работает как нужно. Вот не могу понять чего так
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,518
Lua:
        if model ==  265 or 266 or 267
             or 281 or 282 or 283
             or 284 or 285 or 286 and distance <= 5.0 then
                 sampAddChatMessage(distance, -1)

Начинает флудить шлак, а при:

Lua:
       if model ==  265  and distance <= 5.0 then
                 sampAddChatMessage(distance, -1)

всё хорошо, работает как нужно. Вот не могу понять чего так
Lua:
if distance <= 5.0 then
    if model == 265 or model == 266 or model == 267
        or model == 281 or model == 282 or model == 283
        or model == 284 or model == 285 or model == 286 then
            sampAddChatMessage(distance, -1)
    end
end
 
Последнее редактирование:
  • Нравится
Реакции: realgangster

RTD

Нестандартное звание
Модератор
391
414
Для чего нужен "lib.moonloader" и "lib.sampfuncs" ?
Там константы, загляни и узнаешь для чего нужны.
Требования для работы скрипта.
Подключает эти две библиотеки при запуске скрипта.
Норм, и какие там требования? :D
 
  • Нравится
Реакции: imring

deddosouru

Смотрю аниме, служу Сатане
Друг
2,036
1,320
Lua:
local chars = getAllChars()
for i, k in pairs(chars) do
  local model = getCharModel(k)
  if model == 228 then
    -- code
  end
end

Как зачекать на несколько скинов? допустим 9
Lua:
if distance <= 5.0 then
    if model == 265 or model == 266 or model == 267
        or model == 281 or model == 282 or model == 283
        or model == 284 or model == 285 or model == 286 then
            sampAddChatMessage(distance, -1)
    end
end
Lua:
skins = {
[0]   = false,
[1]   = false,
[2]   = false,
[3]   = false,
[4]   = false,
[5]   = false,
[6]   = false,
[7]   = false,
[8]   = false,
[9]   = false,
[10]  = false,
[11]  = false,
[12]  = false,
[13]  = false,
[14]  = false,
[15]  = false,
[16]  = false,
[17]  = false,
[18]  = false,
[19]  = false,
[20]  = false,
[21]  = false,
[22]  = false,
[23]  = false,
[24]  = false,
[25]  = false,
[26]  = false,
[27]  = false,
[28]  = false,
[29]  = false,
[30]  = false,
[31]  = false,
[32]  = false,
[33]  = false,
[34]  = false,
[35]  = false,
[36]  = false,
[37]  = false,
[38]  = false,
[39]  = false,
[40]  = false,
[41]  = false,
[42]  = false,
[43]  = false,
[44]  = false,
[45]  = false,
[46]  = false,
[47]  = false,
[48]  = false,
[49]  = false,
[50]  = false,
[51]  = false,
[52]  = false,
[53]  = false,
[54]  = false,
[55]  = false,
[56]  = false,
[57]  = false,
[58]  = false,
[59]  = false,
[60]  = false,
[61]  = false,
[62]  = false,
[63]  = false,
[64]  = false,
[65]  = false,
[66]  = false,
[67]  = false,
[68]  = false,
[69]  = false,
[70]  = false,
[71]  = false,
[72]  = false,
[73]  = false,
[74]  = false,
[75]  = false,
[76]  = false,
[77]  = false,
[78]  = false,
[79]  = false,
[80]  = false,
[81]  = false,
[82]  = false,
[83]  = false,
[84]  = false,
[85]  = false,
[86]  = false,
[87]  = false,
[88]  = false,
[89]  = false,
[90]  = false,
[91]  = false,
[92]  = false,
[93]  = false,
[94]  = false,
[95]  = false,
[96]  = false,
[97]  = false,
[98]  = false,
[99]  = false,
[100] = false,
[101] = false,
[102] = false,
[103] = false,
[104] = false,
[105] = false,
[106] = false,
[107] = false,
[108] = false,
[109] = false,
[110] = false,
[111] = false,
[112] = false,
[113] = false,
[114] = false,
[115] = false,
[116] = false,
[117] = false,
[118] = false,
[119] = false,
[120] = false,
[121] = false,
[122] = false,
[123] = false,
[124] = false,
[125] = false,
[126] = false,
[127] = false,
[128] = false,
[129] = false,
[130] = false,
[131] = false,
[132] = false,
[133] = false,
[134] = false,
[135] = false,
[136] = false,
[137] = false,
[138] = false,
[139] = false,
[140] = false,
[141] = false,
[142] = false,
[143] = false,
[144] = false,
[145] = false,
[146] = false,
[147] = false,
[148] = false,
[149] = false,
[150] = false,
[151] = false,
[152] = false,
[153] = false,
[154] = false,
[155] = false,
[156] = false,
[157] = false,
[158] = false,
[159] = false,
[160] = false,
[161] = false,
[162] = false,
[163] = false,
[164] = false,
[165] = false,
[166] = false,
[167] = false,
[168] = false,
[169] = false,
[170] = false,
[171] = false,
[172] = false,
[173] = false,
[174] = false,
[175] = false,
[176] = false,
[177] = false,
[178] = false,
[179] = false,
[180] = false,
[181] = false,
[182] = false,
[183] = false,
[184] = false,
[185] = false,
[186] = false,
[187] = false,
[188] = false,
[189] = false,
[190] = false,
[191] = false,
[192] = false,
[193] = false,
[194] = false,
[195] = false,
[196] = false,
[197] = false,
[198] = false,
[199] = false,
[200] = false,
[201] = false,
[202] = false,
[203] = false,
[204] = false,
[205] = false,
[206] = false,
[207] = false,
[208] = false,
[209] = false,
[210] = false,
[211] = false,
[212] = false,
[213] = false,
[214] = false,
[215] = false,
[216] = false,
[217] = false,
[218] = false,
[219] = false,
[220] = false,
[221] = false,
[222] = false,
[223] = false,
[224] = false,
[225] = false,
[226] = false,
[227] = false,
[228] = false,
[229] = false,
[230] = false,
[231] = false,
[232] = false,
[233] = false,
[234] = false,
[235] = false,
[236] = false,
[237] = false,
[238] = false,
[239] = false,
[240] = false,
[241] = false,
[242] = false,
[243] = false,
[244] = false,
[245] = false,
[246] = false,
[247] = false,
[248] = false,
[249] = false,
[250] = false,
[251] = false,
[252] = false,
[253] = false,
[254] = false,
[255] = false,
[256] = false,
[257] = false,
[258] = false,
[259] = false,
[260] = false,
[261] = false,
[262] = false,
[263] = false,
[264] = false,
[265] = false,
[266] = false,
[267] = false,
[268] = false,
[269] = false,
[270] = false,
[271] = false,
[272] = false,
[273] = false,
[274] = false,
[275] = false,
[276] = false,
[277] = false,
[278] = false,
[279] = false,
[280] = false,
[281] = false,
[282] = false,
[283] = false,
[284] = false,
[285] = false,
[286] = false,
[287] = false,
[288] = false,
[289] = false,
[290] = false,
[291] = false,
[292] = false,
[293] = false,
[294] = false,
[295] = false,
[296] = false,
[297] = false,
[298] = false,
[299] = false,
[300] = false,
[301] = false,
[302] = false,
[303] = false,
[304] = false,
[305] = false,
[306] = false,
[307] = false,
[308] = false,
[309] = false, 
[310] = false,
[311] = false}
в таблице отмечаем нужные скины на true, и дальше для проверки юзаем

Lua:
local chars = getAllChars()
for i, k in pairs(chars) do
  local model = getCharModel(k)
  if skins[model] then
    -- code
  end
end
для экономии места, все false параметры можно невозбранно удолить
 
  • Нравится
Реакции: realgangster

imring

Ride the Lightning
Всефорумный модератор
2,355
2,518
Lua:
skins = {
[0]   = false,
[1]   = false,
[2]   = false,
[3]   = false,
[4]   = false,
[5]   = false,
[6]   = false,
[7]   = false,
[8]   = false,
[9]   = false,
[10]  = false,
[11]  = false,
[12]  = false,
[13]  = false,
[14]  = false,
[15]  = false,
[16]  = false,
[17]  = false,
[18]  = false,
[19]  = false,
[20]  = false,
[21]  = false,
[22]  = false,
[23]  = false,
[24]  = false,
[25]  = false,
[26]  = false,
[27]  = false,
[28]  = false,
[29]  = false,
[30]  = false,
[31]  = false,
[32]  = false,
[33]  = false,
[34]  = false,
[35]  = false,
[36]  = false,
[37]  = false,
[38]  = false,
[39]  = false,
[40]  = false,
[41]  = false,
[42]  = false,
[43]  = false,
[44]  = false,
[45]  = false,
[46]  = false,
[47]  = false,
[48]  = false,
[49]  = false,
[50]  = false,
[51]  = false,
[52]  = false,
[53]  = false,
[54]  = false,
[55]  = false,
[56]  = false,
[57]  = false,
[58]  = false,
[59]  = false,
[60]  = false,
[61]  = false,
[62]  = false,
[63]  = false,
[64]  = false,
[65]  = false,
[66]  = false,
[67]  = false,
[68]  = false,
[69]  = false,
[70]  = false,
[71]  = false,
[72]  = false,
[73]  = false,
[74]  = false,
[75]  = false,
[76]  = false,
[77]  = false,
[78]  = false,
[79]  = false,
[80]  = false,
[81]  = false,
[82]  = false,
[83]  = false,
[84]  = false,
[85]  = false,
[86]  = false,
[87]  = false,
[88]  = false,
[89]  = false,
[90]  = false,
[91]  = false,
[92]  = false,
[93]  = false,
[94]  = false,
[95]  = false,
[96]  = false,
[97]  = false,
[98]  = false,
[99]  = false,
[100] = false,
[101] = false,
[102] = false,
[103] = false,
[104] = false,
[105] = false,
[106] = false,
[107] = false,
[108] = false,
[109] = false,
[110] = false,
[111] = false,
[112] = false,
[113] = false,
[114] = false,
[115] = false,
[116] = false,
[117] = false,
[118] = false,
[119] = false,
[120] = false,
[121] = false,
[122] = false,
[123] = false,
[124] = false,
[125] = false,
[126] = false,
[127] = false,
[128] = false,
[129] = false,
[130] = false,
[131] = false,
[132] = false,
[133] = false,
[134] = false,
[135] = false,
[136] = false,
[137] = false,
[138] = false,
[139] = false,
[140] = false,
[141] = false,
[142] = false,
[143] = false,
[144] = false,
[145] = false,
[146] = false,
[147] = false,
[148] = false,
[149] = false,
[150] = false,
[151] = false,
[152] = false,
[153] = false,
[154] = false,
[155] = false,
[156] = false,
[157] = false,
[158] = false,
[159] = false,
[160] = false,
[161] = false,
[162] = false,
[163] = false,
[164] = false,
[165] = false,
[166] = false,
[167] = false,
[168] = false,
[169] = false,
[170] = false,
[171] = false,
[172] = false,
[173] = false,
[174] = false,
[175] = false,
[176] = false,
[177] = false,
[178] = false,
[179] = false,
[180] = false,
[181] = false,
[182] = false,
[183] = false,
[184] = false,
[185] = false,
[186] = false,
[187] = false,
[188] = false,
[189] = false,
[190] = false,
[191] = false,
[192] = false,
[193] = false,
[194] = false,
[195] = false,
[196] = false,
[197] = false,
[198] = false,
[199] = false,
[200] = false,
[201] = false,
[202] = false,
[203] = false,
[204] = false,
[205] = false,
[206] = false,
[207] = false,
[208] = false,
[209] = false,
[210] = false,
[211] = false,
[212] = false,
[213] = false,
[214] = false,
[215] = false,
[216] = false,
[217] = false,
[218] = false,
[219] = false,
[220] = false,
[221] = false,
[222] = false,
[223] = false,
[224] = false,
[225] = false,
[226] = false,
[227] = false,
[228] = false,
[229] = false,
[230] = false,
[231] = false,
[232] = false,
[233] = false,
[234] = false,
[235] = false,
[236] = false,
[237] = false,
[238] = false,
[239] = false,
[240] = false,
[241] = false,
[242] = false,
[243] = false,
[244] = false,
[245] = false,
[246] = false,
[247] = false,
[248] = false,
[249] = false,
[250] = false,
[251] = false,
[252] = false,
[253] = false,
[254] = false,
[255] = false,
[256] = false,
[257] = false,
[258] = false,
[259] = false,
[260] = false,
[261] = false,
[262] = false,
[263] = false,
[264] = false,
[265] = false,
[266] = false,
[267] = false,
[268] = false,
[269] = false,
[270] = false,
[271] = false,
[272] = false,
[273] = false,
[274] = false,
[275] = false,
[276] = false,
[277] = false,
[278] = false,
[279] = false,
[280] = false,
[281] = false,
[282] = false,
[283] = false,
[284] = false,
[285] = false,
[286] = false,
[287] = false,
[288] = false,
[289] = false,
[290] = false,
[291] = false,
[292] = false,
[293] = false,
[294] = false,
[295] = false,
[296] = false,
[297] = false,
[298] = false,
[299] = false,
[300] = false,
[301] = false,
[302] = false,
[303] = false,
[304] = false,
[305] = false,
[306] = false,
[307] = false,
[308] = false,
[309] = false,
[310] = false,
[311] = false}
в таблице отмечаем нужные скины на true, и дальше для проверки юзаем

Lua:
local chars = getAllChars()
for i, k in pairs(chars) do
  local model = getCharModel(k)
  if skins[model] then
    -- code
  end
end
для экономии места, все false параметры можно невозбранно удолить
Lua:
function doingWithModel(modelID)
    local types = {
        [0] = 1,
        [301] = 2
    }
    local functions = {
        [1] = function()
            sampAddChatMessage('Ya CJ', -1)
        end,
        [2] = function()
            sampAddChatMessage('Ya kop', -1)
        end
    }
    local t = types[modelID]
    if t then
        functions[t]()
    end
end
так лучше. каждая функция для определённых скинов.
 
  • Нравится
Реакции: N1ghT и deddosouru

Bogach

Активный
558
27
Ребят, а вот допустим я перебираю через for id серверных текстдравов, а как узнать текст этих текстдравов?
 

T1cKz

Известный
596
246
Нашёл строку - записал в message, как оттуда взять текст с параметрами
Типа: "Вася говорит: %s", text
 

Forevor

Известный
77
5
Что тут не так. Почему в %s не вводится никнейм игрока по ID (inp)
ADM3.lua:908: bad argument #3 to '?' (number expected, got string)

Lua:
local re, bu, li, inp, Rname = sampHasDialogRespond(1490)
     Rname = sampGetPlayerNickname(inp)
        if re == true then
          if bu == 1 then
           if Rname ~= nil then
            if inp ~= nil then
              sampSendChat(string.format("Новый лидер LSPD - %s[%d] ID. Поздравим его!", inp, Rname))
              lid()
            end
          end
          end
        end
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,518
Что тут не так. Почему в %s не вводится никнейм игрока по ID (inp)
ADM3.lua:908: bad argument #3 to '?' (number expected, got string)

Lua:
local re, bu, li, inp, Rname = sampHasDialogRespond(1490)
     Rname = sampGetPlayerNickname(inp)
        if re == true then
          if bu == 1 then
           if Rname ~= nil then
            if inp ~= nil then
              sampSendChat(string.format("Новый лидер LSPD - %s[%d] ID. Поздравим его!", inp, Rname))
              lid()
            end
          end
          end
        end
в string.format inp и Rname поменяй местами.
Lua:
local re, bu, li, inp = sampHasDialogRespond(1490)
if re and bu == 1 then
    local name = sampGetPlayerNickname(inp)
    if name then
        sampSendChat(string.format("Новый лидер LSPD - %s[%d] ID. Поздравим его!", name, inp))
        lid()
    end
end
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,639
2,489
Ребята, что не так в коде снизу? Постоянно показывает одни и те же цифры, хотя стоит функция рандома.

Lua:
function adi()
local adi = math.random(0, 1000)
local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
if sampIsPlayerConnected(ad) and ad ~= myid then
local nick, name = string.match(sampGetPlayerNickname(ad), "(%g+)_(%g+)")
sampSendChat(string.format("/ao Победитель этого часа - %s %s[%d], он получает $2000!", nick, name, ad))
sampSendChat("/ao Новый рандомный победитель будет выбран в следующем часу, напомните об этом.")
else adi2()
end
end

function adi2()
adi()
end

https://pp.userapi.com/c841429/v841429730/7f126/lXdlU9h1LMA.jpg

https://pp.userapi.com/c841429/v841429730/7f136/BgIdP35kSuM.jpg

Более-менее ясный код с табуляцией:

https://pp.userapi.com/c841429/v841429593/7609a/nOls_AgRwgE.jpg
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,518
Ребята, что не так в коде снизу? Постоянно показывает одни и те же цифры, хотя стоит функция рандома.

Lua:
function adi()
local adi = math.random(0, 1000)
local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
if sampIsPlayerConnected(ad) and ad ~= myid then
local nick, name = string.match(sampGetPlayerNickname(ad), "(%g+)_(%g+)")
sampSendChat(string.format("/ao Победитель этого часа - %s %s[%d], он получает $2000!", nick, name, ad))
sampSendChat("/ao Новый рандомный победитель будет выбран в следующем часу, напомните об этом.")
else adi2()
end
end

function adi2()
adi()
end

https://pp.userapi.com/c841429/v841429730/7f126/lXdlU9h1LMA.jpg

https://pp.userapi.com/c841429/v841429730/7f136/BgIdP35kSuM.jpg

Более-менее ясный код с табуляцией:

https://pp.userapi.com/c841429/v841429593/7609a/nOls_AgRwgE.jpg
Lua:
function adi()
    local adi = math.random(0, 1000)
    local _, myid = sampGetPlayerIdByCharHandle(playerPed)
    while not sampIsPlayerConnected(adi) or adi == myid do adi = math.random(0, 1000) end
    local nick, name = string.match(sampGetPlayerNickname(adi), "(%g+)_(%g+)")
    sampSendChat(string.format("/ao Победитель этого часа - %s %s[%d], он получает $2000!", nick, name, adi))
    sampSendChat("/ao Новый рандомный победитель будет выбран в следующем часу, напомните об этом.")
end