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

trefa

3d print
Всефорумный модератор
2,107
1,261
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end
    sampfuncsRegisterConsoleCommand("pi", pig)
    sampSetClientCommandDescription("pi", "Player info by ID")
    x, y = getScreenResolution()
    font = renderCreateFont("Arial", 9, 12)
    wait(-1)
end


function pig(p)
    local id = string.match(p, '(%d+)')
    if id ~= nil then
        local id = tonumber(id)
        local _, idme = sampGetPlayerIdByCharHandle(playerPed)
        if sampIsPlayerConnected(id) or id == idme then
            local result, handle = sampGetCharHandleBySampPlayerId(id)
            if result then
                color = sampGetPlayerColor(id)
                name = sampGetPlayerNickname(id)
                weapon = getCurrentCharWeapon(handle)
                weap = getweaponname(weapon)
                health = sampGetPlayerHealth(id)
                armor = sampGetPlayerArmor(id)
                ping = sampGetPlayerPing(id)
                score = sampGetPlayerScore(id)
                renderFontDrawText(font,string.format("Nickname: %s[%d]\nHealth: %d \nArmor: %d\nScore: %d\nPing: %d", name, id, health, armor, score, ping) ,x/35, y/3, color)
            end
        else
            sampAddChatMessage("Игрок вышел из игры", 0xCC0000)
        end
    else
        sampAddChatMessage("Используй: /pi id", 0xCC0000)
    end
end

function getweaponname(weapon)
  local names = {
  [0] = "Fist",
  [1] = "Brass Knuckles",
  [2] = "Golf Club",
  [3] = "Nightstick",
  [4] = "Knife",
  [5] = "Baseball Bat",
  [6] = "Shovel",
  [7] = "Pool Cue",
  [8] = "Katana",
  [9] = "Chainsaw",
  [10] = "Purple Dildo",
  [11] = "Dildo",
  [12] = "Vibrator",
  [13] = "Silver Vibrator",
  [14] = "Flowers",
  [15] = "Cane",
  [16] = "Grenade",
  [17] = "Tear Gas",
  [18] = "Molotov Cocktail",
  [22] = "9mm",
  [23] = "Silenced 9mm",
  [24] = "Desert Eagle",
  [25] = "Shotgun",
  [26] = "Sawnoff Shotgun",
  [27] = "Combat Shotgun",
  [28] = "Micro SMG/Uzi",
  [29] = "MP5",
  [30] = "AK-47",
  [31] = "M4",
  [32] = "Tec-9",
  [33] = "Country Rifle",
  [34] = "Sniper Rifle",
  [35] = "RPG",
  [36] = "HS Rocket",
  [37] = "Flamethrower",
  [38] = "Minigun",
  [39] = "Satchel Charge",
  [40] = "Detonator",
  [41] = "Spraycan",
  [42] = "Fire Extinguisher",
  [43] = "Camera",
  [44] = "Night Vis Goggles",
  [45] = "Thermal Goggles",
  [46] = "Parachute" }
  return names[weapon]
end
Всё равно не робит, появляется на секунду и всё.
 

uryukhai

Активный
196
104
Как сократить? (нужно со всеми цифрами от 1 до 9)
Код:
while true do
        wait(1)
        local chat = sampGetChatString(99)
        if chat == "[AntiAFK]: Введи ответ: 1+1 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(2)
        if chat == "[AntiAFK]: Введи ответ: 1+2 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(3)
        if chat == "[AntiAFK]: Введи ответ: 1+3 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(4)
        if chat == "[AntiAFK]: Введи ответ: 1+4 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(5)
        if chat == "[AntiAFK]: Введи ответ: 1+5 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(6)
        if chat == "[AntiAFK]: Введи ответ: 1+6 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(7)
        if chat == "[AntiAFK]: Введи ответ: 1+7 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(8)
        if chat == "[AntiAFK]: Введи ответ: 1+8 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(9)
        if chat == "[AntiAFK]: Введи ответ: 1+9 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(10)
        if chat == "[AntiAFK]: Введи ответ: 2+1 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(3)
        if chat == "[AntiAFK]: Введи ответ: 2+2 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(4)
        if chat == "[AntiAFK]: Введи ответ: 2+3 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(5)
        if chat == "[AntiAFK]: Введи ответ: 2+4 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(6)
        if chat == "[AntiAFK]: Введи ответ: 2+5 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(7)
        if chat == "[AntiAFK]: Введи ответ: 2+6 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(8)
        if chat == "[AntiAFK]: Введи ответ: 2+7 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(9)
        if chat == "[AntiAFK]: Введи ответ: 2+8 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(10)
        if chat == "[AntiAFK]: Введи ответ: 2+9 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(11)
 

