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

kraft1k

Вынь х*й из головы и все получится © hnnssy
Друг
1,479
1,163
это вроде системная переменная, да и в ней проблемы нету.
Нихуя она не системная
Скрипт должен искать ак-47 на карте, получается что в скрипте не пашет именно этот код:
Lua:
              while true do
                    wait(0)
                    id = 355
                        local exists, handle = sampGetObjectHandleBySampId(id)
                            if exists and isObjectOnScreen(handle) then
                            local plX, plY, plZ = getObjectCoordinates(handle)
                                                        local plsX, plsY = convert3DCoordsToScreen(plX, plY, plZ)
Никакой АК-47 она не ищет, ты вообще чё пишешь?
Или код чей-то взял?
 

DevilishMane

Новичок
10
1
Нихуя она не системная

Никакой АК-47 она не ищет, ты вообще чё пишешь?
Или код чей-то взял?
я писал что взял чужой код и пытался его отредактировать
А написать хочу вх на оружие(в моем случае пока что только на ак-47)
 

kraft1k

Вынь х*й из головы и все получится © hnnssy
Друг
1,479
1,163
я писал что взял чужой код и пытался его отредактировать
А написать хочу вх на оружие(в моем случае пока что только на ак-47)
Есть же уже такое, "gun render" если не ошибаюсь
 

JayscoreIncorporated

Новичок
2
0
Приветствую, мне нужно, чтобы при каждом заходе на сервер, открывало /mn - 1 пункт , считывало информацию с нескольких пунктов и записывало в .ini файл. Как такое реализовать ?)
 

Frapsy

Известный
Проверенный
393
226
Приветствую, мне нужно, чтобы при каждом заходе на сервер, открывало /mn - 1 пункт , считывало информацию с нескольких пунктов и записывало в .ini файл. Как такое реализовать ?)
Открываешь стату, потом через хук onShowDialog регулярками достаешь нужную тебе информацию.
 

LZTD

Активный
129
25
-Vy9rD2L0ys.jpg

local intid = sampGetCurrentDialogId()
sampSendDialogResponse(intid, 1, 0, 228)

Почему не работает ???
 

egor230

Участник
47
16
Здравствуйте всем.
Помогите пожалуйста разобраться. создаю Объект который должен двигаться вверх. Но когда я к нему подхожу, движения объекта вверх прекращается. в планах сделать, что-то наподобие лифта.
Lua:
script_author("Egor")
script_name("slideObject")
require "lib.moonloader"
function main()
  while true do
    m = 1966 -- id модели 
    wait(0)
    if isPlayerPlaying(playerHandle) -- игрок жив
      then if wasKeyPressed(VK_J) -- клавиша j 
      then requestModel(m) -- запрос модели 
      while isKeyDown(VK_J) do wait(0) end -- ждать пока отпустим кнопку
           if isModelAvailable(m) -- проверка на загруженность модели 
            then 
                posX, posY, posZ = getCharCoordinates(playerPed) -- координаты cj
                posY = posY + 10
                posZ = posZ - 3.4
                object1 = createObject(m, posX, posY, posZ) -- 0107: $2706 = create_object #AD_FLATDOOR at 1833.36 -1995.45 12.5
                setObjectRotation(object1, 90.0, 0.0, 0.0) -- 0453: set_object $CRANE_MAGNET XY_rotation 15.0 0.0 angle $TEMPVAR_ANGLE
                result, posX, posY, posZ = getObjectCoordinates(object1)-- 01BB: store_object 0@ position_to $TEMPVAR_FLOAT_1 $TEMPVAR_FLOAT_2 $TEMPVAR_FLOAT_3
                while not wasKeyPressed(VK_H) do wait(0) end -- ждать нажатие кнопки
                  posZ = posZ + 50.4
                  for i=1, 100000 do
                    wait(3)
                  slideObject(object1, posX, posY, posZ, 0.0, 0.0, 0.005, 1)-- 034E: move_object 0@ to 1@ 2@ 3@ speed 13@ 16@ 19@ collision_check 1 
                  end                 
                  printStringNow('~g~ma', 2000)-- вывод текста
                end
end 
end
end
end
 

AnWu

