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

madrasso

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

ШPEK

Известный
1,474
525
Как заменить скрипт тогда? Действующий - Скаченным


В Spur Imgui не нашел ничего
os.remove(path)
Перед удалением надо закрыть файл который нужно удалить
Как заменить скрипт тогда? Действующий - Скаченным


В Spur Imgui не нашел ничего
Lua:
function spur(path, rash)
    files = {}
    local handleFile, nameFile = findFirstFile(path.."/*."..rash)
    while nameFile do
        if handleFile then
            if not nameFile then 
                findClose(handleFile)
            else
                table.insert(files, nameFile)
                nameFile = findNextFile(handleFile)
            end
        end
    end
    return files
end
Мб тебе это надо?
Возвращает таблицу с названиями всех файлов.
path - расположение
rash - расширение (например: txt)
 

madrasso

Потрачен
883
325
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
функу вызываю прост так: goupdate()
в updatelink - ссылка рабочая.
Обновление не проходит...
Lua:
function download_handler(id, status, p1, p2)
  if status == dlstatus.STATUS_DOWNLOADINGDATA then
    print(string.format('Загружено %d из %d.', p1, p2))
  elseif status == dlstatus.STATUS_ENDDOWNLOADDATA then
    sampAddChatMessage("[MDX]: {FFFFFF}Обновление завершено! Подробнее об обновлении - /mdxlog.", 0x8800ff)
    thisScript():reload()
  end
end

function goupdate()
  sampAddChatMessage("[MDX]: {FFFFFF}Обнаружено обновление. Пытаюсь обновиться c v"..thisScript().version.." на v"..updateversion, 0x8800ff)
  wait(250)
  download_id = downloadUrlToFile(updatelink, thisScript().path, download_handler)
end
 

[SA ARZ]

Известный
392
8
upload_2018-11-2_20-43-22.png

после кнопки отправить - диалог с 818 - закрывается и не отправляется СМС, это на DRP
 

Fomikus

Известный
Проверенный
475
345
Как узнать текст определенного пункта в диалоге?
Например в /mn >
1.Статистика
2.Помощь по серверу
3.Связь с админстрацием
И так дале.
 

wargamer9911

Участник
33
4
проблему не решил
Код:
 require "lib.moonloader"
local sampev = require 'lib.samp.events'
local as_action = require('moonloader').audiostream_state
require "lib.sampfuncs"
local memory = require "memory"
local bass = require 'lib.bass'


local myObjsModel = {19393, 19384, 19390, 19929}

function main()
   if not isSampLoaded() then return end
   while not isSampAvailable() do wait(100) end

   while true do wait(0)
       local ob = getAllObjects()
       for i = 1, #ob do
           local v = ob
           if doesObjectExist(v) then
               local model = getObjectModel(v)
               if isObjectInArea2d(v, -152.0783, 1247.5969, -1348.4775, 2157.8174, true) then -- объясните что это за координаты? тут я должен подставить свои?
                   for t = 1, #myObjsModel do
                       if model == myObjsModel[t] then
                           deleteObject(v)
                       end
                   end
               end
           end
       end
   end
end
задача удалить стены на стройке DRP, скрипт работает, загружается но стены не удаляются, что делать?
 

Fomikus

Известный
Проверенный
475
345
Lua:
function samp.onShowDialog(id, style, title, btn, btn, text)
print(text)
if text == Строка 1
Строка 2
Строка 3
Строка 4
Как проверить text, если он - текст с несколькими строчками?
function samp.onShowDialog(id, style, title, btn, btn, text)
print(text)
if text == 'Магический пунш {FFFFFF} {3A8819}[Доступен]{FFFFFF}
Сломанная метла {FFFFFF} {3A8819}[Доступен]{FFFFFF}
Проказник Чахлик {3A8819}[Доступен]{FFFFFF}
В поисках забытых предков {3A8819}[Доступен]{FFFFFF}
Тайный элексир {3A8819}[Доступен]{FFFFFF}
Мой брат Воланд {3A8819}[Доступен]{FFFFFF}
 

ШPEK

Известный
1,474
525
i
Lua:
function samp.onShowDialog(id, style, title, btn, btn, text)
print(text)
if text == Строка 1
Строка 2
Строка 3
Строка 4
Как проверить text, если он - текст с несколькими строчками?
function samp.onShowDialog(id, style, title, btn, btn, text)
print(text)
if text == 'Магический пунш {FFFFFF} {3A8819}[Доступен]{FFFFFF}
Сломанная метла {FFFFFF} {3A8819}[Доступен]{FFFFFF}
Проказник Чахлик {3A8819}[Доступен]{FFFFFF}
В поисках забытых предков {3A8819}[Доступен]{FFFFFF}
Тайный элексир {3A8819}[Доступен]{FFFFFF}
Мой брат Воланд {3A8819}[Доступен]{FFFFFF}
if text == [[asdadsasd
asdsdasa
dfssfddf
cvxcvx]]
 

atizoff

приобретаю кашель за деньги
Проверенный
1,296
1,179
Как получить расположение хпбара?