M
Description
Open source full auto mostly all feature
GAMEFake an Egg
UPDATEDOct 26, 2026
ACCESSKeyless
PLATFORMDesktop & Mobile
Script source Luau
-- [[ BloxScripts Risk Notice ]]
-- This script has not been verified by BloxScripts.fun. Deal with caution.
--
-- Stay safe:
-- • Never log in on unofficial Roblox sites or lookalike domains.
-- • Real Roblox links use roblox.com (check the .com ending).
-- • Treat fake Roblox login / "claim reward" pages as phishing.
-- [[ End BloxScripts Risk Notice ]]
-- Fake an Egg | Real MCP | WindUI
-- RightShift: show/hide menu. F6: stop/start. Re-run safely to replace this copy.
-- Stealing uses the game's StealBase window, opened when someone hatches your disguise.
local lifecycle, startup = ...
local Players = game:GetService("Players")
local RS = game:GetService("ReplicatedStorage")
local PathfindingService = game:GetService("PathfindingService")
local RunService = game:GetService("RunService")
local CollectionService = game:GetService("CollectionService")
local UserInputService = game:GetService("UserInputService")
local player = Players.LocalPlayer
assert(game.PlaceId == 97289366402005, "This script is for Fake an Egg.")
local env = getgenv()
local previousController = env.FakeAnEggAuto
local priorBaitOwner = previousController and previousController.baitOwnerId
local priorBaitName = previousController and previousController.baitName
if env.FakeAnEggAuto and env.FakeAnEggAuto.cleanup then
pcall(env.FakeAnEggAuto.cleanup)
end
local C = {
enabled = false, mode = "Auto steal", movement = "Walk", fakeEsp = true, targetTracker = true,
steal = true, pickupPriority = true, hatchDisguise = true, returnHome = true, wander = true, hatch = true, equip = true, rewards = true,
dodge = true, dodgeRange = 14,
nests = true, upgrade = false, food = true, buyFood = false,
rebirth = false, sell = false, spend = 35, reserve = 0,
disguise = "Target rebirth egg", variant = "Normal", selection = "Highest income",
}
if type(startup) == "table" then
for key, value in pairs(startup) do if C[key] ~= nil then C[key] = value end end
end
local A: any = {config = C, alive = true, status = "Ready", banked = 0, calls = 0, errors = 0, failedPickups = 0}
if player:GetAttribute("Disguised") or player:GetAttribute("StealBase") then
A.baitOwnerId = priorBaitOwner
A.baitName = priorBaitName
end
env.FakeAnEggAuto = A
local window, console, statusText, targetText, trackerText
local movement, inputConnection
local manualMotionUntil = 0
local dodgeActors = {}
local dodgeScanAt = 0
local dodgeChoice
local eggWander
local eggMotionBound = false
local eggMotionBinding = "FAE_EggMotion"
local clearESP, updateESP, eggVisualConnection
local clearTargetTracker, updateTargetTracker
local pendingDisguise
local pendingDisguiseHatch
local navigationSerial = 0
local last = {}
local attempted = {}
local pendingCarry, carryStarted, bankStarted
local manualHome = false
local lastStatus = ""
local function uiCall(handle, method, ...)
if not handle then return false end
setthreadidentity(8)
local args = table.pack(...)
local ok, result = pcall(function() return handle[method](handle, table.unpack(args, 1, args.n)) end)
if not ok then
A.uiErrors = (A.uiErrors or 0) + 1
A.lastUIError = tostring(result)
end
return ok, result
end
local function log(message)
setthreadidentity(8)
local line = os.date("%H:%M:%S") .. " " .. tostring(message)
if console and window and not window.unloaded then uiCall(console, "Append", line) end
print("[FAE] " .. tostring(message))
end
local function status(message)
setthreadidentity(8)
A.status = message
if message ~= lastStatus then
if not statusText or uiCall(statusText, "Set", message) then lastStatus = message end
end
end
local function due(key, seconds)
local now = os.clock()
if now - (last[key] or -math.huge) < seconds then return false end
last[key] = now
return true
end
local function stopEggWander()
if eggWander then
local humanoid = eggWander.humanoid
local root = eggWander.root
if humanoid and humanoid.Parent and root and root.Parent then
humanoid:MoveTo(root.Position)
humanoid:Move(Vector3.zero, false)
end
eggWander = nil
end
end
local function cancelMove()
navigationSerial += 1
if movement then
local humanoid, root = movement.humanoid, movement.root
if humanoid and humanoid.Parent and root and root.Parent then
humanoid:MoveTo(root.Position)
humanoid:Move(Vector3.zero, false)
end
if movement.path then movement.path:Destroy() end
if movement.blockedConnection then movement.blockedConnection:Disconnect() end
movement = nil
end
A.navigationState = "idle"
end
function A.returnToBase()
stopEggWander()
manualHome = true
cancelMove()
status("Returning to base")
end
function A.cleanup()
setthreadidentity(8)
if not A.alive then return end
A.alive = false
stopEggWander()
if eggMotionBound then
RunService:UnbindFromRenderStep(eggMotionBinding)
eggMotionBound = false
end
C.enabled = false
dodgeActors = {}; dodgeChoice = nil
manualHome = false
cancelMove()
if inputConnection then inputConnection:Disconnect() end
if eggVisualConnection then eggVisualConnection:Disconnect() end
if clearESP then clearESP() end
if clearTargetTracker then clearTargetTracker() end
if window and not window.unloaded then window:Unload() end
end
if type(lifecycle) == "table" and lifecycle.onCleanup then lifecycle.onCleanup(A.cleanup) end
local function rootPart()
local character = player.Character
local humanoid = character and character:FindFirstChildOfClass("Humanoid")
local root = character and character:FindFirstChild("HumanoidRootPart")
if humanoid and humanoid.Health > 0 and root and root:IsA("BasePart") then return root, humanoid end
return nil, nil
end
local function positionOf(object)
if not object then return nil end
if object:IsA("Attachment") then return object.WorldPosition end
if object:IsA("BasePart") then return object.Position end
if object:IsA("Model") then return object:GetPivot().Position end
return nil
end
local function baseOf(owner)
local bases = workspace:FindFirstChild("Bases")
return bases and bases:FindFirstChild(tostring(owner:GetAttribute("Base")))
end
local function ownerForBase(baseId)
if baseId == nil then return nil end
for _, other in ipairs(Players:GetPlayers()) do
local otherBase = other:GetAttribute("Base")
if other ~= player and otherBase ~= nil and tostring(otherBase) == tostring(baseId) then
return other
end
end
return nil
end
local function followedOwner()
local follow = player:FindFirstChild("DisguiseFollow")
local anchor = follow and follow:IsA("ObjectValue") and follow.Value
if not anchor or not anchor.Parent then return nil, nil end
for _, other in ipairs(Players:GetPlayers()) do
if other ~= player then
local character = other.Character
if character and (anchor == character or anchor:IsDescendantOf(character)) then
return other, "carried"
end
local base = baseOf(other)
if base and (anchor == base or anchor:IsDescendantOf(base)) then
return other, "nest"
end
end
end
return nil, "owner pending"
end
local function cash()
local stats = player:FindFirstChild("leaderstats")
local value = stats and stats:FindFirstChild("Cash")
return value and value.Value or 0
end
local function rebirths()
local stats = player:FindFirstChild("leaderstats")
local value = stats and stats:FindFirstChild("Rebirths")
return value and value.Value or 0
end
local function flatDistance(a, b)
return Vector2.new(a.X - b.X, a.Z - b.Z).Magnitude
end
local function manualMotionBlocked(now)
local active = UserInputService:GetFocusedTextBox() ~= nil
if not active then
for _, key in ipairs({Enum.KeyCode.W, Enum.KeyCode.A, Enum.KeyCode.S, Enum.KeyCode.D,
Enum.KeyCode.Up, Enum.KeyCode.Down, Enum.KeyCode.Left, Enum.KeyCode.Right}) do
if UserInputService:IsKeyDown(key) then active = true; break end
end
end
if not active and UserInputService.GamepadEnabled then
for _, input in ipairs(UserInputService:GetGamepadState(Enum.UserInputType.Gamepad1)) do
if input.KeyCode == Enum.KeyCode.Thumbstick1 and input.Position.Magnitude > 0.15 then active = true; break end
end
end
if active then manualMotionUntil = now + 0.35 end
return active or now < manualMotionUntil
end
local function turnDirection(current, desired, dt, rate)
if desired.Magnitude < 0.01 then return Vector3.zero end
desired = desired.Unit
if not current or current.Magnitude < 0.01 then return desired end
local angle = math.atan2(current.Z, current.X)
local target = math.atan2(desired.Z, desired.X)
local delta = (target - angle + math.pi) % (math.pi * 2) - math.pi
angle += math.clamp(delta, -rate * math.min(dt, 0.1), rate * math.min(dt, 0.1))
return Vector3.new(math.cos(angle), 0, math.sin(angle))
end
local motionRaycast = RaycastParams.new()
motionRaycast.FilterType = Enum.RaycastFilterType.Exclude
motionRaycast.RespectCanCollide = true
local function clearHeading(root, humanoid, direction, distance, enemy, checkGround)
if direction.Magnitude < 0.01 then return false end
local ignore = {player.Character}
if enemy and enemy.Parent then table.insert(ignore, enemy.Parent) end
motionRaycast.FilterDescendantsInstances = ignore
local vector = direction.Unit * distance
if workspace:Raycast(root.Position, vector, motionRaycast)
or workspace:Raycast(root.Position - Vector3.new(0, 1.2, 0), vector, motionRaycast) then return false end
if checkGround then
local nextPosition = root.Position + vector
local floor = workspace:Raycast(nextPosition + Vector3.new(0, 2, 0), Vector3.new(0, -12, 0), motionRaycast)
if not floor or root.Position.Y - floor.Position.Y > humanoid.HipHeight + root.Size.Y / 2 + 2.5 then return false end
end
return true
end
local function animationKey(id)
return tostring(id):match("%d+") or tostring(id)
end
local function refreshDodgeActors(root, now)
if now < dodgeScanAt then return end
dodgeScanAt = now + 0.1
dodgeActors = {}
for _, other in ipairs(Players:GetPlayers()) do
if other ~= player and not other:GetAttribute("Disguised") then
local character = other.Character
local enemyRoot = character and character:FindFirstChild("HumanoidRootPart")
local humanoid = character and character:FindFirstChildOfClass("Humanoid")
local tool = character and character:FindFirstChildOfClass("Tool")
if enemyRoot and humanoid and humanoid.Health > 0 and not enemyRoot.Anchored and tool
and flatDistance(root.Position, enemyRoot.Position) <= C.dodgeRange + 4
and math.abs(root.Position.Y - enemyRoot.Position.Y) < 7
and (tool.Name == "Bat" or (tool:GetAttribute("Bat") and A.Bats.ByName[tool:GetAttribute("Bat")])) then
local swingIds = {}
local animations = tool:FindFirstChild("Anims")
if animations then
for _, name in ipairs({"Swing1", "Swing2"}) do
local animation = animations:FindFirstChild(name)
if animation and animation:IsA("Animation") then swingIds[animationKey(animation.AnimationId)] = true end
end
end
local swinging = false
local animator = humanoid:FindFirstChildOfClass("Animator")
if animator then
for _, track in ipairs(animator:GetPlayingAnimationTracks()) do
if track.IsPlaying and track.Animation and swingIds[animationKey(track.Animation.AnimationId)] then swinging = true; break end
end
end
table.insert(dodgeActors, {owner = other, root = enemyRoot, swinging = swinging})
end
end
end
end
local function evasiveDirection(root, humanoid, desired, now)
if not C.dodge or not C.enabled or player:GetAttribute("Disguised")
or not (player:GetAttribute("StealBase") or player:GetAttribute("Carrying") or player:GetAttribute("Stealing")) or bankStarted then
dodgeChoice = nil; A.dodgeState = "idle"; A.dodgeEnemy = nil
return desired, false
end
refreshDodgeActors(root, now)
local threat, highest
for _, actor in ipairs(dodgeActors) do
local enemy = actor.root
if enemy.Parent then
local offset = Vector3.new(root.Position.X - enemy.Position.X, 0, root.Position.Z - enemy.Position.Z)
local distance = offset.Magnitude
local toward = distance > 0.01 and offset.Unit or Vector3.new(1, 0, 0)
local facing = Vector3.new(enemy.CFrame.LookVector.X, 0, enemy.CFrame.LookVector.Z):Dot(toward)
local closing = (enemy.AssemblyLinearVelocity - root.AssemblyLinearVelocity):Dot(toward)
if distance < C.dodgeRange and (actor.swinging or distance < 6
or (facing > 0.2 and closing > 0.5) or facing > 0.45 or (closing > 4 and distance < 8)) then
local score = C.dodgeRange - distance + (actor.swinging and 14 or 0) + math.max(0, closing) * 0.15
if not highest or score > highest then threat, highest = actor, score end
end
end
end
if not threat then
dodgeChoice = nil; A.dodgeState = "watching for bats"; A.dodgeEnemy = nil
return desired, false
end
local enemy = threat.root
local reach = math.clamp(humanoid.WalkSpeed * 0.18, 2.5, 5)
if dodgeChoice and dodgeChoice.owner == threat.owner and now < dodgeChoice.expires
and clearHeading(root, humanoid, dodgeChoice.direction, reach, enemy, true) then
A.dodgeState = threat.swinging and "evading swing" or "avoiding nearby bat"
return dodgeChoice.direction, true
end
local predicted = enemy.Position + Vector3.new(enemy.AssemblyLinearVelocity.X, 0, enemy.AssemblyLinearVelocity.Z) * 0.15
local away = Vector3.new(root.Position.X - predicted.X, 0, root.Position.Z - predicted.Z)
if away.Magnitude < 0.01 then away = Vector3.new(-enemy.CFrame.LookVector.X, 0, -enemy.CFrame.LookVector.Z) end
if away.Magnitude < 0.01 then away = Vector3.new(1, 0, 0) end
away = away.Unit
local side = Vector3.new(-away.Z, 0, away.X)
local preferred = dodgeChoice and dodgeChoice.owner == threat.owner and dodgeChoice.side or (desired:Dot(side) >= 0 and 1 or -1)
if preferred == 0 then preferred = desired:Dot(side) >= 0 and 1 or -1 end
local forwardWeight = threat.swinging and 0.35 or 0.75
for _, sign in ipairs({preferred, -preferred, 0}) do
local direction = desired * forwardWeight + away * 1.15 + side * sign * 1.4
if direction.Magnitude > 0.01 then
direction = direction.Unit
if clearHeading(root, humanoid, direction, reach, enemy, true) then
if A.dodgeEnemy ~= threat.owner.Name then A.dodgeCount = (A.dodgeCount or 0) + 1 end
A.dodgeEnemy = threat.owner.Name
A.dodgeState = threat.swinging and "evading swing" or "avoiding nearby bat"
dodgeChoice = {owner = threat.owner, side = sign, direction = direction, expires = now + 0.25}
return direction, true
end
end
end
A.dodgeState = "no clear sidestep"; A.dodgeEnemy = threat.owner.Name
return desired, false
end
local function updateNavigationMotion(dt)
local root, humanoid = rootPart()
if not root or not humanoid or not A.alive or A.disconnectMessage
or (not C.enabled and not manualHome) or player:GetAttribute("Disguised") then return false end
if root.Anchored or humanoid.WalkSpeed <= 0 or player:GetAttribute("Ragdoll") then
if movement then humanoid:Move(Vector3.zero, false) end
A.navigationState = "waiting to walk"
return true
end
local now = os.clock()
if manualMotionBlocked(now) then
if movement then movement.lastProgressAt = now; movement.needsRepath = true; movement.repathReason = movement.repathReason or "manual" end
dodgeChoice = nil
A.navigationState = "manual control"; A.dodgeState = "manual control"
return true
end
local route = movement
local desired = Vector3.zero
if route and route.root == root then
if flatDistance(root.Position, route.lastPosition) >= 0.6 then
route.lastPosition = root.Position; route.lastProgressAt = now
end
if not route.needsRepath and flatDistance(root.Position, route.goal) > route.tolerance then
local arrival = math.clamp(humanoid.WalkSpeed * math.min(dt, 0.1) + 1.2, 1.5, 3.8)
while route.index < #route.points and flatDistance(root.Position, route.points[route.index].Position) <= arrival
and (route.points[route.index].Action ~= Enum.PathWaypointAction.Jump or route.jumpedIndex == route.index) do route.index += 1 end
local point = route.points[route.index]
local target = route.index == #route.points and route.goal or point.Position
local offset = Vector3.new(target.X - root.Position.X, 0, target.Z - root.Position.Z)
if offset.Magnitude > 0.01 then desired = offset.Unit end
if point.Action == Enum.PathWaypointAction.Jump and route.jumpedIndex ~= route.index
and flatDistance(root.Position, point.Position) < 3.5 and humanoid.FloorMaterial ~= Enum.Material.Air then
humanoid.Jump = true; route.jumpedIndex = route.index
end
A.navigationState = "following route"
else
A.navigationState = route.needsRepath and "replanning blocked route" or "arrived"
end
end
local dodging
desired, dodging = evasiveDirection(root, humanoid, desired, now)
if not route and not dodging then return false end
local current = route and route.direction or humanoid.MoveDirection
local direction = turnDirection(current, desired, dt, dodging and 14 or 10)
if dodging and direction.Magnitude > 0.01
and not clearHeading(root, humanoid, direction, math.clamp(humanoid.WalkSpeed * 0.18, 2.5, 5), nil, true) then
direction = desired
end
if direction.Magnitude > 0.01 and not dodging and route and now >= (route.clearanceAt or 0) then
route.clearanceAt = now + 0.1
if not clearHeading(root, humanoid, direction, 2.5, nil, false)
and clearHeading(root, humanoid, desired, 2.5, nil, false) then direction = desired end
end
if route then route.direction = direction end
humanoid:Move(direction, false)
if dodging then A.navigationState = "evading " .. (A.dodgeEnemy or "attacker") end
return true
end
local function navigationFailure(message)
cancelMove()
manualHome = false
if A.setEnabled then A.setEnabled(false) end
status(message)
log(message)
end
local function moveTo(destination, label, tolerance)
stopEggWander()
local root, humanoid = rootPart()
if not root or not humanoid or not destination then return false end
if root.Anchored or humanoid.WalkSpeed <= 0 then
cancelMove()
status("Waiting until the character can walk")
return false
end
local now = os.clock()
if manualMotionBlocked(now) then
if movement then movement.lastProgressAt = now; movement.needsRepath = true; movement.repathReason = movement.repathReason or "manual" end
status("Manual control — automatic walking will resume after release")
return false
end
tolerance = math.min(tolerance or 4, 6)
if flatDistance(root.Position, destination) <= tolerance then
cancelMove()
return true
end
status(label)
local retries = 0
if movement and movement.root == root and flatDistance(movement.pathGoal, destination) < 6 then
movement.goal = destination
movement.tolerance = tolerance
if flatDistance(root.Position, movement.lastPosition) >= 0.75 then
movement.lastPosition = root.Position
movement.lastProgressAt = now
end
if movement.needsRepath or now - movement.lastProgressAt > 4 then
retries = movement.retries + (movement.repathReason == "manual" and 0 or 1)
if retries > 2 then
navigationFailure("Walking route blocked — automation paused")
return false
end
cancelMove()
end
else
cancelMove()
end
if not movement then
local path = PathfindingService:CreatePath({
AgentRadius = 2, AgentHeight = 5, AgentCanJump = true, WaypointSpacing = 5,
})
local serial = navigationSerial
local goal = Vector3.new(destination.X, root.Position.Y, destination.Z)
local computed = pcall(function() path:ComputeAsync(root.Position, goal) end)
if serial ~= navigationSerial or not A.alive or (not C.enabled and not manualHome) then
path:Destroy()
return false
end
if not computed or path.Status ~= Enum.PathStatus.Success then
path:Destroy()
navigationFailure("No walking route found — automation paused")
return false
end
local points = path:GetWaypoints()
if #points < 2 then
path:Destroy()
navigationFailure("Walking destination is unreachable — automation paused")
return false
end
local route: any = {root = root, humanoid = humanoid, goal = destination, pathGoal = destination, path = path,
points = points, index = 2, jumpedIndex = 0, lastPosition = root.Position,
lastProgressAt = now, retries = retries, tolerance = tolerance, direction = humanoid.MoveDirection}
movement = route
route.blockedConnection = path.Blocked:Connect(function(index)
if movement == route and index >= route.index then route.needsRepath = true; route.repathReason = "blocked" end
end)
A.pathComputes = (A.pathComputes or 0) + 1
end
A.navigationState = "following route"
return false
end
local function homePosition()
local base = baseOf(player)
local collect = base and (base:FindFirstChild("Collect") or base:FindFirstChild("Spawn"))
local pos = positionOf(collect)
return pos and pos + Vector3.new(0, 2.5, 0), collect
end
local function requireModule(name)
local module = RS:WaitForChild(name, 15)
assert(module, "Missing game module: " .. name)
return require(module)
end
local ok, loadError = pcall(function()
A.Eggs = requireModule("Eggs")
A.Animals = requireModule("Animals")
A.Rebirth = requireModule("Rebirth")
A.Pen = requireModule("Pen")
A.Food = requireModule("Food")
A.Index = requireModule("IndexRewards")
A.Trick = requireModule("Trick")
A.Bats = requireModule("Bats")
end)
if not ok then A.cleanup() ; error(loadError) end
local remotes = RS:WaitForChild("RemoteEvents", 15)
local eggRemotes = RS:WaitForChild("EggRemotes", 15)
assert(remotes and eggRemotes, "Game remotes have not loaded.")
local eggEvent = eggRemotes:WaitForChild("EggEvent", 10)
local function fire(name, ...)
local remote = remotes:FindFirstChild(name)
if remote and remote:IsA("RemoteEvent") then
remote:FireServer(...)
A.calls += 1
return true
end
return false
end
local function eggFire(...)
eggEvent:FireServer(...)
A.calls += 1
end
-- Richest eligible player supplies the bait; an actual pickup can take priority.
local lastScan = -100
local function hasRequiredRebirthItem(owner, animal, eggName)
if not animal then return false end
if A.Rebirth.hasHatched(owner) then return true, "rebirth requirement already hatched" end
local inventory = owner:FindFirstChild("Inventory")
if inventory then
for key, count in pairs(inventory:GetAttributes()) do
if type(count) == "number" and count > 0 then
local name = A.Animals.parseSlot(A.Animals.decodeAttr(key))
if name == animal then return true, "already owns required pet" end
end
end
end
local slots = owner:FindFirstChild("Slots")
if slots then
for _, slot in ipairs(slots:GetChildren()) do
if not slot:GetAttribute("StolenBy") then
local name = A.Animals.parseSlot(tostring(slot:GetAttribute("Slot") or ""))
if name == animal then return true, "already owns required pet" end
end
end
end
local nests = owner:FindFirstChild("Nests")
if nests then
for _, nest in ipairs(nests:GetChildren()) do
local egg = nest:GetAttribute("Egg")
if egg and nest:GetAttribute("FakeOwner") == nil then
local definition = A.Eggs.ByName[egg]
if egg == eggName or egg == animal or (definition and definition.pet == animal) then
return true, "required egg already in nest"
end
end
end
end
return false
end
A.hasRequiredRebirthItem = hasRequiredRebirthItem
local function refreshPickupTarget()
local allowedBase = player:GetAttribute("StealBase")
local owner, stage
if allowedBase ~= nil then
owner, stage = ownerForBase(allowedBase), "steal window"
elseif player:GetAttribute("Disguised") then
owner, stage = followedOwner()
elseif player:GetAttribute("Carrying") then
return
end
local ownerId = owner and owner.UserId
local changed = ownerId ~= A.pickupOwnerId or stage ~= A.pickupStage
or allowedBase ~= A.pickupBase
A.pickupOwnerId, A.pickupStage, A.pickupBase = ownerId, stage, allowedBase
if changed then
lastScan = -100
if C.pickupPriority and C.enabled and not player:GetAttribute("Carrying") then cancelMove() end
if owner then
log(string.format("Pickup tracked: %s | %s%s", owner.DisplayName, stage,
C.pickupPriority and " | best-pet priority" or ""))
elseif stage == "owner pending" then
log("Disguise picked up; waiting for a replicated owner or steal window.")
end
end
end
local function scanTargets(force)
refreshPickupTarget()
if not force and os.clock() - lastScan < 5 then return A.target end
lastScan = os.clock()
local ranked = {}
for _, other in ipairs(Players:GetPlayers()) do
if other ~= player and baseOf(other) then
local stats = other:FindFirstChild("leaderstats")
local money = stats and stats:FindFirstChild("Cash")
local rebirthValue = stats and stats:FindFirstChild("Rebirths")
local nextGoal = A.Rebirth.getNext(rebirthValue and rebirthValue.Value or 0)
local requiredEgg = nextGoal and A.Rebirth.eggFor(nextGoal.animal)
local item = {owner = other, cash = money and money.Value or 0,
income = other:GetAttribute("CashPerSecond") or 0,
egg = requiredEgg and requiredEgg.name, animal = nextGoal and nextGoal.animal, bestIncome = -1}
item.hasRebirthItem, item.rebirthItemReason = hasRequiredRebirthItem(other, item.animal, item.egg)
local slots = other:FindFirstChild("Slots")
if slots then
for _, slot in ipairs(slots:GetChildren()) do
if not slot:GetAttribute("Locked") and not slot:GetAttribute("StolenBy") then
local name, size, variant, traits = A.Animals.parseSlot(tostring(slot:GetAttribute("Slot") or ""))
if name and type(A.Animals[name]) == "table" then
local earning = A.Animals.getCashPerSecond(name, slot:GetAttribute("Size") or size, variant, traits)
if earning > item.bestIncome then
item.bestIncome = earning
item.bestAnimal = name
end
end
end
end
end
table.insert(ranked, item)
end
end
table.sort(ranked, function(a, b)
if a.cash == b.cash then
if a.income == b.income then return a.owner.UserId < b.owner.UserId end
return a.income > b.income
end
return a.cash > b.cash
end)
local previous = A.target
A.targets = ranked
A.target = nil
for _, candidate in ipairs(ranked) do
candidate.canBait = candidate.egg ~= nil and A.Eggs.canDisguise(rebirths(), candidate.egg, C.variant)
candidate.eligible = candidate.canBait and not candidate.hasRebirthItem and candidate.bestIncome >= 0
candidate.skipReason = candidate.rebirthItemReason or (not candidate.egg and "final rebirth")
or (not candidate.canBait and "bait locked") or (candidate.bestIncome < 0 and "no unlocked pets") or nil
if candidate.eligible and not A.target then A.target = candidate end
end
local _, pickupStage = followedOwner()
local committed = pendingDisguise ~= nil or pendingDisguiseHatch ~= nil or pickupStage ~= nil
or player:GetAttribute("StealBase") or player:GetAttribute("Carrying")
local roaming = player:GetAttribute("Disguised") and not committed
local cycleActive = committed or roaming
if cycleActive and A.baitOwnerId then
for _, candidate in ipairs(ranked) do
if candidate.owner.UserId == A.baitOwnerId and (committed
or (candidate.eligible and (not A.baitName or candidate.egg == A.baitName))) then
A.target = candidate
break
end
end
elseif not cycleActive then
A.baitOwnerId = nil
A.baitName = nil
end
if roaming and A.baitName and (not A.target or A.target.egg ~= A.baitName) then
for _, candidate in ipairs(ranked) do
if candidate.eligible and candidate.egg == A.baitName then A.target = candidate; break end
end
end
if C.pickupPriority and A.pickupOwnerId and (player:GetAttribute("Disguised") or player:GetAttribute("StealBase")) then
for _, candidate in ipairs(ranked) do
if candidate.owner.UserId == A.pickupOwnerId then
A.target = candidate
break
end
end
end
if A.target and (not previous or previous.owner ~= A.target.owner or previous.egg ~= A.target.egg) then
local reason = C.pickupPriority and A.pickupOwnerId == A.target.owner.UserId and "Pickup target" or "Richest eligible target"
log(string.format("%s: %s | $%.0f | Rebirth bait: %s | Best pet: %s (%.0f/s)", reason,
A.target.owner.DisplayName, A.target.cash, A.target.egg or "max rebirth", A.target.bestAnimal or "none", math.max(0, A.target.bestIncome)))
end
if targetText then
local lines = {}
for index, item in ipairs(ranked) do
table.insert(lines, string.format("%d. %s | $%.0f | %.0f/s | Needs: %s | Best: %s (%.0f/s)",
index, item.owner.DisplayName .. (item == A.target and " [TARGET]" or (item.skipReason and " [" .. item.skipReason .. "]" or "")), item.cash, item.income, item.egg or "max rebirth",
item.bestAnimal or "none", math.max(0, item.bestIncome)))
end
uiCall(targetText, "Set", #lines > 0 and table.concat(lines, "\n") or "Waiting for other occupied bases")
end
return A.target
end
A.scanTargets = scanTargets
local WindUI = loadstring(game:HttpGet("https://github.com/Footagesus/WindUI/releases/latest/download/main.lua"))()
if not A.alive then return end
WindUI:SetParent(player:WaitForChild("PlayerGui"))
local windWindow = WindUI:CreateWindow({
Title = "Fake an Egg", Author = "Smart targets · Smooth movement", Icon = "egg", Folder = "FakeAnEggHub",
Size = UDim2.fromOffset(720, 520), MinSize = Vector2.new(600, 440), MaxSize = Vector2.new(1000, 760),
Theme = "Dark", Transparent = false, Resizable = true, SideBarWidth = 185,
Radius = 18, ElementsRadius = 14, HideSearchBar = false, ScrollBarEnabled = true,
})
windWindow:SetToggleKey(Enum.KeyCode.RightShift)
for _, key in ipairs({"ScreenGui", "NotificationGui", "DropdownGui", "TooltipGui"}) do
local gui = WindUI[key]
if typeof(gui) == "Instance" and gui:IsA("ScreenGui") then gui.ResetOnSpawn = false end
end
A.uiLibrary = "WindUI"
A.windWindow = windWindow
local function wrapWindTab(raw)
local tab: any = {raw = raw}
function tab:CreateToggle(options)
local handle: any = {value = options.value, suppress = nil}
local control
control = raw:Toggle({Title = options.name, Desc = options.description, Value = options.value,
Callback = function(value)
setthreadidentity(8)
handle.value = value
if handle.suppress == value then handle.suppress = nil; return end
handle.suppress = nil
if options.callback then options.callback(value) end
end})
function handle:Set(value, silent)
self.value = value
if silent then self.suppress = value end
control:Set(value)
end
return handle
end
function tab:CreateButton(options)
return raw:Button({Title = options.name, Desc = options.description,
Callback = function() setthreadidentity(8); options.callback() end})
end
function tab:CreateDropdown(options)
return raw:Dropdown({Title = options.name, Desc = options.description, Values = options.options, Value = options.value,
Callback = function(value)
setthreadidentity(8)
if type(value) == "table" then value = value[1] end
if value ~= nil then options.callback(value) end
end})
end
function tab:CreateSlider(options)
return raw:Slider({Title = options.name, Desc = options.description, Step = options.increment or 1,
Value = {Min = options.range[1], Max = options.range[2], Default = options.value},
Callback = function(value) setthreadidentity(8); options.callback(value) end})
end
function tab:CreateInput(options)
return raw:Input({Title = options.name, Value = options.value, Placeholder = options.name,
Callback = function(value) setthreadidentity(8); options.callback(value) end})
end
function tab:CreateConsole(options)
local paragraph = raw:Paragraph({Title = options.name, Desc = options.text or "Waiting for game data…"})
local handle: any = {lines = {}, maxLines = math.min(options.maxLines or 12, 16)}
function handle:Set(text)
self.lines = string.split(tostring(text), "\n")
paragraph:SetDesc(tostring(text))
end
function handle:Append(line)
for _, value in ipairs(string.split(tostring(line), "\n")) do table.insert(self.lines, value) end
while #self.lines > self.maxLines do table.remove(self.lines, 1) end
paragraph:SetDesc(table.concat(self.lines, "\n"))
end
return handle
end
return tab
end
window = {unloaded = false}
function window:Unload()
if self.unloaded then return end
self.unloaded = true
pcall(function() windWindow:Destroy() end)
end
function window:ToggleHide() windWindow:Toggle() end
function window:CreateTab(options)
local icons = {Overview = "layout-dashboard", Automation = "play", Farming = "sprout", Progression = "trending-up",
Visuals = "scan-eye", Targets = "users", Activity = "scroll-text"}
return wrapWindTab(windWindow:Tab({Title = options.name, Icon = icons[options.name] or "circle"}))
end
windWindow:OnDestroy(function()
window.unloaded = true
if A.alive then A.cleanup() end
end)
A.window = window
local info = window:CreateTab({name = "Overview"})
local main = window:CreateTab({name = "Automation"})
local settings = window:CreateTab({name = "Farming"})
local progress = window:CreateTab({name = "Progression"})
local visuals = window:CreateTab({name = "Visuals"})
local targetsTab = window:CreateTab({name = "Targets"})
local activityTab = window:CreateTab({name = "Activity"})
local master
local function setEnabled(value)
setthreadidentity(8)
C.enabled = value
if not value then pendingDisguise = nil; manualHome = false end
if not value then dodgeChoice = nil; A.dodgeState = "paused"; A.dodgeEnemy = nil end
if value then
A.failedPickups = 0
A.consecutiveErrors = 0
bankStarted = nil
end
if not value then stopEggWander(); cancelMove(); status("Paused") end
if master and master.value ~= value then uiCall(master, "Set", value, true) end
end
A.setEnabled = setEnabled
master = info:CreateToggle({name = "Auto everything", value = C.enabled, forgetState = true,
description = "Uses the game's current movement speed in each state. F6 pauses immediately.", callback = setEnabled})
main:CreateDropdown({name = "Mode", options = {"Auto steal", "Egg farm", "Maintenance only"}, value = C.mode,
forgetState = true, callback = function(value) C.mode = value ; cancelMove() end})
main:CreateButton({name = "Start / pause automation", description = "The master switch is also at the top of Overview. F6 works anywhere.",
callback = function() setEnabled(not C.enabled) end})
main:CreateToggle({name = "Auto steal best pet", value = C.steal, forgetState = true,
description = "Uses the granted steal window and selects the highest-income unlocked animal.",
callback = function(value) C.steal = value end})
main:CreateToggle({name = "Steal from whoever picks me up", value = C.pickupPriority, forgetState = true,
description = "Prioritizes the actual picker over the planned rich target. Waits for the game's steal window after hatching.",
callback = function(value) C.pickupPriority = value; lastScan = -100; cancelMove() end})
main:CreateToggle({name = "Auto hatch my disguise in a nest", value = C.hatchDisguise, forgetState = true,
description = "Uses Hatch once only inside another player's nest, then waits for the granted steal window.",
callback = function(value) C.hatchDisguise = value end})
main:CreateToggle({name = "Dodge nearby bat attacks", value = C.dodge, forgetState = true,
description = "Sidesteps nearby bat users and visible swings during steals/returns. Uses normal movement and checks walls/ledges.",
callback = function(value) C.dodge = value; dodgeChoice = nil end})
main:CreateSlider({name = "Dodge detection distance", range = {6, 18}, value = C.dodgeRange, increment = 1, forgetState = true,
description = "How close a bat user must be for evasive steering. Manual movement takes priority.",
callback = function(value) C.dodgeRange = value end})
main:CreateToggle({name = "Auto return to base", value = C.returnHome, forgetState = true,
description = "Returns carried pets and eggs to your Collect pad.", callback = function(value) C.returnHome = value end})
main:CreateButton({name = "Return to my base now", callback = A.returnToBase})
main:CreateButton({name = "Leave disguise", callback = function()
setEnabled(false)
if player:GetAttribute("Disguised") then eggFire("Undisguise") end
end})
main:CreateButton({name = "STOP ALL", callback = function()
manualHome = false; C.fakeEsp = false; C.targetTracker = false; setEnabled(false)
if clearESP then clearESP() end
if clearTargetTracker then clearTargetTracker() end
end})
main:CreateButton({name = "Unload script", callback = A.cleanup})
local disguiseOptions = {"Target rebirth egg", "Automatic cheap"}
for _, entry in ipairs(A.Eggs) do table.insert(disguiseOptions, entry.name) end
settings:CreateDropdown({name = "Disguise egg", options = disguiseOptions, value = C.disguise, forgetState = true,
description = "Target rebirth egg matches the richest player's next rebirth requirement.", callback = function(value) C.disguise = value end})
settings:CreateDropdown({name = "Disguise variant", options = {"Normal", "Gold", "Diamond", "Rainbow"}, value = C.variant,
forgetState = true, callback = function(value) C.variant = value end})
local function toggle(tab, name, key, description)
tab:CreateToggle({name = name, description = description, value = C[key], forgetState = true,
callback = function(value) C[key] = value end})
end
toggle(visuals, "Fake egg ESP", "fakeEsp", "Marks confirmed player disguises and scanner-revealed fakes. Works while automation is paused.")
toggle(visuals, "Live target tracker", "targetTracker", "Shows the current target, best unlocked pet, hatch countdown, and a gold pet marker. Works while paused.")
toggle(settings, "Move like a normal egg", "wander", "Continuous movement at the game\'s 0.55-second egg-hop cadence. Stops when held in a nest.")
toggle(settings, "Auto hatch ready eggs", "hatch", "Waits for each nest timer. Hatches at the nest.")
toggle(settings, "Auto equip best pets", "equip", "Equips your highest-income pets.")
toggle(settings, "Auto claim rewards", "rewards", "Index, completed trick tasks, and finished machines.")
toggle(settings, "Auto unlock free nests", "nests", "Unlocks the next nest while its current price is zero.")
toggle(settings, "Auto fill feeder", "food", "Uses food you already own when the feeder has room.")
toggle(settings, "Auto buy feeder food", "buyFood", "Uses game cash. Keeps your cash reserve.")
settings:CreateSlider({name = "Maximum cash per egg (%)", range = {1, 100}, value = C.spend, increment = 1,
forgetState = true, callback = function(value) C.spend = value end})
settings:CreateInput({name = "Cash reserve", value = tostring(C.reserve), numeric = true, forgetState = true,
callback = function(value) C.reserve = math.max(tonumber(value) or 0, 0) end})
toggle(progress, "Auto upgrade pen", "upgrade", "Spends cash to add pet slots. Keeps your cash reserve.")
toggle(progress, "Auto rebirth", "rebirth", "Resets cash when the game's cash and hatch requirements are complete.")
toggle(progress, "Auto sell spare inventory pets", "sell", "Sells inventory pets with Sell All Pets. Equipped pets use the game's own rules.")
progress:CreateButton({name = "Equip best now", callback = function() fire("EquipBestEvent") end})
trackerText = info:CreateConsole({name = "Live target tracker", height = 170, maxLines = 8})
targetText = targetsTab:CreateConsole({name = "Server bases — sorted by cash", height = 200, maxLines = 20})
statusText = info:CreateConsole({name = "Current action", text = "Ready — enable Auto everything", height = 70, maxLines = 3})
console = activityTab:CreateConsole({name = "Recent activity", height = 210, follow = true, maxLines = 14})
info:CreateButton({name = "Show current stats", callback = function()
log(string.format("Cash: %.0f | Income: %.0f/s | Rebirths: %d | Banked: %d | Calls: %d | Errors: %d",
cash(), player:GetAttribute("CashPerSecond") or 0, rebirths(), A.banked, A.calls, A.errors))
end})
inputConnection = UserInputService.InputBegan:Connect(function(input, processed)
if processed or UserInputService:GetFocusedTextBox() then return end
if input.KeyCode == Enum.KeyCode.F6 then setEnabled(not C.enabled) end
end)
local function carrying()
return player:GetAttribute("Carrying")
end
local function bankCarry()
if not C.returnHome then status("Carrying — auto return is off") ; return true end
local destination = homePosition()
if not destination then status("Waiting for your base") ; return true end
if moveTo(destination, "Returning to base", 3) then
bankStarted = bankStarted or os.clock()
status("Banking carried item")
if os.clock() - bankStarted > 20 then
setEnabled(false)
status("Delivery was not confirmed — automation paused")
log("Paused: delivery did not clear the carried item within 20 seconds.")
end
end
return true
end
local function nestPosition(nest)
local base = baseOf(player)
local nests = base and base:FindFirstChild("Nests")
local model = nests and nests:FindFirstChild(nest.Name)
local pos = positionOf(model)
return pos and pos + Vector3.new(0, 3, 0)
end
local function hatchReady()
if not C.hatch then return false end
local nests = player:FindFirstChild("Nests")
if not nests then return false end
for _, nest in ipairs(nests:GetChildren()) do
if nest:GetAttribute("Owned") and nest:GetAttribute("Egg")
and (nest:GetAttribute("HatchAt") or math.huge) <= workspace:GetServerTimeNow()
and os.clock() - (attempted["hatch" .. nest.Name] or -100) > 3 then
if moveTo(nestPosition(nest), "Going to ready egg in nest " .. nest.Name, 7) then
fire("OpenBlockEvent", nest.Name)
attempted["hatch" .. nest.Name] = os.clock()
log("Hatch requested: nest " .. nest.Name)
end
return true
end
end
return false
end
local function maintenance()
if C.equip and due("equip", 20) then fire("EquipBestEvent") end
if C.rewards and due("rewards", 15) then
for _, variant in ipairs(A.Index.Variants) do
local reward = A.Index.state(player, variant)
if reward and reward.ready then fire("IndexRewardEvent", variant) ; log("Index reward requested: " .. variant) end
end
for biome in pairs(A.Index.PetRewards.Biome) do
local count, total = A.Index.biomeProgress(player, biome)
if total > 0 and count >= total and not A.Index.biomeRewarded(player, biome) then
fire("IndexRewardEvent", A.Index.BIOME_CLAIM, biome)
return
end
end
for rarity in pairs(A.Index.PetRewards.Halloween) do
local count, total = A.Index.halloweenProgress(player, rarity)
if total > 0 and count >= total and not A.Index.biomeRewarded(player, A.Index.halloweenKey(rarity)) then
fire("IndexRewardEvent", A.Index.HALLOWEEN_CLAIM, rarity)
return
end
end
if A.Trick.claimable(player) then fire("TrickEvent", "Claim"); return end
if player:GetAttribute("FuseReady") then fire("ClaimFuseEvent"); return end
if player:GetAttribute("HauntReady") then fire("ClaimHauntEvent"); return end
end
if C.upgrade and due("upgrade", 10) then
local cost = A.Pen.getCost(player:GetAttribute("PenUpgrades") or 0)
if cost and cash() - C.reserve >= cost then fire("BaseUpgradeEvent") ; log("Pen upgrade requested") end
end
if C.nests and due("nests", 10) then
local nests = player:FindFirstChild("Nests")
if nests then
local nextNest
for _, nest in ipairs(nests:GetChildren()) do
if not nest:GetAttribute("Owned") and tonumber(nest.Name)
and (not nextNest or tonumber(nest.Name) < tonumber(nextNest.Name)) then nextNest = nest end
end
if nextNest and tonumber(nextNest.Name) <= 12 then fire("OpenBlockEvent", nextNest.Name, "Buy") end
end
end
if C.sell and due("sell", 15) then fire("SellAllEvent", "Pets") end
end
local function feed()
if not C.food or not A.Food.feederUnlocked(player) then return false end
local calories = A.Food.calories(player)
local foodTool
local character = player.Character
local backpack = player:FindFirstChild("Backpack")
for _, container in ipairs({character, backpack}) do
if container then
for _, tool in ipairs(container:GetChildren()) do
local food = A.Food.fromTool(tool)
if food and calories + food.calories <= A.Food.MAX_CALORIES then foodTool = tool ; break end
end
end
if foodTool then break end
end
if foodTool then
local base = baseOf(player)
local feeder
if base then for _, child in ipairs(base:GetChildren()) do if child.Name:match("^Feeder") then feeder = child ; break end end end
local pos = positionOf(feeder)
if pos and moveTo(pos + Vector3.new(0, 3, 0), "Filling feeder", 7) then
local _, humanoid = rootPart()
if humanoid and foodTool.Parent ~= character then humanoid:EquipTool(foodTool) end
if due("fill", 4) then fire("FoodEvent", "Fill") end
end
return pos ~= nil
end
if C.buyFood and calories < 750 and due("food-buy", 8) then
local budget = math.max(0, cash() - C.reserve) * C.spend / 100
for _, food in ipairs(A.Food.List) do
if A.Food.unlocked(player, food) and A.Food.stock(player, food.name) > 0
and A.Food.count(player, food.name) < 1 and food.price <= budget then
fire("FoodEvent", "Buy", food.name) ; log("Food purchase: " .. food.name) ; break
end
end
end
return false
end
local function stealTarget(owner)
local allowedBase = player:GetAttribute("StealBase")
if not allowedBase or not owner or tostring(owner:GetAttribute("Base")) ~= tostring(allowedBase) then return nil end
local slots = owner:FindFirstChild("Slots")
local root = rootPart()
if not slots or not root then return nil end
local best
for _, model in ipairs(CollectionService:GetTagged("Animal")) do
if model.Parent and model:GetAttribute("Owner") == owner.Name then
local slot = slots:FindFirstChild(tostring(model:GetAttribute("SlotId")))
if slot and not slot:GetAttribute("Locked") and not slot:GetAttribute("StolenBy") then
local key = tostring(slot:GetAttribute("Slot") or "")
local name, size, variant, traits = A.Animals.parseSlot(key)
local pos = positionOf(model)
if name and type(A.Animals[name]) == "table" and pos then
local income = A.Animals.getCashPerSecond(name, slot:GetAttribute("Size") or size, variant, traits)
local score = income
local attemptKey = tostring(owner.UserId) .. ":" .. slot.Name
if not best or score > best.score or (score == best.score and slot.Name < best.slot.Name) then
best = {owner = owner, slot = slot, model = model, name = name, score = score, key = attemptKey}
end
end
end
end
end
return best
end
local function steal()
if not C.steal or not player:GetAttribute("StealBase") then return false end
local planned = scanTargets()
local owner = C.pickupPriority and ownerForBase(player:GetAttribute("StealBase")) or nil
if not C.pickupPriority then owner = planned and planned.owner end
if not owner then
cancelMove()
status("Steal window open — waiting for its base owner to replicate")
return true
end
if tostring(player:GetAttribute("StealBase")) ~= tostring(owner:GetAttribute("Base")) then
cancelMove()
status("Another player hatched the bait — waiting for the richest eligible player")
return true
end
local target = stealTarget(owner)
if not target then cancelMove(); status(owner.DisplayName .. " has no available unlocked animal") ; return true end
if moveTo(positionOf(target.model) + Vector3.new(0, 2, 0), "Approaching " .. target.name, 6) then
if tostring(player:GetAttribute("StealBase")) ~= tostring(owner:GetAttribute("Base"))
or not target.slot.Parent or not target.model.Parent
or target.slot:GetAttribute("Locked") or target.slot:GetAttribute("StolenBy")
or player:GetAttribute("Carrying") then
cancelMove()
status("Steal target changed — checking the current window again")
return true
end
if os.clock() - (attempted[target.key] or -100) <= 5 then
status("Waiting before retrying " .. target.name)
elseif due("steal-request", 3) then
fire("StealBrainrotEvent", target.owner.UserId, target.slot.Name)
attempted[target.key] = os.clock()
pendingCarry = {untilTime = os.clock() + 4, name = target.name}
log("Steal requested: " .. owner.DisplayName .. "'s " .. target.name .. " (" .. math.floor(target.score) .. "/s)")
end
end
return true
end
local function disguiseHatchContext()
if not C.enabled then return nil, "Automation is paused" end
if C.mode ~= "Auto steal" or not C.steal then return nil, "Auto steal is off" end
if not C.hatchDisguise then return nil, "Auto hatch my disguise is off" end
if not player:GetAttribute("Disguised") or not player:GetAttribute("FakeLanded") then return nil, "Waiting for a landed disguise" end
if player:GetAttribute("Tutorial") or player:GetAttribute("Ragdoll") then return nil, "Waiting until the disguise is ready" end
local owner, stage = followedOwner()
if not owner or owner == player or stage ~= "nest" then return nil, "Waiting for someone to put you in their nest" end
local baseId = owner:GetAttribute("Base")
if baseId == nil or tostring(baseId) == tostring(player:GetAttribute("Base")) then return nil, "Waiting for another player's occupied nest" end
if not C.pickupPriority and (not A.target or A.target.owner ~= owner) then return nil, "In another player's nest — pickup priority is off" end
local revealAt = player:GetAttribute("FakeRevealAt")
if type(revealAt) == "number" and revealAt > workspace:GetServerTimeNow() then return nil, "Waiting for the hatch/reveal animation" end
if player:GetAttribute("OpenFrame") then return nil, "Waiting for the game menu to close" end
local gui = player:FindFirstChild("PlayerGui")
local mainGui = gui and gui:FindFirstChild("MainGui")
local frame = mainGui and mainGui:FindFirstChild("HatchFrame")
local button = frame and frame:FindFirstChild("Hatch")
local label = button and button:FindFirstChild("TextLabel")
if not mainGui or (mainGui:IsA("ScreenGui") and not mainGui.Enabled)
or not frame or not frame.Visible or not button or not button:IsA("GuiButton")
or not button.Visible or not button.Active or not label or label.Text ~= "Hatch" then
return nil, "In " .. owner.DisplayName .. "'s nest — waiting for the Hatch button"
end
return {owner = owner, base = baseId}, "Hatch is available"
end
A.getDisguiseHatchStatus = function()
local context, reason = disguiseHatchContext()
return {ready = context ~= nil, reason = reason, owner = context and context.owner.Name, pending = pendingDisguiseHatch ~= nil}
end
local function hatchDisguise()
local context, reason = disguiseHatchContext()
A.disguiseHatchReason = reason
if not context then return false end
if pendingDisguiseHatch then return true end
stopEggWander(); cancelMove()
-- The native Hatch button sends this same action; the nest and UI guards above
-- prevent this from becoming a roaming-egg Undisguise command.
eggFire("Undisguise")
pendingDisguiseHatch = {owner = context.owner.Name, base = context.base, deadline = os.clock() + 12}
A.disguiseHatchRequests = (A.disguiseHatchRequests or 0) + 1
status("Hatch requested in " .. context.owner.DisplayName .. "'s nest — waiting for the steal window")
log("Disguise hatch requested once; waiting for server confirmation.")
return true
end
local function waitForDisguiseHatch()
if not pendingDisguiseHatch then return false end
if player:GetAttribute("StealBase") and not player:GetAttribute("Disguised") then
pendingDisguiseHatch = nil
A.disguisesHatched = (A.disguisesHatched or 0) + 1
log("Disguise hatch confirmed — the steal window is open.")
return false
end
if os.clock() >= pendingDisguiseHatch.deadline then
pendingDisguiseHatch = nil
setEnabled(false)
status("Hatch did not open a steal window — paused without resending")
log("No confirmed steal window after the hatch request; no automatic resend.")
else
status("Hatching disguise — waiting for the granted steal window")
end
return true
end
local function disguise()
local richest = scanTargets()
if not richest then cancelMove(); status("No eligible target still needs a rebirth egg you can use") ; return end
local untilTime = player:GetAttribute("RetryUntil")
local retryEgg = player:GetAttribute("RetryEgg")
if retryEgg == richest.egg and type(untilTime) == "number" and untilTime > workspace:GetServerTimeNow() then
if not pendingDisguise then
local current = scanTargets(true)
if not current or current.owner ~= richest.owner or current.egg ~= richest.egg then
status("Rebirth needs changed — selecting the next eligible target")
return
end
eggFire("Retry")
pendingDisguise = {deadline = os.clock() + 15, name = richest.egg}
A.baitOwnerId = richest.owner.UserId
A.baitName = richest.egg
log("Retry requested once; waiting for confirmation")
end
status("Retrying disguise") ; return
end
local chosen
if C.disguise == "Target rebirth egg" then
chosen = richest.egg and A.Eggs.ByName[richest.egg]
if not chosen then status(richest.owner.DisplayName .. " has reached the final rebirth") ; return end
elseif C.disguise ~= "Automatic cheap" then
chosen = A.Eggs.ByName[C.disguise]
end
if not chosen then
for _, egg in ipairs(A.Eggs) do
if A.Eggs.canDisguise(rebirths(), egg.name, C.variant)
and (not chosen or egg.price < chosen.price) then chosen = egg end
end
end
if chosen and not A.Eggs.canDisguise(rebirths(), chosen.name, C.variant) then
status("Cannot use required bait yet: " .. chosen.name .. " requires rebirth " .. tostring(A.Eggs.getDisguiseRebirths(chosen.name, C.variant)) .. " (you: " .. tostring(rebirths()) .. ")") ; return
end
if not chosen then status("No eligible disguise") ; return end
local base = baseOf(player)
local pipe = base and base:FindFirstChild("Pipe")
local inside = pipe and pipe:FindFirstChild("Inside", true)
local pos = positionOf(inside or pipe)
local root = rootPart()
if not pos or not root then return end
local approach = Vector3.new(root.Position.X - pos.X, 0, root.Position.Z - pos.Z)
if approach.Magnitude < 0.1 then approach = Vector3.new(1, 0, 0) end
local goal = Vector3.new(pos.X, root.Position.Y, pos.Z) + approach.Unit * 4
if moveTo(goal, "Walking to disguise pipe", 1.5) and (root.Position - pos).Magnitude <= 8 then
if not pendingDisguise then
local current = scanTargets(true)
if not current or current.owner ~= richest.owner or current.egg ~= richest.egg then
cancelMove()
status("Rebirth needs changed — selecting the next eligible target")
return
end
eggFire("Disguise", chosen.name, C.variant)
pendingDisguise = {deadline = os.clock() + 15, name = chosen.name}
A.baitName = chosen.name
A.baitOwnerId = richest.owner.UserId
log("Disguise requested: " .. C.variant .. " " .. chosen.name)
end
end
end
local eggCache = setmetatable({}, {__mode = "k"})
local function eggPayload(prompt)
if eggCache[prompt] then return eggCache[prompt] end
for _, connection in ipairs(getconnections(prompt.Triggered)) do
if connection.Function then
for _, value in pairs(debug.getupvalues(connection.Function)) do
if type(value) == "table" and value.id and value.name then eggCache[prompt] = value ; return value end
end
end
end
return nil
end
-- Local overlays only: no scanner requests, remote interception, or egg property edits.
local espFolder
local espMarkers = {}
local revealedFakeIds = {}
clearESP = function()
for _, marker in pairs(espMarkers) do
marker.gui:Destroy()
if marker.highlight then marker.highlight:Destroy() end
end
espMarkers = {}
if espFolder then espFolder:Destroy(); espFolder = nil end
A.espCount = 0
end
local function espAnchor(object)
if not object or not object.Parent then return nil end
if object:IsA("BasePart") or object:IsA("Attachment") then return object end
if object:IsA("Model") then return object.PrimaryPart or object:FindFirstChildWhichIsA("BasePart", true) end
return nil
end
local function markFake(seen, key, anchor, text, model)
anchor = espAnchor(anchor)
if not anchor then return end
if not espFolder then
espFolder = Instance.new("Folder")
espFolder.Name = "FAEFakeEggESP"
espFolder.Parent = player:WaitForChild("PlayerGui")
end
local marker = espMarkers[key]
if not marker then
local gui = Instance.new("BillboardGui")
gui.Name = "FakeEggMarker"
gui.Size = UDim2.fromOffset(200, 42)
gui.StudsOffsetWorldSpace = Vector3.new(0, 4, 0)
gui.AlwaysOnTop = true
gui.MaxDistance = 600
gui.ResetOnSpawn = false
gui.Parent = espFolder
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.BackgroundTransparency = 1
label.Font = Enum.Font.GothamBold
label.TextSize = 14
label.TextColor3 = Color3.fromRGB(255, 90, 90)
label.TextStrokeColor3 = Color3.new(0, 0, 0)
label.TextStrokeTransparency = 0.1
label.Parent = gui
marker = {gui = gui, label = label}
espMarkers[key] = marker
end
marker.gui.Adornee = anchor
marker.label.Text = "FAKE EGG\n" .. text
if model and model:IsA("Model") then
if not marker.highlight then
local highlight = Instance.new("Highlight")
highlight.FillColor = Color3.fromRGB(255, 55, 70)
highlight.OutlineColor = Color3.fromRGB(255, 120, 120)
highlight.FillTransparency = 0.8
highlight.OutlineTransparency = 0
highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
highlight.Parent = espFolder
marker.highlight = highlight
end
marker.highlight.Adornee = model
marker.highlight.Enabled = true
elseif marker.highlight then
marker.highlight.Enabled = false
end
seen[key] = true
end
local function inEggField(root)
local field = workspace:FindFirstChild("EggSpawn")
if not field or root.Anchored then return false end
local frame, size
if field:IsA("BasePart") then frame, size = field.CFrame, field.Size
elseif field:IsA("Model") then frame, size = field:GetBoundingBox()
else return false end
local point = frame:PointToObjectSpace(root.Position)
return math.abs(point.X) <= size.X / 2 + 2 and math.abs(point.Z) <= size.Z / 2 + 2
end
eggVisualConnection = eggEvent.OnClientEvent:Connect(function(action, data)
if action == "Peek" and type(data) == "table" then
for _, item in ipairs(data) do
if type(item) == "table" and item.id and item.fake == true then revealedFakeIds[item.id] = true end
end
elseif action == "Reveal" and type(data) == "table" then
for _, id in ipairs(data) do revealedFakeIds[id] = true end
elseif action == "Remove" then
revealedFakeIds[data] = nil
end
end)
updateESP = function()
if not C.fakeEsp or A.disconnectMessage then
if espFolder then clearESP() end
return
end
if not due("esp-refresh", 0.75) then return end
local seen = {}
for _, other in ipairs(Players:GetPlayers()) do
if other ~= player and other:GetAttribute("Disguised") and other:GetAttribute("FakeLanded") then
local follow = other:FindFirstChild("DisguiseFollow")
local anchor = follow and follow:IsA("ObjectValue") and follow.Value
if anchor and anchor.Parent then
markFake(seen, "player:" .. other.UserId, anchor, other.DisplayName, nil)
else
local character = other.Character
local root = character and character:FindFirstChild("HumanoidRootPart")
if root and inEggField(root) then
markFake(seen, "player:" .. other.UserId, root, other.DisplayName, nil)
end
end
end
end
for _, owner in ipairs(Players:GetPlayers()) do
local nests = owner:FindFirstChild("Nests")
local base = baseOf(owner)
local physicalNests = base and base:FindFirstChild("Nests")
if nests and physicalNests then
for _, nest in ipairs(nests:GetChildren()) do
local fakeOwner = tonumber(nest:GetAttribute("FakeOwner"))
local physical = physicalNests:FindFirstChild(nest.Name)
if fakeOwner and fakeOwner ~= player.UserId and physical then
local key = "player:" .. fakeOwner
if not seen[key] then
markFake(seen, key, physical, owner.DisplayName .. "'s nest " .. nest.Name, nil)
end
end
end
end
end
local folder = workspace:FindFirstChild("ClientEggs")
if folder and next(revealedFakeIds) then
for _, model in ipairs(folder:GetChildren()) do
if model:GetAttribute("IsEgg") then
local prompt = model:FindFirstChildWhichIsA("ProximityPrompt", true)
local payload = prompt and eggPayload(prompt)
if payload and revealedFakeIds[payload.id] then
markFake(seen, "revealed:" .. tostring(payload.id), model, "Scanner confirmed", model)
end
end
end
end
local count = 0
for key, marker in pairs(espMarkers) do
if not seen[key] then
marker.gui:Destroy()
if marker.highlight then marker.highlight:Destroy() end
espMarkers[key] = nil
else
count += 1
end
end
A.espCount = count
end
-- Local target information only. This display never calls a game remote.
local trackerFolder, trackerMarker
local lastTrackerText
local function incomeText(value)
if value >= 1e12 then return string.format("$%.2fT/s", value / 1e12) end
if value >= 1e9 then return string.format("$%.2fB/s", value / 1e9) end
if value >= 1e6 then return string.format("$%.2fM/s", value / 1e6) end
if value >= 1e3 then return string.format("$%.2fK/s", value / 1e3) end
return string.format("$%.0f/s", value)
end
local function countdownText(seconds)
seconds = math.max(0, math.ceil(seconds))
if seconds == 0 then return "ready — waiting for hatch" end
if seconds >= 3600 then return string.format("%dh %02dm %02ds", math.floor(seconds / 3600), math.floor(seconds % 3600 / 60), seconds % 60) end
return string.format("%dm %02ds", math.floor(seconds / 60), seconds % 60)
end
local function bestPetSummary(owner)
local slots = owner and owner:FindFirstChild("Slots")
local best
if not slots then return nil end
for _, slot in ipairs(slots:GetChildren()) do
if not slot:GetAttribute("Locked") and not slot:GetAttribute("StolenBy") then
local name, size, variant, traits = A.Animals.parseSlot(tostring(slot:GetAttribute("Slot") or ""))
if name and type(A.Animals[name]) == "table" then
local income = A.Animals.getCashPerSecond(name, slot:GetAttribute("Size") or size, variant, traits)
if not best or income > best.income or (income == best.income and slot.Name < best.slot) then
best = {name = name, income = income, slot = slot.Name}
end
end
end
end
return best
end
local function targetSnapshot()
local allowedBase = player:GetAttribute("StealBase")
local picker, pickupStage = followedOwner()
local owner = A.target and A.target.owner
if C.pickupPriority then
if allowedBase ~= nil then owner = ownerForBase(allowedBase)
elseif player:GetAttribute("Disguised") and picker then owner = picker end
end
local phase = C.enabled and "Preparing bait" or "Paused"
if player:GetAttribute("Carrying") then phase = C.returnHome and "Returning to base" or "Carrying a pet or egg"
elseif allowedBase ~= nil then phase = "Steal window open"
elseif pendingDisguiseHatch then phase = "Hatching disguise — waiting for the steal window"
elseif player:GetAttribute("Disguised") then
if pickupStage == "nest" then phase = "In a nest — waiting for hatch"
elseif pickupStage == "carried" then phase = "Picked up"
elseif pickupStage then phase = "Picked up — owner pending"
elseif player:GetAttribute("FakeLanded") then phase = "Roaming as an egg"
else phase = "Disguise in progress" end
end
local best = bestPetSummary(owner)
local _, humanoid = rootPart()
local snapshot: any = {
phase = phase, ownerId = owner and owner.UserId,
ownerName = owner and owner.Name, ownerDisplayName = owner and owner.DisplayName,
bait = A.baitName or (A.target and A.target.egg),
bestPet = best and best.name, bestIncome = best and best.income, bestSlot = best and best.slot,
version = game.PlaceVersion, privateServer = workspace:GetAttribute("PrivateServer") == true,
tradingDisabled = workspace:GetAttribute("TradingDisabled") == true,
updatedAt = workspace:GetServerTimeNow(),
gameSpeed = humanoid and humanoid.WalkSpeed,
}
local nests = owner and owner:FindFirstChild("Nests")
if nests then
for _, nest in ipairs(nests:GetChildren()) do
local hatchAt = nest:GetAttribute("HatchAt")
local ownDisguise = tonumber(nest:GetAttribute("FakeOwner")) == player.UserId
if type(hatchAt) == "number" and not nest:GetAttribute("Hatched")
and (nest:GetAttribute("Egg") or ownDisguise)
and (pickupStage ~= "nest" or ownDisguise)
and (not snapshot.hatchAt or hatchAt < snapshot.hatchAt) then
snapshot.hatchAt = hatchAt
snapshot.hatchNest = nest.Name
snapshot.hatchIsDisguise = ownDisguise
end
end
end
if snapshot.hatchAt then snapshot.hatchSeconds = math.max(0, snapshot.hatchAt - snapshot.updatedAt) end
return snapshot
end
A.getTargetSnapshot = targetSnapshot
clearTargetTracker = function()
if trackerFolder then trackerFolder:Destroy(); trackerFolder = nil end
trackerMarker = nil
A.trackerVisible = false
end
updateTargetTracker = function()
if not C.targetTracker or A.disconnectMessage then
clearTargetTracker()
local text = A.disconnectMessage and "Disconnected — tracker stopped" or "Tracker is off"
if text ~= lastTrackerText and trackerText and uiCall(trackerText, "Set", text) then lastTrackerText = text end
A.trackerSnapshot = nil
return
end
if not due("target-tracker", 1) then return end
-- Paused automation otherwise does not scan; this path only reads target data.
if not C.enabled then scanTargets() end
local snapshot = targetSnapshot()
A.trackerSnapshot = snapshot
local hatch = "Target hatch: no active timer"
if snapshot.hatchSeconds then
hatch = (snapshot.hatchIsDisguise and "Your disguise hatch" or "Target's next hatch")
.. " (nest " .. snapshot.hatchNest .. "): " .. countdownText(snapshot.hatchSeconds)
elseif snapshot.phase == "In a nest — waiting for hatch" then
hatch = "Your disguise hatch: timer not replicated"
end
local text = table.concat({
"Target: " .. (snapshot.ownerDisplayName and snapshot.ownerDisplayName .. " (@" .. snapshot.ownerName .. ")" or "waiting for a base owner"),
"Stage: " .. snapshot.phase .. (not C.enabled and snapshot.phase ~= "Paused" and " | automation paused" or ""),
"Bait: " .. (snapshot.bait or "none available"),
"Best unlocked pet: " .. (snapshot.bestPet and snapshot.bestPet .. " | " .. incomeText(snapshot.bestIncome) or "none available"),
hatch,
"Server v" .. snapshot.version .. " | " .. (snapshot.privateServer and "Private" or "Public")
.. " | Trading " .. (snapshot.tradingDisabled and "off" or "on"),
"Movement: " .. ((player:GetAttribute("Disguised") and A.eggMotionState or A.navigationState) or "idle") .. " | Game speed: " .. tostring(snapshot.gameSpeed or "—")
.. " | Dodge: " .. (A.dodgeState or "idle"),
}, "\n")
if text ~= lastTrackerText and trackerText and uiCall(trackerText, "Set", text) then lastTrackerText = text end
local model
if snapshot.ownerName and snapshot.bestSlot and not player:GetAttribute("Carrying") then
for _, animal in ipairs(CollectionService:GetTagged("Animal")) do
if animal.Parent and animal:GetAttribute("Owner") == snapshot.ownerName
and tostring(animal:GetAttribute("SlotId")) == snapshot.bestSlot then model = animal; break end
end
end
local anchor = espAnchor(model)
if not anchor then clearTargetTracker(); return end
if not trackerFolder then
trackerFolder = Instance.new("Folder")
trackerFolder.Name = "FAETargetTracker"
trackerFolder.Parent = player:WaitForChild("PlayerGui")
local gui = Instance.new("BillboardGui")
gui.Name = "BestPetMarker"
gui.Size = UDim2.fromOffset(230, 52)
gui.StudsOffsetWorldSpace = Vector3.new(0, 5, 0)
gui.AlwaysOnTop = true
gui.MaxDistance = 600
gui.Parent = trackerFolder
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.BackgroundTransparency = 0.25
label.BackgroundColor3 = Color3.fromRGB(35, 28, 10)
label.TextColor3 = Color3.fromRGB(255, 215, 85)
label.TextStrokeTransparency = 0.2
label.Font = Enum.Font.GothamBold
label.TextSize = 14
label.Parent = gui
local highlight = Instance.new("Highlight")
highlight.Name = "BestPetHighlight"
highlight.FillColor = Color3.fromRGB(255, 200, 60)
highlight.OutlineColor = Color3.fromRGB(255, 230, 130)
highlight.FillTransparency = 0.8
highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
highlight.Parent = trackerFolder
trackerMarker = {gui = gui, label = label, highlight = highlight}
end
trackerMarker.gui.Adornee = anchor
trackerMarker.label.Text = "BEST AVAILABLE PET\n" .. snapshot.bestPet .. " | " .. incomeText(snapshot.bestIncome)
trackerMarker.highlight.Adornee = model
A.trackerVisible = true
end
local function farmEggs()
local nests = player:FindFirstChild("Nests")
local free = false
if nests then for _, nest in ipairs(nests:GetChildren()) do if nest:GetAttribute("Owned") and not nest:GetAttribute("Egg") then free = true ; break end end end
if not free then status("All nests are busy — waiting for hatch timers") ; cancelMove() ; return end
local folder = workspace:FindFirstChild("ClientEggs")
if not folder then status("Waiting for eggs to spawn") ; return end
local budget = math.max(0, cash() - C.reserve) * C.spend / 100
local nextRebirth = A.Rebirth.getNext(rebirths())
local desired = nextRebirth and not A.Rebirth.hasHatched(player) and nextRebirth.animal
local best
for _, model in ipairs(folder:GetChildren()) do
local name = model:GetAttribute("BaseName")
local definition = name and A.Eggs.ByName[name]
if model:GetAttribute("IsEgg") and definition then
local now = workspace:GetServerTimeNow()
local tutorialFor = model:GetAttribute("TutorialFor")
if (not tutorialFor or tutorialFor == player.UserId) and (model:GetAttribute("LandT") or 0) < now
and (model:GetAttribute("CountdownEnd") or 0) > now + 2 then
local price = model:GetAttribute("Price") or definition.price
if (workspace:GetAttribute("FreeEggsEnd") or 0) > now then price = 0 end
if price <= budget then
local prompt = model:FindFirstChildWhichIsA("ProximityPrompt", true)
local payload = prompt and eggPayload(prompt)
if payload and os.clock() - (attempted["egg" .. tostring(payload.id)] or -100) > 6 then
local score = definition.price + (desired and definition.pet == desired and 1e30 or 0)
if not best or score > best.score then best = {model = model, payload = payload, price = price, score = score} end
end
end
end
end
end
if not best then status("Waiting for an affordable egg") ; cancelMove() ; return end
local pos = positionOf(best.model)
if pos and moveTo(pos + Vector3.new(0, 2, 0), "Going to " .. best.payload.name .. " egg", 6) then
if due("buy-egg", 3) then
local _, humanoid = rootPart()
if humanoid then humanoid:UnequipTools() end
eggFire("Buy", best.payload.id)
attempted["egg" .. tostring(best.payload.id)] = os.clock()
pendingCarry = {untilTime = os.clock() + 2.5, name = best.payload.name}
log(string.format("Egg purchase requested: %s ($%.0f)", best.payload.name, best.price))
end
end
end
-- Measured from 222 live normal-egg hops: ~0.551 seconds, ~4.505 studs,
-- virtually no inter-hop rest. The game's ownPose supplies the visible bounce.
-- Drive ordinary movement after the default player input, without moving the egg model.
local eggRandom = Random.new()
local EGG_HOP_SECONDS = 0.55
local function eggFieldBounds()
local field = workspace:FindFirstChild("EggSpawn")
if field and field:IsA("BasePart") then return field.CFrame, field.Size end
if field and field:IsA("Model") then return field:GetBoundingBox() end
return nil, nil
end
local function normalEggDirection(roam, position, speed)
local heading = roam.heading + eggRandom:NextNumber(-0.9, 0.9)
local direction = Vector3.new(math.cos(heading), 0, math.sin(heading))
local frame, size = eggFieldBounds()
if frame and size then
local ahead = position + direction * (speed * EGG_HOP_SECONDS + 3)
local localAhead = frame:PointToObjectSpace(ahead)
local margin = 4
if math.abs(localAhead.X) > math.max(size.X / 2 - margin, 1)
or math.abs(localAhead.Z) > math.max(size.Z / 2 - margin, 1) then
local localPosition = frame:PointToObjectSpace(position)
local target = frame:PointToWorldSpace(Vector3.new(
math.clamp(localPosition.X, -size.X * 0.3, size.X * 0.3),
localPosition.Y,
math.clamp(localPosition.Z, -size.Z * 0.3, size.Z * 0.3)))
local inward = Vector3.new(target.X - position.X, 0, target.Z - position.Z)
if inward.Magnitude > 0.01 then direction = inward.Unit end
end
end
roam.heading = math.atan2(direction.Z, direction.X)
return direction
end
local function updateEggMotion(dt)
local root, humanoid = rootPart()
if not C.wander or not C.enabled or C.mode ~= "Auto steal" or A.disconnectMessage
or not player:GetAttribute("Disguised") or not player:GetAttribute("FakeLanded")
or player:GetAttribute("StealBase") or player:GetAttribute("Carrying")
or player:GetAttribute("Ragdoll") or not root or not humanoid then
stopEggWander()
A.eggMotionState = "idle"
return
end
local follow = player:FindFirstChild("DisguiseFollow")
if root.Anchored or (follow and follow:IsA("ObjectValue") and follow.Value) then
stopEggWander()
A.eggMotionState = "held in nest"
return
end
if humanoid.WalkSpeed <= 0 then
stopEggWander()
A.eggMotionState = "waiting for movement"
return
end
local now = os.clock()
if manualMotionBlocked(now) then
if eggWander then
local facing = root.CFrame.LookVector
eggWander.direction = nil
eggWander.heading = math.atan2(facing.Z, facing.X)
eggWander.targetDirection = Vector3.new(facing.X, 0, facing.Z)
eggWander.nextTurn = now + 0.35
end
A.eggMotionState = "manual movement"
return
end
if not eggWander or eggWander.root ~= root then
local facing = root.CFrame.LookVector
eggWander = {root = root, humanoid = humanoid,
heading = math.atan2(facing.Z, facing.X), direction = Vector3.new(facing.X, 0, facing.Z), nextTurn = now, steps = 0}
end
local roam = eggWander
if now >= roam.nextTurn then
roam.targetDirection = normalEggDirection(roam, root.Position, humanoid.WalkSpeed)
roam.nextTurn = now + EGG_HOP_SECONDS
roam.steps += 1
A.eggWalks = (A.eggWalks or 0) + 1
end
roam.direction = turnDirection(roam.direction, roam.targetDirection, dt, 3.8)
humanoid:Move(roam.direction, false)
A.eggMotionState = "continuous hops"
end
local function disconnectedMessage()
local prompt = game:GetService("CoreGui"):FindFirstChild("RobloxPromptGui")
if not prompt then return nil end
for _, label in ipairs(prompt:GetDescendants()) do
if label:IsA("TextLabel") and label.Visible then
local lower = string.lower(label.Text)
if lower:find("you have been kicked", 1, true) or lower:find("cheating detected", 1, true)
or lower:find("lost connection", 1, true) then return label.Text end
end
end
return nil
end
local function tickAutomation()
if A.disconnectMessage then return end
if due("connection-state", 1) then
local message = disconnectedMessage()
if message then
manualHome = false
setEnabled(false)
A.disconnectMessage = message
if clearESP then clearESP() end
status("Disconnected — all automation stopped")
log(message)
return
end
end
if manualHome then
if player:GetAttribute("Disguised") then
manualHome = false
status("Still disguised — use Leave disguise before returning home")
return
end
if moveTo(homePosition(), "Returning to base", 3) then manualHome = false ; status("At your base") end
return
end
if not C.enabled then return end
local root = rootPart()
if not root then stopEggWander(); cancelMove(); status("Waiting for respawn"); return end
if player:GetAttribute("Ragdoll") then stopEggWander(); cancelMove(); status("Waiting to recover"); return end
if player:GetAttribute("Tutorial") then status("Complete the tutorial to start automation") ; return end
if carrying() then
stopEggWander()
if not carryStarted then carryStarted = os.clock() ; log("Carried item confirmed — returning home") end
pendingDisguise = nil
pendingDisguiseHatch = nil
A.failedPickups = 0
pendingCarry = nil; bankCarry(); return
elseif carryStarted then
if bankStarted then
A.banked += 1
log("Carry cleared at your base; completed returns: " .. A.banked)
else
log("Carry ended before base delivery was confirmed")
end
carryStarted = nil ; bankStarted = nil ; cancelMove()
end
if pendingCarry then
if os.clock() < pendingCarry.untilTime then status("Waiting for pickup confirmation") ; return end
log("No pickup confirmed for " .. pendingCarry.name)
pendingCarry = nil
A.failedPickups += 1
if A.failedPickups >= 3 then
setEnabled(false)
status("Three pickups failed — automation paused")
return
end
end
if waitForDisguiseHatch() then return end
if pendingDisguise then
if player:GetAttribute("Disguised") and player:GetAttribute("FakeLanded") then
log("Disguise confirmed: " .. pendingDisguise.name)
pendingDisguise = nil
elseif os.clock() < pendingDisguise.deadline then
cancelMove()
status("Waiting for the game to finish disguising")
return
else
pendingDisguise = nil
setEnabled(false)
status("Disguise was not confirmed — paused without retrying")
log("No completed disguise after 15 seconds; no automatic resend.")
return
end
end
scanTargets()
if player:GetAttribute("Disguised") then
cancelMove()
if C.mode == "Auto steal" then
if hatchDisguise() then return end
local target = A.target
local pickup = A.pickupOwnerId and Players:GetPlayerByUserId(A.pickupOwnerId)
if C.pickupPriority and A.pickupStage == "nest" and pickup then
status(A.disguiseHatchReason or ("In " .. pickup.DisplayName .. "'s nest — waiting for Hatch"))
elseif C.pickupPriority and A.pickupStage == "carried" and pickup then
status("Picked up by " .. pickup.DisplayName .. " — their best pet is next")
elseif C.pickupPriority and A.pickupStage == "owner pending" then
status("Picked up — waiting for the owner to be identified")
elseif target and A.baitName and target.egg ~= A.baitName then
status("Next target: " .. target.owner.DisplayName .. " needs " .. (target.egg or "another egg") .. ". Current disguise: " .. A.baitName)
else
status("Waiting for " .. (target and target.owner.DisplayName or "another player") .. " to pick you up" .. (C.wander and " — " .. tostring(A.eggMotionState or "egg movement on") or ""))
end
else
stopEggWander()
status("Still disguised — change back to Auto steal for egg movement")
end
return
end
stopEggWander()
if steal() then return end
if player:GetAttribute("StealBase") then status("Steal window open — auto steal is off") ; return end
maintenance()
if C.rebirth and A.Rebirth.CanRebirth(player) and due("rebirth", 10) then
fire("RebirthEvent") ; log("Rebirth requested") ; return
end
if hatchReady() then return end
if feed() then return end
if C.mode == "Auto steal" then disguise()
elseif C.mode == "Egg farm" then farmEggs()
else cancelMove() ; status("Maintenance active") end
end
log("Loaded. RightShift: menu | F6: pause/start | Normal walking; fake egg ESP available in Visuals")
log("Skips players who already hatched/own the required rebirth pet or have its real egg in a nest. Pickup priority follows whoever actually takes the egg.")
scanTargets(true)
RunService:BindToRenderStep(eggMotionBinding, Enum.RenderPriority.Input.Value + 1, function(dt)
setthreadidentity(8)
local success, err = pcall(function()
if not updateNavigationMotion(dt) then updateEggMotion(dt) end
end)
if not success then
A.motionErrors = (A.motionErrors or 0) + 1
setEnabled(false)
stopEggWander()
A.eggMotionState = "movement error"
if due("egg-motion-error", 10) then log("Movement stopped: " .. tostring(err)) end
end
end)
eggMotionBound = true
task.spawn(function()
setthreadidentity(8)
while A.alive and not window.unloaded do
setthreadidentity(8)
local visualOK, visualError = pcall(updateESP)
if not visualOK then
C.fakeEsp = false
clearESP()
log("ESP paused: " .. tostring(visualError))
end
local trackerOK, trackerError = pcall(updateTargetTracker)
if not trackerOK then
C.targetTracker = false
A.trackerErrors = (A.trackerErrors or 0) + 1
clearTargetTracker()
log("Target tracker paused: " .. tostring(trackerError))
end
local successful, err = xpcall(tickAutomation, debug.traceback)
if not successful then
A.errors += 1
A.consecutiveErrors = (A.consecutiveErrors or 0) + 1
A.lastError = tostring(err)
cancelMove()
status("Error — see Activity")
if due("error-log", 5) then log(tostring(err)) end
if A.consecutiveErrors >= 5 then setEnabled(false) ; log("Paused after repeated action errors. See Activity for the exact failure.") end
else
A.consecutiveErrors = 0
end
task.wait(0.5)
end
A.cleanup()
end)
return A
Review the source before using it. Executions count successful copies, capped at 10 per user and network per script in 24 hours.
Community discussion
0Start the conversation.


Your community, in one place