function stopAllAnimations()local R=currentAnim if emoteNames[R]~=nil and emoteNames[R]==false then R="\105\100\108\101"end currentAnim=""currentAnimInstance=nil if currentAnimKeyframeHandler~=nil then currentAnimKeyframeHandler:disconnect()end if currentAnimTrack~=nil then currentAnimTrack:Stop()currentAnimTrack:Destroy()currentAnimTrack=nil end if runAnimKeyframeHandler~=nil then runAnimKeyframeHandler:disconnect()end if runAnimTrack~=nil then runAnimTrack:Stop()runAnimTrack:Destroy()runAnimTrack=nil end return R end function getHeightScale()if Humanoid then if FFlagUserAdjustHumanoidRootPartToHipPosition then if not Humanoid.AutomaticScalingEnabled then return 1 end end local R=Humanoid.HipHeight/HumanoidHipHeight if userAnimationSpeedDampening then if AnimationSpeedDampeningObject==nil then AnimationSpeedDampeningObject=script:FindFirstChild("\083\099\097\108\101\068\097\109\112\101\110\105\110\103\080\101\114\099\101\110\116")end if AnimationSpeedDampeningObject~=nil then R=1+((Humanoid.HipHeight-HumanoidHipHeight)*AnimationSpeedDampeningObject.Value)/HumanoidHipHeight end end return R end return 1 end local R=.0001 function setRunSpeed(x)local K=x*4.5 local I=getHeightScale()local t=K/I if t~=currentAnimSpeed then if t<.33 then currentAnimTrack:AdjustWeight(1.0)runAnimTrack:AdjustWeight(R)elseif t<.66 then local x=(t-.33)/.33 currentAnimTrack:AdjustWeight((1.0-x)+R)runAnimTrack:AdjustWeight(x+R)else currentAnimTrack:AdjustWeight(R)runAnimTrack:AdjustWeight(1.0)end currentAnimSpeed=t runAnimTrack:AdjustSpeed(t)currentAnimTrack:AdjustSpeed(t)end end function setAnimationSpeed(R)if currentAnim=="\119\097\108\107"then setRunSpeed(R)else if R~=currentAnimSpeed then currentAnimSpeed=R currentAnimTrack:AdjustSpeed(currentAnimSpeed)end end end function keyFrameReachedFunc(R)if R=="\069\110\100"then if currentAnim=="\119\097\108\107"then if userNoUpdateOnLoop==true then if runAnimTrack.Looped~=true then runAnimTrack.TimePosition=.0 end if currentAnimTrack.Looped~=true then currentAnimTrack.TimePosition=.0 end else runAnimTrack.TimePosition=.0 currentAnimTrack.TimePosition=.0 end else local R=currentAnim if emoteNames[R]~=nil and emoteNames[R]==false then R="\105\100\108\101"end local x=currentAnimSpeed playAnimation(R,.15,Humanoid)setAnimationSpeed(x)end end end function rollAnimation(R)local x=math.random(1,animTable[R].totalWeight)local K=x local I=1 while x>animTable[R][I].weight do x=x-animTable[R][I].weight I=I+1 end return I end function playAnimation(R,x,K)local I=rollAnimation(R)local t=animTable[R][I].anim if t~=currentAnimInstance then if currentAnimTrack~=nil then currentAnimTrack:Stop(x)currentAnimTrack:Destroy()end if runAnimTrack~=nil then runAnimTrack:Stop(x)runAnimTrack:Destroy()if userNoUpdateOnLoop==true then runAnimTrack=nil end end currentAnimSpeed=1.0 currentAnimTrack=K:LoadAnimation(t)currentAnimTrack.Priority=Enum.AnimationPriority.Core currentAnimTrack:Play(x)currentAnim=R currentAnimInstance=t if currentAnimKeyframeHandler~=nil then currentAnimKeyframeHandler:disconnect()end currentAnimKeyframeHandler=currentAnimTrack.KeyframeReached:connect(keyFrameReachedFunc)if R=="\119\097\108\107"then local R="\114\117\110"local I=rollAnimation(R)runAnimTrack=K:LoadAnimation(animTable[R][I].anim)runAnimTrack.Priority=Enum.AnimationPriority.Core runAnimTrack:Play(x)if runAnimKeyframeHandler~=nil then runAnimKeyframeHandler:disconnect()end runAnimKeyframeHandler=runAnimTrack.KeyframeReached:connect(keyFrameReachedFunc)end end end
-- functions

function stopAllAnimations()
	local oldAnim = currentAnim

	-- return to idle if finishing an emote
	if emoteNames[oldAnim] ~= nil and emoteNames[oldAnim] == false then
		oldAnim = "idle"
	end

	currentAnim = ""
	currentAnimInstance = nil
	if currentAnimKeyframeHandler ~= nil then
		currentAnimKeyframeHandler:disconnect()
	end

	if currentAnimTrack ~= nil then
		currentAnimTrack:Stop()
		currentAnimTrack:Destroy()
		currentAnimTrack = nil
	end

	-- clean up walk if there is one
	if runAnimKeyframeHandler ~= nil then
		runAnimKeyframeHandler:disconnect()
	end

	if runAnimTrack ~= nil then
		runAnimTrack:Stop()
		runAnimTrack:Destroy()
		runAnimTrack = nil
	end

	return oldAnim
