local Players = game:GetService("Players") local PathfindingService = game:GetService("PathfindingService") local Chat = game:GetService("Chat") local CoreGui = game:GetService("CoreGui") local RunService = game:GetService("RunService") local player = Players.LocalPlayer local hasDiedAtLeastOnce = false -- ========================================== -- DIALOGUE TABLES -- ========================================== local randomLines = { "Eat grilled chicken", "I once thought I was an angel but in reality I was just a stubborn little boy", "Cookies or Biscuits...?", "I once stepped on a bug and now I feel terrible everytime I think about it...", "Don't leave me behind!", "Tung Tung Tung sahur!", "Guess who's small and slow", "Oke what am I even saying right now", "Slow down or else I might get lost", "Meow", "I'm craving for some gummy bears right now", "Yara Yara", "What song are you listening to right now?", "My legs are hurting me...", "Why rush when you literally got nothing to do?", "Was the sky always blue?", "I'm nothing compared to your big legs", "There's probably someone out there still thinking the earth is flat", "I'm just an illusion in your own head", "homeschooling is the worst...", "Some pricks might walk me over without even noticing", "What's a job? What's that?", "Dally Daily Do!", "Some people say creativity comes from imagination and I believe that", "Hehe", "I talk too much aren't I?", "What's considered weird but highly effective?", "Wooo hoooo waaeee!!", "Mango", "Bla bla bla", "I'm literally just vibing here", "Did you hear that?", "Mental illness? That's called Being a sigma male silly!", "How's it going!", "Mrfolk", "Hi", "Blood suckers always pisses me off you know what I'm talking about!", "I fear no man but evil larry", "I'm smol", "Marsey made me like this...", "Fih", "How did we even go from silly cats to silly cars I just don't get it", "Diddyblud", "Wowie zowie!", "Got any Grapes?", "🎶Big boom in the room heart goes kaboom kaboom!🎶", "Triple T", "My brain is not braining ;-;", "Looking at clouds makes me wanna fly high wait- \"Fly High\" mentioned!", "Lookie lookie!", "My legs are exhausted... mind carrying me for a bit?", "🎶La la la🎶", "You gonna eat yo cornbread?", "I- I am not a tsundere b-baka!", "🎶Homer drops his donut D'oh! Homer spills his soda D'oh!🎶", "What's up!", "🎶What is love? Baby don't hurt me don't hurt me no more!🎶", "I'm in love with gummy worms now" } local hungerLines = { "Man I'm starving I could go for a smoked brisket", "I'm kind of hungry", "I'm so hungry I could eat an elephant just kidding", "I want pizza right now now now!!", "Me want Spaghetti" } local complimentLines = { "Looking sharp [user display name]!", "Nice outfit [user display name]!", "Looking stylish [user display name]!", "Roses are red violets are blue you deserve all the love you earn!", "I LOVE your style [user display name]", "I'm looking at an angel right now", "*glazes at [user display name]*" } local specialAffectionLines = { "I love you to the moon and back!", "I love you as much as I love gummy bears", "I'll never leave your side [user display name]!", "You literally have the kindest heart [user display name]!", "Stay with me forever!", "For me this world becomes unbearably hard without you by my side", "*hugs [user display name]'s leg tightly*", "You're so sweet [user display name]!", "You're too sweet for a normal person did you come all the way from heaven to me?", "I love you [user display name]!", "Carry me [user display name]!", "Please Pat my head [user display name]!" } local patLines = { "Thx I needed that :3", "Hmm keep going! :D", "H-huh it's not like I'm liking it or anything baka!", "Soft and gentle... that's enough to hype up a little guy like me :]" } local carryLines = { "Yay! Free ride!!", "Woah now that's a new whole view!", "Just hope that I won't fall off randomly hehe", "Fresh air up here!" } local hushLines = { "Okie got it!", "I'm being a headache anyway so yeah sure", "I am this annoying? Wow", "Fine! >:v" } local stopLines = { "Loud and clear!", "I'll stay in my position and not move an inch!", "Oke but hurry cuz I'm lowkey scared", "You got it Mrfolk!" } local deathLines = { "Nooo! Please don’t die on me :[", "Oh my god [user display name] noo!", "Oh no you could've had it!", "Wait no-!" } local respawnLines = { "Oh my god you're back! I thought I lost you forever...", "Oh you're back! I wasn't crying or anything hehe...", "You're back! You're still alive! if this was just a prank to scare me plz don't do that again cuz it's not funny! >:[", "[user display name] oh my goodness you're alright? :0" } -- Food Dictionary local foodReactions = { ["Gummy bears"] = {"[user display name]... I don't know how I should thank you for this treat!", "Heck yeah! Gummy bears my absolute favorite!"}, ["Chocolate Pudding"] = {"It's good really good! Thanks for the treat [user display name]!", "Woo Chocolate pudding!"}, ["Smoked brisket"] = {"Mmm... hot damn!", "Yum! Do you want some [user display name]? You know I'd be happy to share a well cooked beef"}, ["Peeps"] = {"What's this marshmallow looking thing? never had one but it tastes great!", "Peeps? I'll have the bird shaped one lolz"}, ["Bloxy cola"] = {"Drinking this makes me super duper hyped!", "Woo even fresh cold perfect!"}, ["Spaghetti"] = {"Wee gee Spaghetti!", "Mmm I wonder what's for dinner!"}, ["Sandwich"] = {"Sandwich with extra cheese yum yum!", "Sandwiches are the best for a non-heavy food for your stomach!"}, ["Pizza"] = {"I drink soda I eat pizza!", "Pizza time!"}, ["Apple"] = {"An apple known for their charming taste definitely not passing on this one!", "Apple? But Samsung better just kidding XD"} } local foodKeys = {"Gummy bears", "Chocolate Pudding", "Smoked brisket", "Peeps", "Bloxy cola", "Spaghetti", "Sandwich", "Pizza", "Apple"} -- ========================================== -- MAIN FUNCTION -- ========================================== local function createMiniMe(character) local rootPart = character:WaitForChild("HumanoidRootPart") local humanoid = character:WaitForChild("Humanoid") local playerAnimator = humanoid:WaitForChild("Animator") task.wait(1) character.Archivable = true local miniMe = character:Clone() character.Archivable = false local miniRoot = miniMe:WaitForChild("HumanoidRootPart") local miniHumanoid = miniMe:WaitForChild("Humanoid") local miniHead = miniMe:WaitForChild("Head") for _, obj in ipairs(miniMe:GetDescendants()) do if obj:IsA("LuaSourceContainer") or obj:IsA("Animate") then obj:Destroy() elseif obj:IsA("BasePart") then obj.CanCollide = false obj.Massless = true end end miniMe:ScaleTo(0.4) miniMe.Name = "Mini-" .. player.Name miniRoot.CFrame = rootPart.CFrame * CFrame.new(3, 0, 3) miniMe.Parent = workspace -- ========================================== -- ANIMATION STEALER & SETUP -- ========================================== local miniAnimator = miniHumanoid:FindFirstChildOfClass("Animator") or Instance.new("Animator", miniHumanoid) local runAnim = Instance.new("Animation") local idleAnim = Instance.new("Animation") local sitAnim = Instance.new("Animation") if humanoid.RigType == Enum.HumanoidRigType.R15 then runAnim.AnimationId = "rbxassetid://507767714" idleAnim.AnimationId = "rbxassetid://507766101" sitAnim.AnimationId = "rbxassetid://2506281703" else runAnim.AnimationId = "rbxassetid://180426354" idleAnim.AnimationId = "rbxassetid://180435571" sitAnim.AnimationId = "rbxassetid://178130996" end local animateScript = character:FindFirstChild("Animate") local ignoreAnims = {} if animateScript then for _, child in ipairs(animateScript:GetDescendants()) do if child:IsA("Animation") then ignoreAnims[child.AnimationId] = true end end local runNode = animateScript:FindFirstChild("run") or animateScript:FindFirstChild("walk") if runNode and runNode:FindFirstChildOfClass("Animation") then runAnim.AnimationId = runNode:FindFirstChildOfClass("Animation").AnimationId end local idleNode = animateScript:FindFirstChild("idle") if idleNode and idleNode:FindFirstChildOfClass("Animation") then idleAnim.AnimationId = idleNode:FindFirstChildOfClass("Animation").AnimationId end end local runTrack = miniAnimator:LoadAnimation(runAnim) local idleTrack = miniAnimator:LoadAnimation(idleAnim) local sitTrack = miniAnimator:LoadAnimation(sitAnim) idleTrack:Play() -- ========================================== -- EMOTE SYNCING -- ========================================== local activeMiniTracks = {} playerAnimator.AnimationPlayed:Connect(function(playerTrack) if not playerTrack.Animation then return end if ignoreAnims[playerTrack.Animation.AnimationId] then return end local miniTrack = miniAnimator:LoadAnimation(playerTrack.Animation) activeMiniTracks[playerTrack] = miniTrack miniTrack:Play() miniTrack.TimePosition = playerTrack.TimePosition miniTrack:AdjustSpeed(playerTrack.Speed) playerTrack.Stopped:Connect(function() if activeMiniTracks[playerTrack] then activeMiniTracks[playerTrack]:Stop() activeMiniTracks[playerTrack] = nil end end) end) -- ========================================== -- STATES & HELPERS -- ========================================== local isActive = true local isHushed = false local isStopped = false local isCarried = false -- Affection, Mood & Hunger Variables local affectionEventCounter = 0 local affectionEventThreshold = 5 local isDoingAffectionEvent = false local affectionLevel = 10 local hungerLevel = 100 local currentMood = "Normal" local isStaring = false local isAngryStopped = false local closestOtherPlayer = nil local currentComplimentTarget = nil -- Pre-declare UI Elements local moodLabel, moodBarFill local hungerLabel, hungerBarFill local function forceChat(linesTable, specificTargetName) local chosenLine = linesTable[math.random(1, #linesTable)] local targetName = specificTargetName or player.DisplayName chosenLine = chosenLine:gsub("%[user display name%]", targetName) Chat:Chat(miniHead, chosenLine, Enum.ChatColor.White) end local function updateStats() -- Clamp Mood if affectionLevel > 25 then affectionLevel = 25 end if affectionLevel < -5 then affectionLevel = -5 end -- Clamp Hunger if hungerLevel > 100 then hungerLevel = 100 end if hungerLevel < 0 then hungerLevel = 0 end -- Update Mood Status if affectionLevel >= 15 then currentMood = "Cheerful" elseif affectionLevel >= 5 then currentMood = "Normal" elseif affectionLevel > 0 then currentMood = "Sad" else currentMood = "Angry" end -- Update UI Elements if moodLabel and moodBarFill then local percent = (affectionLevel + 5) / 30 percent = math.clamp(percent, 0, 1) moodBarFill.Size = UDim2.new(percent, 0, 1, 0) moodLabel.Text = "Mood: " .. currentMood if currentMood == "Cheerful" then moodBarFill.BackgroundColor3 = Color3.fromRGB(80, 220, 100) elseif currentMood == "Normal" then moodBarFill.BackgroundColor3 = Color3.fromRGB(240, 200, 50) elseif currentMood == "Sad" then moodBarFill.BackgroundColor3 = Color3.fromRGB(80, 150, 220) else moodBarFill.BackgroundColor3 = Color3.fromRGB(220, 60, 60) end end if hungerLabel and hungerBarFill then local hPercent = hungerLevel / 100 hungerBarFill.Size = UDim2.new(hPercent, 0, 1, 0) hungerLabel.Text = "Hunger: " .. math.floor(hungerLevel) .. "%" if hungerLevel > 60 then hungerBarFill.BackgroundColor3 = Color3.fromRGB(80, 220, 100) -- Green elseif hungerLevel > 30 then hungerBarFill.BackgroundColor3 = Color3.fromRGB(240, 150, 50) -- Orange else hungerBarFill.BackgroundColor3 = Color3.fromRGB(220, 60, 60) -- Red end end end local function addAffection() affectionEventCounter = affectionEventCounter + 1 affectionLevel = affectionLevel + 2 updateStats() end -- ========================================== -- UI CREATION -- ========================================== local ui = Instance.new("ScreenGui") ui.Name = "MiniMeMenu" ui.ResetOnSpawn = false pcall(function() ui.Parent = CoreGui end) if not ui.Parent then ui.Parent = player:WaitForChild("PlayerGui") end local toggleBtn = Instance.new("TextButton") toggleBtn.Size = UDim2.new(0, 60, 0, 60) toggleBtn.Position = UDim2.new(1, -80, 0.5, -30) toggleBtn.BackgroundColor3 = Color3.fromRGB(40, 40, 40) toggleBtn.TextColor3 = Color3.fromRGB(255, 255, 255) toggleBtn.TextScaled = true toggleBtn.Font = Enum.Font.SourceSansBold toggleBtn.Text = "Pet\nMenu" local toggleCorner = Instance.new("UICorner") toggleCorner.CornerRadius = UDim.new(1, 0) toggleCorner.Parent = toggleBtn toggleBtn.Parent = ui local function createBtn(name, text, parentFrame, layoutOrder) local btn = Instance.new("TextButton") btn.Size = UDim2.new(0.9, 0, 0, 45) btn.BackgroundColor3 = Color3.fromRGB(60, 60, 60) btn.TextColor3 = Color3.fromRGB(255, 255, 255) btn.TextScaled = true btn.Font = Enum.Font.SourceSansBold btn.Text = text btn.Name = name btn.LayoutOrder = layoutOrder local btnCorner = Instance.new("UICorner") btnCorner.CornerRadius = UDim.new(0, 8) btnCorner.Parent = btn btn.Parent = parentFrame return btn end local mainFrame = Instance.new("Frame") mainFrame.Size = UDim2.new(0, 200, 0, 420) -- Increased to fit Hunger Bar mainFrame.Position = UDim2.new(0.5, -100, 0.5, -180) mainFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 30) mainFrame.BorderSizePixel = 0 mainFrame.Visible = false mainFrame.Parent = ui local uiCornerMain = Instance.new("UICorner") uiCornerMain.CornerRadius = UDim.new(0, 10) uiCornerMain.Parent = mainFrame local layoutMain = Instance.new("UIListLayout") layoutMain.Parent = mainFrame layoutMain.Padding = UDim.new(0, 5) layoutMain.HorizontalAlignment = Enum.HorizontalAlignment.Center layoutMain.VerticalAlignment = Enum.VerticalAlignment.Center layoutMain.SortOrder = Enum.SortOrder.LayoutOrder local btnPat = createBtn("Pat", "Pat", mainFrame, 1) local btnCarry = createBtn("Carry", "Carry", mainFrame, 2) local btnFeed = createBtn("Feed", "Feed", mainFrame, 3) local btnHush = createBtn("Hush", "Hush", mainFrame, 4) local btnStop = createBtn("Stop", "Stop", mainFrame, 5) local btnClose = createBtn("Close", "Close", mainFrame, 6) btnClose.BackgroundColor3 = Color3.fromRGB(150, 50, 50) -- HUNGER BAR UI local hungerContainer = Instance.new("Frame") hungerContainer.Size = UDim2.new(0.9, 0, 0, 45) hungerContainer.BackgroundTransparency = 1 hungerContainer.LayoutOrder = 7 hungerContainer.Parent = mainFrame hungerLabel = Instance.new("TextLabel") hungerLabel.Size = UDim2.new(1, 0, 0, 20) hungerLabel.BackgroundTransparency = 1 hungerLabel.TextColor3 = Color3.fromRGB(255, 255, 255) hungerLabel.Font = Enum.Font.SourceSansBold hungerLabel.TextScaled = true hungerLabel.Text = "Hunger: 100%" hungerLabel.Parent = hungerContainer local hungerBarBack = Instance.new("Frame") hungerBarBack.Size = UDim2.new(1, 0, 0, 15) hungerBarBack.Position = UDim2.new(0, 0, 0, 25) hungerBarBack.BackgroundColor3 = Color3.fromRGB(50, 50, 50) local hbCorner = Instance.new("UICorner") hbCorner.CornerRadius = UDim.new(1, 0) hbCorner.Parent = hungerBarBack hungerBarBack.Parent = hungerContainer hungerBarFill = Instance.new("Frame") hungerBarFill.Size = UDim2.new(1, 0, 1, 0) hungerBarFill.BackgroundColor3 = Color3.fromRGB(80, 220, 100) local hbfCorner = Instance.new("UICorner") hbfCorner.CornerRadius = UDim.new(1, 0) hbfCorner.Parent = hungerBarFill hungerBarFill.Parent = hungerBarBack -- MOOD BAR UI local moodContainer = Instance.new("Frame") moodContainer.Size = UDim2.new(0.9, 0, 0, 45) moodContainer.BackgroundTransparency = 1 moodContainer.LayoutOrder = 8 moodContainer.Parent = mainFrame moodLabel = Instance.new("TextLabel") moodLabel.Size = UDim2.new(1, 0, 0, 20) moodLabel.BackgroundTransparency = 1 moodLabel.TextColor3 = Color3.fromRGB(255, 255, 255) moodLabel.Font = Enum.Font.SourceSansBold moodLabel.TextScaled = true moodLabel.Text = "Mood: Normal" moodLabel.Parent = moodContainer local moodBarBack = Instance.new("Frame") moodBarBack.Size = UDim2.new(1, 0, 0, 15) moodBarBack.Position = UDim2.new(0, 0, 0, 25) moodBarBack.BackgroundColor3 = Color3.fromRGB(50, 50, 50) local mbCorner = Instance.new("UICorner") mbCorner.CornerRadius = UDim.new(1, 0) mbCorner.Parent = moodBarBack moodBarBack.Parent = moodContainer moodBarFill = Instance.new("Frame") moodBarFill.Size = UDim2.new(0.5, 0, 1, 0) moodBarFill.BackgroundColor3 = Color3.fromRGB(240, 200, 50) local mbfCorner = Instance.new("UICorner") mbfCorner.CornerRadius = UDim.new(1, 0) mbfCorner.Parent = moodBarFill moodBarFill.Parent = moodBarBack local foodFrame = Instance.new("Frame") foodFrame.Size = UDim2.new(0, 220, 0, 350) foodFrame.Position = UDim2.new(0.5, -110, 0.5, -175) foodFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 30) foodFrame.BorderSizePixel = 0 foodFrame.Visible = false foodFrame.Parent = ui local uiCornerFood = Instance.new("UICorner") uiCornerFood.CornerRadius = UDim.new(0, 10) uiCornerFood.Parent = foodFrame local foodLayout = Instance.new("UIListLayout") foodLayout.Parent = foodFrame foodLayout.Padding = UDim.new(0, 5) foodLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center foodLayout.VerticalAlignment = Enum.VerticalAlignment.Top local topPadding = Instance.new("UIPadding") topPadding.PaddingTop = UDim.new(0, 5) topPadding.Parent = foodFrame local btnBack = createBtn("Back", "<- Back to Menu", foodFrame, 1) btnBack.BackgroundColor3 = Color3.fromRGB(150, 50, 50) local scrollFrame = Instance.new("ScrollingFrame") scrollFrame.Size = UDim2.new(1, 0, 1, -60) scrollFrame.BackgroundTransparency = 1 scrollFrame.BorderSizePixel = 0 scrollFrame.ScrollBarThickness = 6 scrollFrame.Parent = foodFrame local scrollLayout = Instance.new("UIListLayout") scrollLayout.Parent = scrollFrame scrollLayout.Padding = UDim.new(0, 5) scrollLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center for i, foodName in ipairs(foodKeys) do local fBtn = createBtn(foodName, foodName, scrollFrame, i) fBtn.Activated:Connect(function() forceChat(foodReactions[foodName]) addAffection() hungerLevel = hungerLevel + 40 -- Eating restores hunger! updateStats() foodFrame.Visible = false end) end scrollLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function() scrollFrame.CanvasSize = UDim2.new(0, 0, 0, scrollLayout.AbsoluteContentSize.Y + 10) end) -- Initialize the visuals for the first time updateStats() -- ========================================== -- BUTTON LOGIC & CONNECTIONS -- ========================================== toggleBtn.Activated:Connect(function() if mainFrame.Visible or foodFrame.Visible then mainFrame.Visible = false; foodFrame.Visible = false else mainFrame.Visible = true end end) btnClose.Activated:Connect(function() mainFrame.Visible = false end) btnFeed.Activated:Connect(function() mainFrame.Visible = false; foodFrame.Visible = true end) btnBack.Activated:Connect(function() foodFrame.Visible = false; mainFrame.Visible = true end) btnPat.Activated:Connect(function() forceChat(patLines) addAffection() end) btnCarry.Activated:Connect(function() isCarried = not isCarried if isCarried then btnCarry.Text = "Drop" forceChat(carryLines) addAffection() idleTrack:Stop(); runTrack:Stop(); sitTrack:Play() currentComplimentTarget = nil isDoingAffectionEvent = false isStaring = false isAngryStopped = false else btnCarry.Text = "Carry" miniRoot.CFrame = rootPart.CFrame * CFrame.new(3, 0, 3) sitTrack:Stop(); idleTrack:Play() end end) btnHush.Activated:Connect(function() isHushed = not isHushed if isHushed then btnHush.Text = "Talk" forceChat(hushLines) else btnHush.Text = "Hush" Chat:Chat(miniHead, "Yay I can speak again!", Enum.ChatColor.White) end end) btnStop.Activated:Connect(function() isStopped = not isStopped if isStopped then btnStop.Text = "Follow me" forceChat(stopLines) currentComplimentTarget = nil isDoingAffectionEvent = false isStaring = false else btnStop.Text = "Stop" Chat:Chat(miniHead, "On my way!", Enum.ChatColor.White) end end) -- ========================================== -- DEATH & RESPAWN LOGIC -- ========================================== if hasDiedAtLeastOnce then task.delay(1.5, function() forceChat(respawnLines) end) end humanoid.Died:Connect(function() hasDiedAtLeastOnce = true isActive = false if miniMe and miniHead then forceChat(deathLines) task.delay(3, function() if miniMe then miniMe:Destroy() end if ui then ui:Destroy() end end) end end) -- ========================================== -- MOOD & HUNGER DECAY LOOP -- ========================================== task.spawn(function() while isActive do task.wait(15) if not isCarried then affectionLevel = affectionLevel - 1 end hungerLevel = hungerLevel - 2 -- Hunger drops over time! updateStats() end end) -- ========================================== -- ANGRY STOPPING LOOP -- ========================================== task.spawn(function() while isActive do task.wait(math.random(15, 30)) if currentMood == "Angry" and not isCarried and not isStopped then isAngryStopped = true task.wait(20) isAngryStopped = false end end end) -- ========================================== -- THE BRAIN & MOVEMENT LOOP -- ========================================== task.spawn(function() local path = PathfindingService:CreatePath({ AgentRadius = 1, AgentHeight = 2, AgentCanJump = true }) while isActive do if not character:IsDescendantOf(workspace) or not miniMe:IsDescendantOf(workspace) then if miniMe then miniMe:Destroy() end if ui then ui:Destroy() end isActive = false break end local distanceToOwner = (rootPart.Position - miniRoot.Position).Magnitude if distanceToOwner > 35 then miniRoot.CFrame = rootPart.CFrame * CFrame.new(-2.5, 0, 2.5) isStaring = false isAngryStopped = false task.wait(0.2) continue end local closestDist = 20 local bestPlayer = nil for _, otherPlr in ipairs(Players:GetPlayers()) do if otherPlr ~= player and otherPlr.Character and otherPlr.Character:FindFirstChild("HumanoidRootPart") then local dist = (miniRoot.Position - otherPlr.Character.HumanoidRootPart.Position).Magnitude if dist < closestDist then closestDist = dist bestPlayer = otherPlr end end end closestOtherPlayer = bestPlayer if isCarried then if character:FindFirstChild("Head") then miniRoot.CFrame = character.Head.CFrame * CFrame.new(0, 1.2, 0) end task.wait() continue end if distanceToOwner > 20 then currentComplimentTarget = nil isDoingAffectionEvent = false end local baseSpeed = 16 if currentMood == "Cheerful" then baseSpeed = 22 end if currentMood == "Sad" or hungerLevel < 30 then baseSpeed = 12 end -- Walks slower when hungry! if distanceToOwner > 15 then miniHumanoid.WalkSpeed = 28 else miniHumanoid.WalkSpeed = baseSpeed end local speed = Vector3.new(miniRoot.AssemblyLinearVelocity.X, 0, miniRoot.AssemblyLinearVelocity.Z).Magnitude if speed > 1 then if not runTrack.IsPlaying then idleTrack:Stop(); runTrack:Play() end runTrack:AdjustSpeed(speed / 16) else if not idleTrack.IsPlaying then runTrack:Stop(); idleTrack:Play() end end if isStopped then task.wait(0.5) continue end if isStaring or isAngryStopped then if isStaring then miniRoot.CFrame = CFrame.lookAt(miniRoot.Position, Vector3.new(rootPart.Position.X, miniRoot.Position.Y, rootPart.Position.Z)) end task.wait(0.2) continue end local targetPos if isDoingAffectionEvent then targetPos = (rootPart.CFrame * CFrame.new(0, 0, -4)).Position elseif currentComplimentTarget and currentComplimentTarget.Character and currentComplimentTarget.Character:FindFirstChild("HumanoidRootPart") then local targetRoot = currentComplimentTarget.Character.HumanoidRootPart targetPos = (targetRoot.CFrame * CFrame.new(0, 0, -4)).Position else targetPos = (rootPart.CFrame * CFrame.new(-2.5, 0, 2.5)).Position end local distanceToTarget = (miniRoot.Position - targetPos).Magnitude if distanceToTarget > 2 then local success = pcall(function() path:ComputeAsync(miniRoot.Position, targetPos) end) if success and path.Status == Enum.PathStatus.Success then local waypoints = path:GetWaypoints() if #waypoints >= 2 then if waypoints[2].Action == Enum.PathWaypointAction.Jump then miniHumanoid.Jump = true end miniHumanoid:MoveTo(waypoints[2].Position) end else miniHumanoid:MoveTo(targetPos) end elseif isDoingAffectionEvent and distanceToTarget <= 2 then miniRoot.CFrame = CFrame.lookAt(miniRoot.Position, Vector3.new(rootPart.Position.X, miniRoot.Position.Y, rootPart.Position.Z)) end task.wait(0.2) end end) -- ========================================== -- THE TALKING LOOP -- ========================================== task.spawn(function() while isActive do local chatWait = math.random(6, 16) if currentMood == "Cheerful" then chatWait = math.random(4, 10) elseif currentMood == "Sad" then chatWait = math.random(15, 25) end task.wait(chatWait) if not isActive or not miniMe:IsDescendantOf(workspace) then break end if isHushed then continue end if currentMood == "Angry" then continue end if currentMood == "Sad" and math.random() > 0.9 and not isCarried and not isStopped then isStaring = true task.wait(10) isStaring = false continue end if isCarried or isStopped then if hungerLevel < 30 and math.random() > 0.3 then forceChat(hungerLines) else forceChat(randomLines) end continue end if affectionEventCounter >= affectionEventThreshold and math.random() > 0.4 then isDoingAffectionEvent = true local timeout = 5 while isDoingAffectionEvent and timeout > 0 do task.wait(1) timeout = timeout - 1 local dist = (miniRoot.Position - rootPart.Position).Magnitude if dist <= 6 then break end end if isDoingAffectionEvent then miniRoot.CFrame = CFrame.lookAt(miniRoot.Position, Vector3.new(rootPart.Position.X, miniRoot.Position.Y, rootPart.Position.Z)) forceChat(specialAffectionLines, player.DisplayName) task.wait(3.5) affectionEventCounter = 0 isDoingAffectionEvent = false end continue end -- PRIORITY: Hunger Lines if starving! if hungerLevel < 30 and math.random() > 0.3 then forceChat(hungerLines) elseif closestOtherPlayer and math.random() > 0.5 then currentComplimentTarget = closestOtherPlayer local timeout = 5 while currentComplimentTarget and timeout > 0 do task.wait(1) timeout = timeout - 1 if currentComplimentTarget and currentComplimentTarget.Character and currentComplimentTarget.Character:FindFirstChild("HumanoidRootPart") then local dist = (miniRoot.Position - currentComplimentTarget.Character.HumanoidRootPart.Position).Magnitude if dist <= 6 then break end else currentComplimentTarget = nil break end end if currentComplimentTarget then miniRoot.CFrame = CFrame.lookAt(miniRoot.Position, Vector3.new(currentComplimentTarget.Character.HumanoidRootPart.Position.X, miniRoot.Position.Y, currentComplimentTarget.Character.HumanoidRootPart.Position.Z)) forceChat(complimentLines, currentComplimentTarget.DisplayName) task.wait(2.5) currentComplimentTarget = nil end else forceChat(randomLines) end end end) end if player.Character then task.spawn(createMiniMe, player.Character) end player.CharacterAdded:Connect(createMiniMe)