Вопросы по 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,484
1,114
Луа(не самповский который) может взаимодействовать с компом?
Ну в смысле забиндить там клавишу и по нажатию вставлять текст в любое инпут поле, если оно активно (не в сампе)
Примеры на Python, были еще на АХК примеры взаимодействия с компом, но что-то не могу найти
 

Callow

Известный
62
62
Cитуация такая, что ini сохроняеться но не прогружает его..

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

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

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

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



подскажите что не так, хочу чтобы госки сохронялись в inputText
1590312911573.png

У тебя название таблицы с загруженным конфигом ini_file, а ищешь ты в ini.file
 
Последнее редактирование:

Romazvar

Новичок
10
0
1590316351792.png

Вот хочу сделать чтобы при нажатии этих кнопок вписывалась команда.Как это сделать?
 

Vanilla_Ice

Новичок
8
0
Привет, друзья. Хотел написать скрипт для ракбота, который при изменении здоровья нажимал бы пробел. Но возникла проблема - выбивает ошибку "expected near 'defCallAdd'. Не подскажете, где я допустил ошибку?
Lua:
function onSetHealth
    defCallAdd(5000, false, function)
        runCommand('!press 32')
    end
end
 

Fott

Простреленный
3,446
2,311
Посмотреть вложение 57387
Вот хочу сделать чтобы при нажатии этих кнопок вписывалась команда.Как это сделать?
Lua:
local keys = require 'vkeys'
require "lib.moonloader"
active = false
function main()
  if not isSampLoaded() or not isSampfuncsLoaded() then return end
     while not isSampAvailable() do wait(0) end
      sampRegisterChatCommand("qwer", qwer)
     while true do
         wait(0)
         if active then
             if isKeyDown(VK_CONTROL) and isKeyJustPressed(VK_MENU) then
                 -- kod
             end
         end
     end
end

function qwer(arg)
     active = not active
end
 
Последнее редактирование:
  • Нравится
Реакции: Romazvar

xbyte

Активный
111
95
Подскажите насчет работы с диалогами пожалуйста. Смотрите есть бот к которому подходишь и ты можешь продать ресурсы(например лён,хлопок и тп), я хочу получить цену допустим льна. Как это сделать?
 

mails2k18

Участник
45
0
Приветствую, подскажите пожалуйста, как сделать работу lua скрипта для samp на определённых серверах?
Интересует вариант только для нескольких серверов, а не для одного!
 

Romazvar

Новичок
10
0
Как сделать, чтобы например на кнопку F2 в текст писало /q и само выходило?
 

CaJlaT

Овощ
Модератор
2,806
2,614
Приветствую, подскажите пожалуйста, как сделать работу lua скрипта для samp на определённых серверах?
Интересует вариант только для нескольких серверов, а не для одного!
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    --Перед нормальцым вечным циклом
    while sampGetCurrentServerAddress() ~= 'ip1' or sampGetCurrentServerAddress() ~= 'ip2' or sampGetCurrentServerAddress() ~= 'ip3' do wait(0) end
    --нормальный вечный цикл
    while true do
        wait(0)
        
    end
end
 

damag

Женюсь на официантке в моем любимом баре
Проверенный
1,152
1,194
Как сделать, чтобы например на кнопку F2 в текст писало /q и само выходило?
Lua:
local vkeys = require 'vkeys'
--в беск. цикл
  if wasKeyPressed(vkeys.name_to_id('F2', false)) and not sampIsChatInputActive() and not sampIsDialogActive() then sampProcessChatInput('/q')  end
 

no3jour

Участник
55
0
Как по нику получить id игрока?
пробовал вариант:
PHP:
function sampGetPlayerIdByNickname(nick)
  local _, myid = sampGetPlayerIdByCharHandle(playerPed)
  if tostring(nick) == sampGetPlayerNickname(myid) then return myid end
  for i = 0, 1000 do if sampIsPlayerConnected(i) and sampGetPlayerNickname(i) == tostring(nick) then return i end end
end

в jbnick хранится ник
local playerid =  sampGetPlayerIdByNickname(jbnick)
sampAddChatMessage("Ник: "..jbnick.." ID:"..playerid, -1)
Если заходишь на нужный сервер, то данная проверка всё-равно показывает текст, будто ты зашёл на другой сервер...
PHP:
local ips = {
  Name1 = 'ip:port',
  Name2 = 'ip:port',
  Name3 = 'ip:port'
}


local function checkip()
  local ip, port = sampGetCurrentServerAddress()
  for key, value in pairs(ips) do
      if value == ip..':'..port then
          return true
      end
  end
  thisScript():unload();
end
 

Alkamal

Новичок
23
2
Всем привет! Тут назрел такой вопросец. Допустим есть на сервере 3dText и я хочу получить текст из этого 3dText'a, могу ли я это сделать? Заранее спасибо!
 

mails2k18

Участник
45
0
Как по нику получить id игрока?
пробовал вариант:
PHP:
function sampGetPlayerIdByNickname(nick)
  local _, myid = sampGetPlayerIdByCharHandle(playerPed)
  if tostring(nick) == sampGetPlayerNickname(myid) then return myid end
  for i = 0, 1000 do if sampIsPlayerConnected(i) and sampGetPlayerNickname(i) == tostring(nick) then return i end end
end

в jbnick хранится ник
local playerid =  sampGetPlayerIdByNickname(jbnick)
sampAddChatMessage("Ник: "..jbnick.." ID:"..playerid, -1)

PHP:
local ips = {
  Name1 = 'ip:port',
  Name2 = 'ip:port',
  Name3 = 'ip:port'
}


local function checkip()
  local ip, port = sampGetCurrentServerAddress()
  for key, value in pairs(ips) do
      if value == ip..':'..port then
          return true
      end
  end
  thisScript():unload();
end
Не работает твоя проверка, с ней на всех серверах можно чилить...