2006 Roblox Movement
Key RequiredUniversal

2006 Roblox Movement

Universal ScriptGuest_43854Guest_43854 1.8K views 1.8K executesUpdated Nov 29, 2025
5.0/ 5(4 votes)
40100% Positive
Lua Script•243 lines (9916 chars)
-- Heavy Physics Character Modifier (No Air Control + Upright)
-- Auto-respawns with all features enabled

local Players = game:GetService("Players")
local player = Players.LocalPlayer

-- Configuration
local MASS_MULTIPLIER = 5 -- Increase for heavier feel
local DISABLE_CLIMBING = true -- Prevent climbing

local function setupCharacter(character)
    local humanoid = character:WaitForChild("Humanoid")
    local rootPart = character:WaitForChild("HumanoidRootPart")

    -- Function to modify a single part
    local function modifyPart(part)
        if part:IsA("BasePart") and part.Name ~= "HumanoidRootPart" then
            -- Make body parts fully collidable (2006 style)
            part.CanCollide = true
            part.CanTouch = true
            part.CanQuery = true
            part.Massless = false
            
            -- Increase mass via CustomPhysicalProperties
            local currentProps = part.CustomPhysicalProperties
            local density = currentProps and currentProps.Density or 0.7
            local friction = currentProps and currentProps.Friction or 0.3
            local elasticity = currentProps and currentProps.Elasticity or 0.5
            
            -- Apply heavy physics properties with 2006-era feel
            part.CustomPhysicalProperties = PhysicalProperties.new(
                density * MASS_MULTIPLIER,  -- Increased density = more mass
                friction * 2,                -- High friction like old physics
                elasticity * 0.2,            -- Very little bounce
                1,                           -- FrictionWeight
                1                            -- ElasticityWeight
            )
        end
    end

    -- Disable climbing
    if DISABLE_CLIMBING then
        humanoid:SetStateEnabled(Enum.HumanoidStateType.Climbing, false)
    end

    -- Apply to all body parts
    for _, part in pairs(character:GetDescendants()) do
        modifyPart(part)
    end

    -- Create BodyGyro to keep character upright and prevent spinning
    local bodyGyro = Instance.new("BodyGyro")
    bodyGyro.Name = "UprightGyro"
    bodyGyro.MaxTorque = Vector3.new(500000, 0, 500000) -- Start with Y-axis free for ground movement
    bodyGyro.P = 50000 -- Very high proportional gain for strong resistance
    bodyGyro.D = 5000 -- Very high dampening to eliminate rotation
    bodyGyro.CFrame = rootPart.CFrame
    bodyGyro.Parent = rootPart

    -- Store the target direction when grounded
    local targetCFrame = rootPart.CFrame

    -- Update gyro to lock orientation
    game:GetService("RunService").Heartbeat:Connect(function()
        if bodyGyro and bodyGyro.Parent and rootPart then
            local state = humanoid:GetState()
            local isGrounded = state == Enum.HumanoidStateType.Running or 
                              state == Enum.HumanoidStateType.RunningNoPhysics or
                              state == Enum.HumanoidStateType.Landed
            
            if isGrounded then
                -- When on ground, allow Y-axis rotation (turning) but keep upright
                bodyGyro.MaxTorque = Vector3.new(500000, 0, 500000)
                targetCFrame = rootPart.CFrame
            else
                -- When airborne, lock ALL axes including Y to prevent spinning
                bodyGyro.MaxTorque = Vector3.new(500000, 500000, 500000)
            end
            
            -- Lock to target orientation
            local lookVector = targetCFrame.LookVector
            local uprightLook = Vector3.new(lookVector.X, 0, lookVector.Z).Unit
            bodyGyro.CFrame = CFrame.lookAt(Vector3.zero, uprightLook) * CFrame.Angles(0, math.pi, 0)
        end
    end)

    -- Reduce angular velocity when airborne to prevent spinning
    humanoid.StateChanged:Connect(function(oldState, newState)
        if newState == Enum.HumanoidStateType.Jumping or 
           newState == Enum.HumanoidStateType.Freefall then
            -- Lock rotation when going airborne
            rootPart.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
        end
    end)

    -- Add collision feedback system for limbs
    local function setupCollisionFeedback()
        for _, part in pairs(character:GetChildren()) do
            if part:IsA("BasePart") and part.Name ~= "HumanoidRootPart" and part.Name ~= "Head" then
                part.Touched:Connect(function(hit)
                    if hit:IsDescendantOf(character) then return end
                    
                    -- Apply small knockback force when limbs hit objects
                    if rootPart:FindFirstChild("TouchForce") then
                        rootPart:FindFirstChild("TouchForce"):Destroy()
                    end
                    
                    local touchForce = Instance.new("BodyVelocity")
                    touchForce.Name = "TouchForce"
                    touchForce.MaxForce = Vector3.new(4000, 0, 4000)
                    touchForce.Velocity = (rootPart.Position - hit.Position).Unit * -2
                    touchForce.Parent = rootPart
                    
                    game:GetService("Debris"):AddItem(touchForce, 0.1)
                end)
            end
        end
    end

    setupCollisionFeedback()

    -- Track if player is airborne
    local isAirborne = false
    local UserInputService = game:GetService("UserInputService")

    -- Disable air control when jumping (2006 style)
    humanoid.StateChanged:Connect(function(oldState, newState)
        if newState == Enum.HumanoidStateType.Jumping or 
           newState == Enum.HumanoidStateType.Freefall then
            -- Player is now airborne - disable control
            isAirborne = true
            humanoid.PlatformStand = true
        elseif newState == Enum.HumanoidStateType.Landed then
            -- Player landed - wait a moment then restore control
            task.wait(0.1) -- Small delay for landing impact feel
            isAirborne = false
            humanoid.PlatformStand = false
            humanoid:ChangeState(Enum.HumanoidStateType.Running)
        end
    end)

    -- Alternative: Press space to recover from landing
    UserInputService.InputBegan:Connect(function(input, gameProcessed)
        if not gameProcessed and input.KeyCode == Enum.KeyCode.Space then
            if isAirborne == false and humanoid.PlatformStand == true then
                -- Force recovery if stuck
                humanoid.PlatformStand = false
                humanoid:ChangeState(Enum.HumanoidStateType.Running)
            end
        end
    end)

    -- Safety: Auto-recover after 0.5 seconds on ground
    task.spawn(function()
        while character.Parent and humanoid.Health > 0 do
            task.wait(0.5)
            if humanoid.PlatformStand == true and 
               humanoid:GetState() ~= Enum.HumanoidStateType.Jumping and
               humanoid:GetState() ~= Enum.HumanoidStateType.Freefall then
                -- Stuck on ground, force recovery
                humanoid.PlatformStand = false
                humanoid:ChangeState(Enum.HumanoidStateType.Running)
            end
        end
    end)

    -- Force limb collision with all objects (override Roblox collision groups)
    local PhysicsService = game:GetService("PhysicsService")

    local function forcePartCollisions(part)
        if part:IsA("BasePart") then
            -- Check if it's a body part (limb, torso, or head)
            local isLimb = part.Name:lower():find("arm") or 
                           part.Name:lower():find("hand") or 
                           part.Name:lower():find("leg") or 
                           part.Name:lower():find("foot")
            
            local isTorso = part.Name:lower():find("torso") or 
                            part.Name:lower():find("uppertrunk") or
                            part.Name:lower():find("lowertrunk")
            
            local isHead = part.Name:lower() == "head"
            
            -- Check if it's an accessory (hat, hair, etc) - exclude these
            local isAccessory = part.Parent and part.Parent:IsA("Accessory")
            
            if (isLimb or isTorso or isHead) and not isAccessory then
                -- Reset collision group to default to ensure collisions work
                pcall(function()
                    part.CollisionGroup = "Default"
                end)
                
                -- Force collision properties
                part.CanCollide = true
                part.CanTouch = true
                part.CanQuery = true
                
                -- Continuously enforce collision (in case something tries to override)
                task.spawn(function()
                    while part and part.Parent and character.Parent do
                        if not part.CanCollide then
                            part.CanCollide = true
                        end
                        task.wait(0.5)
                    end
                end)
            end
        end
    end

    -- Apply forced collisions to all current body parts
    for _, part in pairs(character:GetDescendants()) do
        forcePartCollisions(part)
    end

    -- Handle new parts added to character (accessories, etc)
    character.DescendantAdded:Connect(function(descendant)
        if descendant:IsA("BasePart") then
            task.wait(0.1) -- Small delay to ensure part is fully loaded
            modifyPart(descendant)
            forcePartCollisions(descendant)
        end
    end)

    -- Cleanup on death
    humanoid.Died:Connect(function()
        if bodyGyro then
            bodyGyro:Destroy()
        end
    end)

    print("Heavy physics applied - no air control but stays upright!")
end

-- Setup current character
if player.Character then
    setupCharacter(player.Character)
end

-- Auto-setup on respawn
player.CharacterAdded:Connect(function(character)
    setupCharacter(character)
end)

Features & Information

Essentially like old 2006 roblox movement where you can't control where you move after jumping, collision with all parts, and inability to climb. This is mostly made for larping or for challenging yourself with obbies or stuff. It's neato It resets after every time you respawn, so you don't need to worry about injecting it over and over.
#Old roblox#Cl*ic#Cl*ic roblox#roblox#Movement script

Community Comments (2)

CarCatCarCatNov 29, 2025

Do other players see these animations?

Replying to @CarCat
Guest_43854Guest_43854Nov 29, 2025

@Mortal_guest1337 Yeah they'll see how you move, this doesn't come with animations but I do recommend combining it with animations since it'll look cooler with it.

More Scripts for Universal Scripts