local ok, Rayfield = pcall(function() return loadstring(game:HttpGet('https://sirius.menu/rayfield'))() end) if not ok or not Rayfield then local ScreenGui = Instance.new("ScreenGui") local Frame = Instance.new("Frame") local Label = Instance.new("TextLabel") ScreenGui.Parent = game.CoreGui Frame.Parent = ScreenGui Frame.Size = UDim2.new(0, 200, 0, 50) Frame.Position = UDim2.new(0.5, -100, 0, 10) Frame.BackgroundColor3 = Color3.fromRGB(30, 30, 30) Label.Parent = Frame Label.Size = UDim2.new(1, 0, 1, 0) Label.Text = "Rayfield failed! Enable HTTP requests." Label.TextColor3 = Color3.fromRGB(255, 0, 0) Label.BackgroundTransparency = 1 return end local Window = Rayfield:CreateWindow({Name = "Portal Fruit Colors"}) local Tab = Window:CreateTab("Main") -- Permanent Save System getgenv().PortalColors = getgenv().PortalColors or { color1 = Color3.fromRGB(0, 162, 255), color2 = Color3.fromRGB(255, 0, 255), dualMode = false, spd = 2, } local color1 = getgenv().PortalColors.color1 local color2 = getgenv().PortalColors.color2 local spd = getgenv().PortalColors.spd local dualMode = getgenv().PortalColors.dualMode local autoV4 = false local player = game.Players.LocalPlayer local RunService = game:GetService("RunService") local Workspace = game:GetService("Workspace") local VirtualInputManager = game:GetService("VirtualInputManager") local KEYWORDS = { "portal","rift","dimension","gate","warp","dash","void","tear", "space","tunnel","fruit","skill","move","effect","vfx","hit", "blast","aura","wave","slash","projectile","orb","v4","awaken", "awakening","godly","divine","ascend","transform","ultra","mode", "power","energy","pulse","surge","burst","glow","ring","halo", "thunder","lightning","flame","shadow","radiant","sphere","pillar", "nova","rune","mark","sigil","symbol","seal", "particle","emitter","trail","impact","explode","explosion", "magic","spell","cast","ability","ultimate","special","super", "attack","combo","charge","buff","debuff","status","stun", "fire","ice","water","wind","earth","poison","electric","holy", "death","soul","spirit","ghost","demon","angel","dragon", "hurt","damage","strike","smash","crush","shatter", "shield","barrier","wall","block","guard","defend", "heal","regen","restore","boost","speed","fly","jump", "smoke","cloud","mist","fog","dust","sand","snow", "star","moon","sun","galaxy","cosmic","astral","celestial", "zombie","arena","spawn","boss","mob","enemy","monster", "blood","gore","splat","flesh","dead","undead","infected", "weapon","gun","sword","knife","axe","bullet","shoot", "melee","ranged","shotgun","rifle","pistol","smg", "kill","respawn","revive","down","knock","critical", "upgrade","level","xp","coin","drop","loot","reward", "tower","base","survive","round","timer","countdown", } local BODY_PARTS = { head=true,torso=true,["left arm"]=true,["right arm"]=true, ["left leg"]=true,["right leg"]=true,humanoidrootpart=true, uppertorso=true,lowertorso=true,leftupperarm=true,leftelbow=true, leftlowerarm=true,leftwrist=true,lefthand=true,rightupperarm=true, rightelbow=true,rightlowerarm=true,rightwrist=true,righthand=true, leftupperleg=true,leftknee=true,leftlowerleg=true,leftankle=true, leftfoot=true,rightupperleg=true,rightknee=true,rightlowerleg=true, rightankle=true,rightfoot=true,handle=true,mesh=true, } local function nameMatches(name) if typeof(name) ~= "string" then return false end local lower = name:lower() for _, kw in ipairs(KEYWORDS) do if lower:find(kw, 1, true) then return true end end return false end local function isBodyPart(v) if not v or not v.Parent then return false end if BODY_PARTS[v.Name:lower()] then return true end local char = player.Character if char and v.Parent == char then return true end if v.Parent:FindFirstChildOfClass("Humanoid") then return true end return false end local function getColor() if dualMode then return Color3.new( (color1.R+color2.R)/2, (color1.G+color2.G)/2, (color1.B+color2.B)/2 ) end return color1 end local function buildCS(original) if dualMode then return ColorSequence.new(color1, color2) end local ok2, kps = pcall(function() return original.Keypoints end) if not ok2 or not kps then return ColorSequence.new(color1) end if #kps == 2 then return ColorSequence.new(color1) end local new = {} for i, kp in ipairs(kps) do new[i] = ColorSequenceKeypoint.new(kp.Time, color1) end return ColorSequence.new(new) end local function apply(v) if not v or not v.Parent then return end pcall(function() local c = getColor() if v:IsA("ParticleEmitter") or v:IsA("Trail") or v:IsA("Beam") then v.Color = buildCS(v.Color) elseif v:IsA("PointLight") or v:IsA("SpotLight") or v:IsA("SurfaceLight") then v.Color = c elseif v:IsA("BasePart") then if isBodyPart(v) then return end if v.Material == Enum.Material.Neon or nameMatches(v.Name) or v.Transparency > 0.3 then v.Color = c v.BrickColor = BrickColor.new(c) end elseif v:IsA("SpecialMesh") then local p = v.Parent if p and not isBodyPart(p) and nameMatches(p.Name) then v.VertexColor = Vector3.new(c.R, c.G, c.B) end elseif v:IsA("SurfaceAppearance") then local p = v.Parent if p and p:IsA("BasePart") and not isBodyPart(p) then p.Color = c end elseif v:IsA("Decal") or v:IsA("Texture") then local p = v.Parent if p and not isBodyPart(p) then v.Color = c end elseif v:IsA("SelectionBox") or v:IsA("SelectionSphere") then v.Color3 = c v.SurfaceColor3 = c elseif v:IsA("ImageLabel") or v:IsA("ImageButton") then v.ImageColor3 = c elseif v:IsA("Frame") or v:IsA("TextLabel") or v:IsA("TextButton") then if v.BackgroundTransparency < 1 then v.BackgroundColor3 = c end end end) end local cached, conns = {}, {} local function uncache(inst) cached[inst] = nil if conns[inst] then conns[inst]:Disconnect() conns[inst] = nil end end local function cache(inst) if not inst or cached[inst] then return end cached[inst] = true conns[inst] = inst.AncestryChanged:Connect(function() if not inst:IsDescendantOf(game) then uncache(inst) end end) end local function cacheDeep(obj) if not obj then return end pcall(function() apply(obj) cache(obj) for _, v in pairs(obj:GetDescendants()) do apply(v) cache(v) end end) end local function applyAllCached() for inst in pairs(cached) do if inst and inst.Parent then pcall(apply, inst) else uncache(inst) end end end local function applyChar() local char = player.Character if not char then return end for _, v in pairs(char:GetDescendants()) do if v:IsA("ParticleEmitter") or v:IsA("Trail") or v:IsA("Beam") then pcall(function() v.Color = buildCS(v.Color) end) elseif v:IsA("PointLight") or v:IsA("SpotLight") or v:IsA("SurfaceLight") then pcall(function() v.Color = getColor() end) elseif v:IsA("BasePart") and not isBodyPart(v) and nameMatches(v.Name) then pcall(function() local c = getColor() v.Color = c v.BrickColor = BrickColor.new(c) end) end end end local rainbowConn, watcherConn, monitorConn local function rainbowToggle(on) if rainbowConn then rainbowConn:Disconnect() rainbowConn = nil end if not on then return end local h = 0 rainbowConn = RunService.RenderStepped:Connect(function(dt) h = (h + dt * spd * 0.1) % 1 color1 = Color3.fromHSV(h, 1, 1) if dualMode then color2 = Color3.fromHSV((h + 0.5) % 1, 1, 1) end end) end local function startWatcher() if watcherConn then watcherConn:Disconnect() end watcherConn = Workspace.DescendantAdded:Connect(function(obj) if not obj or not obj.Parent then return end task.wait() if nameMatches(obj.Name) then cacheDeep(obj) elseif obj.Parent and nameMatches(obj.Parent.Name) then apply(obj) cache(obj) end end) end local function startMonitor() if monitorConn then monitorConn:Disconnect() end monitorConn = RunService.Heartbeat:Connect(function() applyChar() applyAllCached() end) end local function refreshAll() applyChar() applyAllCached() end local function saveColors() getgenv().PortalColors.color1 = color1 getgenv().PortalColors.color2 = color2 getgenv().PortalColors.dualMode = dualMode getgenv().PortalColors.spd = spd Rayfield:Notify({Title="Saved", Content="Colors saved permanently! Next script load will use these.", Duration=5}) end -- ==================== AUTO V4 ==================== local function isPortalEquipped() local char = player.Character if not char then return false end local tool = char:FindFirstChildOfClass("Tool") return tool and tool.Name:find("Portal") end local function isV4Ready() local char = player.Character if not char then return false end local hum = char:FindFirstChild("Humanoid") if not hum or hum.Health <= 0 then return false end return true end local v4Conn local function toggleAutoV4(state) autoV4 = state if v4Conn then v4Conn:Disconnect() v4Conn = nil end if not state then return end v4Conn = RunService.Heartbeat:Connect(function() if not autoV4 then return end if not isPortalEquipped() then return end if not isV4Ready() then return end pcall(function() VirtualInputManager:SendKeyEvent(true, Enum.KeyCode.Y, false, game) task.wait(0.1) VirtualInputManager:SendKeyEvent(false, Enum.KeyCode.Y, false, game) end) task.wait(15) end) end -- ==================== UI ==================== Tab:CreateColorPicker({Name="Color 1", Color=color1, Callback=function(v) rainbowToggle(false) color1 = v refreshAll() end}) Tab:CreateColorPicker({Name="Color 2 (Dual Mode)", Color=color2, Callback=function(v) rainbowToggle(false) color2 = v refreshAll() end}) Tab:CreateToggle({Name="Dual Color Mode", CurrentValue=dualMode, Callback=function(v) dualMode = v refreshAll() end}) Tab:CreateToggle({Name="Rainbow", Callback=rainbowToggle}) Tab:CreateSlider({Name="Rainbow Speed", Range={0.5,5}, CurrentValue=spd, Callback=function(v) spd = v end}) Tab:CreateToggle({Name="Auto V4 Transformation", CurrentValue=false, Callback=function(v) toggleAutoV4(v) end}) Tab:CreateButton({Name="Save Colors Permanently", Callback=saveColors}) Tab:CreateButton({Name="Apply & Monitor", Callback=function() startMonitor() startWatcher() refreshAll() end}) Tab:CreateButton({Name="Join Discord Server", Callback=function() setclipboard("https://discord.gg/3Gx5MDHqF") Rayfield:Notify({Title="Discord", Content="Invite copied!", Duration=3}) end}) player.CharacterAdded:Connect(function() task.wait(1.5) applyChar() startMonitor() startWatcher() end) local char = player.Character or player.CharacterAdded:Wait() task.wait(2) startMonitor() startWatcher() applyChar() Rayfield:Notify({ Title = "Portal Fruit Colors", Content = "Loaded! Use 'Save Colors Permanently' to keep your settings.", Duration = 6 })