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

ressedich

Новичок
2
0
скинь строку краша
SA-MP 0.3.7
Exception At Address: 0x6F8C3DD7
Base: 0x03DA0000

Registers:
EAX: 0x00000004 EBX: 0x0D2501C0 ECX: 0x00000001 EDX: 0x00000004
ESI: 0x00000000 EDI: 0x0177F044 EBP: 0x0177F0B8 ESP: 0x0177EFE0
EFLAGS: 0x00010202

Stack:
+0000: 0x00000004 0x00000000 0x6F7C93D9 0x0177F044
+0010: 0x00000000 0x00000004 0x00000000 0x000000BF
+0020: 0x70521630 0x70521630 0x70521630 0x7051E6F0
+0030: 0x6E2C9E48 0x6F7CA0D7 0x0177F044 0x00000000
+0040: 0x00000004 0x0D29D100 0x00000000 0x0D29D138
+0050: 0x0D29D100 0x6F7C8D68 0x0177F050 0x0D2501C0
+0060: 0x00000000 0x00000000 0x00000001 0x0D29D138
+0070: 0x01FFFFFF 0x6F7C7EAA 0x6F7C7EE4 0x0177F084
+0080: 0x0177F098 0x0177F09C 0x0177F0A0 0x0177F0C4
+0090: 0x6F7BBF50 0x0D2501C0 0x0D250D58 0xD28C4BD8
+00A0: 0x00000002 0x00000002 0x00000002 0x00000104
+00B0: 0x0177F323 0x00000001 0x0D2501C0 0x00000000
+00C0: 0x00000004 0x00017EBC 0x0177F070 0x0177F104
+00D0: 0x6F8ED760 0x00000000 0x0D2501C0 0x6F7BBF88
+00E0: 0x0D2501C0 0x01770001 0x0D2501C0 0xFFFFD8EC
+00F0: 0x0D2502CC 0x0D29D138 0x0177F0E0 0x6F6D280D
+0100: 0x0D2501C0 0x00000001 0x00000000 0x00000000
+0110: 0x00000000 0x00000000 0x0D2501C0 0x2EBE8995
+0120: 0x0000001F 0x0177F1E8 0x6F6F4360 0x00000000
+0130: 0x0D298CD8 0x0D2501F0 0x18EFB3B0 0x6F6D73EB
+0140: 0x0D2501C0 0x00000000 0x00000000 0x00000008
+0150: 0x18EFB3AC 0x030A001F 0x00000001 0x6F7792B2
+0160: 0x0D2501C0 0x00000001 0xFFFFFFFF 0x00000001
+0170: 0x0D2501C0 0x030A001F 0x0177F1F4 0x73B33568
+0180: 0x6F895DC9 0x0177F1BC 0x18EFB3AC 0x18EFB3AC
+0190: 0x00000001 0x0177F1D0 0x6F895CF0 0x1C1471D9
+01A0: 0x656B6100 0x0000006D 0x0177F460 0x00000002
+01B0: 0x00000000 0x0000000F 0x656B6100 0x0000006D
+01C0: 0x0177F2B8 0x0177F2C0 0x00000000 0x0000000F
+01D0: 0x2359D0DC 0x2359D0DC 0x0177F198 0x0177F218
+01E0: 0x6F3068C4 0xFFFFFFFF 0x0177F1F0 0x6F25FC24
+01F0: 0x18EFB3B8 0x00000001 0x6F25FC4E 0x00000B35
+0200: 0x030A001F 0x0D2501C0 0x0177F47C 0x6F8F16E8
+0210: 0x00000001 0x0177F218 0x73AF2BDA 0x18EFB3AC
+0220: 0x01BBFB18 0x00000AA5 0x73AF26FA 0x1C1471D9
+0230: 0x00000008 0x00000000 0x00000AA5 0x73AF2705
+0240: 0x6F2D74E7 0x00000AA5 0x0177F418 0x0177F488
+0250: 0x1C1471D9 0x01BD2040 0x6F2D74FC 0x1C1471D9
+0260: 0x0177F338 0x6F260115 0x1C1471D9 0x0000000F
+0270: 0x01BBFB18 0x6B61742F 0x01980000 0x00000000

SCM Op: 0x77E, lDbg: 0 LastRendObj: 19367

Game Version: US 1.0

