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

sv6b6da

Новичок
8
1
писал скрипт на закладки для раксампа с помощью ИИ, не находит команду, 100 раз пробовал, RakSamp никакие ошибки не выдаёт

Lua:
require("addon")
local sampev = require("samp.events")

-- НАСТРОЙКИ БАЗ
local BASES = {
    ["aztek"] = {
        exitCoord = {x = -719.5945, y = 2233.1672, z = 1500.9745},
        routeCG = "cgaztek"
    },
    ["ballas"] = {
        exitCoord = {x = -725.5266, y = 2400.7056, z = 1500.9701},
        routeCG = "cgballas"
    }
}

local ROUTE_ZAKLADKI = "testzakladok"

local ZAKLADKI = {
    {x = 2051.2656, y = -1156.4294, z = 23.8502},
    {x = 2115.4988, y = -1095.2936, z = 24.7771},
    {x = 2051.3401, y = -1041.9553, z = 26.5127},
    {x = 2357.4819, y = -1133.4607, z = 28.3938},
    {x = 2359.8284, y = -1171.2126, z = 28.2831},
    {x = 2314.9907, y = -1200.4818, z = 28.2262},
    {x = 2559.2310, y = -1109.2358, z = 64.2670},
    {x = 2628.7939, y = -1124.2505, z = 66.5594},
    {x = 2559.2410, y = -1241.3362, z = 48.8187},
    {x = 2522.7737, y = -1233.6808, z = 45.5962},
    {x = 2509.5601, y = -1126.1271, z = 41.5980},
    {x = 1846.2993, y = -1066.0305, z = 24.6667},
    {x = 1906.2572, y = -1208.8391, z = 19.5152},
    {x = 1769.5657, y = -1269.2799, z = 14.1775},
    {x = 1829.7423, y = -1383.6549, z = 15.1998},
    {x = 1964.8093, y = -1360.9491, z = 18.5781},
    {x = 2054.5581, y = -1326.3584, z = 24.2201},
    {x = 2017.6685, y = -1353.2582, z = 24.2693},
    {x = 2020.1677, y = -1284.9058, z = 24.1846},
    {x = 2416.6184, y = -1354.7859, z = 25.0912},
    {x = 2438.1675, y = -1344.4335, z = 30.5403},
    {x = 2262.4863, y = -1440.3964, z = 24.0092},
    {x = 2321.9722, y = -1454.2347, z = 21.2680},
    {x = 2387.6304, y = -1482.6478, z = 24.6273},
    {x = 2373.1194, y = -1489.6899, z = 28.7267},
    {x = 2764.3159, y = -1182.5099, z = 69.6838},
    {x = 2748.8960, y = -1244.6897, z = 60.6338},
    {x = 2785.7996, y = -1415.1720, z = 16.3880},
    {x = 2588.3672, y = -2061.9470, z = 4.75751},
    {x = 2827.6787, y = -1160.9064, z = 25.3925},
    {x = 2848.3298, y = -1942.6093, z = 12.7612},
    {x = 2372.0056, y = -2114.5867, z = 27.3039},
    {x = 2427.9353, y = -2027.5251, z = 13.7694},
    {x = 2440.2705, y = -1981.6669, z = 13.5469},
    {x = 2307.7266, y = -2009.5165, z = 19.0014},
    {x = 2190.4375, y = -2029.0265, z = 13.7296},
    {x = 2246.0425, y = -1931.4435, z = 13.8074},
    {x = 2122.4360, y = -1933.3767, z = 13.5469},
    {x = 2637.1528, y = -2024.9476, z = 13.6671},
    {x = 2021.6184, y = -2093.2749, z = 19.0454},
    {x = 1905.4556, y = -2136.0786, z = 15.4430},
    {x = 1889.7408, y = -2010.2220, z = 13.5469},
    {x = 1805.8722, y = -2083.0471, z = 13.8553},
    {x = 1971.7415, y = -1535.3516, z = 11.4262},
    {x = 2233.2390, y = -1700.1475, z = 22.5497},
    {x = 2066.9160, y = -1690.3385, z = 13.8153},
    {x = 1987.8599, y = -1628.1263, z = 16.2498},
    {x = 2145.1350, y = -1613.7839, z = 13.7605},
    {x = 2257.3027, y = -1620.9314, z = 15.7393},
    {x = 2368.2910, y = -1702.8949, z = 13.8794},
    {x = 2527.6074, y = -1642.2953, z = 13.9939},
    {x = 2521.1274, y = -1670.7814, z = 15.1195},
    {x = 2395.9255, y = -1816.7269, z = 13.7957},
    {x = 2376.1086, y = -1814.9210, z = 13.7681},
    {x = 2019.8030, y = -1898.4729, z = 9.16811},
    {x = 2280.3914, y = -2113.9587, z = 13.7744},
    {x = 2301.2146, y = -2130.9661, z = 13.9171},
    {x = 2323.5144, y = -2161.7908, z = 13.8654},
    {x = 2300.8599, y = -2232.1970, z = 13.7277},
    {x = 2286.2788, y = -2195.1948, z = 7.24131},
    {x = 2219.3274, y = -2103.9907, z = 8.03221},
    {x = 1711.1694, y = -1852.1277, z = 13.7792},
    {x = 1967.8704, y = -1844.5211, z = 4.14571},
    {x = 2093.0811, y = -1845.7833, z = 4.03511},
    {x = 2102.4995, y = -1639.3700, z = 13.6343},
    {x = 2128.6104, y = -1710.7371, z = 15.2948},
    {x = 2346.2971, y = -1040.7277, z = 53.9172},
    {x = 2383.5659, y = -1941.3464, z = 13.5469},
    {x = 2291.5208, y = -1693.4148, z = 13.6857},
    {x = 1837.9935, y = -1599.3556, z = 13.5677},
    {x = 2497.2095, y = -1793.5551, z = 14.3287}
}

local state = "IDLE"
local activeConfig = nil
local targetTime = {h = 0, m = 0}
local visitedZakladki = {}
local pauseTimer = 0
local cgStartTime = 0

