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

Refraktor

Известный
137
72
В чем смысл этого кода? Все что загрузил - выгрузится сразу, т.к. ты не сохранил. Удали не позорься, ужс
Смысл в том, что вместо 1000 строк, можно всё написать в 3 строки циклом. А сохранять или нет - автор и сам разберётся. Я в imgui не силён.
 

RTD

Нестандартное звание
Модератор
391
414
Смысл в том, что вместо 1000 строк, можно всё написать в 3 строки циклом. А сохранять или нет - автор и сам разберётся. Я в imgui не силён.
Ну если не силён - не отвечай. Твой код - мертвый код который не имеет никакого смысла и создает нагрузку, вплоть до фриза на секунды. Функция загружает картинку и возвращает указатель который в дальнейшем используется для рендеринга. Про "А сохранять или нет - автор и сам разберётся " тут нет выбора, чтобы использовать - обязательно нужно сохранить
 

dmitri4

Известный
452
79
Ну если не силён - не отвечай. Твой код - мертвый код который не имеет никакого смысла и создает нагрузку, вплоть до фриза на секунды. Функция загружает картинку и возвращает указатель который в дальнейшем используется для рендеринга. Про "А сохранять или нет - автор и сам разберётся " тут нет выбора, чтобы использовать - обязательно нужно сохранить
А еще лучше объединить это все в одну картинку и загружать ее и потом тупо частями выводить где какая нужна
 
  • Нравится
Реакции: trefa и RTD

RTD

Нестандартное звание
Модератор
391
414
Буду иметь в виду, уважаемый твинк #Northn. Смешно это. :ROFLMAO:
Да, да, защитная реакция.
Скинь ЧСВ, ты не прав. А создать жалобу на модера, при этом быть не правым в этом вопросе - без комментариев...
А еще лучше объединить это все в одну картинку и загружать ее и потом тупо частями выводить где какая нужна
Так делают профи, да, это правильно, поддерживаю, но он не потянет
 

Refraktor

Известный
137
72
Да, да, защитная реакция.
Скинь ЧСВ, ты не прав. А создать жалобу на модера, при этом быть не правым в этом вопросе - без комментариев...

Так делают профи, да, это правильно, поддерживаю, но он не потянет
Функции CreateTextureFromFile() там нет. То что я не знаю как она работает, особенно учитывая что её нет в описании API ImGUI — не даёт тебе права судить меня, мои знания и всё остальное. И заходить на твинк для этого — вообще унизительно с твоей стороны.
Прекращаем оффтоп. Тема для помощи, а не выяснений.
 

Kuharz

Известный
403
153
Lua:
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local zone = getNameOfZone(x, y, z)
    local temp = getGxtText(zone)
При выводе temp получаю “ћ©-Kopo®a вместо Эль-корона

В одном скрипте увидел комментарий при использовании функций выше "-- получение названия района на инглише(работает только при включенном английском в настройках игры, иначе иероглифы)"
Вопрос такой, как получить нормальное название района на русском, если гта с руссификатором?
Lua:
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local zone = getNameOfZone(x, y, z)
    local temp = getGxtText(zone)
При выводе temp получаю “ћ©-Kopo®a вместо Эль-корона

В одном скрипте увидел комментарий при использовании функций выше "-- получение названия района на инглише(работает только при включенном английском в настройках игры, иначе иероглифы)"
Вопрос такой, как получить нормальное название района на русском, если гта с руссификатором?
p.s. использование кодировки (u8) не помогает.
 
Последнее редактирование:

Refraktor

Известный
137
72
Lua:
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local zone = getNameOfZone(x, y, z)
    local temp = getGxtText(zone)
При выводе temp получаю “ћ©-Kopo®a вместо Эль-корона

В одном скрипте увидел комментарий при использовании функций выше "-- получение названия района на инглише(работает только при включенном английском в настройках игры, иначе иероглифы)"
Вопрос такой, как получить нормальное название района на русском, если гта с руссификатором?
Проверил у себя - аналогично. Как вариант, можно создать таблицу с именами всех зон, и брать их оттуда. Вот пример: https://blast.hk/threads/13892/post-367453
Но придётся перевести их все вручную (или найти русскую таблицу).
 

RTD

Нестандартное звание
Модератор
391
414
Функции CreateTextureFromFile() там нет. То что я не знаю как она работает, особенно учитывая что её нет в описании API ImGUI — не даёт тебе права судить меня, мои знания и всё остальное. И заходить на твинк для этого — вообще унизительно с твоей стороны.
Прекращаем оффтоп. Тема для помощи, а не выяснений.
Если ты не понял по названию что она делает(дословно переводя "создать текстуру из файла") то какие знания? API imgui на С++ и API imgui на луа различаются, держу в курсе. Так что ориентироваться только не него - не правильно
Повторю, не знаешь ответа - не отвечай. Мне кажется если спросить тебя то чего ты не знаешь - ты все равно дашь ответ и будешь убежден в нем. Это эффект даннинга-крюгера
И не убеждай себя, что я - это твинк нортона, это не так, горькая правда, не так ли? :omg:
При выводе temp получаю “ћ©-Kopo®a вместо Эль-корона
Язык игры поставь на английский(в настройках). На русском только таблицу делать
 