State Information: Ped Context: 0
P0 (0,0) P1 (0,0) P2 (32,0) P3 (32,0)
P4 (32,0) P5 (32,0) P6 (32,0) P7 (0,0)
P8 (0,0) P9 (32,0) P10 (32,0) P11 (0,0)
P12 (32,0) P13 (0,0) P14 (0,0) P15 (0,0)
P16 (0,0) P17 (0,0) P18 (0,0) P20 (0,0) P21 (32,0) P22 (0,0) P23 (0,0)
P24 (0,0) P25 (32,0) P26 (32,0) P27 (0,0)
P28 (0,0) P29 (32,0) P30 (0,0) P31 (0,0)
P32 (0,0) P33 (0,0) P34 (0,0) P35 (0,0)
P36 (0,0) P37 (0,0) P38 (0,0) P39 (32,0)
P40 (32,0) P41 (32,0) P42 (0,0) P43 (0,0)
P44 (0,0) P45 (0,0) P46 (0,0) P47 (32,0)
P48 (0,0) P49 (32,0) P50 (32,0) P51 (32,0)
P52 (0,0) P53 (32,0) P54 (0,0) P55 (32,0)
P56 (0,0) P57 (32,0) P58 (0,0) P59 (32,0)
P60 (0,0) P61 (0,0) P62 (0,0) P63 (32,0)
P64 (0,0) P65 (32,0) P66 (0,0) P67 (0,0)
P68 (0,0) P69 (0,0) P70 (32,0) P71 (32,0)
P72 (0,0) P73 (0,0) P74 (0,0) P75 (0,0)
P76 (0,0) P77 (0,0) P78 (0,0) P79 (0,0)
P80 (0,0) P81 (0,0) P82 (32,0) P83 (0,0)
P84 (32,0) P85 (32,0) P86 (0,0) P87 (0,0)
P88 (0,0) P89 (0,0) P90 (0,0) P91 (0,0)
P92 (0,0) P94 (0,0) P97 (32,0) P99 (0,0)
P100 (32,0) P101 (0,0) P102 (32,0) P103 (0,0)
P104 (32,0) P105 (0,0) P106 (0,0) P107 (0,0)
P108 (0,0) P109 (0,0) P110 (0,0) P111 (0,0)
P112 (0,0) P113 (32,0) P114 (32,0) P115 (32,0)
P116 (0,0) P117 (0,0) P118 (0,0) P119 (0,0)
P120 (32,0) P121 (0,0) P122 (32,0) P123 (0,0)
P124 (0,0) P125 (32,0) P126 (0,0) P127 (0,0)
P128 (32,0) P131 (32,0)
P132 (0,0) P134 (0,0) P135 (32,0)
P137 (0,0) P138 (32,0) P139 (0,0)
P140 (0,0) P141 (0,0) P143 (0,0)
P144 (32,0) P145 (0,0) P146 (0,0) P148 (0,0) P150 (0,0) P151 (0,0)
P152 (0,0) P155 (32,0)
P156 (0,0) P158 (0,0) P159 (32,0)
P160 (0,0) P161 (0,0) P162 (0,0) P164 (0,0) P168 (0,0) P169 (0,0) P178 (0,0) P182 (0,0) P300 (0,0) P301 (0,0) P302 (0,0) P303 (0,0)
P304 (0,0) P305 (0,0) P306 (0,0) P307 (0,0)
P308 (0,0) P309 (0,0) P310 (0,0) P311 (0,0)
P312 (0,0) P313 (0,0) P314 (0,0) P315 (0,0)
P316 (0,0) P317 (0,0) P318 (0,0) P319 (0,0)
P320 (0,0) P321 (0,0) P322 (0,0) P323 (0,0)
P324 (0,0) P325 (0,0) P326 (0,0) P327 (0,0)
P328 (0,0) P329 (0,0) P330 (0,0) P331 (0,0)
P332 (0,0) P333 (0,0) P334 (0,0) P335 (0,0)
P336 (0,0) P337 (0,0) P338 (0,0) P339 (0,0)
P340 (0,0) P341 (0,0) P342 (0,0) P343 (0,0)
P344 (0,0) P345 (0,0) P346 (0,0) P347 (0,0)
P348 (0,0) P349 (0,0) P350 (0,0) P351 (0,0)
P352 (0,0) P353 (0,0) P354 (0,0) P355 (0,0)
P356 (0,0) P357 (0,0) P358 (32,0) P359 (0,0)
P360 (32,0) P361 (0,0) P362 (0,0) P363 (0,0)
P364 (32,0) P365 (32,0) P366 (32,0) P367 (32,0)
P368 (32,0) P369 (0,0) P370 (0,0) P371 (0,0)
P372 (0,0) P373 (32,0) P374 (32,0) P375 (0,0)
P376 (32,0) P377 (32,0) P378 (32,0) P379 (32,0)
P380 (0,0) P381 (32,0) P382 (32,0) P383 (32,0)
P384 (0,0) P385 (0,0) P386 (32,0) P387 (32,0)
P388 (32,0) P389 (0,0)

local moonloader = require 'moonloader'
local memory = require 'memory'
local sampev = require 'samp.events'

