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

egor230

Участник
47
16
Чтобы создать машину, нужно знать iD модели, этого можно избежать если подключить библиотеку 'lib.game.models'
Получится вот так
Lua:
require "lib.moonloader"
model = require 'lib.game.models'
function main()
  while true do
    m = model.CHEETAH -- id модели машины
    wait(0)
    if isPlayerPlaying(playerHandle) -- игрок жив
      then if wasKeyPressed(VK_M) -- клавиша j 
      then requestModel(m) -- запрос модели 
      while isKeyDown(VK_M) do wait(10) end -- ждать пока отпустим кнопку
           if isModelAvailable(m) -- проверка на загруженность модели 
            then printStringNow('~g~marker', 2000)-- вывод текста
                local posX, posY, posZ = getCharCoordinates(playerPed) -- координаты cj
                  local posY = posY + 10
                  mycar = createCar(m,  posX, posY, posZ) -- создать машину от 10 м от cj
                --  markModelAsNoLongerNeeded(a) -- удалить модель и id из памяти
                end
            end
        end
    end
end
Вопрос как сделать чтобы вместо model.CHEETAH, можно было использовать CHEETAH?
 

MrCreepTon

Неизвестный
Всефорумный модератор
2,134
4,731
Чтобы создать машину, нужно знать iD модели, этого можно избежать если подключить библиотеку 'lib.game.models'
Получится вот так
Lua:
require "lib.moonloader"
model = require 'lib.game.models'
function main()
  while true do
    m = model.CHEETAH -- id модели машины
    wait(0)
    if isPlayerPlaying(playerHandle) -- игрок жив
      then if wasKeyPressed(VK_M) -- клавиша j
      then requestModel(m) -- запрос модели
      while isKeyDown(VK_M) do wait(10) end -- ждать пока отпустим кнопку
           if isModelAvailable(m) -- проверка на загруженность модели
            then printStringNow('~g~marker', 2000)-- вывод текста
                local posX, posY, posZ = getCharCoordinates(playerPed) -- координаты cj
                  local posY = posY + 10
                  mycar = createCar(m,  posX, posY, posZ) -- создать машину от 10 м от cj
                --  markModelAsNoLongerNeeded(a) -- удалить модель и id из памяти
                end
            end
        end
    end
end
Вопрос как сделать чтобы вместо model.CHEETAH, можно было использовать CHEETAH?
Код:
local CHEETAH = model.CHEETAH
 

Musaigen

abobusnik
Проверенный
1,585
1,309
Для изменения цвета денег нужно писать RGBA кодировку наоборот, как можно это сделать?
Поставить альфу на первое место.
:sad_frog:
Как перевернуть RGBA цвет?


Цвет другой вообще получается
RGBA > ABGR
Lua:
Зеленый RGBA: 00FF00FF
Зеленый ABGR: FF00FF00
 
Последнее редактирование:

GevorgAaaaa

Новичок
1
0
Не работают стрелки при написания скрипта не нажимает именно у меня что это может быть?
(стрелки на клаве)
 

Logaan

Известный
80
15
Как для ракбота сделать нормальную задержку между командами? При использовании sleep как-то все непонятно работает
Например,
sendDialog(7972,1,0,'')
sleep(2000)
runCommand('!coord 1495,12 -1280,09 14,58')
он спит не между этими командами, а где то в другой части скрипта. Или может как-то через defcalladd. Весь гугол переискал. Помогите разобраться.
 

asocial demon

Потрачен
175
14
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как выбрать один из пунктов этого диалога?
 

Вложения

  • sa-mp-030.png
    sa-mp-030.png
    145.2 KB · Просмотры: 380

asocial demon

Потрачен
175
14
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Почему не работает?
Lua:
function sampev.onShowTextDraw(id)
     if id == 2055 then
         sampSendClickTextDraw(2055)
   end
end
 

egor230

