-- автор Kontix (clean run, no jump)
local state = false
local state_taked = false
local state_harvest = false
local wheat_dist = 1.5
local step = {200, 400}
function GetNearWheat(wheat)
local table, dist
for _, k in pairs(wheat) do
if (not k.peds or (k.dist < wheat_dist and state_harvest))
and (table == nil or k.dist < dist) then
table, dist = k, k.dist
end
end
return table
end
-- === ДВИЖЕНИЕ: ТОЛЬКО БЕГ, БЕЗ ПРЫЖКОВ ===
function WalkEngine(active)
state_harvest = false
setGameKeyState(1, -255) -- вперёд
if active then
setGameKeyState(14, 255) -- постоянный бег
end
end
function StartWork()
state = not state
sampAddChatMessage(
state and "{DDECFF}Бот на ферму {55FF00}начал работу"
or "{DDECFF}Бот на ферму {FF0000}завершил работу",
-1)
state_taked = false
end
function EngineWork()
local x, y, z = getCharCoordinates(PLAYER_PED)
if not state_taked then
local wheat = {}
for id = 0, 2047 do
if sampIs3dTextDefined(id) then
local str, _, x1, y1, z1 = sampGet3dTextInfoById(id)
if str:find("Куст на ферме") then
table.insert(wheat, {
x = x1,
y = y1,
z = z1,
peds = findAllRandomCharsInSphere(x1, y1, z1, 3, false, true),
dist = getDistanceBetweenCoords3d(x, y, z, x1, y1, z1)
})
end
end
end
if #wheat == 0 then return end
wheat = GetNearWheat(wheat)
if wheat.dist > wheat_dist then
setCameraPositionUnfixed(
-0.3,
math.rad(getHeadingFromVector2d(wheat.x - x, wheat.y - y)) + 4.7
)
WalkEngine(true)
else
if sampGetPlayerAnimationId(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) == 163 then
state_harvest = true
end
end
else
local x1, y1, z1 = -105.60591125488, 100.61192321777, 3.1171875
if getDistanceBetweenCoords3d(x, y, z, x1, y1, z1) > 1.5 then
setCameraPositionUnfixed(
-0.3,
math.rad(getHeadingFromVector2d(x1 - x, y1 - y)) + 4.7
)
WalkEngine(true)
end
end
end
function main()
math.randomseed(os.time())
while not isSampAvailable() or not sampIsLocalPlayerSpawned() do wait(0) end
sampAddChatMessage(
"{E0BA29}[Ferma Bot] {FFFFFF} Бот загружен! Команда: {E0BA29}/ferma",
-1)
sampRegisterChatCommand("ferma", StartWork)
while true do
wait(0)
if state then
EngineWork()
end
end
end
function onReceiveRpc(id, bs)
if not state then return end
if id == 113 then
local playerId = raknetBitStreamReadInt16(bs)
raknetBitStreamReadInt32(bs)
raknetBitStreamReadBool(bs)
local model = raknetBitStreamReadInt32(bs)
if not state_taked
and select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)) == playerId
and model == 2901 then
state_taked = true
end
elseif id == 93 then
raknetBitStreamReadInt32(bs)
local len = raknetBitStreamReadInt32(bs)
local str = raknetBitStreamReadString(bs, len)
if state_taked and str:find("{FF6347} Теперь Ваш навык фермерства") then
state_taked = false
end
end
end
function sendCustomPacket(text)
local bs = raknetNewBitStream()
raknetBitStreamWriteInt8(bs, 220)
raknetBitStreamWriteInt8(bs, 18)
raknetBitStreamWriteInt16(bs, #text)
raknetBitStreamWriteString(bs, text)
raknetBitStreamWriteInt32(bs, 0)
raknetSendBitStream(bs)
raknetDeleteBitStream(bs)
end
function onReceivePacket(id, bs)
if id ~= 220 then return end
raknetBitStreamIgnoreBits(bs, 8)
if raknetBitStreamReadInt8(bs) ~= 17 then return end
raknetBitStreamIgnoreBits(bs, 32)
local length = raknetBitStreamReadInt16(bs)
local encoded = raknetBitStreamReadInt8(bs)
local str = encoded ~= 0
and raknetBitStreamDecodeString(bs, length + encoded)
or raknetBitStreamReadString(bs, length)
if str:find([[window%.executeEvent%('event%.setActiveView', `%["FindGame"%]`%);]]) then
lua_thread.create(function()
sendCustomPacket('findGame.finish')
end)
return false
end
end