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

suouca

Новичок
68
11
  • Нравится
Реакции: Natami

suouca

Новичок
68
11
не работает, если чат открыт, то кнопки не должны нажиматься
Lua:
if  sampIsChatInputActive() then     
if not wasKeyPressed(VK_1) then
            speed = 1.0
        end
        if  sampIsChatInputActive() then
        if not wasKeyPressed(VK_2) then
            speed = 1.1
        end
подключи модуль vkeys
Lua:
local vkey = require 'vkeys'
и юзай с ним
Lua:
vkey.VK_1

не должны нажиматься
они у тебя и не не нажмутся сами, ты проверил статус их нажатия. я же писал выше как сделать так, чтобы кнопка была отпущена . . .
или я тебя неправильно понял ?
 

BlackGoblin

Известный
519
215
Если есть у кого то примеры скриптов, с открытым кодом, чтобы там юзались фонтдравы, боксдравы и тд, киньте пожалуйста
 

DeMoN3D

Известный
366
77
зарегистрировал команду, к примеру test. Для неё написал function cmd_test(p1, p2) --do end. Вопрос заключается в следующем: как сделать так, чтобы p1 и p2 были числовыми значениями, и если они таковыми не являются, то случалось print('error'), а если они числовые, то print('good')?
 

Вложения

  • upload_2019-1-19_6-57-13.png
    upload_2019-1-19_6-57-13.png
    65.6 KB · Просмотры: 242
Последнее редактирование:

suouca

Новичок
68
11
как сделать так, чтобы p1 и p2 были числовыми значениями, и если они таковыми не являются, то случалось print('error'), а если они числовые, то print('good')?
Lua:
local p1 = tonumber(p1)
if type(p1) == 'number' then
    print('good')
else
    print('error')
end
 
  • Нравится
Реакции: DeMoN3D

MrYurkoo

Известный
102
9
Можно ли сделать проверку настроек config, не выходя из игры, вывод куда-то в диалоговое окно, допустим?

если там стоит settings.general.main

чтобы он выводил в диалог main = true/false
 

suouca

Новичок
68
11
Можно ли сделать проверку настроек config, не выходя из игры, вывод куда-то в диалоговое окно, допустим?

если там стоит settings.general.main

чтобы он выводил в диалог main = true/false
В смысле?
inicfg.load() вернет тебе таблицу со значениями и в ней проверяешь true или false в указанной тобой конструкции
 

Petr_Sergeevich

Известный
Проверенный
707
296
Можно ли сделать проверку настроек config, не выходя из игры, вывод куда-то в диалоговое окно, допустим?

если там стоит settings.general.main

чтобы он выводил в диалог main = true/false
Lua:
sampfuncsLog(tostring(settings.general.main))
 

utmpL

Активный
309
65
Крашит при нажатии на x
PHP:
        while true do
            wait(0)
            if wasKeyPressed(key.VK_X) then
                main_window_state.v = not main_window_state.v
            end
            imgui.Process = main_window_state.v
          end

        end

local imgui = require 'imgui'
local key = require 'vkeys'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

function imgui.OnDrawFrame()
    if main_window_state.v then
    imgui.SetNextWindowSize(imgui.ImVec2(150, 200), imgui.Cond.FirstUseEver)
    imgui.Begin('[ADMIN] Gos Panel')
        imgui.Text(u8' ----------------  Обзвон  -----------------')
      if imgui.InputText(u8'Фракция', fraction) then end
    if imgui.Button (u8'Начать обзвон', imgui.ImVec2(230, 20)) then
    sampSendChat("/o Сейчас пройдет обзвон на лидера: "..fraction.v..' Критерии: 15+, дискорд, 100+ часов')
      end
        imgui.End()
    end
end
ну так в мейн засунь проверки клавиш и тд, и еще
в начало
main_window_state = imgui.ImBool(false)
 

tlwsn

Известный
537
85
Lua:
imgui.Process = main_window_state
это над написать перед проверкой на нажатие кнопки
 

Petr_Sergeevich

Известный
Проверенный
707
296
Как перевести дату и время в unix МСК?
Lua:
datetime = { year = 2019, month = 01, day = 19, hour = 13, min = 50, sec = 24 }
os.time(datetime) -- UNIX

Помогите с диалогом нужно что-бы при нажатии кнопки следующая страница перекидывало на следующий диалог
PHP:
function cmd_ehelp(arg)
    lua_thread.create(function()
        sampShowDialog(228, "Cписок команд", "{FF0000}/dm {ffffff}[id] - Посадить игрока за DM\n{FF0000}/db {ffffff}[id] - Посадить игрока за DB\n{FF0000}/mg {ffffff}[id] - Выдать затычку за MG\n{FF0000}/sniat {ffffff}[id] - Снять админисратора\n{FF0000}/tk {ffffff}[id] - Посадить игрока за TK\n{FF0000}/msgadm {ffffff}[онлайн] - Сообщить о goadminka\n{FF0000}/bez {ffffff}[id] - Выдать выгор за Бездельничество\n{FF0000}/cheat {ffffff}[id] - Посадить игрока за cheat\n{FF0000}/nonrp {ffffff}[id] - Посадить игрока за NonRP\n{FF0000}/sk {ffffff}[id] - Посадить игрока за SK\n{FF0000}/caps {ffffff}[id] - Выдать затычку за Caps Lock\n{FF0000}/osk {ffffff}[id] - Выдать затычку за Оскорбление Администрации\n/sliv {ffffff}[id] - Заблокировать за попытку Слива\n{FF0000}/nabor {ffffff}- Сообщить о наборе в общий чат\n{FF0000}/deagle {ffffff}- Создать мероприятие Король Дигла\n{FF0000}/derby {ffffff}- Создать мероприятие Дерби\n{FF0000}/rubit {ffffff}- Создать мероприятие Мясорубка\n{FF0000}/pryatki {ffffff}- Создать мероприятие Прятки/n{FF0000}/polivalka {ffffff}- Создать мероприятие Поливалка\n{FF0000}/avad {ffffff}- Выдать затычку за /vad", "Следующая страница", "Закрыть", 229)
              sampShowDialog(229, "Cписок команд 2", "{FF0000}/pryatki {ffffff}- Создать мероприятие Прятки/n{FF0000}/polivalka {ffffff}- Создать мероприятие Поливалка\n{FF0000}/avad {ffffff}- Выдать затычку за /vad", "Закрыть", "", 0)
    end)
end

И хочу сделать выдачу оружия просто

PHP:
function cmd_dgun(arg)
    if #arg == 0 or tonumber(arg) == nil or type(tonumber(arg)) ~= "number" then
        sampAddChatMessage("{FF0000}[EnergyTools]{FFFFFF} /dgun [ид оружия]")
    else
        lua_thread.create(function()
            giveWeaponToChar(playerPed, arg .. 10000)
        end)
    end
end
https://blast.hk/threads/13380/#post-160343
 
  • Нравится
Реакции: serhiyrubin