Участник
47
16
Спасибо большое за ваши ответы @Vincent, @MrCreepTon.
Сегодня написал простую миссию на языке lua.
Может кому пригодится, использовать как шаблон?
Lua:
require "lib.moonloader"
glob = require 'game.globals'               
model = require 'lib.game.models'
function fall() -- провал
setGameGlobal(glob.ONMISSION, 0)
printWithNumberBig("M_FAIL", 100, 4000, 1)
end
function pass(money)
setGameGlobal(glob.ONMISSION, 0)
printWithNumberBig("M_PASS", money, 4000, 1) -- надпись пройдено
playMissionPassedTune(1)-- 0394: play_music 1
givePlayerMoney(PlayerPed, money, 200)-- дать денег игроку
end
function defeat()
lua_thread.create(function()
wait(0)
while isPlayerPlaying(PLAYER_HANDLE) do wait(0) end -- пока игрок жив 
fall() -- провал
end)end
function step1()
lua_thread.create(function()
wait(0)
while not locateCar3d(car, 2445.20,-1659.75,13.07, 6.0, 6.0, 3.0, true) do
wait(0) end 
removeBlip(checkpoint)
pass(100) -- кол-во денег за победу
end)end
function mission()
defeat() -- поток на провал
car = createCar(model.CHEETAH, 2492.70, -1661.45, 13.10) -- создать машину 
checkpoint = addBlipForCoord(2445.20,-1659.75,13.07) -- 018A: 1@ = create_checkpoint_at 14@ 15@ 16@
setCoordBlipAppearance(checkpoint, 2) -- 08FB: set_checkpoint 1@ type_to 0
step1()
end
function flagmis1()
onmission = getGameGlobal(glob.ONMISSION)
if onmission == 0
then printStringNow(onmission, 2000)-- вывод текста   
setGameGlobal(glob.ONMISSION, 1)
end
if onmission == 1
then printStringNow(onmission, 2000)-- вывод текста   
setGameGlobal(glob.ONMISSION, 0)
wait(1500)
registerMissionGiven() --registerMissionGiven()
end 
end
function flagmis() -- получаем флаг миссии
onmission = getGameGlobal(glob.ONMISSION)
return onmission
end
function delicon() -- удалить сферу и иконку
creat = 0 
removeSphere(sphere) -- 03BD: destroy_sphere 149@
removeBlip(icon) -- 0164: disable_marker $MARKER_CATALINA 
end
function creaticon() -- создать сферу и иконку
icon = addSpriteBlipForCoord(posx, posy, posz, icons) --02A8: $439 = create_marker ICON at 1@ 2@ 3@
sphere = addSphere(posx, posy, posz, 4.3) --03BC: 149@ = create_sphere_at x y z  radius 1.0
creat = 1 -- метка создана
end
function startmiss() -- подготовка миссии
misflag = flagmis() -- проверка запущена ли другая миссия или нет
if misflag == 0
then doFade(false, 200) -- 016A: fade 0 time 0
setPlayerControl(PLAYER_HANDLE, false) -- 01B4: set_player $PLAYER_CHAR can_move 1
mycar = storeCarCharIsInNoSave(PLAYER_PED) -- 03C0: $2197 = actor $PLAYER_ACTOR 
wait(500)
taskLeaveAnyCar(playerPed) -- 0633: AS_actor 50@ exit_car
while isCharInAnyCar(PLAYER_PED) do wait(0) end
setCarCoordinates(mycar, 0.0, 0.0, 0.0) -- 00AB: put_car 22@ at -1577.942 52.6333 40.0
for k,m in ipairs(models) do requestModel(m) -- запрос модели 
while not isModelAvailable(m) do wait(0) end-- проверка на загруженность модели end
end
doFade(true, 200) -- 016A: fade 0 time 0
setGameGlobal(glob.ONMISSION, 1) -- включить флаг миссии 
setPlayerControl(PLAYER_HANDLE, true) -- 01B4: set_player $PLAYER_CHAR can_move 1
mission() end end
function start()
misflag = flagmis() -- проверка запущена ли другая миссия или нет
if misflag == 0 and creat == 0
then creaticon() -- создать метку и сферу
end
if locateStoppedCharAnyMeans3d(PLAYER_PED, posx, posy, posz, 5.0, 5.0, 4.0, false) -- 0101: actor $PLAYER_ACTOR in_sphere 10@ 11@ 12@ radius 5.0 5.0 3.0 sphere 0 stopplayerPed
then startmiss()-- подготовка миссии
end
if misflag == 1
then delicon() -- удалить сферу и иконку
end end
function main()
creat = 0 -- флаг создание сферы и иконки
models = {model.CHEETAH}
posx = 2497.49
posy = -1652.38
posz = 13.47
icons = 40
while true do
wait(0)
if not isCharInAnyCar(PLAYER_PED) -- 00DF: actor $PLAYER_ACTOR driving
then delicon() -- удалить сферу и иконку
else start() -- запуск миссии
end end
delicon() -- в случае смерти
end
 

tlwsn

Известный
537
85
как отправить сообщение всем тем, кто играет на сервере с моим скриптом?