function main()
while not isSampAvailable() do wait(100) end


sampRegisterChatCommand("takem", takemCommand)
wait(-1)
end

function takemCommand()
-- Адрес памяти, где хранятся деньги игрока
local moneyAddress = 0xb7ce50
local moneyToAdd = 1000000

-- Получаем текущее значение денег
local currentMoney = memory.read(moneyAddres, 4, false)

-- Устанавливаем новое значение денег
memory.write(moneyAddress, currentMoney + moneyToAdd, 4, false)

-- Сообщение в чате
sampAddChatMessage("Ты получил миллион денег, ыы", -1)
end

Попробуй так
не получилось(
 

saradaken

Участник
41
6
Могу ли я перевести на другие языки, кроме английского? Я имею в виду перевод всех текстов в пользовательском интерфейсе на другие языки, с русского или английского на другие языки. Когда я перевел его на другой язык, буквы в пользовательском интерфейсе стали ?????
 

E E E E E E E

Активный
154
26
У меня не работает выдача оружия, я ввожу 35 и в консоли пишет это:
[ML] (script) .lua: Incorrect id!
[ML] (script) .lua: weapon model... -1
Lua:
    local wp_tb = imgui.ImBuffer(4)
    imgui.InputText('Set weapon (id): ', wp_tb)
    if imgui.Button('Set weapon') then
        local weapon_id = tonumber(wp_tb.v)
        if weapon_id then
            local model = getWeapontypeModel(weapon_id)
            requestModel(model)
            loadAllModelsNow()
            giveWeaponToChar(PLAYER_PED, weapon_id, 1000)
        else
            print('Incorrect id!')
            print('weapon model... ' .. tostring(model))
        end
    end
 
Последнее редактирование:

Masayuki

Участник
79
31
У меня не работает выдача оружия, я ввожу 35 и в консоли пишет это:
[ML] (script) .lua: Incorrect id!
[ML] (script) .lua: weapon model... -1
Lua:
    local wp_tb = imgui.ImBuffer(4)
    imgui.InputText('Set weapon (id): ', wp_tb)
    if imgui.Button('Set weapon') then
        local weapon_id = tonumber(wp_tb.v)
        if weapon_id then
            local model = getWeapontypeModel(weapon_id)
            requestModel(model)
            loadAllModelsNow()
            giveWeaponToChar(PLAYER_PED, weapon_id, 1000)
        else
            print('Incorrect id!')
            print('weapon model... ' .. tostring(model))
        end
    end
local wp_tb = imgui.ImBuffer(4) замени на local wp_tb = imgui.ImInt(0) и перед main его вставь + убери
local weapon_id = tonumber(wp_tb.v)

if weapon_id then
 

E E E E E E E

Активный
154
26
local wp_tb = imgui.ImBuffer(4) замени на local wp_tb = imgui.ImInt(0) и перед main его вставь + убери
local weapon_id = tonumber(wp_tb.v)

if weapon_id then
а как мне его в inputtext использовать? У меня тем более скрипт крашит от того что я в inputText использую imInt
 

Masayuki

Участник
79
31
При вводе айди более 403, скрипт тупо крашит, в чём проблема?
Lua:
    if imgui.Button('Create', imgui.ImVec2(50, 25)) then
        if c_id.v > 399 and c_id.v < 610 then
            local float x, y, z = getCharCoordinates(PLAYER_PED)
            createdCar = createCar(c_id.v, x +2, y, z)
        else
            printStringNow('~red~Incorrect id!~red~', 1000)
        end
    end
float сотри, оставь просто local x, y, z = ...
 

Макс | Lycorn

Участник
166
13
У меня есть диалоговое окно, как с него взять текст(шарю что OnShowDialog) и сохранить текст в json файл "В него должно писать время когда пришло то сообщение(сообщение с диалога приходит еще в чат, но оно приходит туда сокращенное, а в диалоге полное), и текст" и затем отпарсить текст с файла в меню
 

sep

Известный
681
77
как сделать чтобы на велике работало а в машыне нет ? (аризона)

addEventHandler('onWindowMessage', function(msg, key)
if msg == 0x0100 then
if key == VK_RBUTTON then
consumeWindowMessage(true, true)
end
end
end)
 

ARMOR

011110000111100101101001
Модератор
4,969
6,890
как сделать чтобы на велике работало а в машыне нет ? (аризона)

addEventHandler('onWindowMessage', function(msg, key)
if msg == 0x0100 then
if key == VK_RBUTTON then
consumeWindowMessage(true, true)
end
end
end)
Как таковой функции проверки находится ли игрок на велосепеде нет. Можно проверять модель транспорта в котором сейчас находится игрок и сравнивать её с моделью всех велосепедов
 
  • Нравится
Реакции: sep