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

astynk

Известный
Проверенный
742
530
Ребят как сбить анимацию или остановить, но не как ни через сбивание другой анимацией.
Пробовал так, не помогло
Lua:
    bs = raknetNewBitStream()
    raknetBitStreamWriteInt16(bs, tonumber(readMemory(sampGetPlayerPoolPtr() + 4, 1, false)))
    raknetEmulRpcReceiveBitStream(87, bs)
    raknetDeleteBitStream(bs)
clearCharTasksImmediately(1)
 

KoJIбасА

Участник
107
4
не робит код, при посадки в авто не чего не пишет в чат

код который не робит:
function sampev.onPlayerEnterVehicle(vehicleId)
    speed = getCarSpeed(vehicleId)
    sampAddChatMessage('{ffffff}'..speed)
    sampAddChatMessage('{ffffff} test')
end
 

FYS

Потрачен
982
236
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

KoJIбасА

Участник
107
4
Lua:
local pCarHandle = storeCarCharIsInNoSave(playerPed)
UPD: еще кстати делаю проверку на то, сидит ли игрок в машине или нет, а то скрипт умрет
всеровно не робит


Lua:
function sampev.onPlayerEnterVehicle(vehicleId)
    local pCarHandle = storeCarCharIsInNoSave(playerPed)
    speed = getCarSpeed(pCarHandle)
    sampAddChatMessage('{ffffff}'..speed)
    sampAddChatMessage('{ffffff} test')
end
 

FYS

Потрачен
982
236
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
всеровно не робит


Lua:
function sampev.onPlayerEnterVehicle(vehicleId)
    local pCarHandle = storeCarCharIsInNoSave(playerPed)
    speed = getCarSpeed(pCarHandle)
    sampAddChatMessage('{ffffff}'..speed)
    sampAddChatMessage('{ffffff} test')
end
что выводит?
 

el_motoblock