Moonlight_Ru

Известный
66
21
В чём проблема? Вообще не работает.

В дополнение к посту выше.
Lua:
sampfuncsRegisterConsoleCommand("pi", pig) -- Ты регистрируешь консольную команду.
sampSetClientCommandDescription("pi", "Player info by ID") -- А описание задаёшь для клиентской команды (Команда для чата).

Ты сделал бесконечный цикл while в функции, в которой даже нельзя ставить задержки.
Чтобы рисовать текст на экране, тебе нужно renderFontDrawText() сделать в main() или в отдельном потоке.
Например так:
Lua:
function main()
    font = renderCreateFont("Arial", 9, 12)
    sampRegisterChatCommand("pi", pig)
    thread = lua_thread.create_suspended(threadFunc)
    wait(-1)
end

function pig(arg)
    if string.find(arg, "^%s*%d+%s*$") then
        local id = tonumber(string.match(arg, "^%s*(%d+)%s*$"))
        if sampIsPlayerConnected(id) then
            thread:run(id)
        end
    end
end

function threadFunc(id)
    while true do
        wait(0)
        if not sampIsPlayerConnected(id) then
            sampAddChatMessage("Игрок отключился.", 0x860101)
            return
        end
        local color = sampGetPlayerColor(id)
        local name = sampGetPlayerNickname(id)
        local ping = sampGetPlayerPing(id)
        local score = sampGetPlayerScore(id)
        local bool, handle = sampGetCharHandleBySampPlayerId(id)
        if bool and doesCharExist(handle) then
          local weapon = getCurrentCharWeapon(handle)
          local weap = getweaponname(weapon)
          local health = sampGetPlayerHealth(id)
          local armor = sampGetPlayerArmor(id)
          local renderFontDrawText(font, string.format("Nickname: %s[%d]\nHealth: %d \nArmor: %d\nScore: %d\nPing: %d", name, id, health, armor, score, ping), 20, 300, color)
        else
          renderFontDrawText(font, string.format("Nickname: %s[%d]\nScore: %d\nPing: %d\n{860101}Игрока нет в зоне стрима.", name, id, score, ping), 20, 300, color)
      end
    end
end

function getweaponname(weapon)
  local names = {
  [0] = "Fist",
  [1] = "Brass Knuckles",
  [2] = "Golf Club",
  [3] = "Nightstick",
  [4] = "Knife",
  [5] = "Baseball Bat",
  [6] = "Shovel",
  [7] = "Pool Cue",
  [8] = "Katana",
  [9] = "Chainsaw",
  [10] = "Purple Dildo",
  [11] = "Dildo",
  [12] = "Vibrator",
  [13] = "Silver Vibrator",
  [14] = "Flowers",
  [15] = "Cane",
  [16] = "Grenade",
  [17] = "Tear Gas",
  [18] = "Molotov Cocktail",
  [22] = "9mm",
  [23] = "Silenced 9mm",
  [24] = "Desert Eagle",
  [25] = "Shotgun",
  [26] = "Sawnoff Shotgun",
  [27] = "Combat Shotgun",
  [28] = "Micro SMG/Uzi",
  [29] = "MP5",
  [30] = "AK-47",
  [31] = "M4",
  [32] = "Tec-9",
  [33] = "Country Rifle",
  [34] = "Sniper Rifle",
  [35] = "RPG",
  [36] = "HS Rocket",
  [37] = "Flamethrower",
  [38] = "Minigun",
  [39] = "Satchel Charge",
  [40] = "Detonator",
  [41] = "Spraycan",
  [42] = "Fire Extinguisher",
  [43] = "Camera",
  [44] = "Night Vis Goggles",
  [45] = "Thermal Goggles",
  [46] = "Parachute" }
  return names[weapon]
end
 
Последнее редактирование:

ufdhbi

