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