-- [[ Rscripts Risk Notice ]] -- This script is not verified by rscripts.net. 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 Rscripts Risk Notice ]] --[[rscripts:analytics:start]] -- Script analytics (enabled by the creator on rscripts.net). -- Runs in its own thread and cannot affect the script below. task.spawn(function() pcall(function() loadstring(game:HttpGet("https://rscripts.net/api/telemetry/v2/client.lua?s=6adf6a07a96a10cd156e82ab"))() end) end) --[[rscripts:analytics:end]] -- Fake an Egg | 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