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

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
Помоги пожалуйста.
I don't think you can get help with that here. This is not an easy task, because you need to parse the site using asynchronous requests, and not everyone knows this. Even if someone agrees to help you, then most likely he will not do it for free. You can search the forum for topics where they ask the same question as you and do the same as there.
 

mambahit

Новичок
1
0
Помогите хотел написать скрипт для аризоны который при нажатии 3 будет юзать сигареты(/smoke) пока у персонажа не будет 100хп
сигареты используются не всегда с первой попытки иногда выводится строка "достал сигарету с зажигалкой и попытался закурить (Неудачно)" нужно что бы скрипт при нахождении этого сообщения в чате повторял попытку с задержкой 1000мс пока в чате не появится "достал сигарету с зажигалкой и закурил" когда сигарета кончается появляется сообщение в чате "докурил(а) сигарету и выбросил(а) окурок" нужно чтобы после этого использовалась сигарета.
вот говнокод
Lua:
[/B]
script_name('smoke_to_100hp')
script_author('Porovozov')
script_description('Скрипт который использует /smoke пока не будет 100хп')
require "lib.moonloader"
local keys = require "vkeys"
local on = require "lib.samp.events"
local tag = "[smoke to 100 hp]"
local label = 0
local main_color = 0x4392DC
local main_color_text = "{FFADDC}"
local white_color = "{FFFFFF}"
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("smok", cmd_smok)
    sampAddChatMessage(tag .. "smoke", main_collor)
    
    while true do
        wait(0)
        if  isKeyJustPressed(VK_3) then
            sampAddChatMessage("НАКУРКА НАЧАТА {4392DC}", main_color)
            sampSendChat("/smoke")
        end
    end
end
function cmd_smok(arg)
    sampAddChatMessage("Здарова куряга {FFADDC}", main_color)
end
function on.onServerMessage(color, text)
    lua_thread.create(function()
        if text:find("достал сигарету с зажигалкой и попытался закурить (Неудачно)") then
            wait(1000)
            sampSendChat("/smoke")
        end
    end)
end
[B]
 

Andrinall

Известный
702
518
если пошла тема с хуками, то можно попробовать хукать этот метод
C++:
// R1
BOOL CActor::IsDead() {
    return ((BOOL(__thiscall*)(CActor*))GetAddress(0x98020))(this);
}
правда я хрен знает, как он работает и работает ли так, как нужно
Ну тут уже скорее не хук, а вызов метода.
Работать это будет не как обработка "события", а именно как вызов того же, например, муновского isCharDead(Ped ped), только в прослойке будет ffi
 
  • Нравится
Реакции: whyega52

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,778
2,598
Ну тут уже скорее не хук, а вызов метода.
Работать это будет не как обработка "события", а именно как вызов того же, например, муновского isCharDead(Ped ped), только в прослойке будет ffi
Да, затупил чет, почему-то подумал, что этот метод вызывается при смерти
 
  • Нравится
Реакции: Andrinall

m1racles

Активный
204
35
Lua:
function func_string(arg, arg2)
    if arg == 1 then
        mainIni.strings.string1 = arg2
        sampAddChatMessage(mainIni.strings.string1, -1)
        inicfg.save(mainIni, 'strings.ini')
    end
end
поможет кто нибудь? не сохраняется
 

MLycoris

На вид оружие массового семяизвержения
Проверенный
1,993
2,182
Lua:
function func_string(arg, arg2)
    if arg == 1 then
        mainIni.strings.string1 = arg2
        sampAddChatMessage(mainIni.strings.string1, -1)
        inicfg.save(mainIni, 'strings.ini')
    end
end
поможет кто нибудь? не сохраняется
покажи что ты пытаешься сохранить
 

Sadow

Известный
1,428
592
Lua:
function func_string(arg, arg2)
    if arg == 1 then
        mainIni.strings.string1 = arg2
        sampAddChatMessage(mainIni.strings.string1, -1)
        inicfg.save(mainIni, 'strings.ini')
    end
