--by Bonk#2965
lastDegree = 0
function newPhysics(part, crouchTog, amp, onHead)
	local lerpAmount = 0.96
	local onHeadd = onHead or false
	local crouchToggle = crouchTog or false
	local parte = part
	local weightReduc = amp or 1
	--set initial amount
	local degree = lerp((playerSpeed() *-100),lastDegree,lerpAmount)
	lastDegree = degree
	--remove head rotation
	if onHeadd then
		degree = degree + getHeadRot()[1]
	end

	--add crouch rotation
	if crouchToggle then
		if player.isSneaky() then
			degree = degree - 30
		end
	end

	--amplify
	degree = degree * weightReduc

	--whole number-ify
	degree = math.floor(degree+0.5)

	--set it
	parte.setRot({degree,0,0})
end

--assists to the physics
function lerp(a, b, t) -- smoothing
	return a + (b - a) * t
end

function getHeadRot() -- Gets the rotation of the player's head
	local x = vanilla_model.HEAD.getOriginRot()
	x = {x[1]*(180/math.pi),x[2]*(180/math.pi),0}
	return x
end

playerVelocity = 0
function player_init()
	pos = player.getPos()
	_pos = pos
	playerVelocity = vectors.of({0})
end
function tick()
	_pos = pos
	pos = player.getPos()
	playerVelocity = pos - _pos
end
function playerSpeed() -- returns the player's horizontal speed, positive if moving forwards, negative if backwards
	return (vectors.of({1, 0, 1})*playerVelocity).getLength()*(movingForwards() and 1 or -1)
end

function movingForwards() -- returns a bool, true if moving forwards, false if moving backwards or stationary
	local bodyDir = vectors.of({math.sin(math.rad(-player.getBodyYaw())), 0, math.cos(math.rad(-player.getBodyYaw()))}) -- a unit vector pointing the same way as the body
	local dotProduct = playerVelocity.z*bodyDir.z + playerVelocity.x*bodyDir.x -- the dot product of the velocity vector and a vector pointing the same way as the body
	return dotProduct > 0
end