function main()
    while not isSampAvailable() do wait(100) end
    print("[AutoZakladki] Скрипт готов. Используй команды в чате:")
    print("Пример: !zakladki_aztek 5 25")
    
    -- Регистрируем команду через sampRegisterChatCommand как /zakladki_...
    -- Но так как ты хочешь !, мы будем использовать onSendChat
    
    while true do
        wait(100)
        
        if state == "IDLE" then
            local time = os.date("*t")
            if activeConfig and time.hour == targetTime.h and time.min == targetTime.m then
                startSequence()
            end
            
        elseif state == "GOING_TO_EXIT" then
            local px, py, pz = getCharCoordinates(PLAYER_PED)
            local dist = getDistance3d(px, py, pz, activeConfig.exitCoord.x, activeConfig.exitCoord.y, activeConfig.exitCoord.z)
            
            if dist < 2.0 then
                print("[AutoZakladki] На точке выхода. Ждем 5 сек...")
                state = "WAITING_CG"
                cgStartTime = os.clock() + 5.0
            end
            
        elseif state == "WAITING_CG" then
            if os.clock() >= cgStartTime then
                sampSendChat("!play " .. activeConfig.routeCG)
                print("[AutoZakladki] Запуск: !play " .. activeConfig.routeCG)
                state = "PLAYING_CG"
                cgStartTime = os.clock() + 180.0
            end
            
        elseif state == "PLAYING_CG" then
            if os.clock() >= cgStartTime then
                sampSendChat("!play " .. ROUTE_ZAKLADKI)
                print("[AutoZakladki] Запуск закладок: !play " .. ROUTE_ZAKLADKI)
                state = "MONITORING_ZAKLADKI"
                for i = 1, #ZAKLADKI do visitedZakladki[i] = false end
            end
            
        elseif state == "MONITORING_ZAKLADKI" then
            local px, py, pz = getCharCoordinates(PLAYER_PED)
            local found = false
            
            for i, z in ipairs(ZAKLADKI) do
                if not visitedZakladki[i] then
                    local dist = getDistance3d(px, py, pz, z.x, z.y, z.z)
                    if dist <= 1.5 then
                        visitedZakladki[i] = true
                        found = true
                        print("[AutoZakladki] Закладка #" .. i .. "! Пауза...")
                        
                        sampSendChat("!stop")
                        state = "PAUSED"
                        pauseTimer = os.clock() + 3.0
                        break
                    end
                end
            end
            
        elseif state == "PAUSED" then
            if os.clock() >= pauseTimer then
                sampSendChat("!stop")
                print("[AutoZakladki] Продолжаем...")
                state = "MONITORING_ZAKLADKI"
            end
        end
    end
end

-- Попытка 1: Перехват через onSendChat (стандартный)
function sampev.onSendChat(text)
    processCommand(text)
end

-- Попытка 2: Если onSendChat не ловит !, пробуем onServerMessage (иногда команды эхолятся)
function sampev.onServerMessage(color, text)
    -- Это менее надежно, но иногда помогает
end

function processCommand(text)
    if text:sub(1, 1) == '!' then
        local cmd = text:lower()
        local baseName, hour, min = cmd:match('!zakladki_(%w+) (%d+) (%d+)')
        
        if baseName and hour and min then
            if BASES[baseName] then
                activeConfig = BASES[baseName]
                targetTime.h = tonumber(hour)
                targetTime.m = tonumber(min)
                state = "IDLE"
                
                local msg = string.format("[AutoZakladki] Настроено: База '%s', Старт в %02d:%02d", baseName, targetTime.h, targetTime.m)
                print(msg)
                sampAddChatMessage(msg, 0x00FF00FF)
            else
                print("[AutoZakladki] Неизвестная база! Доступны: aztek, ballas")
            end
        end
    end
end

function getDistance3d(x1, y1, z1, x2, y2, z2)
    return math.sqrt((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2)
end

function startSequence()
    state = "GOING_TO_EXIT"
    print("[AutoZakladki] Старт! Идем к выходу...")
    sampSendChat("!coord " .. activeConfig.exitCoord.x .. " " .. activeConfig.exitCoord.y .. " " .. activeConfig.exitCoord.z)
end
 
  • Эм
Реакции: romacaddy

Lokapon

Активный
112
69
писал скрипт на закладки для раксампа с помощью ИИ, не находит команду, 100 раз пробовал, RakSamp никакие ошибки не выдаёт

Lua:
require("addon")
local sampev = require("samp.events")

-- НАСТРОЙКИ БАЗ
local BASES = {
    ["aztek"] = {
        exitCoord = {x = -719.5945, y = 2233.1672, z = 1500.9745},
        routeCG = "cgaztek"
    },
    ["ballas"] = {
        exitCoord = {x = -725.5266, y = 2400.7056, z = 1500.9701},
        routeCG = "cgballas"
    }
}

local ROUTE_ZAKLADKI = "testzakladok"

local ZAKLADKI = {
    {x = 2051.2656, y = -1156.4294, z = 23.8502},
    {x = 2115.4988, y = -1095.2936, z = 24.7771},
    {x = 2051.3401, y = -1041.9553, z = 26.5127},
    {x = 2357.4819, y = -1133.4607, z = 28.3938},
    {x = 2359.8284, y = -1171.2126, z = 28.2831},
    {x = 2314.9907, y = -1200.4818, z = 28.2262},
    {x = 2559.2310, y = -1109.2358, z = 64.2670},
    {x = 2628.7939, y = -1124.2505, z = 66.5594},
    {x = 2559.2410, y = -1241.3362, z = 48.8187},
    {x = 2522.7737, y = -1233.6808, z = 45.5962},
    {x = 2509.5601, y = -1126.1271, z = 41.5980},
    {x = 1846.2993, y = -1066.0305, z = 24.6667},
    {x = 1906.2572, y = -1208.8391, z = 19.5152},
    {x = 1769.5657, y = -1269.2799, z = 14.1775},
    {x = 1829.7423, y = -1383.6549, z = 15.1998},
    {x = 1964.8093, y = -1360.9491, z = 18.5781},
    {x = 2054.5581, y = -1326.3584, z = 24.2201},
    {x = 2017.6685, y = -1353.2582, z = 24.2693},
    {x = 2020.1677, y = -1284.9058, z = 24.1846},
    {x = 2416.6184, y = -1354.7859, z = 25.0912},
    {x = 2438.1675, y = -1344.4335, z = 30.5403},
    {x = 2262.4863, y = -1440.3964, z = 24.0092},
    {x = 2321.9722, y = -1454.2347, z = 21.2680},
    {x = 2387.6304, y = -1482.6478, z = 24.6273},
    {x = 2373.1194, y = -1489.6899, z = 28.7267},
    {x = 2764.3159, y = -1182.5099, z = 69.6838},
    {x = 2748.8960, y = -1244.6897, z = 60.6338},
    {x = 2785.7996, y = -1415.1720, z = 16.3880},
    {x = 2588.3672, y = -2061.9470, z = 4.75751},
    {x = 2827.6787, y = -1160.9064, z = 25.3925},
    {x = 2848.3298, y = -1942.6093, z = 12.7612},
    {x = 2372.0056, y = -2114.5867, z = 27.3039},
    {x = 2427.9353, y = -2027.5251, z = 13.7694},
    {x = 2440.2705, y = -1981.6669, z = 13.5469},
    {x = 2307.7266, y = -2009.5165, z = 19.0014},
    {x = 2190.4375, y = -2029.0265, z = 13.7296},
    {x = 2246.0425, y = -1931.4435, z = 13.8074},
    {x = 2122.4360, y = -1933.3767, z = 13.5469},
    {x = 2637.1528, y = -2024.9476, z = 13.6671},
    {x = 2021.6184, y = -2093.2749, z = 19.0454},
    {x = 1905.4556, y = -2136.0786, z = 15.4430},
    {x = 1889.7408, y = -2010.2220, z = 13.5469},
    {x = 1805.8722, y = -2083.0471, z = 13.8553},
    {x = 1971.7415, y = -1535.3516, z = 11.4262},
    {x = 2233.2390, y = -1700.1475, z = 22.5497},
    {x = 2066.9160, y = -1690.3385, z = 13.8153},
    {x = 1987.8599, y = -1628.1263, z = 16.2498},
    {x = 2145.1350, y = -1613.7839, z = 13.7605},
    {x = 2257.3027, y = -1620.9314, z = 15.7393},
    {x = 2368.2910, y = -1702.8949, z = 13.8794},
    {x = 2527.6074, y = -1642.2953, z = 13.9939},
    {x = 2521.1274, y = -1670.7814, z = 15.1195},
    {x = 2395.9255, y = -1816.7269, z = 13.7957},
    {x = 2376.1086, y = -1814.9210, z = 13.7681},
    {x = 2019.8030, y = -1898.4729, z = 9.16811},
    {x = 2280.3914, y = -2113.9587, z = 13.7744},
    {x = 2301.2146, y = -2130.9661, z = 13.9171},
    {x = 2323.5144, y = -2161.7908, z = 13.8654},
    {x = 2300.8599, y = -2232.1970, z = 13.7277},
    {x = 2286.2788, y = -2195.1948, z = 7.24131},
    {x = 2219.3274, y = -2103.9907, z = 8.03221},
    {x = 1711.1694, y = -1852.1277, z = 13.7792},
    {x = 1967.8704, y = -1844.5211, z = 4.14571},
    {x = 2093.0811, y = -1845.7833, z = 4.03511},
    {x = 2102.4995, y = -1639.3700, z = 13.6343},
    {x = 2128.6104, y = -1710.7371, z = 15.2948},
    {x = 2346.2971, y = -1040.7277, z = 53.9172},
    {x = 2383.5659, y = -1941.3464, z = 13.5469},
    {x = 2291.5208, y = -1693.4148, z = 13.6857},
    {x = 1837.9935, y = -1599.3556, z = 13.5677},
    {x = 2497.2095, y = -1793.5551, z = 14.3287}
}

local state = "IDLE"
local activeConfig = nil
local targetTime = {h = 0, m = 0}
local visitedZakladki = {}
local pauseTimer = 0
local cgStartTime = 0

function main()
    while not isSampAvailable() do wait(100) end
    print("[AutoZakladki] Скрипт готов. Используй команды в чате:")
    print("Пример: !zakladki_aztek 5 25")
   
    -- Регистрируем команду через sampRegisterChatCommand как /zakladki_...
    -- Но так как ты хочешь !, мы будем использовать onSendChat
   
    while true do
        wait(100)
       
        if state == "IDLE" then
            local time = os.date("*t")
            if activeConfig and time.hour == targetTime.h and time.min == targetTime.m then
                startSequence()
            end
           
        elseif state == "GOING_TO_EXIT" then
            local px, py, pz = getCharCoordinates(PLAYER_PED)
            local dist = getDistance3d(px, py, pz, activeConfig.exitCoord.x, activeConfig.exitCoord.y, activeConfig.exitCoord.z)
           
            if dist < 2.0 then
                print("[AutoZakladki] На точке выхода. Ждем 5 сек...")
                state = "WAITING_CG"
                cgStartTime = os.clock() + 5.0
            end
           
        elseif state == "WAITING_CG" then
            if os.clock() >= cgStartTime then
                sampSendChat("!play " .. activeConfig.routeCG)
                print("[AutoZakladki] Запуск: !play " .. activeConfig.routeCG)
                state = "PLAYING_CG"
                cgStartTime = os.clock() + 180.0
            end
           
        elseif state == "PLAYING_CG" then
            if os.clock() >= cgStartTime then
                sampSendChat("!play " .. ROUTE_ZAKLADKI)
                print("[AutoZakladki] Запуск закладок: !play " .. ROUTE_ZAKLADKI)
                state = "MONITORING_ZAKLADKI"
                for i = 1, #ZAKLADKI do visitedZakladki[i] = false end
            end
           
        elseif state == "MONITORING_ZAKLADKI" then
            local px, py, pz = getCharCoordinates(PLAYER_PED)
            local found = false
           
            for i, z in ipairs(ZAKLADKI) do
                if not visitedZakladki[i] then
                    local dist = getDistance3d(px, py, pz, z.x, z.y, z.z)
                    if dist <= 1.5 then
                        visitedZakladki[i] = true
                        found = true
                        print("[AutoZakladki] Закладка #" .. i .. "! Пауза...")
                       
                        sampSendChat("!stop")
                        state = "PAUSED"
                        pauseTimer = os.clock() + 3.0
                        break
                    end
                end
            end
           
        elseif state == "PAUSED" then
            if os.clock() >= pauseTimer then
                sampSendChat("!stop")
                print("[AutoZakladki] Продолжаем...")
                state = "MONITORING_ZAKLADKI"
            end
        end
    end
end

-- Попытка 1: Перехват через onSendChat (стандартный)
function sampev.onSendChat(text)
    processCommand(text)
end

-- Попытка 2: Если onSendChat не ловит !, пробуем onServerMessage (иногда команды эхолятся)
function sampev.onServerMessage(color, text)
    -- Это менее надежно, но иногда помогает
end

function processCommand(text)
    if text:sub(1, 1) == '!' then
        local cmd = text:lower()
        local baseName, hour, min = cmd:match('!zakladki_(%w+) (%d+) (%d+)')
       
        if baseName and hour and min then
            if BASES[baseName] then
                activeConfig = BASES[baseName]
                targetTime.h = tonumber(hour)
                targetTime.m = tonumber(min)
                state = "IDLE"
               
                local msg = string.format("[AutoZakladki] Настроено: База '%s', Старт в %02d:%02d", baseName, targetTime.h, targetTime.m)
                print(msg)
                sampAddChatMessage(msg, 0x00FF00FF)
            else
                print("[AutoZakladki] Неизвестная база! Доступны: aztek, ballas")
            end
        end
    end
end

function getDistance3d(x1, y1, z1, x2, y2, z2)
    return math.sqrt((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2)
end

function startSequence()
    state = "GOING_TO_EXIT"
    print("[AutoZakladki] Старт! Идем к выходу...")
    sampSendChat("!coord " .. activeConfig.exitCoord.x .. " " .. activeConfig.exitCoord.y .. " " .. activeConfig.exitCoord.z)
end
В раксамп нельзя регистрировать команды
 

chromiusj

Известный
Модератор
6,103
4,486
писал скрипт на закладки для раксампа с помощью ИИ, не находит команду, 100 раз пробовал, RakSamp никакие ошибки не выдаёт

Lua:
require("addon")
local sampev = require("samp.events")

-- НАСТРОЙКИ БАЗ
local BASES = {
    ["aztek"] = {
        exitCoord = {x = -719.5945, y = 2233.1672, z = 1500.9745},
        routeCG = "cgaztek"
    },
    ["ballas"] = {
        exitCoord = {x = -725.5266, y = 2400.7056, z = 1500.9701},
        routeCG = "cgballas"
    }
}

local ROUTE_ZAKLADKI = "testzakladok"

local ZAKLADKI = {
    {x = 2051.2656, y = -1156.4294, z = 23.8502},
    {x = 2115.4988, y = -1095.2936, z = 24.7771},
    {x = 2051.3401, y = -1041.9553, z = 26.5127},
    {x = 2357.4819, y = -1133.4607, z = 28.3938},
    {x = 2359.8284, y = -1171.2126, z = 28.2831},
    {x = 2314.9907, y = -1200.4818, z = 28.2262},
    {x = 2559.2310, y = -1109.2358, z = 64.2670},
    {x = 2628.7939, y = -1124.2505, z = 66.5594},
    {x = 2559.2410, y = -1241.3362, z = 48.8187},
    {x = 2522.7737, y = -1233.6808, z = 45.5962},
    {x = 2509.5601, y = -1126.1271, z = 41.5980},
    {x = 1846.2993, y = -1066.0305, z = 24.6667},
    {x = 1906.2572, y = -1208.8391, z = 19.5152},
    {x = 1769.5657, y = -1269.2799, z = 14.1775},
    {x = 1829.7423, y = -1383.6549, z = 15.1998},
    {x = 1964.8093, y = -1360.9491, z = 18.5781},
    {x = 2054.5581, y = -1326.3584, z = 24.2201},
    {x = 2017.6685, y = -1353.2582, z = 24.2693},
    {x = 2020.1677, y = -1284.9058, z = 24.1846},
    {x = 2416.6184, y = -1354.7859, z = 25.0912},
    {x = 2438.1675, y = -1344.4335, z = 30.5403},
    {x = 2262.4863, y = -1440.3964, z = 24.0092},
    {x = 2321.9722, y = -1454.2347, z = 21.2680},
    {x = 2387.6304, y = -1482.6478, z = 24.6273},
    {x = 2373.1194, y = -1489.6899, z = 28.7267},
    {x = 2764.3159, y = -1182.5099, z = 69.6838},
    {x = 2748.8960, y = -1244.6897, z = 60.6338},
    {x = 2785.7996, y = -1415.1720, z = 16.3880},
    {x = 2588.3672, y = -2061.9470, z = 4.75751},
    {x = 2827.6787, y = -1160.9064, z = 25.3925},
    {x = 2848.3298, y = -1942.6093, z = 12.7612},
    {x = 2372.0056, y = -2114.5867, z = 27.3039},
    {x = 2427.9353, y = -2027.5251, z = 13.7694},
    {x = 2440.2705, y = -1981.6669, z = 13.5469},
    {x = 2307.7266, y = -2009.5165, z = 19.0014},
    {x = 2190.4375, y = -2029.0265, z = 13.7296},
    {x = 2246.0425, y = -1931.4435, z = 13.8074},
    {x = 2122.4360, y = -1933.3767, z = 13.5469},
    {x = 2637.1528, y = -2024.9476, z = 13.6671},
    {x = 2021.6184, y = -2093.2749, z = 19.0454},
    {x = 1905.4556, y = -2136.0786, z = 15.4430},
    {x = 1889.7408, y = -2010.2220, z = 13.5469},
    {x = 1805.8722, y = -2083.0471, z = 13.8553},
    {x = 1971.7415, y = -1535.3516, z = 11.4262},
    {x = 2233.2390, y = -1700.1475, z = 22.5497},
    {x = 2066.9160, y = -1690.3385, z = 13.8153},
    {x = 1987.8599, y = -1628.1263, z = 16.2498},
    {x = 2145.1350, y = -1613.7839, z = 13.7605},
    {x = 2257.3027, y = -1620.9314, z = 15.7393},
    {x = 2368.2910, y = -1702.8949, z = 13.8794},
    {x = 2527.6074, y = -1642.2953, z = 13.9939},
    {x = 2521.1274, y = -1670.7814, z = 15.1195},
    {x = 2395.9255, y = -1816.7269, z = 13.7957},
    {x = 2376.1086, y = -1814.9210, z = 13.7681},
    {x = 2019.8030, y = -1898.4729, z = 9.16811},
    {x = 2280.3914, y = -2113.9587, z = 13.7744},
    {x = 2301.2146, y = -2130.9661, z = 13.9171},
    {x = 2323.5144, y = -2161.7908, z = 13.8654},
    {x = 2300.8599, y = -2232.1970, z = 13.7277},
    {x = 2286.2788, y = -2195.1948, z = 7.24131},
    {x = 2219.3274, y = -2103.9907, z = 8.03221},
    {x = 1711.1694, y = -1852.1277, z = 13.7792},
    {x = 1967.8704, y = -1844.5211, z = 4.14571},
    {x = 2093.0811, y = -1845.7833, z = 4.03511},
    {x = 2102.4995, y = -1639.3700, z = 13.6343},
    {x = 2128.6104, y = -1710.7371, z = 15.2948},
    {x = 2346.2971, y = -1040.7277, z = 53.9172},
    {x = 2383.5659, y = -1941.3464, z = 13.5469},
    {x = 2291.5208, y = -1693.4148, z = 13.6857},
    {x = 1837.9935, y = -1599.3556, z = 13.5677},
    {x = 2497.2095, y = -1793.5551, z = 14.3287}
}

local state = "IDLE"
local activeConfig = nil
local targetTime = {h = 0, m = 0}
local visitedZakladki = {}
local pauseTimer = 0
local cgStartTime = 0

function main()
    while not isSampAvailable() do wait(100) end
    print("[AutoZakladki] Скрипт готов. Используй команды в чате:")
    print("Пример: !zakladki_aztek 5 25")
   
    -- Регистрируем команду через sampRegisterChatCommand как /zakladki_...
    -- Но так как ты хочешь !, мы будем использовать onSendChat
   
    while true do
        wait(100)
       
        if state == "IDLE" then
            local time = os.date("*t")
            if activeConfig and time.hour == targetTime.h and time.min == targetTime.m then
                startSequence()
            end
           
        elseif state == "GOING_TO_EXIT" then
            local px, py, pz = getCharCoordinates(PLAYER_PED)
            local dist = getDistance3d(px, py, pz, activeConfig.exitCoord.x, activeConfig.exitCoord.y, activeConfig.exitCoord.z)
           
            if dist < 2.0 then
                print("[AutoZakladki] На точке выхода. Ждем 5 сек...")
                state = "WAITING_CG"
                cgStartTime = os.clock() + 5.0
            end
           
        elseif state == "WAITING_CG" then
            if os.clock() >= cgStartTime then
                sampSendChat("!play " .. activeConfig.routeCG)
                print("[AutoZakladki] Запуск: !play " .. activeConfig.routeCG)
                state = "PLAYING_CG"
                cgStartTime = os.clock() + 180.0
            end
           
        elseif state == "PLAYING_CG" then
            if os.clock() >= cgStartTime then
                sampSendChat("!play " .. ROUTE_ZAKLADKI)
                print("[AutoZakladki] Запуск закладок: !play " .. ROUTE_ZAKLADKI)
                state = "MONITORING_ZAKLADKI"
                for i = 1, #ZAKLADKI do visitedZakladki[i] = false end
            end
           
        elseif state == "MONITORING_ZAKLADKI" then
            local px, py, pz = getCharCoordinates(PLAYER_PED)
            local found = false
           
            for i, z in ipairs(ZAKLADKI) do
                if not visitedZakladki[i] then
                    local dist = getDistance3d(px, py, pz, z.x, z.y, z.z)
                    if dist <= 1.5 then
                        visitedZakladki[i] = true
                        found = true
                        print("[AutoZakladki] Закладка #" .. i .. "! Пауза...")
                       
                        sampSendChat("!stop")
                        state = "PAUSED"
                        pauseTimer = os.clock() + 3.0
                        break
                    end
                end
            end
           
        elseif state == "PAUSED" then
            if os.clock() >= pauseTimer then
                sampSendChat("!stop")
                print("[AutoZakladki] Продолжаем...")
                state = "MONITORING_ZAKLADKI"
            end
        end
    end
end

-- Попытка 1: Перехват через onSendChat (стандартный)
function sampev.onSendChat(text)
    processCommand(text)
end

-- Попытка 2: Если onSendChat не ловит !, пробуем onServerMessage (иногда команды эхолятся)
function sampev.onServerMessage(color, text)
    -- Это менее надежно, но иногда помогает
end

function processCommand(text)
    if text:sub(1, 1) == '!' then
        local cmd = text:lower()
        local baseName, hour, min = cmd:match('!zakladki_(%w+) (%d+) (%d+)')
       
        if baseName and hour and min then
            if BASES[baseName] then
                activeConfig = BASES[baseName]
                targetTime.h = tonumber(hour)
                targetTime.m = tonumber(min)
                state = "IDLE"
               
                local msg = string.format("[AutoZakladki] Настроено: База '%s', Старт в %02d:%02d", baseName, targetTime.h, targetTime.m)
                print(msg)
                sampAddChatMessage(msg, 0x00FF00FF)
            else
                print("[AutoZakladki] Неизвестная база! Доступны: aztek, ballas")
            end
        end
    end
end

function getDistance3d(x1, y1, z1, x2, y2, z2)
    return math.sqrt((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2)
end

function startSequence()
    state = "GOING_TO_EXIT"
    print("[AutoZakladki] Старт! Идем к выходу...")
    sampSendChat("!coord " .. activeConfig.exitCoord.x .. " " .. activeConfig.exitCoord.y .. " " .. activeConfig.exitCoord.z)
end
Попробуй апи раксампа предоставить ШИИ, а не сидеть долбить тупыми запросами
 

Baklaxa

Участник
66
25
Можно ли получить позицию наймтега?



Снимок экрана (121).png
 

Lokapon

Активный
112
69
Можно ли получить позицию наймтега?



Посмотреть вложение 302821

Точно получить невозможно, но можно примерно получить
Код:
local result, ped = sampGetCharHandleBySampPlayerId(249)
if result then
    local x, y, z = getCharCoordinates(ped)
    local screenX, screenY = convert3DCoordsToScreen(x, y, z + 1.2)
    
    print(string.format("X: %d, Y: %d", screenX, screenY))
end

1.2 можешь поменять, чтоб точнее было
 
  • Bug
Реакции: ARMOR

Baklaxa

Участник
66
25
Точно получить невозможно, но можно примерно получить
Код:
local result, ped = sampGetCharHandleBySampPlayerId(249)
if result then
    local x, y, z = getCharCoordinates(ped)
    local screenX, screenY = convert3DCoordsToScreen(x, y, z + 1.2)
   
    print(string.format("X: %d, Y: %d", screenX, screenY))
end

1.2 можешь поменять, чтоб точнее было
нет ли сниппета, который бы получал координаты точнее?
возможно с использованием memory
 

Lokapon

Активный
112
69
нет ли сниппета, который бы получал координаты точнее?
возможно с использованием memory
Это невозможно, так как в сампе нету функции/переменной отвечающей за координаты нэймтэга, координаты вычисляются сразу при отрисовке текста
 

FireZilla

Активный
215
85
писал скрипт на закладки для раксампа с помощью ИИ, не находит команду, 100 раз пробовал, RakSamp никакие ошибки не выдаёт

Lua:
require("addon")
local sampev = require("samp.events")

-- НАСТРОЙКИ БАЗ
local BASES = {
    ["aztek"] = {
        exitCoord = {x = -719.5945, y = 2233.1672, z = 1500.9745},
        routeCG = "cgaztek"
    },
    ["ballas"] = {
        exitCoord = {x = -725.5266, y = 2400.7056, z = 1500.9701},
        routeCG = "cgballas"
    }
}

local ROUTE_ZAKLADKI = "testzakladok"

local ZAKLADKI = {
    {x = 2051.2656, y = -1156.4294, z = 23.8502},
    {x = 2115.4988, y = -1095.2936, z = 24.7771},
    {x = 2051.3401, y = -1041.9553, z = 26.5127},
    {x = 2357.4819, y = -1133.4607, z = 28.3938},
    {x = 2359.8284, y = -1171.2126, z = 28.2831},
    {x = 2314.9907, y = -1200.4818, z = 28.2262},
    {x = 2559.2310, y = -1109.2358, z = 64.2670},
    {x = 2628.7939, y = -1124.2505, z = 66.5594},
    {x = 2559.2410, y = -1241.3362, z = 48.8187},
    {x = 2522.7737, y = -1233.6808, z = 45.5962},
    {x = 2509.5601, y = -1126.1271, z = 41.5980},
    {x = 1846.2993, y = -1066.0305, z = 24.6667},
    {x = 1906.2572, y = -1208.8391, z = 19.5152},
    {x = 1769.5657, y = -1269.2799, z = 14.1775},
    {x = 1829.7423, y = -1383.6549, z = 15.1998},
    {x = 1964.8093, y = -1360.9491, z = 18.5781},
    {x = 2054.5581, y = -1326.3584, z = 24.2201},
    {x = 2017.6685, y = -1353.2582, z = 24.2693},
    {x = 2020.1677, y = -1284.9058, z = 24.1846},
    {x = 2416.6184, y = -1354.7859, z = 25.0912},
    {x = 2438.1675, y = -1344.4335, z = 30.5403},
    {x = 2262.4863, y = -1440.3964, z = 24.0092},
    {x = 2321.9722, y = -1454.2347, z = 21.2680},
    {x = 2387.6304, y = -1482.6478, z = 24.6273},
    {x = 2373.1194, y = -1489.6899, z = 28.7267},
    {x = 2764.3159, y = -1182.5099, z = 69.6838},
    {x = 2748.8960, y = -1244.6897, z = 60.6338},
    {x = 2785.7996, y = -1415.1720, z = 16.3880},
    {x = 2588.3672, y = -2061.9470, z = 4.75751},
    {x = 2827.6787, y = -1160.9064, z = 25.3925},
    {x = 2848.3298, y = -1942.6093, z = 12.7612},
    {x = 2372.0056, y = -2114.5867, z = 27.3039},
    {x = 2427.9353, y = -2027.5251, z = 13.7694},
    {x = 2440.2705, y = -1981.6669, z = 13.5469},
    {x = 2307.7266, y = -2009.5165, z = 19.0014},
    {x = 2190.4375, y = -2029.0265, z = 13.7296},
    {x = 2246.0425, y = -1931.4435, z = 13.8074},
    {x = 2122.4360, y = -1933.3767, z = 13.5469},
    {x = 2637.1528, y = -2024.9476, z = 13.6671},
    {x = 2021.6184, y = -2093.2749, z = 19.0454},
    {x = 1905.4556, y = -2136.0786, z = 15.4430},
    {x = 1889.7408, y = -2010.2220, z = 13.5469},
    {x = 1805.8722, y = -2083.0471, z = 13.8553},
    {x = 1971.7415, y = -1535.3516, z = 11.4262},
    {x = 2233.2390, y = -1700.1475, z = 22.5497},
    {x = 2066.9160, y = -1690.3385, z = 13.8153},
    {x = 1987.8599, y = -1628.1263, z = 16.2498},
    {x = 2145.1350, y = -1613.7839, z = 13.7605},
    {x = 2257.3027, y = -1620.9314, z = 15.7393},
    {x = 2368.2910, y = -1702.8949, z = 13.8794},
    {x = 2527.6074, y = -1642.2953, z = 13.9939},
    {x = 2521.1274, y = -1670.7814, z = 15.1195},
    {x = 2395.9255, y = -1816.7269, z = 13.7957},
    {x = 2376.1086, y = -1814.9210, z = 13.7681},
    {x = 2019.8030, y = -1898.4729, z = 9.16811},
    {x = 2280.3914, y = -2113.9587, z = 13.7744},
    {x = 2301.2146, y = -2130.9661, z = 13.9171},
    {x = 2323.5144, y = -2161.7908, z = 13.8654},
    {x = 2300.8599, y = -2232.1970, z = 13.7277},
    {x = 2286.2788, y = -2195.1948, z = 7.24131},
    {x = 2219.3274, y = -2103.9907, z = 8.03221},
    {x = 1711.1694, y = -1852.1277, z = 13.7792},
    {x = 1967.8704, y = -1844.5211, z = 4.14571},
    {x = 2093.0811, y = -1845.7833, z = 4.03511},
    {x = 2102.4995, y = -1639.3700, z = 13.6343},
    {x = 2128.6104, y = -1710.7371, z = 15.2948},
    {x = 2346.2971, y = -1040.7277, z = 53.9172},
    {x = 2383.5659, y = -1941.3464, z = 13.5469},
    {x = 2291.5208, y = -1693.4148, z = 13.6857},
    {x = 1837.9935, y = -1599.3556, z = 13.5677},
    {x = 2497.2095, y = -1793.5551, z = 14.3287}
}

local state = "IDLE"
local activeConfig = nil
local targetTime = {h = 0, m = 0}
local visitedZakladki = {}
local pauseTimer = 0
local cgStartTime = 0

function main()
    while not isSampAvailable() do wait(100) end
    print("[AutoZakladki] Скрипт готов. Используй команды в чате:")
    print("Пример: !zakladki_aztek 5 25")
  
    -- Регистрируем команду через sampRegisterChatCommand как /zakladki_...
    -- Но так как ты хочешь !, мы будем использовать onSendChat
  
    while true do
        wait(100)
      
        if state == "IDLE" then
            local time = os.date("*t")
            if activeConfig and time.hour == targetTime.h and time.min == targetTime.m then
                startSequence()
            end
          
        elseif state == "GOING_TO_EXIT" then
            local px, py, pz = getCharCoordinates(PLAYER_PED)
            local dist = getDistance3d(px, py, pz, activeConfig.exitCoord.x, activeConfig.exitCoord.y, activeConfig.exitCoord.z)
          
            if dist < 2.0 then
                print("[AutoZakladki] На точке выхода. Ждем 5 сек...")
                state = "WAITING_CG"
                cgStartTime = os.clock() + 5.0
            end
          
        elseif state == "WAITING_CG" then
            if os.clock() >= cgStartTime then
                sampSendChat("!play " .. activeConfig.routeCG)
                print("[AutoZakladki] Запуск: !play " .. activeConfig.routeCG)
                state = "PLAYING_CG"
                cgStartTime = os.clock() + 180.0
            end
          
        elseif state == "PLAYING_CG" then
            if os.clock() >= cgStartTime then
                sampSendChat("!play " .. ROUTE_ZAKLADKI)
                print("[AutoZakladki] Запуск закладок: !play " .. ROUTE_ZAKLADKI)
                state = "MONITORING_ZAKLADKI"
                for i = 1, #ZAKLADKI do visitedZakladki[i] = false end
            end
          
        elseif state == "MONITORING_ZAKLADKI" then
            local px, py, pz = getCharCoordinates(PLAYER_PED)
            local found = false
          
            for i, z in ipairs(ZAKLADKI) do
                if not visitedZakladki[i] then
                    local dist = getDistance3d(px, py, pz, z.x, z.y, z.z)
                    if dist <= 1.5 then
                        visitedZakladki[i] = true
                        found = true
                        print("[AutoZakladki] Закладка #" .. i .. "! Пауза...")
                      
                        sampSendChat("!stop")
                        state = "PAUSED"
                        pauseTimer = os.clock() + 3.0
                        break
                    end
                end
            end
          
        elseif state == "PAUSED" then
            if os.clock() >= pauseTimer then
                sampSendChat("!stop")
                print("[AutoZakladki] Продолжаем...")
                state = "MONITORING_ZAKLADKI"
            end
        end
    end
end

-- Попытка 1: Перехват через onSendChat (стандартный)
function sampev.onSendChat(text)
    processCommand(text)
end

-- Попытка 2: Если onSendChat не ловит !, пробуем onServerMessage (иногда команды эхолятся)
function sampev.onServerMessage(color, text)
    -- Это менее надежно, но иногда помогает
end

function processCommand(text)
    if text:sub(1, 1) == '!' then
        local cmd = text:lower()
        local baseName, hour, min = cmd:match('!zakladki_(%w+) (%d+) (%d+)')
      
        if baseName and hour and min then
            if BASES[baseName] then
                activeConfig = BASES[baseName]
                targetTime.h = tonumber(hour)
                targetTime.m = tonumber(min)
                state = "IDLE"
              
                local msg = string.format("[AutoZakladki] Настроено: База '%s', Старт в %02d:%02d", baseName, targetTime.h, targetTime.m)
                print(msg)
                sampAddChatMessage(msg, 0x00FF00FF)
            else
                print("[AutoZakladki] Неизвестная база! Доступны: aztek, ballas")
            end
        end
    end
end

function getDistance3d(x1, y1, z1, x2, y2, z2)
    return math.sqrt((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2)
end

function startSequence()
    state = "GOING_TO_EXIT"
    print("[AutoZakladki] Старт! Идем к выходу...")
    sampSendChat("!coord " .. activeConfig.exitCoord.x .. " " .. activeConfig.exitCoord.y .. " " .. activeConfig.exitCoord.z)
end
В раксампе команды регистрируются через: onInput, onRunCommand
код:
function onRunCommand(cmd)
    if cmd:find("!penis") then
        print("Ya pidoras")
    end
end
function onInput(cmd)
    if cmd:find("!penis") then
        print("Ya pidoras")
    end
end
Тоесть по примеру кода, если я введу в raksamp !penis, то мне выдаст что я пидорас
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,276
12,752
Можно ли получить позицию наймтега?



Посмотреть вложение 302821
Это невозможно, так как в сампе нету функции/переменной отвечающей за координаты нэймтэга, координаты вычисляются сразу при отрисовке текста
Можно хукать отрисовку ников, примерно как то так
Lua:
local ffi = require('ffi');
local hook = require('hooks');

--[[   
    void CPlayerTags::DrawLabel(CVector* pPosition, const char* szText, D3DCOLOR color, float fDistanceToCamera, bool bDrawStatus, int nStatus) {
        ((void(__thiscall*)(CPlayerTags*, CVector*, const char*, D3DCOLOR, float, bool, int))GetAddress(0x686C0))(this, pPosition, szText, color, fDistanceToCamera, bDrawStatus, nStatus);
    }
    void CPlayerTags::DrawHealthBar(CVector* pPosition, float fHealth, float fArmour, float fDistanceToCamera) {
        ((void(__thiscall*)(CPlayerTags*, CVector*, float, float, float))GetAddress(0x689C0))(this, pPosition, fHealth, fArmour, fDistanceToCamera);
    }
]]

ffi.cdef([[
    typedef struct { float x, y, z; } CVector;
]]);

function CPlayerTags__DrawLabel(this, pPosition, szText, color, fDistanceToCamera, bDrawStatus, nStatus)
    local str = ffi.string(szText);
    local x, y = convert3DCoordsToScreen(pPosition.x, pPosition.y, pPosition.z);
    
    renderDrawPolygon(x, y, 10, 10, 4, 0, 0xFFffffff) -- тут x и y это координаты

    return CPlayerTags__DrawLabel(this, pPosition, szText, color, fDistanceToCamera, bDrawStatus, nStatus)
end

function main()
    jit.off();
    CPlayerTags__DrawLabel = hook.jmp.new('void(__thiscall*)(void*, CVector*, const char*, unsigned long, float, bool, int)', CPlayerTags__DrawLabel, getModuleHandle('samp.dll') + 0x686C0);
    while not isSampAvailable() do wait(0) end
    wait(-1)
end
 
  • Клоун
  • Нравится
Реакции: ARMOR и romacaddy

ARMOR

God has forsaken us
Модератор
5,035
7,452
Можно ли получить позицию наймтега?



Посмотреть вложение 302821

Можно хукать отрисовку ников, примерно как то так
Lua:
local ffi = require('ffi');
local hook = require('hooks');

--[[  
    void CPlayerTags::DrawLabel(CVector* pPosition, const char* szText, D3DCOLOR color, float fDistanceToCamera, bool bDrawStatus, int nStatus) {
        ((void(__thiscall*)(CPlayerTags*, CVector*, const char*, D3DCOLOR, float, bool, int))GetAddress(0x686C0))(this, pPosition, szText, color, fDistanceToCamera, bDrawStatus, nStatus);
    }
    void CPlayerTags::DrawHealthBar(CVector* pPosition, float fHealth, float fArmour, float fDistanceToCamera) {
        ((void(__thiscall*)(CPlayerTags*, CVector*, float, float, float))GetAddress(0x689C0))(this, pPosition, fHealth, fArmour, fDistanceToCamera);
    }
]]

ffi.cdef([[
    typedef struct { float x, y, z; } CVector;
]]);

function CPlayerTags__DrawLabel(this, pPosition, szText, color, fDistanceToCamera, bDrawStatus, nStatus)
    local str = ffi.string(szText);
    local x, y = convert3DCoordsToScreen(pPosition.x, pPosition.y, pPosition.z);
   
    renderDrawPolygon(x, y, 10, 10, 4, 0, 0xFFffffff) -- тут x и y это координаты

    return CPlayerTags__DrawLabel(this, pPosition, szText, color, fDistanceToCamera, bDrawStatus, nStatus)
end

function main()
    jit.off();
    CPlayerTags__DrawLabel = hook.jmp.new('void(__thiscall*)(void*, CVector*, const char*, unsigned long, float, bool, int)', CPlayerTags__DrawLabel, getModuleHandle('samp.dll') + 0x686C0);
    while not isSampAvailable() do wait(0) end
    wait(-1)
end
Хукать самповскую функцию - это не метод, а говно. Лучше сделать всё самому.

Lua:
local memory = require("memory")
local ffi = require("ffi")
function GetDistanceToCamera(entity)
    if entity == 0 then
        return 100000.0
    end
    local gameEntity = memory.getuint32(entity, true)
    if gameEntity == 0 then
        return 100000.0
    end
    local matrix = memory.getuint32(entity + 0x14, true)
    if matrix == 0 then
        return 100000.0
    end
    local x = memory.getfloat(matrix + 0x30, true)
    local y = memory.getfloat(matrix + 0x34, true)
    local z = memory.getfloat(matrix + 0x38, true)
    local cameraX = memory.getfloat(0xB6F9CC, true)
    local cameraY = memory.getfloat(0xB6F9D0, true)
    local cameraZ = memory.getfloat(0xB6F9D4, true)
    local dx = x - cameraX
    local dy = y - cameraY
    local dz = z - cameraZ
    return math.sqrt(dx * dx + dy * dy + dz * dz)
end

local getBonePosition = ffi.cast("int (__thiscall*)(void*, float*, int, bool)", 0x5E4280)
function getBodyPartCoordinates(id, handle)
  local pedptr = getCharPointer(handle)
  local vec = ffi.new("float[3]")
  getBonePosition(ffi.cast("void*", pedptr), vec, id, true)
  return vec[0], vec[1], vec[2]
end
function isPointCorrect(x,y,z,d)
    return ({convert3DCoordsToScreenEx(x, y, z)})[4] >= (d or 0) or not z
end
function main()
    while not isSampAvailable() do wait(0) end
    while true do
        wait(0)
            for k, v in ipairs(getAllChars()) do
                local pPed = getCharPointer(v)
                if pPed ~= nil and doesCharExist(v) then
                    local fX, fY, fZ = getBodyPartCoordinates(8, v)
                    local fDist = GetDistanceToCamera(pPed)
                    if (isPointCorrect(fX, fY, fZ)) then
                        fZ = fDist * 0.047499999 + fZ + 0.2;
                        local x, y = convert3DCoordsToScreen(fX, fY, fZ);
                        renderDrawBox(x, y, 50, 20, 0xFFFF0000)
                    end
                end
            end
    end
end
 
  • Нравится
Реакции: Baklaxa

Baklaxa

Участник
66
25
можно ли моментально взорвать т/с в котором сидишь, но так, чтобы это увидели все?
 

romacaddy

Известный
Проверенный
245
207
можно ли моментально взорвать т/с в котором сидишь, но так, чтобы это увидели все?
нет, но есть транспорт, при установке низкого здоровья которого он взрывается моментально - вертолеты\самолеты
 

Qubea

Новичок
5
1
Помогите пожалуйста, не знаю почему не призывается охранник, скрипт зависает/останавливается на табличке где должно нажать кнопку "Заспавнить рядом с собой"


Lua:
[/B]
Поиск пункта спавна в меню охранника
local function recognizeGuardMenu(body)
    local plain = dialogTextUtf8(body):gsub('{%x%x%x%x%x%x}', '')
    local index, spawnIndex, activeGuard = 0, nil, false

    for line in (plain .. '\n'):gmatch('(.-)\n') do
        line = line:gsub('\r', '')

        if line:find('Заспавнить рядом с собой', 1, true) then
            spawnIndex = index
        end

        if line:find('Спрятать', 1, true)
        or line:find('Отозвать', 1, true)
        or line:find('Убрать охранника', 1, true) then
            activeGuard = true
        end

        index = index + 1
    end

    if activeGuard then return 'already_spawned' end
    if spawnIndex ~= nil then return 'spawn', spawnIndex end

    return 'unknown'
end

Обработка диалогов охранника
if state == 'menu_wait' and id == 25749 then
    guardMenuAction, guardMenuIndex = recognizeGuardMenu(body)
    go('choose_menu', 1, 8)

elseif state == 'confirm_wait' and id == 0 then
    go('confirm_guard', 1, 8)
end

Выбор охр + меню
elseif state == 'select_guard' and now >= actionAt then
    if settings.guard_id == '' then
        halt('No guard selected')
    else
        local available = false

        for _, guard in ipairs(settings.securities) do
            if tostring(guard.id) == tostring(settings.guard_id) then
                available = true
                break
            end
        end

        if not available then
            halt('Selected guard unavailable')
        else
            go('select_wait', 1, 10)
            sendCEF('selectSecurity|{"id":' .. tostring(settings.guard_id) .. '}')
        end
    end

elseif state == 'select_wait' and now >= actionAt then
    go('menu_wait', 0, 10)
    sendCEF('clickOnMenu|{"id": ' .. tostring(settings.guard_id) .. '}')


ищет "заспавнить рядом" 
elseif state == 'choose_menu' and now >= actionAt then
    if guardMenuAction == 'spawn' and guardMenuIndex ~= nil then
        go('confirm_wait', 0, 10)

        local ok = pcall(
            sampSendDialogResponse,
            25749, 1, guardMenuIndex, ''
        )

        if not ok then halt('Guard menu error') end
    else
        local ok = pcall(function()
            if sampIsDialogActive() and sampGetCurrentDialogId() == 25749 then
                sampCloseCurrentDialogWithButton(0)
            end
        end)

        if not ok then
            halt('Guard dialog close error')
        elseif inventoryOpened then
            go('close_inventory', 1, 6)
        else
            halt('Guard dialog cancelled')
        end
    end


закрытия инвентаря
elseif state == 'close_inventory' and now >= actionAt then
    go('close_inventory_wait', 0, 6)
    sendCEF('inventoryClose')

elseif state == 'close_inventory_wait' and not inventoryOpened then
    halt('Inventory closed')


проверка что охра заспавнена
elseif state == 'confirm_guard' and now >= actionAt then
    go('finished')

    local ok = pcall(
        sampSendDialogResponse,
        0, 1, 0, ''
    )

    if not ok then
        halt('Guard confirm error')
    else
        halt('Guard sequence completed')
    end
[B]