end

function getHeightScale()
	if Humanoid then
		if FFlagUserAdjustHumanoidRootPartToHipPosition then
			if not Humanoid.AutomaticScalingEnabled then
				return 1
			end
		end

		local scale = Humanoid.HipHeight / HumanoidHipHeight
		if userAnimationSpeedDampening then
			if AnimationSpeedDampeningObject == nil then
				AnimationSpeedDampeningObject = script:FindFirstChild("ScaleDampeningPercent")
			end
			if AnimationSpeedDampeningObject ~= nil then
				scale = 1
					+ (Humanoid.HipHeight - HumanoidHipHeight)
						* AnimationSpeedDampeningObject.Value
						/ HumanoidHipHeight
			end
		end
		return scale
	end
	return 1
end

local smallButNotZero = 0.0001
function setRunSpeed(speed)
	local speedScaled = speed * 4.5 -- Default is 1.25
	local heightScale = getHeightScale()
	local runSpeed = speedScaled / heightScale

	if runSpeed ~= currentAnimSpeed then
		if runSpeed < 0.33 then
			currentAnimTrack:AdjustWeight(1.0)
			runAnimTrack:AdjustWeight(smallButNotZero)
		elseif runSpeed < 0.66 then
			local weight = ((runSpeed - 0.33) / 0.33)
			currentAnimTrack:AdjustWeight(1.0 - weight + smallButNotZero)
			runAnimTrack:AdjustWeight(weight + smallButNotZero)
		else
			currentAnimTrack:AdjustWeight(smallButNotZero)
			runAnimTrack:AdjustWeight(1.0)
		end
		currentAnimSpeed = runSpeed
		runAnimTrack:AdjustSpeed(runSpeed)
		currentAnimTrack:AdjustSpeed(runSpeed)
	end
end

function setAnimationSpeed(speed)
	if currentAnim == "walk" then
		setRunSpeed(speed)
	else
		if speed ~= currentAnimSpeed then
			currentAnimSpeed = speed
			currentAnimTrack:AdjustSpeed(currentAnimSpeed)
		end
	end
end

function keyFrameReachedFunc(frameName)
	if frameName == "End" then
		if currentAnim == "walk" then
			if userNoUpdateOnLoop == true then
				if runAnimTrack.Looped ~= true then
					runAnimTrack.TimePosition = 0.0
				end
				if currentAnimTrack.Looped ~= true then
					currentAnimTrack.TimePosition = 0.0
				end
			else
				runAnimTrack.TimePosition = 0.0
				currentAnimTrack.TimePosition = 0.0
			end
		else
			local repeatAnim = currentAnim
			-- return to idle if finishing an emote
			if emoteNames[repeatAnim] ~= nil and emoteNames[repeatAnim] == false then
				repeatAnim = "idle"
			end

			local animSpeed = currentAnimSpeed
			playAnimation(repeatAnim, 0.15, Humanoid)
			setAnimationSpeed(animSpeed)
		end
	end
end

function rollAnimation(animName)
	local roll = math.random(1, animTable[animName].totalWeight)
	local origRoll = roll
	local idx = 1
	while roll > animTable[animName][idx].weight do
		roll = roll - animTable[animName][idx].weight
		idx = idx + 1
	end
	return idx
end

function playAnimation(animName, transitionTime, humanoid)
	local idx = rollAnimation(animName)
	local anim = animTable[animName][idx].anim

	-- switch animation
	if anim ~= currentAnimInstance then
		if currentAnimTrack ~= nil then
			currentAnimTrack:Stop(transitionTime)
			currentAnimTrack:Destroy()
		end

		if runAnimTrack ~= nil then
			runAnimTrack:Stop(transitionTime)
			runAnimTrack:Destroy()
			if userNoUpdateOnLoop == true then
				runAnimTrack = nil
			end
		end

		currentAnimSpeed = 1.0

		-- load it to the humanoid; get AnimationTrack
		currentAnimTrack = humanoid:LoadAnimation(anim)
		currentAnimTrack.Priority = Enum.AnimationPriority.Core

		-- play the animation
		currentAnimTrack:Play(transitionTime)
		currentAnim = animName
		currentAnimInstance = anim

		-- set up keyframe name triggers
		if currentAnimKeyframeHandler ~= nil then
			currentAnimKeyframeHandler:disconnect()
		end
		currentAnimKeyframeHandler = currentAnimTrack.KeyframeReached:connect(keyFrameReachedFunc)

		-- check to see if we need to blend a walk/run animation
		if animName == "walk" then
			local runAnimName = "run"
			local runIdx = rollAnimation(runAnimName)

			runAnimTrack = humanoid:LoadAnimation(animTable[runAnimName][runIdx].anim)
			runAnimTrack.Priority = Enum.AnimationPriority.Core
			runAnimTrack:Play(transitionTime)

			if runAnimKeyframeHandler ~= nil then
				runAnimKeyframeHandler:disconnect()
			end
			runAnimKeyframeHandler = runAnimTrack.KeyframeReached:connect(keyFrameReachedFunc)
		end
	end
end