Известный
Проверенный
1,459
866
Как сократить? (нужно со всеми цифрами от 1 до 9)
Код:
while true do
        wait(1)
        local chat = sampGetChatString(99)
        if chat == "[AntiAFK]: Введи ответ: 1+1 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(2)
        if chat == "[AntiAFK]: Введи ответ: 1+2 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(3)
        if chat == "[AntiAFK]: Введи ответ: 1+3 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(4)
        if chat == "[AntiAFK]: Введи ответ: 1+4 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(5)
        if chat == "[AntiAFK]: Введи ответ: 1+5 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(6)
        if chat == "[AntiAFK]: Введи ответ: 1+6 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(7)
        if chat == "[AntiAFK]: Введи ответ: 1+7 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(8)
        if chat == "[AntiAFK]: Введи ответ: 1+8 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(9)
        if chat == "[AntiAFK]: Введи ответ: 1+9 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(10)
        if chat == "[AntiAFK]: Введи ответ: 2+1 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(3)
        if chat == "[AntiAFK]: Введи ответ: 2+2 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(4)
        if chat == "[AntiAFK]: Введи ответ: 2+3 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(5)
        if chat == "[AntiAFK]: Введи ответ: 2+4 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(6)
        if chat == "[AntiAFK]: Введи ответ: 2+5 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(7)
        if chat == "[AntiAFK]: Введи ответ: 2+6 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(8)
        if chat == "[AntiAFK]: Введи ответ: 2+7 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(9)
        if chat == "[AntiAFK]: Введи ответ: 2+8 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(10)
        if chat == "[AntiAFK]: Введи ответ: 2+9 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(11)
