
Key RequiredUniversal

-- 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)



Do other players see these animations?
@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.