Новичок
5
0
Lua:
script_name("RPG Woman, stripcub for gta-ic")
script_author("el_motoblock")
require "lib.moonloader"
function main()
    local interior = getActiveInterior()
    if isPlayerPlaying(0) == true then wait (2000)
    if locateCharAnyMeans3d(PLAYER_PED, 688.1552, -2509.9, 80.5, 25.0, 25.0, 25.0, false) == true and interior == 1 then wait (0)
    printHelpString("stoppedonfoot")
    requestCollision(672.03, -2510.7441)
    clearArea(672.03, -2510.7441, 81.0, 82, 1)
    requestAnimation("STRIP")  -- 04ED
    requestModel(87)
    requestModel(244)
    requestModel(246)
    requestModel(256)
    requestModel(257)
    requestModel(152)
    requestModel(214)
    requestModel(263)
    requestModel(163)
    requestModel(164)
    requestModel(348)
    loadAllModelsNow()
    RPGW1 = createChar(5, 87, 657.4783, -2518.2927, 81.7031)
    RPGW2 = createChar(5, 244, 657.4957, -2503.9487, 81.7031)
    RPGW3 = createChar(5, 246, 657.6232, -2490.4338, 81.7031)
    RPGW4 = createChar(5, 256, 687.7251, -2484.5845, 81.7031)
    RPGW5 = createChar(5, 257, 687.943, -2497.0925, 81.7031)
    RPGW6 = createChar(5, 152, 687.7437, -2522.5776, 81.7031)
    RPGV1 = createChar(5, 214, 673.6019, -2510.1262, 81.0)
    RPGV2 = createChar(5, 263, 670.0073, -2510.7424, 81.0)
    RPGS1 = createChar(6, 163, 671.972, -2479.7092, 81.0)
    RPGS2 = createChar(6, 164, 660.5089, -2532.5342, 81.0)
    dontRemoveChar(RPGW1)
    dontRemoveChar(RPGW2)
    dontRemoveChar(RPGW3)
    dontRemoveChar(RPGW4)
    dontRemoveChar(RPGW5)
    dontRemoveChar(RPGW6)
    dontRemoveChar(RPGV1)
    dontRemoveChar(RPGV2)
    dontRemoveChar(RPGS1)
    dontRemoveChar(RPGS2)
    setCharInterior(RPGW1, 1)
    setCharInterior(RPGW2, 1)
    setCharInterior(RPGW3, 1)
    setCharInterior(RPGW4, 1)
    setCharInterior(RPGW5, 1)
    setCharInterior(RPGW6, 1)
    setCharInterior(RPGV1, 1)
    setCharInterior(RPGV2, 1)
    setCharInterior(RPGS1, 1)
    setCharInterior(RPGS2, 1)
    setCharOnlyDamagedByPlayer(RPGW1, 1)
    setCharOnlyDamagedByPlayer(RPGW2, 2)
    setCharOnlyDamagedByPlayer(RPGW3, 3)
    setCharOnlyDamagedByPlayer(RPGW4, 4)
    setCharOnlyDamagedByPlayer(RPGW5, 5)
    setCharOnlyDamagedByPlayer(RPGW6, 6)
    taskPlayAnim(RPGW1, "STRIP_E", "STRIP", 8.0, 1, 1, 1, 0, -1)
    taskPlayAnim(RPGW2, "STRIP_A", "STRIP", 8.0, 1, 1, 1, 0, -1)
    taskPlayAnim(RPGW3, "STRIP_E", "STRIP", 8.0, 1, 1, 1, 0, -1)
    taskPlayAnim(RPGW4, "STRIP_A", "STRIP", 8.0, 1, 1, 1, 0, -1)
    taskPlayAnim(RPGW5, "STRIP_E", "STRIP", 8.0, 1, 1, 1, 0, -1)
    taskPlayAnim(RPGW6, "STRIP_A", "STRIP", 8.0, 1, 1, 1, 0, -1)
    giveWeaponToChar(RPGS1, 24, 200)
    giveWeaponToChar(RPGS2, 24, 200)
    setCurrentCharWeapon(RPGS1, 1)
    setCurrentCharWeapon(RPGS2, 1)
    setCharMaxHealth(RPGS1, 500)
    setCharHealth(RPGS1, 500)
    addArmourToChar(RPGS1, 200)
    setCharMaxHealth(RPGS2, 500)
    setCharHealth(RPGS2, 500)
    addArmourToChar(RPGS2, 200)
    setCharDecisionMaker(RPGS1, 65543)
    setCharDecisionMaker(RPGS2, 65543)
    end
    if not interior == 1  then wait (0)
    printHelpString("removed")
    markCharAsNoLongerNeeded(RPGW1)
    markCharAsNoLongerNeeded(RPGW2)
    markCharAsNoLongerNeeded(RPGW3)
    markCharAsNoLongerNeeded(RPGW4)
    markCharAsNoLongerNeeded(RPGW5)
    markCharAsNoLongerNeeded(RPGW6)
    markCharAsNoLongerNeeded(RPGV1)
    markCharAsNoLongerNeeded(RPGV2)
    markCharAsNoLongerNeeded(RPGS1)
    markCharAsNoLongerNeeded(RPGS2)
    end
end
    end
Как сделать чтобы всё работало сначала игры, а не после перезапуска скрипта?
И как сделать чтобы все персонажи выгружалось при уходе из интерьера 1 в интерьер 0
 

FYS

Потрачен
982
236
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
[20:03:24.641647] (system) Loading script 'D:\���������\���\GTA San Andreas\moonloader\speedometr.lua'...
[20:03:24.641647] (debug) New script: 0B87337C
[20:03:24.659651] (system) name: Loaded successfully.

грузит. В чат не чего не пишет
так у тебя событие onPlayerEnterVehicle, сядь в авто
 
  • Нравится
Реакции: KoJIбасА

astynk

Известный
Проверенный
742
530
всеровно не робит


Lua:
function sampev.onPlayerEnterVehicle(vehicleId)
    local pCarHandle = storeCarCharIsInNoSave(playerPed)
    speed = getCarSpeed(pCarHandle)
    sampAddChatMessage('{ffffff}'..speed)
    sampAddChatMessage('{ffffff} test')
end
Оно и не должно работать, на момент отправки RPC пед еще не находится в авто.
local pCarHandle = select(2, sampGetCarHandleBySampVehicleId(vehicleId))
 

rey///

Известный
6
0
Скрипт работает через нажатие кнопки. С открытым чатом и при нажатии кнопки актива он срабатывает, как это пофиксить? Как сделать чтобы не работал при открытом чате?