local RunService = game:GetService("RunService") local character = script.Parent local root = character:WaitForChild("HumanoidRootPart") local torso = character:WaitForChild("Torso") local rootJoint = root:WaitForChild("RootJoint") local humanoid = character:WaitForChild("Humanoid") -- PHYSICS TUNING local TENSION = 210 local DAMPING = 8 local SQUISH_INTENSITY = 0.012 local currentScale = 1 local velocityScale = 0 local lastVelocityY = 0 local originalRootC1 = rootJoint.C1 local objects = {} -- SOUNDS local jumpSound = Instance.new("Sound") jumpSound.SoundId = "rbxassetid://111539020190610" jumpSound.Volume = 0.4 jumpSound.Parent = root local landSound = Instance.new("Sound") landSound.SoundId = "rbxassetid://112358504840457" landSound.Volume = 0.4 landSound.Parent = root local function playJumpSound() jumpSound:Play() end local function playLandSound() landSound:Play() end local spawnTime = time() -- Setup objects local function setup() objects = {} for _, v in ipairs(character:GetDescendants()) do local isBody = v:IsA("BasePart") and v.Parent == character and v.Name ~= "HumanoidRootPart" local isAcc = v:IsA("BasePart") and v.Name == "Handle" and v.Parent:IsA("Accessory") if isBody or isAcc then local joint pcall(function() joint = v:FindFirstChildOfClass("Motor6D") or v:FindFirstChildOfClass("Weld") if not joint and isBody then for _, m in ipairs(torso:GetChildren()) do if m:IsA("Motor6D") and m.Part1 == v then joint = m break end end end end) if v.Name == "Head" then pcall(function() v.Transparency = 1 for _, child in ipairs(v:GetChildren()) do if child:IsA("Decal") then child.Transparency = 1 end end end) end local mesh = v:FindFirstChildOfClass("SpecialMesh") local meshScale = mesh and mesh.Scale or Vector3.new(1,1,1) objects[v] = { Size = v.Size, Joint = joint, C0 = joint and joint.C0 or nil, Mesh = mesh, MeshScale = meshScale, Name = v.Name } end end end torso.Touched:Connect(function(hit) pcall(function() if time() - spawnTime < 1.5 then return end if hit:IsDescendantOf(character) then return end local relativeVelocity = hit.AssemblyLinearVelocity - root.AssemblyLinearVelocity if relativeVelocity.Y < -14 then velocityScale = velocityScale - (math.abs(relativeVelocity.Y) * 1.35) playLandSound() end end) end) local head = character:FindFirstChild("Head") if head then head.Touched:Connect(function(hit) pcall(function() if time() - spawnTime < 1.5 then return end if hit:IsDescendantOf(character) then return end velocityScale = velocityScale - 15 playLandSound() end) end) end humanoid.StateChanged:Connect(function(_, newState) pcall(function() if newState == Enum.HumanoidStateType.Jumping then velocityScale = velocityScale - 3 playJumpSound() end if newState == Enum.HumanoidStateType.Landed then velocityScale = velocityScale - 12 playLandSound() end end) end) setup() character.DescendantAdded:Connect(function() task.wait(0.1) setup() end) RunService.RenderStepped:Connect(function(dt) pcall(function() dt = math.min(dt, 0.033) if not root or not root.Parent then return end local velocity = root.AssemblyLinearVelocity local targetScale = 1 + (velocity.Y * SQUISH_INTENSITY) targetScale = math.clamp(targetScale, 0.84, 1.5) if lastVelocityY < -10 and velocity.Y >= -1 then velocityScale = velocityScale - (math.abs(lastVelocityY) * 0.35) playLandSound() end lastVelocityY = velocity.Y local displacement = currentScale - targetScale local force = -TENSION * displacement - DAMPING * velocityScale force = math.clamp(force, -500, 500) if currentScale < 0.88 then force = force * 2 end velocityScale = math.clamp(velocityScale + (force * dt), -40, 40) currentScale = math.clamp(currentScale + (velocityScale * dt), 0.7, 1.5) local xzScale = (currentScale < 1) and (1 + (1 - currentScale) * 0.45) or (1 - (currentScale - 1) * 0.2) local originalTorsoHeight = objects[torso] and objects[torso].Size.Y or 2 for part, data in pairs(objects) do if part and part.Parent then if part.Size then local newSize = Vector3.new( data.Size.X * xzScale, data.Size.Y * currentScale, data.Size.Z * xzScale ) if newSize.X > 0 and newSize.Y > 0 and newSize.Z > 0 then part.Size = newSize end end if data.Mesh and data.Mesh.Parent then data.Mesh.Scale = Vector3.new( data.MeshScale.X * xzScale, data.MeshScale.Y * currentScale, data.MeshScale.Z * xzScale ) end if data.Joint and part ~= torso and data.Joint.Parent then local origC0 = data.C0 if origC0 then local yPos = origC0.Y * currentScale if data.Name and data.Name:find("Leg") then local torsoBottomShift = (originalTorsoHeight * 0.5) * (1 - currentScale) yPos = (origC0.Y * currentScale) + torsoBottomShift end if data.Name and data.Name:find("Arm") then local torsoBottomShift = (originalTorsoHeight * 0.35) * (1 - currentScale) yPos = (origC0.Y * currentScale) + torsoBottomShift end pcall(function() data.Joint.C0 = CFrame.new(origC0.X, yPos, origC0.Z) * origC0.Rotation end) end end end end if objects[torso] then local verticalOffset = (1 - currentScale) * (objects[torso].Size.Y * 0.5) if rootJoint and originalRootC1 then rootJoint.C1 = originalRootC1 * CFrame.new(0, verticalOffset, 0) end end end) end)