- 19
- 3
Кароче, хотел сделать скрипт для метало искателя, взял я под основу https://www.blast.hk/threads/171089/ , так вот, я со своими знаниями об луа и с помощью chat gpt сделали какуюто хуйню какая не работает на пляже санта мария, только работает на ровной местности, а на санта мария не ворк. Также у скрипта есть одна проблема, его начинает крутить на месте если нету меток. Помогите пожалусто с скриптом, буду очень благодарен вам.
Lua:
script_name("metal by opezdalo")
script_authors("Oksana_Garah")
script_description("Персонаж хаотично перемещается в радиусе 5 метров и реагирует на красную метку")
script_version("0.1")
script_dependencies("CLEO")
---------------------------------------------------------------------------
require "lib.moonloader"
math.randomseed(os.time())
---------------------------------------------------------------------------
-- Глобальная переменная для активации скрипта
enabled = false
function main()
if not isSampfuncsLoaded() or not isSampLoaded() then return end
sampRegisterChatCommand("metalurg", cmd_bot)
local state = "wander" -- два состояния: "wander" (хаотичное движение) и "marker" (движение к метке)
local wanderTarget = nil -- цель для хаотичного движения
while true do
wait(0)
if isPlayerPlaying(playerHandle) and enabled then
local posX, posY, posZ = GetCoordinates()
local markerFound, markerX, markerY, markerZ = SearchMarker(posX, posY, posZ, 50.0, false)
if markerFound then
state = "marker"
else
state = "wander"
end
if state == "marker" then
-- При обнаружении метки сразу движемся к ней
BeginToPoint(markerX, markerY, markerZ, 1.0, -255, false)
-- После достижения метки (или при прерывании) продолжаем хаотичное движение
wanderTarget = nil
elseif state == "wander" then
-- Если цель для хаотичного движения не задана – выбираем случайную точку в радиусе ±5 метров
if wanderTarget == nil then
wanderTarget = { posX + (math.random() * 10 - 5), posY + (math.random() * 10 - 5), posZ }
end
local result = BeginToPoint(wanderTarget[1], wanderTarget[2], wanderTarget[3], 1.0, -255, false)
if result == "marker_interrupt" then
-- Если во время движения появилась метка – переходим в режим движения к метке
state = "marker"
wanderTarget = nil
else
-- Достигнув точки – обнуляем цель для следующего хаотичного перемещения
wanderTarget = nil
end
end
end
end
end
--------------------------- СТАНДАРТНЫЕ ФУНКЦИИ ---------------------------
-- Функция движения к заданной точке; проверяет появление метки для прерывания
function BeginToPoint(x, y, z, radius, move_code, isSprint)
repeat
local posX, posY, posZ = GetCoordinates()
-- Если во время движения появилась метка – возвращаем сигнал прерывания
local markerFound, mX, mY, mZ = SearchMarker(posX, posY, posZ, 50.0, false)
if markerFound then
return "marker_interrupt"
end
SetAngle(x, y, z)
MovePlayer(move_code, isSprint)
local dist = getDistanceBetweenCoords3d(x, y, z, posX, posY, posZ)
wait(0)
until not enabled or dist < radius
return "done"
end
function MovePlayer(move_code, isSprint)
setGameKeyState(1, move_code)
-- Код движения: -255 — движение вперед; 255 — назад; 65535/ -65535 — ходьба
if isSprint then setGameKeyState(16, 255) end
end
function SetAngle(x, y, z)
local posX, posY, posZ = GetCoordinates()
local pX = x - posX
local pY = y - posY
local zAngle = getHeadingFromVector2d(pX, pY)
if isCharInAnyCar(playerPed) then
local car = storeCarCharIsInNoSave(playerPed)
setCarHeading(car, zAngle)
else
setCharHeading(playerPed, zAngle)
end
restoreCameraJumpcut()
end
function GetCoordinates()
if isCharInAnyCar(playerPed) then
local car = storeCarCharIsInNoSave(playerPed)
return getCarCoordinates(car)
else
return getCharCoordinates(playerPed)
end
end
function cmd_bot(param)
enabled = not enabled
if enabled then
sampAddChatMessage(string.format("[%s]: Активирован", thisScript().name), 0x40FF40)
else
sampAddChatMessage(string.format("[%s]: Деактивирован", thisScript().name), 0xFF4040)
end
end
-- Телепорт из ClickWarp (by FYP)
function teleportPlayer(x, y, z)
if isCharInAnyCar(playerPed) then
setCharCoordinates(playerPed, x, y, z)
end
setCharCoordinatesDontResetAnim(playerPed, x, y, z)
end
function setCharCoordinatesDontResetAnim(char, x, y, z)
if doesCharExist(char) then
local ptr = getCharPointer(char)
setEntityCoordinates(ptr, x, y, z)
end
end
function setEntityCoordinates(entityPtr, x, y, z)
if entityPtr ~= 0 then
local matrixPtr = readMemory(entityPtr + 0x14, 4, false)
if matrixPtr ~= 0 then
local posPtr = matrixPtr + 0x30
writeMemory(posPtr + 0, 4, representFloatAsInt(x), false) -- X
writeMemory(posPtr + 4, 4, representFloatAsInt(y), false) -- Y
writeMemory(posPtr + 8, 4, representFloatAsInt(z), false) -- Z
end
end
end
-- Конец кода телепорта
--------------------------- ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ ---------------------------
function SearchMarker(posX, posY, posZ, radius, isRace)
local ret_posX = 0.0
local ret_posY = 0.0
local ret_posZ = 0.0
local isFind = false
for id = 0, 31 do
local MarkerStruct = 0
if isRace then
MarkerStruct = 0xC7F168 + id * 56
else
MarkerStruct = 0xC7DD88 + id * 160
end
local MarkerPosX = representIntAsFloat(readMemory(MarkerStruct + 0, 4, false))
local MarkerPosY = representIntAsFloat(readMemory(MarkerStruct + 4, 4, false))
local MarkerPosZ = representIntAsFloat(readMemory(MarkerStruct + 8, 4, false))
if MarkerPosX ~= 0.0 or MarkerPosY ~= 0.0 or MarkerPosZ ~= 0.0 then
local dist = getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ)
if dist < radius then
ret_posX = MarkerPosX
ret_posY = MarkerPosY
ret_posZ = MarkerPosZ
isFind = true
radius = dist
end
end
end
return isFind, ret_posX, ret_posY, ret_posZ
end