end
поможет кто нибудь? не сохраняется
Если это функция команды, то попробуй так:
Lua:
function func_string(arg, arg2)
    if arg == "1" then -- или вместо "1" введи tostring(1)
        mainIni.strings.string1 = arg2
        sampAddChatMessage(mainIni.strings.string1, -1)
        inicfg.save(mainIni, 'strings.ini')
    end
end
 
  • Bug
  • Нравится
Реакции: m1racles, zzalupka и DZONE

bulba$h

Активный
330
92
почему оба скрипта при запуске гташки просто напросто крашит?

Lua:
local sampev = require("samp.events")
local weap = require("game.weapons")

function sampev.onPlayerDeathNotification(killerID, killerID2, reason)
    local nick = sampGetPlayerNickname(killerID)
    local nick2 = sampGetPlayerNickname(killerID2)
    local gun = weap.get_name(reason)
    local format = string.format("{FF5151}%s >> {FFFFFF}%s << {51C0FF}%s",nick, gun, nick2)
    sampAddChatMessage(format, 0xFFFFFFFF)
end

Lua:
local sampev = require("samp.events")
local weap = require("game.weapons")

local hui = {}

function main()
    repeat wait(0) until isSampAvailable()

    local font = renderCreateFont("Arial", 10, 13)

    while true do wait(0)

        local x, y = 500, 500
        for i = 1, #hui do
            renderFontDrawText(font, hui[i], x, y, 0xFFFFFFFF)
            y = y + 20
        end
    end
end

function sampev.onPlayerDeathNotification(killer, victim, reason)
    local killernick = sampGetPlayerNickname(killer)
    local victimnick = sampGetPlayerNickname(victim)
    local gun = weap.get_name(reason)
    local format = string.format("Игрок: %s Убил: %s Оружие: %s", killernick, victimnick, gun)
    table.insert(hui, format)
    if #hui > 5 then
        table.remove(hui, 1)
    end
end
 
  • Эм
Реакции: deleted-user-139653

Moorell

Участник
55
12
почему оба скрипта при запуске гташки просто напросто крашит?

Lua:
local sampev = require("samp.events")
local weap = require("game.weapons")

function sampev.onPlayerDeathNotification(killerID, killerID2, reason)
    local nick = sampGetPlayerNickname(killerID)
    local nick2 = sampGetPlayerNickname(killerID2)
    local gun = weap.get_name(reason)
    local format = string.format("{FF5151}%s >> {FFFFFF}%s << {51C0FF}%s",nick, gun, nick2)
    sampAddChatMessage(format, 0xFFFFFFFF)
end

Lua:
local sampev = require("samp.events")
local weap = require("game.weapons")

local hui = {}

function main()
    repeat wait(0) until isSampAvailable()

    local font = renderCreateFont("Arial", 10, 13)

    while true do wait(0)

        local x, y = 500, 500
        for i = 1, #hui do
            renderFontDrawText(font, hui[i], x, y, 0xFFFFFFFF)
            y = y + 20
        end
    end
end

function sampev.onPlayerDeathNotification(killer, victim, reason)
    local killernick = sampGetPlayerNickname(killer)
    local victimnick = sampGetPlayerNickname(victim)
    local gun = weap.get_name(reason)
    local format = string.format("Игрок: %s Убил: %s Оружие: %s", killernick, victimnick, gun)
    table.insert(hui, format)
    if #hui > 5 then
        table.remove(hui, 1)
    end
end
Надо не local sampev = require("samp.events"), а нужно local sampev = require("lib.samp.events")
 

ch1ps

Участник
101
3
Существует функция getCharPlayerIsTargeting(), которая получает хэндл игрока, в которого я целюсь, но если игрок условно говоря в машине, то она не сработает, при этом неважно - в машине он или нет, всегда при таргете игрока высвечивается таблица с ником, айди, хп и армором
sa-mp-003.png

так вот, можно получить хендл, либо айди игрока при таргете его, если он в машине?