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

makasinuch

Новичок
52
4
попробуй проверять на существование объекта
Суть не в этом. 1 и 2 код одинаковые ( по сути ), но в 1 я получаю ид с хендла потом снова хендл. Оба должны работать...
Lua:
if isKeyJustPressed(49) then
        local objects = getAllObjects()
        for i,value in ipairs(objects) do
        local objectId = sampGetObjectSampIdByHandle(value)
            local object = sampGetObjectHandleBySampId(objectId)
            local result, positionX, positionY, positionZ = getObjectCoordinates(object)
        local object = createObject(19135, positionX, positionY, positionZ)  -- 19135 - metka
        end
    end
Собственно вопрос - почему не работает код? Пишет вот такое ( opcode '01BB' call caused an unhandled exception )
если использовать вот такой код:
Lua:
if isKeyJustPressed(49) then
        local objects = getAllObjects()
        for i,value in ipairs(objects) do
            local result, positionX, positionY, positionZ = getObjectCoordinates([B]value[/B])
        local object = createObject(19135, positionX, positionY, positionZ)  -- 19135 - metka
        end
    end
то все прекрасно работает!
 

Aniki

🐰
Администратор
1,225
1,506
Есть такая вот фигня
Lua:
function sampev.onServerMessage(color, text)
    if text:find('%[.+%]%s.+%s%a+_%a+%[.+%]: .+') then
        chat, zvan, nick, id, text = text:match('%[(.+)%]%s(.+)%s(%a+_%a+)%[(%d+)%]: (.+)')
        if zvan:find('Генерал') or zvan:find('Адмирал') or zvan:find('Министр обороны') or nick:find('Vasiliy_Rostov') then
            return { color, '['..chat..'] '..zvan..' {ff9933}'..nick..'['..id..']: {'..color..'}'..text }
        end
    end
