local Players = game:GetService("Players") local Lighting = game:GetService("Lighting") local RunService = game:GetService("RunService") local LocalPlayer = Players.LocalPlayer math.randomseed(tick()) local function rgb(r,g,b) return Color3.fromRGB(r,g,b) end local function randomColor() return Color3.new(math.random(), math.random(), math.random()) end local function invertColor(c) return Color3.new(1 - c.R, 1 - c.G, 1 - c.B) end local function hsvToRgb(h, s, v) local c = v * s local x = c * (1 - math.abs((h / 60) % 2 - 1)) local m = v - c local r, g, b = 0, 0, 0 if h < 60 then r, g, b = c, x, 0 elseif h < 120 then r, g, b = x, c, 0 elseif h < 180 then r, g, b = 0, c, x elseif h < 240 then r, g, b = 0, x, c elseif h < 300 then r, g, b = x, 0, c else r, g, b = c, 0, x end return Color3.new(r + m, g + m, b + m) end local PALETTE = { GREY = rgb(140,140,140), DARK_GREY = rgb(85,85,85), ALMOST_BLACK = rgb(30,30,30), PINK = rgb(255,170,200), LIGHT_PINK = rgb(255,200,220), CRIMSON = rgb(120,30,40), WHITE = rgb(235,235,235), BLACK = rgb(0,0,0), CYAN = rgb(0,200,255), NEON_GREEN = rgb(50,255,100), PURPLE = rgb(180,50,255), ORANGE = rgb(255,140,0), GOLD = rgb(255,215,0) } do Lighting.Ambient = rgb(120,120,120) Lighting.OutdoorAmbient = rgb(90,90,90) Lighting.Brightness = 2 local cc = Instance.new("ColorCorrectionEffect") cc.TintColor = rgb(255,200,215) cc.Brightness = 0.1 cc.Contrast = 0.15 cc.Saturation = -0.25 cc.Parent = Lighting local bloom = Instance.new("BloomEffect") bloom.Intensity = 0.6 bloom.Size = 24 bloom.Threshold = 0.8 bloom.Parent = Lighting end local PHIGHTING_FACES = { --banhammer "rbxassetid://12663739973", "rbxassetid://15201503293", "rbxassetid://15201503858", "rbxassetid://15201504904", --boombox "rbxassetid://11362511478", "rbxassetid://11362512500", "rbxassetid://11362513651", --astrobox "rbxassetid://7294779767", --coil "rbxassetid://18964052238", "rbxassetid://18964052057", "rbxassetid://18964052393", --hyperlaserkatana "rbxassetid://10666225215", "rbxassetid://10666225117", "rbxassetid://10666224987", --medkit "rbxassetid://12996388651", "rbxassetid://13035024570", "rbxassetid://13035026041", "rbxassetid://13035027563", --rocket "rbxassetid://79456612925473", "rbxassetid://114172010068200", "rbxassetid://77487540847740", --skateboard "rbxassetid://79444090478332", "rbxassetid://129692254425837", "rbxassetid://112369994631553", "rbxassetid://117789483333523", "rbxassetid://103737043081386", --slingshot/catshot "rbxassetid://11362362820", "rbxassetid://11362363896", "rbxassetid://11362365140", "rbxassetid://9136774350", "rbxassetid://10651080555", "rbxassetid://10651080326", "rbxassetid://10651080056", --subspace/grieferspace "rbxassetid://15398700458", "rbxassetid://81638130989263", "rbxassetid://128033514971806", "rbxassetid://121317942950887", "rbxassetid://87657165335729", "rbxassetid://138748378825337", "rbxassetid://127159459680988", "rbxassetid://76183115695777", --sword(john phihting) "rbxassetid://7502110493", "rbxassetid://18271727904", "rbxassetid://18271950515", "rbxassetid://18271950368", "rbxassetid://18271950214", --marshmallowsword "rbxassetid://10753371621", "rbxassetid://10753371196", "rbxassetid://10753371129", --npcs "rbxassetid://10651079103", --valk "rbxassetid://9127752391", --dom "rbxassetid://3868600", --settoing "rbxassetid://11219882791", --broker "rbxassetid://11614952566", --zuka "rbxassetid://14054828639" --traffic } local REMOVE_ACCESSORIES = { "Hair", "Hat", "FaceAccessory", "Mask", "Hood", "Helmet", "Cap", "Beanie", "Crown", "Bandana", "Visor", "Headband" } local function shouldRemoveAccessory(accessory) local name = accessory.Name:lower() for _, keyword in ipairs(REMOVE_ACCESSORIES) do if name:find(keyword:lower()) then return true end end if accessory:IsA("Accessory") then local accType = tostring(accessory.AccessoryType) for _, keyword in ipairs(REMOVE_ACCESSORIES) do if accType:find(keyword) then return true end end end return false end local DUMMIES = { starterdummy = { Head = PALETTE.GREY, Torso = PALETTE.ALMOST_BLACK, Limbs = PALETTE.DARK_GREY, Accessories = PALETTE.DARK_GREY }, horrordummy = { All = PALETTE.ALMOST_BLACK, Accessories = PALETTE.ALMOST_BLACK }, rig = { All = PALETTE.GREY, Accessories = PALETTE.GREY }, saddummy = { Head = PALETTE.GREY, Arms = PALETTE.GREY, Torso = PALETTE.ALMOST_BLACK, Legs = PALETTE.DARK_GREY, Accessories = PALETTE.GREY }, partydummy = { Head = PALETTE.GREY, Torso = PALETTE.LIGHT_PINK, Limbs = PALETTE.GREY, Accessories = PALETTE.LIGHT_PINK }, clowndummy = { Head = PALETTE.GREY, Torso = PALETTE.WHITE, LeftLeg = PALETTE.LIGHT_PINK, RightLeg = PALETTE.PINK, Arms = PALETTE.GREY, Accessories = PALETTE.PINK }, lovedummy = { Head = PALETTE.GREY, Arms = PALETTE.GREY, Torso = PALETTE.ALMOST_BLACK, Legs = PALETTE.CRIMSON, Accessories = PALETTE.CRIMSON }, chilldummy = { Head = PALETTE.GREY, Arms = PALETTE.GREY, Torso = PALETTE.DARK_GREY, Legs = PALETTE.DARK_GREY, Accessories = PALETTE.GREY }, rainbowdummy = { Rainbow = true, Accessories = "Rainbow" }, neondummy = { Head = PALETTE.NEON_GREEN, Torso = PALETTE.CYAN, Arms = PALETTE.PURPLE, Legs = PALETTE.ORANGE, Accessories = PALETTE.NEON_GREEN, Neon = true }, golddummy = { All = PALETTE.GOLD, Accessories = PALETTE.GOLD, Neon = true }, frozendummy = { Head = PALETTE.WHITE, Torso = PALETTE.CYAN, Limbs = rgb(150,200,255), Accessories = PALETTE.CYAN }, lavadummy = { Head = PALETTE.ALMOST_BLACK, Torso = rgb(255,80,0), Limbs = rgb(200,50,0), Accessories = rgb(255,80,0), Neon = true }, ghostdummy = { All = PALETTE.WHITE, Accessories = PALETTE.WHITE, Transparency = 0.3 }, checkerdummy = { Checker = true, Accessories = PALETTE.BLACK }, randomskin = { Random = true, Accessories = "Random" }, inverted = { Invert = true, Accessories = "Invert" }, random_inverted = { RandomInvert = true, Accessories = "RandomInvert" } } local DUMMY_FACE_MAP = { starterdummy = "STARTER", horrordummy = "HORROR", rig = "RIG", saddummy = "LOVE", partydummy = "PARTY", clowndummy = "CLOWN", lovedummy = "SAD", chilldummy = "CHILL", rainbowdummy = "ALL", neondummy = "ALL", golddummy = "ALL", frozendummy = "CHILL", lavadummy = "HORROR", ghostdummy = "HORROR", checkerdummy = "ALL", randomskin = "ALL", inverted = "ALL", random_inverted = "ALL" } local FACE_POOLS = { ALL = PHIGHTING_FACES, STARTER = { "rbxassetid://910076130" }, HORROR = { "rbxassetid://15398700458", "rbxassetid://81638130989263", "rbxassetid://128033514971806", "rbxassetid://121317942950887", "rbxassetid://87657165335729", "rbxassetid://138748378825337", "rbxassetid://127159459680988", "rbxassetid://76183115695777" }, RIG = { "rbxassetid://3868600", "rbxassetid://7502110493" }, SAD = { "rbxassetid://11362362820", "rbxassetid://11362363896", "rbxassetid://11362365140", "rbxassetid://9136774350" }, PARTY = { "rbxassetid://11362511478", "rbxassetid://11362512500", "rbxassetid://11362513651", "rbxassetid://79444090478332" }, CLOWN = { "rbxassetid://9136774350", "rbxassetid://10651080555" }, LOVE = { "rbxassetid://10753371621", "rbxassetid://10753371196", "rbxassetid://10753371129" }, CHILL = { "rbxassetid://11614952566", "rbxassetid://12996388651", "rbxassetid://13035024570" } } local NPC_DUMMY_MAP = { StarterDummy = "starterdummy", TutorialDummy = "rig", ObbyDummy = "rig", TapeDummy = "chilldummy", LoveDummy = "lovedummy", PartyDummy = "partydummy", ClownDummy = "clowndummy", SadDummy = "saddummy", ChillDummy = "chilldummy", Valk = "chilldummy", Dom = "rig", Broker = "rig", Zuka = "chilldummy", Traffic = "rig", Settoing = "rig" } local DUMMY_KEYS = {} for k in pairs(DUMMIES) do if k ~= "starterdummy" then table.insert(DUMMY_KEYS, k) end end local rainbowCharacters = {} RunService.Heartbeat:Connect(function() local hue = (tick() * 50) % 360 for character, _ in pairs(rainbowCharacters) do if character and character.Parent then for _, part in ipairs(character:GetChildren()) do if part:IsA("BasePart") then part.Color = hsvToRgb(hue, 1, 1) end end for _, accessory in ipairs(character:GetChildren()) do if accessory:IsA("Accessory") then local handle = accessory:FindFirstChild("Handle") if handle and handle:IsA("BasePart") then handle.Color = hsvToRgb(hue, 1, 1) end end end else rainbowCharacters[character] = nil end end end) local function stripCharacter(character) for _,obj in ipairs(character:GetChildren()) do if obj:IsA("Shirt") or obj:IsA("Pants") or obj:IsA("ShirtGraphic") then obj:Destroy() end if obj:IsA("Accessory") and shouldRemoveAccessory(obj) then obj:Destroy() end end end local function removeBodyColors(character) local bc = character:FindFirstChildOfClass("BodyColors") if bc then bc:Destroy() end end local function forceBlocky(character) for _,obj in ipairs(character:GetDescendants()) do if obj:IsA("CharacterMesh") then obj:Destroy() end if obj:IsA("SpecialMesh") and obj.Parent then local parent = obj.Parent local isBodyPart = parent.Name == "Head" or parent.Name == "Torso" or parent.Name == "UpperTorso" or parent.Name == "LowerTorso" or parent.Name:find("Arm") or parent.Name:find("Leg") if isBodyPart and parent.Name ~= "Head" then obj:Destroy() end end end end local function recolorAccessories(character, dummy, baseColor) local accessoryColor = dummy.Accessories for _, accessory in ipairs(character:GetChildren()) do if accessory:IsA("Accessory") then local handle = accessory:FindFirstChild("Handle") if handle and handle:IsA("BasePart") then local mesh = handle:FindFirstChildOfClass("SpecialMesh") if mesh then mesh.TextureId = "" end local c = handle.Color if accessoryColor == "Rainbow" then elseif accessoryColor == "Random" then c = randomColor() elseif accessoryColor == "Invert" then c = invertColor(c) elseif accessoryColor == "RandomInvert" then c = invertColor(baseColor) elseif type(accessoryColor) == "userdata" then c = accessoryColor end handle.Color = c if dummy.Neon then handle.Material = Enum.Material.Neon else handle.Material = Enum.Material.SmoothPlastic end if dummy.Transparency then handle.Transparency = dummy.Transparency end end end end end local STANDARD_LIMBS = { "Head", "Torso", "UpperTorso", "LowerTorso", "Left Arm", "Right Arm", "LeftUpperArm", "RightUpperArm", "LeftLowerArm", "RightLowerArm", "LeftHand", "RightHand", "Left Leg", "Right Leg", "LeftUpperLeg", "RightUpperLeg", "LeftLowerLeg", "RightLowerLeg", "LeftFoot", "RightFoot", "HumanoidRootPart" } local function isStandardLimb(partName) for _, limb in ipairs(STANDARD_LIMBS) do if partName == limb then return true end end return false end local function recolorNPCParts(character, dummy, baseColor) local accessoryColor = dummy.Accessories or dummy.All for _, part in ipairs(character:GetChildren()) do if part:IsA("BasePart") and not isStandardLimb(part.Name) then local mesh = part:FindFirstChildOfClass("SpecialMesh") if mesh then mesh.TextureId = "" end local c = part.Color if accessoryColor == "Rainbow" then elseif accessoryColor == "Random" or dummy.Random then c = randomColor() elseif accessoryColor == "Invert" or dummy.Invert then c = invertColor(c) elseif accessoryColor == "RandomInvert" or dummy.RandomInvert then c = invertColor(baseColor) elseif type(accessoryColor) == "userdata" then c = accessoryColor end part.Color = c if dummy.Neon then part.Material = Enum.Material.Neon else part.Material = Enum.Material.SmoothPlastic end if dummy.Transparency then part.Transparency = dummy.Transparency end end end end local function applyDummy(character, dummyName) local dummy = DUMMIES[dummyName] if not dummy then return end stripCharacter(character) local baseColor = randomColor() local isRainbow = dummy.Rainbow if isRainbow then rainbowCharacters[character] = true else rainbowCharacters[character] = nil end local partIndex = 0 for _,part in ipairs(character:GetChildren()) do if part:IsA("BasePart") and isStandardLimb(part.Name) then part.Material = dummy.Neon and Enum.Material.Neon or Enum.Material.SmoothPlastic local c = part.Color if dummy.Rainbow then c = hsvToRgb((tick() * 50) % 360, 1, 1) elseif dummy.Checker then partIndex = partIndex + 1 c = (partIndex % 2 == 0) and PALETTE.WHITE or PALETTE.BLACK elseif dummy.Random then c = randomColor() elseif dummy.Invert then c = invertColor(c) elseif dummy.RandomInvert then c = invertColor(baseColor) elseif dummy.All then c = dummy.All elseif part.Name == "Head" and dummy.Head then c = dummy.Head elseif part.Name:find("Arm") and dummy.Arms then c = dummy.Arms elseif part.Name:find("Leg") and dummy.Legs then c = dummy.Legs elseif (part.Name == "Torso" or part.Name == "UpperTorso") and dummy.Torso then c = dummy.Torso elseif part.Name == "LeftLeg" and dummy.LeftLeg then c = dummy.LeftLeg elseif part.Name == "RightLeg" and dummy.RightLeg then c = dummy.RightLeg elseif dummy.Limbs then c = dummy.Limbs end part.Color = c if dummy.Transparency then part.Transparency = dummy.Transparency end end end recolorAccessories(character, dummy, baseColor) recolorNPCParts(character, dummy, baseColor) local head = character:FindFirstChild("Head") if head then local face = head:FindFirstChildOfClass("Decal") if face then local poolName = DUMMY_FACE_MAP[dummyName] or "ALL" local pool = FACE_POOLS[poolName] or FACE_POOLS.ALL face.Texture = pool[math.random(#pool)] face.Color3 = (head.Color:Luminance() < 0.45) and PALETTE.WHITE or PALETTE.BLACK end end end local function safeApplyDummy(character, dummyName) if not character or not character.Parent then return end local humanoid = character:WaitForChild("Humanoid", 5) local head = character:WaitForChild("Head", 5) if not humanoid or not head then return end removeBodyColors(character) forceBlocky(character) stripCharacter(character) local face = head:FindFirstChildOfClass("Decal") if not face then face = Instance.new("Decal") face.Name = "face" face.Parent = head end task.wait() task.wait() applyDummy(character, dummyName) end local processedCharacters = {} local function onCharacterAdded(player, character) processedCharacters[character] = true local humanoid = character:WaitForChild("Humanoid", 5) local head = character:WaitForChild("Head", 5) if not humanoid or not head then return end local face = head:FindFirstChildOfClass("Decal") if not face then face = Instance.new("Decal") face.Name = "face" face.Parent = head end task.wait(0.5) if player == LocalPlayer then safeApplyDummy(character, "starterdummy") else safeApplyDummy(character, DUMMY_KEYS[math.random(#DUMMY_KEYS)]) end local lastCheck = tick() local connection connection = RunService.Heartbeat:Connect(function() if not character or not character.Parent then connection:Disconnect() processedCharacters[character] = nil return end if tick() - lastCheck > 2 then lastCheck = tick() local hasClothing = false for _, obj in ipairs(character:GetChildren()) do if obj:IsA("Shirt") or obj:IsA("Pants") or obj:IsA("ShirtGraphic") then hasClothing = true break end if obj:IsA("Accessory") and shouldRemoveAccessory(obj) then hasClothing = true break end end if hasClothing then if player == LocalPlayer then safeApplyDummy(character, "starterdummy") else safeApplyDummy(character, DUMMY_KEYS[math.random(#DUMMY_KEYS)]) end end end end) humanoid.Died:Connect(function() if connection then connection:Disconnect() end processedCharacters[character] = nil end) end for _,player in ipairs(Players:GetPlayers()) do if player.Character and not processedCharacters[player.Character] then task.spawn(onCharacterAdded, player, player.Character) end player.CharacterAdded:Connect(function(char) task.spawn(onCharacterAdded, player, char) end) end Players.PlayerAdded:Connect(function(player) player.CharacterAdded:Connect(function(char) task.spawn(onCharacterAdded, player, char) end) if player.Character and not processedCharacters[player.Character] then task.spawn(onCharacterAdded, player, player.Character) end end) local function handleNPC(model) if not model:IsA("Model") then return end if Players:GetPlayerFromCharacter(model) then return end local humanoid = model:FindFirstChildOfClass("Humanoid") if not humanoid then humanoid = model:WaitForChild("Humanoid", 5) end if not humanoid then return end task.wait() local dummyName = NPC_DUMMY_MAP[model.Name] or "rig" safeApplyDummy(model, dummyName) end for _,desc in ipairs(workspace:GetDescendants()) do if desc:IsA("Model") then task.spawn(handleNPC, desc) end end workspace.DescendantAdded:Connect(function(desc) if desc:IsA("Model") then task.spawn(handleNPC, desc) end end) print("Trapped.")