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

f0rtrix

Известный
208
15
Не подскажете в чем ошибка? Сразу отправляется сообщение об авторизации или ошибке рандомно, если даже не введено ничего.

Lua:
function password()
    sampShowDialog(1488, "Авторизация", "Введите пароль для авторизации:", "Ок", "Закрыть", 3)
    while true do wait(0)
    result, _, _, input = sampHasDialogRespond(1488)
        if result then
            if input ~= nil and input == 'password' then
            lua_thread.create(function() wait(0) sampAddChatMessage('Авторизация прошла успешно!', 0xFF0000) end) break
            else
            sampAddChatMessage('Ошибка авторизации. Неверно введен пароль.', 0xFF0000)
            thisScript():unload()
        end
    end
end
end
Зачем это делать в
Lua:
    while true do
    wait(0)
    - - code
    end
Пробни без этого
 

TAKYS

Новичок
21
1
Как проверить что игрок в определённой зоне, не в точке, в квадрате?
Это что-то на подобии "если игрок в районе then", но только свои координаты
%)
 

for (;;)

Участник
71
31
Как проверить что игрок в определённой зоне, не в точке, в квадрате?
Это что-то на подобии "если игрок в районе then", но только свои координаты
%)
v.015bool result = isCharInArea2d(Ped ped, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere)00A3
v.015bool result = isCharInArea3d(Ped ped, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool sphere)00A4
v.015bool result = isCarInArea2d(Vehicle car, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere)00B0
v.015bool result = isCarInArea3d(Vehicle car, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool sphere)00B1
v.015bool result = isCharInAreaOnFoot2d(Ped ped, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere)01A1
v.015bool result = isCharInAreaInCar2d(Ped ped, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere)01A2
v.015bool result = isCharStoppedInArea2d(Ped ped, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere)01A3
v.015bool result = isCharStoppedInAreaOnFoot2d(Ped ped, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere)01A4
v.015bool result = isCharStoppedInAreaInCar2d(Ped ped, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere)01A5
v.015bool result = isCharInAreaOnFoot3d(Ped ped, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool sphere)01A6
v.015bool result = isCharInAreaInCar3d(Ped ped, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool sphere)01A7
v.015bool result = isCharStoppedInArea3d(Ped ped, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool sphere)01A8
v.015bool result = isCharStoppedInAreaOnFoot3d(Ped ped, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool sphere)01A9
v.015bool result = isCharStoppedInAreaInCar3d(Ped ped, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool sphere)01AA
v.015bool result = isCarStoppedInArea2d(Vehicle car, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere)01AB
v.015bool result = isCarStoppedInArea3d(Vehicle car, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool sphere)01AC
v.015bool result = isCharShootingInArea(Ped ped, float cornerAX, float cornerAY, float cornerBX, float cornerBY, int weapon)02D6
v.015bool result = isProjectileInArea(float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ)02EE
v.015Vehicle car = getRandomCarOfTypeInArea(float cornerAX, float cornerAY, float cornerBX, float cornerBY, Model modelId)0327
v.015bool result = isAreaOccupied(float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool solid, bool car, bool actor, bool object, bool particle)0339
v.015bool result = isExplosionInArea(int explosionType, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ)0356
v.015bool result = isSniperBulletInArea(float float1, float float2, float float3, float float4, float float5, float float6)037E
v.015clearArea(float atX, float atY, float atZ, float radius, bool area)0395
v.015clearAreaOfCars(float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ)03BA
v.015clearAreaOfChars(float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ)042B
[TBODY] [/TBODY]
[TBODY] [/TBODY]
 

Jason2222

Известный
180
3
Это для меня слишком сложно. Все перепробовал. В логе нет ошибок, но не работает.

Lua:
function main()
while not isSampAvailable() do wait(0) end
    while sampGetCurrentServerName() == 'SA-MP' do wait(0) end
while true do
wait(0)
pickupid()
end
if resultpick == 1111 then
marker = addBlipForPickup(resultpick)
end
end


function pickupid(model)
   local poolPtr = sampGetPickupPoolPtr()
   local ptwo = readMemory(poolPtr, 4, 0)
   if ptwo > 0 then
     ptwo = poolPtr + 0x4
     local pthree = poolPtr + 0xF004
     for id = 1, 4096 do
       local pfive = readMemory(ptwo + id * 4, 4, false)
       if pfive < 0 or pfive > 0 then
         pfive = readMemory(pthree + id * 20, 4, false)
         if pfive == model then
           return id
         end
       end
     end
   end
end
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,633
2,482
Есть путь:
CLEO\\WorkInPause.cs
Как сделать проверку на то, что эта папка существует в любом случае и в любом случае переместить туда файл?
Т.е чтобы работало даже если папка не CLEO, а cleo, cLeo, CLEo и т.п
 

Шурик

Активный
216
42
Может кто кинуть пример бота, который бегает на определённый маркер? Или урок где можно найти информацию.
Всё перерыл, не нашёл :sad_frog:
 

lanini

Известный
35
9
В общем то в чем
Спасибо за наводку, НО!! Возникла такая проблема: на экране все хорошо, но со стороны говорят что бот понемногу телепортируется. Как фиксануть? (тык)
--
Три минуса данного кода:
1) он тпшиться как оказалось
2) бежит на прямую
3) поворот камеры в начале ооооочень резкий

Помогите фиксануть
 
Последнее редактирование:

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,130
Можно ли визуально скрыть диалог при этом не закрывая его?
Если можно, то покажите, пожалуйста, пример.
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,633
2,482
Можно ли визуально скрыть диалог при этом не закрывая его?
Если можно, то покажите, пожалуйста, пример.
Описание: скрыть/открыть диалог.
Lua:
function enableDialog(bool)
    local memory = require 'memory'
    memory.setint32(sampGetDialogInfoPtr()+40, bool and 1 or 0, true)
    sampToggleCursor(bool)
end
Пример:
Lua:
if wasKeyPressed(0x34) then -- 4
    enableDialog(false)
elseif wasKeyPressed(0x35) -- 5
    enableDialog(true)
end