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

MFatunes

Новичок
46
10
Lua:
if list == 1 then
                         local bl = io.open('moonloader\\TRMH\\BlackList.txt','r')
                         if bl ~= nil then
                                 local CheckInBL = false
                                 for line in bl:lines() do
                                          if not string.find(line,tNick) then
                                             sampAddChatMessage("["..thisScript().name.."] {FFFFFF}Игрок {ffe100}" ..tNick.." не находится в черном списке.", 0x960ca8)
                                             break
                                       end
                                 end
                                 if not CheckInBL then
                                      sampAddChatMessage("["..thisScript().name.."] {FFFFFF}Игрок {ffe100}" ..tNick.." находится в черном списке.", 0x960ca8)
                                 end
                         end
                    end
Друзья, я совсем запамятовал как писать проверку на ЧС, буду очень рад если поможете, пробовал разные варианты которые всплывали в моей голове, в данный момент у меня появляются в чате 2-е строчки, в которых говорится, что игрок состоит в ЧС и не состоит одновременно.
Не стоит постоянно открывать файл и читать с него информацию. Создай таблицу, запиши туда все данные с файла и работай с ней.
 

Caicyo

Новичок
21
0
Есть ли способ или как нибудь проверка, благодаря которой функции "renderFontDrawText" и подобные не будут работать до тех пор, пока игрок полностью не залогинится на сервер?
Кароче чтобы скрипт ничего не отрисовывал на самом экране логина на сервер. Пробовал делать проверку на playerPed но безуспешно.
 

cover

Известный
Проверенный
245
273
Есть ли способ или как нибудь проверка, благодаря которой функции "renderFontDrawText" и подобные не будут работать до тех пор, пока игрок полностью не залогинится на сервер?
Кароче чтобы скрипт ничего не отрисовывал на самом экране логина на сервер. Пробовал делать проверку на playerPed но безуспешно.

Lua:
bool result = sampIsLocalPlayerSpawned()
 

Caicyo

Новичок
21
0
renderFontDrawText тоже функция SF.

Стоит только MoonLoader. Вот мне нужно что бы текстурка и часы не показывалась на экране логина на сервер. (Так же в коде отображает возле радара корды и название зоны, но скрина нет)

Lua:
require "lib.moonloader"

local texture = renderLoadTextureFromFile("moonloader/HudAddon/caicyo.png")
local font = renderCreateFont("Arial", 8, 5)

function main()
 while true do
  wait(0)
   x, y = getScreenResolution()
   px, py, pz = getCharCoordinates(playerPed)
   zone = getGxtText(getNameOfZone(px, py, pz))
   renderDrawTexture(texture, x-200, y-140, 200, 300, 0.0, -1)
   renderFontDrawText(font, 'Santiego_Morrison', x-156, y-160, 0xFFBEBEBE)
   renderFontDrawText(font, '' .. os.date("%X"), 82, y-160, 0xFFBEBEBE)
   renderFontDrawText(font, string.format("%s", zone), 200, 534, 0xFFBEBEBE)
   renderFontDrawText(font, string.format("X:%d Y:%d Z:%d", px, py, pz), 200, 546, 0xFFBEBEBE)
    if isCharInAnyCar(playerPed) then
     car = storeCarCharIsInNoSave(playerPed)
     carhp = getCarHealth(car)
     renderFontDrawText(font, string.format("Car health: %d", carhp), x-300, y-20, 0xFFBEBEBE)
    end
  end
end

Вот говнокод этой темы, прекрасно работает без SF.
 

Вложения

  • sa-mp-004.png
    sa-mp-004.png
    177.3 KB · Просмотры: 278

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
renderFontDrawText тоже функция SF.
нет (с 026-beta)
https://blast.hk/wiki/moonloader:changelog
Опкоды SAMPFUNCS для рисования 2D-элементов на экране заменены встроенными функциями
мм костыль
Lua:
local v = ('%.01f'):format(46.2000001)
 
  • Нравится
Реакции: MFatunes

biscuitt

Известный
185
14
Есть запись в файлик txt. Мне надо, чтобы записывались оба значения, но если я записал время, а потом запишу счёт "var", то время очищается и вместо него записывается var.
Как сделать так, чтобы файл не очищался от прошлой записи.
Lua:
function wonline()
    local file = io.open('moonloader\savelog.txt', 'w')
    file:write('Время работы: '..hour..':'..min..':'..sec)
    file:close()
end

function wreport()
    local file = io.open('moonloader\savelog.txt', 'w')
    file:write('Всего: '..var..' штук.')
    file:close()
end
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
Есть запись в файлик txt. Мне надо, чтобы записывались оба значения, но если я записал время, а потом запишу счёт "var", то время очищается и вместо него записывается var.
Как сделать так, чтобы файл не очищался от прошлой записи.
Lua:
function wonline()
    local file = io.open('moonloader\savelog.txt', 'w')
    file:write('Время работы: '..hour..':'..min..':'..sec)
    file:close()
end

function wreport()
    local file = io.open('moonloader\savelog.txt', 'w')
    file:write('Всего: '..var..' штук.')
    file:close()
end
w замени на a
и еще добавь к строкам в конце \n
 
  • Нравится
Реакции: biscuitt

biscuitt

Известный
185
14
Как очистить txt файл, в который я записывал значения через f:write

И как добавить врамя записи в f:write
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
Как очистить txt файл, в который я записывал значения через f:write

И как добавить врамя записи в f:write
Lua:
io.open(path, 'w'):close()
Lua:
local file = io.open(path, 'w')
file:close()
 
  • Нравится
Реакции: biscuitt

biscuitt

Известный
185
14
Как добавить дату записи в f:write?
Есть например f:write('Кол-во'..var), что будет выводить в txt "Кол-во число".
Как сделать, чтобы была дата? То есть вывод был таков: "[25/09/2018] Кол-во число".
 

cover

Известный
Проверенный
245
273
Как добавить дату записи в f:write?
Есть например f:write('Кол-во'..var), что будет выводить в txt "Кол-во число".
Как сделать, чтобы была дата? То есть вывод был таков: "[25/09/2018] Кол-во число".
Юзай os.date
 
  • Нравится
Реакции: biscuitt

Boganis

Новичок
15
0
Где фейл
local Main_Color = 0x5A90CE
local White_Color = '{FFFFFF}'
local Main_Color_text = "{5A90CE}"

require "lib.moonloader"



function main()
if not isSampLoaded() or not isSampfuncsLoaded() then return end
while not isSampAvailable() do wait(100) end
sampAddChatMessage('Скрипт разработал {FFFFFF} Bogdanis. New Script {5A90CE} загружен', 0x5A90CE)
wait(-1)

end

while true do
wait(0)
if isKeyJustPressed (VK_F3) then
sampAddChatMessage("Вы нажали клавишу {FFFFFF}F3", Main_Color)



end


end
 

MrCreepTon

Неизвестный
Всефорумный модератор
2,127
4,715
Где фейл
local Main_Color = 0x5A90CE
local White_Color = '{FFFFFF}'
local Main_Color_text = "{5A90CE}"

require "lib.moonloader"



function main()
if not isSampLoaded() or not isSampfuncsLoaded() then return end
while not isSampAvailable() do wait(100) end
sampAddChatMessage('Скрипт разработал {FFFFFF} Bogdanis. New Script {5A90CE} загружен', 0x5A90CE)
wait(-1)

end

while true do
wait(0)
if isKeyJustPressed (VK_F3) then
sampAddChatMessage("Вы нажали клавишу {FFFFFF}F3", Main_Color)



end


end
Лень объяснять весь говнокод, решил тупо переписать твою работу. Ошибки, думаю, сам найдешь, если сравнишь.
Lua:
function main()
    repeat wait(0) until isSampAvailable()
    sampAddChatMessage('{5A90CE}Скрипт разработал {FFFFFF} Bogdanis. New Script {5A90CE} загружен', -1)
    while true do
        wait(0)
        if wasKeyPressed(0x72) then
        sampAddChatMessage("{0x5A90CE}Вы нажали клавишу {FFFFFF}F3", -1)
    end
end