напиши мне в вк, сделаю Write a message @gfrtgf(https://vk.me/gfrtgf)
 

Moonlight_Ru

Известный
66
21
Как сократить? (нужно со всеми цифрами от 1 до 9)
Код:
while true do
        wait(1)
        local chat = sampGetChatString(99)
        if chat == "[AntiAFK]: Введи ответ: 1+1 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(2)
        if chat == "[AntiAFK]: Введи ответ: 1+2 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(3)
        if chat == "[AntiAFK]: Введи ответ: 1+3 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(4)
        if chat == "[AntiAFK]: Введи ответ: 1+4 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(5)
        if chat == "[AntiAFK]: Введи ответ: 1+5 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(6)
        if chat == "[AntiAFK]: Введи ответ: 1+6 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(7)
        if chat == "[AntiAFK]: Введи ответ: 1+7 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(8)
        if chat == "[AntiAFK]: Введи ответ: 1+8 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(9)
        if chat == "[AntiAFK]: Введи ответ: 1+9 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(10)
        if chat == "[AntiAFK]: Введи ответ: 2+1 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(3)
        if chat == "[AntiAFK]: Введи ответ: 2+2 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(4)
        if chat == "[AntiAFK]: Введи ответ: 2+3 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(5)
        if chat == "[AntiAFK]: Введи ответ: 2+4 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(6)
        if chat == "[AntiAFK]: Введи ответ: 2+5 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(7)
        if chat == "[AntiAFK]: Введи ответ: 2+6 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(8)
        if chat == "[AntiAFK]: Введи ответ: 2+7 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(9)
        if chat == "[AntiAFK]: Введи ответ: 2+8 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(10)
        if chat == "[AntiAFK]: Введи ответ: 2+9 = ? | У тебя есть 30 секунд, что бы ответить!" then  sampSendChat(11)

Это очень неудобный способ.

Сделай с помощью библиотеки samp.events и регулярных выражений.
Lua:
local hook = require 'lib.samp.events'

function main()
    wait(-1)
end

function hook.onServerMessage(color, text)
    if string.find(text, "^%[AntiAFK%]: Введи ответ: %d+%+%d+ = %? %| У тебя есть 30 секунд, что бы ответить!$") then -- Не забудь изменить кодировку на Windows 1251, для работы с кирилицей.
        local num1, num2 = string.match(text, "^%[AntiAFK%]: Введи ответ: (%d+)%+(%d+) = %? %| У тебя есть 30 секунд, что бы ответить!$")
        answer = tonumber(num1) + tonumber(num2)
        sampSendChat(tostring(answer))
    end
end

SAMP.Lua - SAMP.Lua(https://blast.hk/threads/14624/)
Регулярные выражения - Регулярные выражения в Lua(http://umodel.narod.ru/webhelp/ams/Program_Reference/Actions/RegExp_Lua.htm)
 

ufdhbi

Известный
Проверенный
1,459
866
Это очень неудобный способ.

Сделай с помощью библиотеки samp.events и регулярных выражений.
Lua:
local hook = require 'lib.samp.events'

function main()
    wait(-1)
end

function hook.onServerMessage(color, text)
    if string.find(text, "^%[AntiAFK%]: Введи ответ: %d+%+%d+ = %? %| У тебя есть 30 секунд, что бы ответить!$") then -- Не забудь изменить кодировку на Windows 1251, для работы с кирилицей.
        local num1, num2 = string.match(text, "^%[AntiAFK%]: Введи ответ: (%d+)%+(%d+) = %? %| У тебя есть 30 секунд, что бы ответить!$")
        answer = tonumber(num1) + tonumber(num2)
        sampSendChat(tostring(answer))
    end
end

SAMP.Lua - SAMP.Lua(https://blast.hk/threads/14624/)
Регулярные выражения - Регулярные выражения в Lua(http://umodel.narod.ru/webhelp/ams/Program_Reference/Actions/RegExp_Lua.htm)
Lua:
require "lib.moonloader"
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, message)
    if string.find(message, "[AntiAFK]: Введи ответ:") then
        a, b = string.match(message, "[AntiAFK]: Введи ответ: (%d+)%+(%d+)% = ? | У тебя есть 30 секунд, что бы ответить!")
        answer = a+b
        sampSendChat(answer)
    end
end

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
    end
end
 

uryukhai

Активный
196
104
Спасибо вам, ребята

Это очень неудобный способ.

Сделай с помощью библиотеки samp.events и регулярных выражений.
Lua:
local hook = require 'lib.samp.events'

function main()
    wait(-1)
end

function hook.onServerMessage(color, text)
    if string.find(text, "^%[AntiAFK%]: Введи ответ: %d+%+%d+ = %? %| У тебя есть 30 секунд, что бы ответить!$") then -- Не забудь изменить кодировку на Windows 1251, для работы с кирилицей.
        local num1, num2 = string.match(text, "^%[AntiAFK%]: Введи ответ: (%d+)%+(%d+) = %? %| У тебя есть 30 секунд, что бы ответить!$")
        answer = tonumber(num1) + tonumber(num2)
        sampSendChat(tostring(answer))
    end
end

SAMP.Lua - SAMP.Lua(https://blast.hk/threads/14624/)
Регулярные выражения - Регулярные выражения в Lua(http://umodel.narod.ru/webhelp/ams/Program_Reference/Actions/RegExp_Lua.htm)
почему-то твой скрипт не отправляет ответы на примеры
 
Последнее редактирование модератором:

Moonlight_Ru

Известный
66
21
почему-то твой скрипт не отправляет ответы на примеры
Для начала скажу, что я тебе неправильный код скинул, он должен работать, но с одним серьёзным багом.
Замени на этот.
Lua:
local hook = require 'lib.samp.events'

function main()
    sendChat = lua_thread.create_suspended(sendChatFunc)
    wait(-1)
end

function hook.onServerMessage(color, text)
    if string.find(text, "^%[AntiAFK%]: Введи ответ: %d+%+%d+ = %? %| У тебя есть 30 секунд, что бы ответить!$") then
        local num1, num2 = string.match(text, "^%[AntiAFK%]: Введи ответ: (%d+)%+(%d+) = %? %| У тебя есть 30 секунд, что бы ответить!$")
        local answer = tonumber(num1) + tonumber(num2)
        sendChat:run(tostring(answer))
    end
end

function sendChatFunc(string)
    wait(0)
    sampSendChat(string)
end

Причины, по которым у тебя может это не работать:

1. Кодировка файла должна быть "Windows 1251", иначе нельзя сравнивать переменную text со строкой, в которой есть русские буквы.
2. Нужно скачать библиотеку samp.events и установить её в нужное место. SAMP.Lua(https://blast.hk/threads/14624/)

Если всё равно не заработает, то проверяй, где ошибка. Сейчас попробую запустить код у себя, может накосячил ещё где-то.
 
Последнее редактирование:

uryukhai

Активный
196
104
Для начала скажу, что я тебе неправильный код скинул, он должен работать, но с одним серьёзным багом.
Замени на этот.
Lua:
local hook = require 'lib.samp.events'

function main()
    sendChat = lua_thread.create_suspended(sendChatFunc)
    wait(-1)
end

function hook.onServerMessage(color, text)
    if string.find(text, "^%[AntiAFK%]: Введи ответ: %d+%+%d+ = %? %| У тебя есть 30 секунд, что бы ответить!$") then
        local num1, num2 = string.match(text, "^%[AntiAFK%]: Введи ответ: (%d+)%+(%d+) = %? %| У тебя есть 30 секунд, что бы ответить!$")
        local answer = tonumber(num1) + tonumber(num2)
        sendChat:run(tostring(answer))
    end
end

function sendChatFunc(string)
    wait(0)
    sampSendChat(string)
end

Причины, по которым у тебя может это не работать:

1. Кодировка файла должна быть "Windows 1251", иначе нельзя сравнивать переменную text со строкой, в которой есть русские буквы.
2. Нужно скачать библиотеку samp.events и установить её в нужное место. SAMP.Lua(https://blast.hk/threads/14624/)

Если всё равно не заработает, то проверяй, где ошибка. Сейчас попробую запустить код у себя, может накосячил ещё где-то.
кодировку менял, библиотека была, но почему-то не работает
 

r4nx

Известный
Друг
201
263
Подскажите, в чём проблема: скрипт показывает dxut диалог, но курсор не отображается. Гуглил, пробовал sampSetCursorMode, sampToggleCursor - не помогают.
Lua:
dlg = dxutCreateDialog('Lua for Goverment')
dxutSetDialogPos(dlg, 500, 500, 300, 225)
dxutAddStatic(dlg, 0, 'Информация', 2, 105, 150, 20)
dxutAddButton(dlg, 1, 'Готово', 0, 0, 100, 30)
dxutSetDialogVisible(dlg, true)
sampSetCursorMode(3)
sampToggleCursor(true)
dlgShowed = true
 
  • Нравится
Реакции: WebDim

ufdhbi

Известный
Проверенный
1,459
866
Подскажите, в чём проблема: скрипт показывает dxut диалог, но курсор не отображается. Гуглил, пробовал sampSetCursorMode, sampToggleCursor - не помогают.
Lua:
dlg = dxutCreateDialog('Lua for Goverment')
dxutSetDialogPos(dlg, 500, 500, 300, 225)
dxutAddStatic(dlg, 0, 'Информация', 2, 105, 150, 20)
dxutAddButton(dlg, 1, 'Готово', 0, 0, 100, 30)
dxutSetDialogVisible(dlg, true)
sampSetCursorMode(3)
sampToggleCursor(true)
dlgShowed = true
с курсор модами поиграй, уже было такое
 

castlefamily

Участник
104
3
Крч без понятия.Крашит полностью GTA без Warning. Без понятия. Без isCharOnScreen работает, но хз, как исправить. Мб другой метод кто-то подскажет.
Читаю команду find.
Код:
function cmdla()
    sampSendChat(string.format("/find"))
    text = sampGetDialogText()
    s = string.find(text,"Из них онлайн:\t")
    j = string.find(text,"На паузе")
    numb = string.sub(text,s+16,j-2)
    sampAddChatMessage(string.format("{FFA500}[ЛА] {DCDCDC}%s", numb), 0xDCDCDC)
    for v = 1, numb do
      i = string.find(text,"%[")
      j = string.find(text,"%]")
      id = string.sub(text,i+1,j-1)
      sampAddChatMessage(string.format("{FFA500}[ЛА] {DCDCDC}%s", id), 0xDCDCDC)
      text = string.gsub(text, "%[" .. id .. "%]", " ")
      local PlayerStreaed, bPed = sampGetCharHandleBySampPlayerId(string.format("%s",id))
      local bResult = isCharOnScreen(bPed)
        if(bResult == false) then
            sampAddChatMessage(string.format("{FFA500}[ЛА] {DCDCDC}%s", sampGetPlayerNickname(id)), 0xDCDCDC)
        end
    end
end

===================================================
Крч решил проблему. :) Ещё не доделал, но работает)
Код:
sampSendChat(string.format("/find"))
    wait(1000)
    text = sampGetDialogText()
    src_good = ""
    src_bad = ""
    src_afk = ""
    s = string.find(text,"Из них онлайн:\t")
    j = string.find(text,"На паузе")
    numb = string.sub(text,s+16,j-2)
    for v = 1, numb do
        i = string.find(text,"%[")
        j = string.find(text,"%]")
        id = string.sub(text,i+1,j-1)
        text = string.gsub(text, "%[" .. id .. "%]", " ")
        local bIf, bPed = sampGetCharHandleBySampPlayerId(string.format("%s",id))
         if bIf and doesCharExist(bPed) then
          local mX, mY, mZ = getCharCoordinates(PLAYER_PED)
      local pX, pY, pZ = getCharCoordinates(bPed)
      local dist = getDistanceBetweenCoords3d(mX, mY, mZ, pX, pY, pZ)
      if dist <= 30 then
                src_good = src_good .. sampGetPlayerNickname(id) .. "\n"
            else
                src_bad = src_bad .. sampGetPlayerNickname(id) .. "\n"
      end
        else
            src_bad = src_bad .. sampGetPlayerNickname(id) .. "\n"
        end
    end
    wait(3000)
    temp_src = "{ffffff}\tСотрудники на месте:\n" .. src_good .. "\n\n\tСотрудников нет на месте:\n" .. src_bad
    sampShowDialog(99,'[ЛА] Список сотрудников', temp_src, 'Принять', '', DIALOG_STYLE_MSGBOX)
 
Последнее редактирование: