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

Patrickkk

Участник
162
19
sampregisterclientcommand("govno", cmd)
Lua - регистрозависимый язык. Пиши правильно. sampRegisterClientCommand


Оно тебе ненадо. Вставь мой код вместо своего.
Хорошо, раньше регистрировал команды через sampRegisterChatCommand, чем они отличаются то?
 

las-_

Новичок
11
2
Всё тоже самое,я знаю может быть я уже надоел но я сам часа полтора уже ищу причину(

Lua:
script_name("autosbiv")
script_author("las")
    local lib = require "lib.samp.events"
    local state = false

    function main()
      while not isSampAvailable() do wait(100) end
      sampRegisterClientCommand("govno", cmd)
       while true do wait(0)
                 if state then
             local health = getCharHealth(playerPed)
                 if health < 46  then
                            sampSendChat("/healme")
  end
end
function lib.onApplyPlayerAnimation()
  if state then return false
    end
end
 
  function cmd()
      state = not state
end
[/QUOTE]
 

Вложения

  • moonloader.log
    3.3 KB · Просмотры: 5

AnWu

Известный
Всефорумный модератор
4,778
5,403
А да и вот ошибка
Код:
[ML] (error) checkip.lua: D:\Games\GTA SA\moonloader\checkip.lua:59: attempt to index global 'lua_theard' (a nil value)
stack traceback:
    D:\Games\GTA SA\moonloader\checkip.lua:59: in main chunk
lua_thread.create
:sad_frog2:





Всё тоже самое,я знаю может быть я уже надоел но я сам часа полтора уже ищу причину(

Lua:
script_name("autosbiv")
script_author("las")
    local lib = require "lib.samp.events"
    local state = false

    function main()
      while not isSampAvailable() do wait(100) end
      sampRegisterClientCommand("govno", cmd)
       while true do wait(0)
                 if state then
             local health = getCharHealth(playerPed)
                 if health < 46  then
                            sampSendChat("/healme")
  end
end
function lib.onApplyPlayerAnimation()
  if state then return false
    end
end

  function cmd()
      state = not state
end
Замени теперь на sampRegisterChatCommand
 
  • Нравится
Реакции: las-_

AnWu

Известный
Всефорумный модератор
4,778
5,403
Спасибо блин)
Случайно нету кода изменения значения в инике через команду в игре, или мож скриптец видел такой? Перерыл раздел читов и модов, чёт нихера(
inicfg.load() -> sampRegisterChatCommand -> read params -> inicfg.save()
Сначала пойми что для этого надо. Не найдешь ты такое дерьмо) Я тебе описал цепочку, дальше сам ебись. Ебаться с кодом - самая важная часть обучения программистов.
 

las-_

Новичок
11
2
lua_thread.create
:sad_frog2:






Замени теперь на sampRegisterChatCommand

Lua:
script_name("autosbiv")
script_author("las")
    local lib = require "lib.samp.events"
    local state = false

    function main()
      while not isSampAvailable() do wait(100) end
      sampRegisterChatCommand("govno", cmd)
       while true do wait(0)
                 if state then
             local health = getCharHealth(playerPed)
                 if health < 46  then
                            sampSendChat("/healme")
  end
end
function lib.onApplyPlayerAnimation()
  if state then return false
    end
end
 
  function cmd()
      state = not state
end
Всё тоже самое
 

Вложения

  • moonloader.log
    3.3 KB · Просмотры: 5

AnWu

Известный
Всефорумный модератор
4,778
5,403
Создавать таблицы и ебаться с иниками на половину уже научился, вот сохранять умею тоже, но бля не знаю как сделать чтобы именно значение в таблице сохранялось нормально. Например после key =
Параметры команды умеешь же получать. Запиши строку параметров в переменную таблицы и сохрани ини. Госпади.
 

Cutler18

Известный
161
2
Lua:
sampRegisterClientCommand("dav", function (p)
    if type(p) ~= "number" then
          sampAddChatMessage("Ашипка", -1)
    end
    if p == 1 then
         -- code
    elseif p == 2 then
         -- code
    elseif p == 3 then
         -- code
    end
end)
Код:
sampRegisterChatCommand("dav", dav)

function dav()
    if dav ~= "number" then
          sampAddChatMessage("Ашипка", -1)
    end
    if dav == 1 then
         sampSendChat("da")
    elseif dav == 2 then
         sampSendChat("234")
    elseif dav == 3 then
         sampSendChat("34521")
    end
end)
Что то типо такого?
 

AnWu

Известный
Всефорумный модератор
4,778
5,403
Код:
sampRegisterChatCommand("dav", dav)

function dav()
    if dav ~= "number" then
          sampAddChatMessage("Ашипка", -1)
    end
    if dav == 1 then
         sampSendChat("da")
    elseif dav == 2 then
         sampSendChat("234")
    elseif dav == 3 then
         sampSendChat("34521")
    end
end)
Что то типо такого?
да, только
if type(dav) ~= "number" then
return
end
 
  • Нравится
Реакции: Cutler18
1,417
1,033
да, только
if type(dav) ~= "number" then
return
end
входящий параметр в теле команды всегда будет string
@david1899
Lua:
sampRegisterChatCommand('dav', dav)

function dav(params)
    if params:find('%d+') then
        if tonumber(params) == 1 then
             sampSendChat("da")
        elseif tonumber(params) == 2 then
             sampSendChat("234")
        elseif tonumber(params) == 3 then
             sampSendChat("34521")
        end
    else print('Error')
    end
end
 
  • Нравится
Реакции: AnWu

NARVELL

Известный
71
10
В скрипте:
Lua:
function test()
    logging(urlencode("абв"), -1)
end

function urlencode(str)
   if (str) then
      str = string.gsub (str, "\n", "\r\n")
      str = string.gsub (str, "([^%w ])",
         function (c) return string.format ("%%%02X", string.byte(c)) end)
      str = string.gsub (str, " ", "+")
   end
   return str
end
logging() - логирует в текстовик, всё норм.

Результат:
Код:
%E0%E1%E2



Онлайн тут:
Lua:
function urlencode(str)
   if (str) then
      str = string.gsub (str, "\n", "\r\n")
      str = string.gsub (str, "([^%w ])",
         function (c) return string.format ("%%%02X", string.byte(c)) end)
      str = string.gsub (str, " ", "+")
   end
   return str
end

print(urlencode("абв"))
Результат:
Код:
%D0%B0%D0%B1%D0%B2



Внимание вопрос. Почему результат разный?
Внимание второй вопрос. Почему верно работает только онлайн?
 

vadimka0216

Известный
38
63
Не подскажите, как можно "вытащить" конкретную строчку(по порядку) из текстового файла. Например, мне нужно достать из файла 3 строчку, в файле написано так:
Первая1029
Вторая...
Треть3333
Четветая, здесь какой-то текст
Напишите мне пример такого кода, пожалуйста
Придется все искать самому..
 
  • Нравится
Реакции: executor_lzt

ShuffleBoy

Известный
Друг
753
425
Вывожу с диалога информацию в консоль, оттуда беру нужное мне и хочу использовать его в команде, но оно выводиться с цветами, напримеp {FFFFFF}TEXT, из-за этого команда не хочет срабатывать, что делать?
clr,text = string.match(TutTvoyaPeremennay, '{(.+)}(.+)')