Guardian of Order
Всефорумный модератор
4,706
5,232
Здравствуйте всем.
Помогите пожалуйста разобраться. создаю Объект который должен двигаться вверх. Но когда я к нему подхожу, движения объекта вверх прекращается. в планах сделать, что-то наподобие лифта.
Lua:
script_author("Egor")
script_name("slideObject")
require "lib.moonloader"
function main()
  while true do
    m = 1966 -- id модели
    wait(0)
    if isPlayerPlaying(playerHandle) -- игрок жив
      then if wasKeyPressed(VK_J) -- клавиша j
      then requestModel(m) -- запрос модели
      while isKeyDown(VK_J) do wait(0) end -- ждать пока отпустим кнопку
           if isModelAvailable(m) -- проверка на загруженность модели
            then
                posX, posY, posZ = getCharCoordinates(playerPed) -- координаты cj
                posY = posY + 10
                posZ = posZ - 3.4
                object1 = createObject(m, posX, posY, posZ) -- 0107: $2706 = create_object #AD_FLATDOOR at 1833.36 -1995.45 12.5
                setObjectRotation(object1, 90.0, 0.0, 0.0) -- 0453: set_object $CRANE_MAGNET XY_rotation 15.0 0.0 angle $TEMPVAR_ANGLE
                result, posX, posY, posZ = getObjectCoordinates(object1)-- 01BB: store_object 0@ position_to $TEMPVAR_FLOAT_1 $TEMPVAR_FLOAT_2 $TEMPVAR_FLOAT_3
                while not wasKeyPressed(VK_H) do wait(0) end -- ждать нажатие кнопки
                  posZ = posZ + 50.4
                  for i=1, 100000 do
                    wait(3)
                  slideObject(object1, posX, posY, posZ, 0.0, 0.0, 0.005, 1)-- 034E: move_object 0@ to 1@ 2@ 3@ speed 13@ 16@ 19@ collision_check 1
                  end                
                  printStringNow('~g~ma', 2000)-- вывод текста
                end
end
end
end
end
какаято хрень у тебя с клавишами. разберись с wasKeyPressed и isKeyDown
 

egor230

Участник
47
16
@DonHomka, Спасибо за ваше участие. Дело в том что есть на объект ничего не ставит, то он движется как надо. Но если же поставить на него машину, то движения вверх платформы прекращается. Хотел только понять как решить эту проблему
 

atizoff

приобретаю кашель за деньги
Проверенный
1,295
1,179
Во 1 не ревент.
Во 2 , хуле ты мне дал, я её и юзал нихуя не принимает
Во-первых, руки блять из жопы достань.
Во-вторых, хукни сперва диалог, узнай его айди, дальше впиши его, блять, ты хукать то умеешь ещё что-то на меня пиздишь? (соре за ма*т)
 

AnWu

Guardian of Order
Всефорумный модератор
4,706
5,232
@DonHomka, Спасибо за ваше участие. Дело в том что есть на объект ничего не ставит, то он движется как надо. Но если же поставить на него машину, то движения вверх платформы прекращается. Хотел только понять как решить эту проблему
так бы и написал. глянь как на павне сделано.
не двигается даже если пед на нем?

Во-первых, руки блять из жопы достань.
Во-вторых, хукни сперва диалог, узнай его айди, дальше впиши его, блять, ты хукать то умеешь ещё что-то на меня пиздишь? (соре за ма*т)
адекватнее
 
  • Нравится
Реакции: atizoff

Shamanije

Известный
Друг
961
921
-Vy9rD2L0ys.jpg

local intid = sampGetCurrentDialogId()
sampSendDialogResponse(intid, 1, 0, 228)

Почему не работает ???
Lua:
local sampev = require 'lib.samp.events'

function sampev.onShowDialog(dialogId,style,title,button1,button2,text)
    print(dialogId .. ' ' .. title) -- хукаешь айди диалога, после чего делаешь нужные действия
    sampSendDialogResponse(dialogId, 1, -1, '')
end

Тебе подойдёт код

Lua:
function sampev.onShowDialog(dialogId,style,title,button1,button2,text)
    if title:match('Размер ставки') then
        sampSendDialogResponse(dialogId, 1, -1, 'ставка')
    end
end
 
  • Нравится
Реакции: Tenkara