end
Ник с идом нормально красит, но вот со цветом траблы, как можно сделать, чтобы все после ида покрасилось в color (869033727)?
Там несколько другой формат цвета (RGBA вместо RGB), тебе надо сделать побитовый сдвиг вправо на 8 чтобы был нормальный цвет.
lua-users wiki: Bitwise Operators(http://lua-users.org/wiki/BitwiseOperators) вот тут есть про побитовые операции
 

Aniki

🐰
Администратор
1,225
1,506
А готовым кодом можно, а то я вообще не шарю в этом
я сам не очень уверен, но по моему там так
Lua:
bit.rshift(color, 8)
Это цвет в формате RGB (вставляй его в фигурные скобки)
 
Последнее редактирование:

AlexNator

Новичок
1
0
HELP
Lua:
require "lib.moonloader"

function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  while true do
    wait(0)
    if isKeyDown(VK_LMENU) and isKeyJustPressed(VK_NUMPAD1) then
      sampAddChatMessage("MAT' ebal", 0x73a2ef)
    end
  end
end


[08:56:56.073487] (system) Session started.
[08:56:56.074487] (debug) Module handle: 68D90000

MoonLoader v.026.5-beta loaded.
Developers: FYP, hnnssy, EvgeN 1137

Copyright (c) 2016, BlastHack Team
Избранное - Lua - ASI - MoonLoader(https://www.blast.hk/moonloader/)

[08:56:56.074487] (info) Working directory: D:\GTA San Andreas kek\moonloader
[08:56:56.074487] (debug) FP Control: 0009001F
[08:56:56.074487] (debug) Game: GTA SA 1.0.0.0 US
[08:56:56.074487] (system) Installing pre-game hooks...
[08:56:56.078487] (system) Hooks installed.
[08:56:57.051543] (debug) Initializing opcode handler table
[08:56:57.051543] (debug) package.path = D:\GTA San Andreas kek\moonloader\lib\?.lua;D:\GTA San Andreas kek\moonloader\lib\?\init.lua;D:\GTA San Andreas kek\moonloader\?.lua;D:\GTA San Andreas kek\moonloader\?\init.lua;.\?.lua;D:\GTA San Andreas kek\moonloader\lib\?.luac;D:\GTA San Andreas kek\moonloader\lib\?\init.luac;D:\GTA San Andreas kek\moonloader\?.luac;D:\GTA San Andreas kek\moonloader\?\init.luac;.\?.luac
[08:56:57.051543] (debug) package.cpath = D:\GTA San Andreas kek\moonloader\lib\?.dll;
[08:56:57.053543] (system) Loading script 'D:\GTA San Andreas kek\moonloader\AutoReboot.lua'...
[08:56:57.053543] (debug) New script: 0834ED64
[08:56:57.055543] (system) ML-AutoReboot: Loaded successfully.
[08:56:57.056543] (system) Loading script 'D:\GTA San Andreas kek\moonloader\binder.lua'...
[08:56:57.056543] (debug) New script: 08350994
[08:56:57.058543] (system) binder.lua: Loaded successfully.
[08:56:57.058543] (system) Loading script 'D:\GTA San Andreas kek\moonloader\check-moonloader-updates.lua'...
[08:56:57.058543] (debug) New script: 08351CCC
[08:56:57.061543] (system) Check MoonLoader Updates: Loaded successfully.
[08:56:57.061543] (system) Loading script 'D:\GTA San Andreas kek\moonloader\reload_all.lua'...
[08:56:57.061543] (debug) New script: 08351E54
[08:56:57.063543] (system) ML-ReloadAll: Loaded successfully.
[08:56:57.063543] (system) Loading script 'D:\GTA San Andreas kek\moonloader\SF Integration.lua'...
[08:56:57.063543] (debug) New script: 0835295C
[08:56:57.066544] (system) SF Integration: Loaded successfully.
[08:57:11.261356] (system) Installing post-load hooks...
[08:57:11.261356] (system) Hooks installed.
[08:57:11.262356] (system) binder.lua: Script terminated. (08350994)
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,482
HELP
Lua:
require "lib.moonloader"

function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  while true do
    wait(0)
    if isKeyDown(VK_LMENU) and isKeyJustPressed(VK_NUMPAD1) then
      sampAddChatMessage("MAT' ebal", 0x73a2ef)
    end
  end
end


[08:56:56.073487] (system) Session started.
[08:56:56.074487] (debug) Module handle: 68D90000

MoonLoader v.026.5-beta loaded.
Developers: FYP, hnnssy, EvgeN 1137

Copyright (c) 2016, BlastHack Team
Избранное - Lua - ASI - MoonLoader(https://www.blast.hk/moonloader/)

[08:56:56.074487] (info) Working directory: D:\GTA San Andreas kek\moonloader
[08:56:56.074487] (debug) FP Control: 0009001F
[08:56:56.074487] (debug) Game: GTA SA 1.0.0.0 US
[08:56:56.074487] (system) Installing pre-game hooks...
[08:56:56.078487] (system) Hooks installed.
[08:56:57.051543] (debug) Initializing opcode handler table
[08:56:57.051543] (debug) package.path = D:\GTA San Andreas kek\moonloader\lib\?.lua;D:\GTA San Andreas kek\moonloader\lib\?\init.lua;D:\GTA San Andreas kek\moonloader\?.lua;D:\GTA San Andreas kek\moonloader\?\init.lua;.\?.lua;D:\GTA San Andreas kek\moonloader\lib\?.luac;D:\GTA San Andreas kek\moonloader\lib\?\init.luac;D:\GTA San Andreas kek\moonloader\?.luac;D:\GTA San Andreas kek\moonloader\?\init.luac;.\?.luac
[08:56:57.051543] (debug) package.cpath = D:\GTA San Andreas kek\moonloader\lib\?.dll;
[08:56:57.053543] (system) Loading script 'D:\GTA San Andreas kek\moonloader\AutoReboot.lua'...
[08:56:57.053543] (debug) New script: 0834ED64
[08:56:57.055543] (system) ML-AutoReboot: Loaded successfully.
[08:56:57.056543] (system) Loading script 'D:\GTA San Andreas kek\moonloader\binder.lua'...
[08:56:57.056543] (debug) New script: 08350994
[08:56:57.058543] (system) binder.lua: Loaded successfully.
[08:56:57.058543] (system) Loading script 'D:\GTA San Andreas kek\moonloader\check-moonloader-updates.lua'...
[08:56:57.058543] (debug) New script: 08351CCC
[08:56:57.061543] (system) Check MoonLoader Updates: Loaded successfully.
[08:56:57.061543] (system) Loading script 'D:\GTA San Andreas kek\moonloader\reload_all.lua'...
[08:56:57.061543] (debug) New script: 08351E54
[08:56:57.063543] (system) ML-ReloadAll: Loaded successfully.
[08:56:57.063543] (system) Loading script 'D:\GTA San Andreas kek\moonloader\SF Integration.lua'...
[08:56:57.063543] (debug) New script: 0835295C
[08:56:57.066544] (system) SF Integration: Loaded successfully.
[08:57:11.261356] (system) Installing post-load hooks...
[08:57:11.261356] (system) Hooks installed.
[08:57:11.262356] (system) binder.lua: Script terminated. (08350994)
Lua:
require "lib.moonloader"

function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  while true do
    wait(0)
    if isKeyDown(VK_LMENU) and isKeyJustPressed(VK_NUMPAD1) then
      sampAddChatMessage("MAT\' ebal", 0x73a2ef)
    end
  end
end
 

f0rtrix

Известный
208
15
help!!!
Lua:
                          weapon = getCurrentCharWeapon(playerPed)
                          while weapon == 24 do
                              wait(0)
                              sampAddChatMessage("{4682B4} Ты достал дигол")
                              while true do
                                  wait(0)
                                  weapon = getCurrentCharWeapon(playerPed)
                                  if weapon == 0 or weapon == 46 then
                                      break
                                  end
                              end
                          end
                          while weapon ~= 24 do
                          wait(0)
                          sampAddChatMessage("{4682B4} Ты убрал дигол")
                          while true do
                              wait(0)
                              weapon = getCurrentCharWeapon(playerPed)
                              if weapon == 24 then
                                  break
                              end
                          end
                      end

                       while weapon == 31 do
                       wait(0)
                       sampAddChatMessage("{4682B4} Ты достал м4")
                       while true do
                               wait(0)
                               weapon = getCurrentCharWeapon(playerPed)
                               if weapon == 0 or weapon == 46 then
                                       break
                               end
                       end
               end
               while weapon ~= 31 do
                       wait(0)
                       sampAddChatMessage("{4682B4} Ты убрал м4")
                       while true do
                               wait(0)
                               weapon = getCurrentCharWeapon(playerPed)
                               if weapon == 31 then
                                       break
                               end
                       end
               end
Что тут не так? Оно на Fist ваще не реагирует, а при доставании дигла оно пишет, что я М4 убрал, а то что дигл достал не пишет и наоборот. При доставании М4 пишет что я убрал дигл и все
(( за табуляцию сорри, из Atom как то криво копирует ))
 

checkdasound

Известный
Проверенный
963
406
Lua:
local mem = require "memory"

function main()
  while not isPlayerPlaying(playerHandle) do wait(100) end
  local wut = mem.tostring(0x969110)
  print(wut)

  while true do
    wait(10)
    if testCheat("MONEY") then
      local money = mem.getint32(0xB7CE50)
      print("Current money: " .. money)
      -- добавить $250.000
      mem.setint32(0xB7CE50, money + 250000)
    end
  end
end

Вопрос:
Почему именно эти типы памяти и что значит 0x969110 и 0xB7CE50.
 

checkdasound

Известный
Проверенный
963
406
0xB7CEE4 - [byte/boolean] Вкл/выкл бесконечный бег
Байтами можно заменить true/false?
 

Jason2222

Известный
180
3
Исправьте, пожалуйста. В вики поискал функцию, описания не было, вставил, не работает ;c Нужно, чтобы персонаж целился при активации и не отпускал.
Lua:
require "lib.moonloader"
require "lib.sampfuncs"
samp = require 'samp.events'

function main()
    while not isSampAvailable() do wait(0) end
    while sampGetCurrentServerName() == 'SA-MP' do wait(0) end
    sampAddChatMessage('Target testing.', 0xFFFFFF)
    while true do wait(0)
    if isKeyDown(VK_X) and isCharOnFoot(playerPed) then
        if isPlayerTargettingChar(playerPed) then
        setPlayerPlayerTargetting(false)
        else
        setPlayerPlayerTargetting(true) 
        end
    end
end
end
 
Последнее редактирование: