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

Minhjhs

Участник
69
22
Lua:
require('lib.samp.events').onServerMessage = function(color, text)
    if text:find('%a+_%a+%[(%d+)%] говорит: Кидай трейд') then
        nick, id, text = text:match('(%a+_%a+)%[(%d+)%] (говорит: Кидай трейд)')
        sampAddChatMessage(nick..' ['..id..'] '..text, -1)
    end
end
так?


Lua:
if imgui.Checkbox("Text", bool) then
    sampAddChatMessage("Checkbox "..(bool[0] and "on" or "off"), -1)
end
так попробуй. mimgui видимо используешь.
Твой Ответ мне почему - то не помог, всё так же не работает
 

E E E E E E E

Активный
154
26
Как сложить CPed? Player Data я могу сложить и получить допустим скорость и т.д, но с CPed так не получается, что не так?
1725895356017.png
 

Макс | Lycorn

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

Vovan1337

Участник
37
6
Приветствую всех, появился такой вопросик, на Аризоне есть некое "диалоговое окно с полем ввода" где в строку нужно ввести аргумент, а дальше на сервере идет проверка, к примеру если ты жертвуешь день больше ли сумма 5.000.000, так вот, псть ли в самп луа функция позволяющая перехватить его ответ? То есть в начале кода: local defs = {}
Defs=(Комманда получения того что игрок ввел в дефс)
 

chromiusj

Известный
Модератор
5,656
3,959
Приветствую всех, появился такой вопросик, на Аризоне есть некое "диалоговое окно с полем ввода" где в строку нужно ввести аргумент, а дальше на сервере идет проверка, к примеру если ты жертвуешь день больше ли сумма 5.000.000, так вот, псть ли в самп луа функция позволяющая перехватить его ответ? То есть в начале кода: local defs = {}
Defs=(Комманда получения того что игрок ввел в дефс)
?
 

Vovan1337

Участник
37
6

skritper123

Новичок
4
1
Приветствую я пытаюсь дописать скрипт чтобы у меня были x3 обоймы на узи и обрезы в сампе, но он как-то неправильно работает после того как 12 пт например закончились он после перезарядки становится 4 пт . Помогите как сделать чтобы он всегда было x3 обоймы на узи и обрезы
Вот весь скрипт
lua:
local memory = require 'memory'

local prevWeaponId = nil

local WEAPON_IDS =
{
   
    {26}, --Sawnoff Shotgun
    {28}, --Micro SMG/Uzi
}

function main()
    while true do
        wait(0)
        local currentWeaponId = getCurrentCharWeapon(playerPed)
        if currentWeaponId ~= prevWeaponId then
            if prevWeaponId ~= nil then
                multiplyAmmoInClip(3) -- Передача идентификатора оружия
            end
            prevWeaponId = currentWeaponId
        end
    end
end



function multiplyAmmoInClip(multiplier)
   while true do
    for k, v in ipairs(WEAPON_IDS) do
    local pointer = getCharPointer(playerPed)
    local weapon = getCurrentCharWeapon(playerPed)
    local ammo = getAmmoInCharWeapon(playerPed, weapon)
    if weapon == v[1] then
        local slot = getWeapontypeSlot(weapon)
        local cweapon = pointer + 0x5A0
        local current_cweapon = cweapon + slot * 0x1C
        local ammoInClip = memory.getuint32(current_cweapon + 0x8)
        local ammowithoutclip = ammo - ammoInClip
        local ammoInClipMulti = ammoInClip * multiplier
        if ammo < ammoInClipMulti then
            newAmmoInClip = ammoInClip + ammowithoutclip
            memory.setuint32(current_cweapon + 0x8, newAmmoInClip)
        elseif ammoInClip < ammowithoutclip then
                newAmmoInClip = ammoInClip * multiplier
                memory.setuint32(current_cweapon + 0x8, newAmmoInClip)
            end
        end
    end
end
 
  • Ха-ха
Реакции: chromiusj

Wer_tyn

Новичок
27
0
Добрый день, можно ли как-то чтобы на RakSAMP бот мог найти координаты красного маркера на карте?
 
Последнее редактирование:

North Trees

Участник
34
2
Вечер добрый.
Хотел бы поинтересоваться
В такой штуке как:
Как узнать коорды обьекта,
либо же скина какого-то?
Обьясняю - я нашел штуку которая конвертирует и рисует линию до обьекта по его коордам.
но какие коорды мне вписать если мне нужна линия до обьекта?
Искренне прошу разьяснить.
 

Masayuki

Участник
79
31
Вечер добрый.
Хотел бы поинтересоваться
В такой штуке как:
Как узнать коорды обьекта,
либо же скина какого-то?
Обьясняю - я нашел штуку которая конвертирует и рисует линию до обьекта по его коордам.
но какие коорды мне вписать если мне нужна линия до обьекта?
Искренне прошу разьяснить.
Lua:
while true do wait(0)
    for _, v in pairs(getAllObjects()) do
        if isObjectOnScreen(v) then
            local model = getObjectModel(v)
            if model == айди объекта then
                local res, obj_x, obj_y, obj_z = getObjectCoordinates(v)
                local obj_screen_x, obj_screen_y = convert3DCoordsToScreen(obj_x,obj_y,obj_z)
                local ped_x,ped_y,ped_z = getCharCoordinates(PLAYER_PED)
                local ped_screen_x, ped_screen_y = convert3DCoordsToScreen(ped_x, ped_y, ped_z)
                renderDrawLine(obj_screen_x, obj_screen_y, ped_screen_x, ped_screen_y, 1.0, 0xF2ffc700)
            end
        end
    end
end
 
  • Нравится
Реакции: North Trees

IlyaFontonov

Активный
147
36
Посмотреть вложение 251670
Вот это сообщение
Я лично использую /timestamp - Может это будет важно.
Вариант 1:
local sampev = require('lib.samp.events')

function sampev.onServerMessage(color, text)
    if text:match("([%w_]+)%[%d+%] говорит: Кидай трейд") then
        local nick = text:match("([%w_]+)%[%d+%] говорит: Кидай трейд")
        sampAddChatMessage('nick: '..nick, -1)
    end
end

Вариант 2:
local sampev = require('lib.samp.events')

function sampev.onServerMessage(color, text)
    if text:find("говорит: Кидай трейд") then
        local nick = text:match("([%w_]+)%[%d+%] говорит: Кидай трейд")
        sampAddChatMessage('nick: '..nick, -1)
    end
end

Попробуй так