Kuharz

Известный
403
153
Проверил у себя - аналогично. Как вариант, можно создать таблицу с именами всех зон, и брать их оттуда. Вот пример: https://blast.hk/threads/13892/post-367453
Но придётся перевести их все вручную (или найти русскую таблицу).
Видел данный пост, думал есть более оптимальный вариант или же хотя бы русская таблица.
Язык игры поставь на английский(в настройках). На русском только таблицу делать
Руссификатор же я себе не просто так ставил)
 

rafion

Новичок
5
0
Ребят помогите пожалуйста, вот есть диалог, как сделать чтобы при нажатии на кнопку ОК он не закрывался а обновлялся? Вот скрин диалога
FG0PS.png
 

trefa

Известный
Всефорумный модератор
2,097
1,231
Почему его не существует? Если onShowDialog() вызван, значит в любом случае диалог уже есть. Даже название функции нам говорит "при отображении диалога". Так что return false тут костыль, я считаю.
На счёт того что не изменил - и что? Мы перехватываем данные, в любом случае надо вернуть всё как было. Ну это логично, по крайней мере, и так делаются перехваты в PAWN. Только там вместо возвращения параметров, мы в return вызываем оригинальную функцию с уже обработанными параметрами (или с оригинальными, если перехват для других целей делался).
Хотя в SAMP много особенностей, может где-то я и не прав. Поправь, если ошибаюсь, полезно будет.

UPD. Я тут подумал. Если физически диалог начинает отображаться только после return, то имеет смысл в словах "его ещё не существует". Тогда да, не костыль. Но хз, глупо это как-то. Само название функции не совсем подходит, как по мне.
Это не глупо, это нормально. Название функции не всегда обозначает за что она отвечает. Я тебе сказал как правильно.

Ребят помогите пожалуйста, вот есть диалог, как сделать чтобы при нажатии на кнопку ОК он не закрывался а обновлялся? Вот скрин диалога
FG0PS.png
Можно диалог хайдером, но он сработает 1 раз. Больше никак не сделать.
 
Последнее редактирование:

gfgfds2423

Участник
73
18
Я зделал так чтобы, при появлении в чате строки Администратор писалось в чат Cheat но он не пишеться
Lua:
local sampev = require "lib.samp.events"
require  "lib.moonloader"
--active = false
local color = 0xFFFFFF
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
   -- sampRegisterChatCommand("dact", function() active = not active end)
    while true do
    wait(-1)
    end
end

function sampev.onServerMessage(_, text)
    if string.find(text, "Администратор", 1 , true ) then
        sampAddChatMessage(Cheat,-1)

        --[[sampSendChat('/mm')
        sampev.onShowDialog()]]--
    end
end
 

tlwsn

Известный
537
85
Я зделал так чтобы, при появлении в чате строки Администратор писалось в чат Cheat но он не пишеться
Lua:
local sampev = require "lib.samp.events"
require  "lib.moonloader"
--active = false
local color = 0xFFFFFF
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
   -- sampRegisterChatCommand("dact", function() active = not active end)
    while true do
    wait(-1)
    end
end

function sampev.onServerMessage(_, text)
    if string.find(text, "Администратор", 1 , true ) then
        sampAddChatMessage(Cheat,-1)

        --[[sampSendChat('/mm')
        sampev.onShowDialog()]]--
    end
end
cheat замени на "cheat"
 
  • Нравится
Реакции: gfgfds2423

gfgfds2423

Участник
73
18
Lua:
local sampev = require "lib.samp.events"
require  "lib.moonloader"
--active = false
local color = 0xFFFFFF
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
   -- sampRegisterChatCommand("dact", function() active = not active end)
    while true do
    wait(-1)
    end
end

function sampev.onServerMessage(_, text)
    if string.find(text, "Администратор", 1 , true ) then
        sampAddChatMessage("Cheat",-1)

        --[[sampSendChat('/mm')
        sampev.onShowDialog()]]--
    end
end
Заменил, все равно не работает.
cheat замени на "cheat"

Lua:
local sampev = require "lib.samp.events"
require  "lib.moonloader"
--active = false
local color = 0xFFFFFF
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
   -- sampRegisterChatCommand("dact", function() active = not active end)
    while true do
    wait(-1)
    end
end

function sampev.onServerMessage(_, text)
    if string.find(text, "Администратор", 1 , true ) then
        sampAddChatMessage("Cheat",-1)

        --[[sampSendChat('/mm')
        sampev.onShowDialog()]]--
    end
end
Заменил, все равно не работает.
 
Последнее редактирование: