Smooth movements

There is a game i play and it has a different movement system.
The character starts slow and slowly gets faster until it reaches a certain walkspeed and when you stop walking the animation slows down then ends and the character continues walking a little bit.

I tried many things but none of them worked.

I think they made it using their animator, so this is my animator’s code:

local Figure = script.Parent
local Torso = Figure:WaitForChild("Torso")
local RightShoulder = Torso:WaitForChild("Right Shoulder")
local LeftShoulder = Torso:WaitForChild("Left Shoulder")
local RightHip = Torso:WaitForChild("Right Hip")
local LeftHip = Torso:WaitForChild("Left Hip")
local Neck = Torso:WaitForChild("Neck")
local Humanoid = Figure:WaitForChild("Humanoid") or Figure:FindFirstChildOfClass("Humanoid")
local pose = "Standing"
local TweenService = game:GetService("TweenService")
local ContextActionService = game:GetService("ContextActionService")
local UserInputService = game:GetService("UserInputService")
local MarketplaceService = game:GetService("MarketplaceService")
local Mobile = UserInputService.TouchEnabled
local MobileRan = false
local MobileDebounce = false

local ParticAttachment = Instance.new("Attachment")
ParticAttachment.Name = "FootParticles"
ParticAttachment.Position = Vector3.new(0, -3, 0)
ParticAttachment.Parent = Figure:WaitForChild("HumanoidRootPart")
local FootParticle = game.ReplicatedStorage:WaitForChild("Resources"):WaitForChild("FootstepParticles"):Clone()
FootParticle.Parent = ParticAttachment

game.Players.LocalPlayer.CharacterRemoving:Connect(function()
	ContextActionService:UnbindAction("Run")
end)

if Mobile then
	local function switch()
		if MobileDebounce then return end
		if game.Players.LocalPlayer.Character.Values.Stunned.Value ~= true and game.Players.LocalPlayer.Character.Values.Freeze.Value == false then
			if not MobileRan then
				MobileDebounce = true
				MobileRan = true
				Ran()
				ContextActionService:SetTitle("Run", "Walk")
				wait(1)
				MobileDebounce = false
			else
				MobileDebounce = true
				MobileRan = false
				walc()
				ContextActionService:SetTitle("Run", "Sprint")
				wait(1)
				MobileDebounce = false
			end
		end
	end
	ContextActionService:BindAction("Run", switch, true)
	ContextActionService:SetTitle("Run", "Sprint")
	ContextActionService:SetPosition("Run", UDim2.new(1, -70, 0, 30))
end

local bigrunning = false
local currentAnim = ""
local currentAnimInstance = nil
local currentAnimTrack = nil
local currentAnimKeyframeHandler = nil
local currentAnimSpeed = 1.0
local animTable = {}
local animNames = { 
	idle = 	{	
		{ id = "http://www.roblox.com/asset/?id=180435571", weight = 9 },
		{ id = "http://www.roblox.com/asset/?id=180435792", weight = 1 }
	},
	walk = 	{ 	
		{ id = "http://www.roblox.com/asset/?id=180426354", weight = 10 } 
	}, 
	run = 	{
		{ id = "run.xml", weight = 10 } 
	}, 
	fastrun = {
		{ id = "http://www.roblox.com/asset/?id=5895476473", weight = 10 }
	},
	jump = 	{
		{ id = "http://www.roblox.com/asset/?id=125750702", weight = 10 } 
	}, 
	land = 	{
		{ id = "http://www.roblox.com/asset/?id=125750702", weight = 10 } 
	},
	fall = 	{
		{ id = "http://www.roblox.com/asset/?id=180436148", weight = 10 } 
	}, 
	climb = {
		{ id = "http://www.roblox.com/asset/?id=180436334", weight = 10 } 
	}, 
	sit = 	{
		{ id = "http://www.roblox.com/asset/?id=178130996", weight = 10 } 
	},	
	toolnone = {
		{ id = "http://www.roblox.com/asset/?id=182393478", weight = 10 } 
	},
	toolslash = {
		{ id = "http://www.roblox.com/asset/?id=129967390", weight = 10 } 
		--				{ id = "slash.xml", weight = 10 } 
	},
	toollunge = {
		{ id = "http://www.roblox.com/asset/?id=129967478", weight = 10 } 
	},
	wave = {
		{ id = "http://www.roblox.com/asset/?id=128777973", weight = 10 } 
	},
	point = {
		{ id = "http://www.roblox.com/asset/?id=128853357", weight = 10 } 
	},
	dance1 = {
		{ id = "http://www.roblox.com/asset/?id=182435998", weight = 10 }, 
		{ id = "http://www.roblox.com/asset/?id=182491037", weight = 10 }, 
		{ id = "http://www.roblox.com/asset/?id=182491065", weight = 10 } 
	},
	dance2 = {
		{ id = "http://www.roblox.com/asset/?id=182436842", weight = 10 }, 
		{ id = "http://www.roblox.com/asset/?id=182491248", weight = 10 }, 
		{ id = "http://www.roblox.com/asset/?id=182491277", weight = 10 } 
	},
	dance3 = {
		{ id = "http://www.roblox.com/asset/?id=182436935", weight = 10 }, 
		{ id = "http://www.roblox.com/asset/?id=182491368", weight = 10 }, 
		{ id = "http://www.roblox.com/asset/?id=182491423", weight = 10 } 
	},
	laugh = {
		{ id = "http://www.roblox.com/asset/?id=129423131", weight = 10 } 
	},
	cheer = {
		{ id = "http://www.roblox.com/asset/?id=129423030", weight = 10 } 
	},
}

function configureAnimationSet(name, fileList)
	if (animTable[name] ~= nil) then
		for _, connection in pairs(animTable[name].connections) do
			connection:disconnect()
		end
	end
	animTable[name] = {}
	animTable[name].count = 0
	animTable[name].totalWeight = 0	
	animTable[name].connections = {}

	-- check for config values
	local config = script:FindFirstChild(name)
	if (config ~= nil) then
		--		print("Loading anims " .. name)
		table.insert(animTable[name].connections, config.ChildAdded:connect(function(child) configureAnimationSet(name, fileList) end))
		table.insert(animTable[name].connections, config.ChildRemoved:connect(function(child) configureAnimationSet(name, fileList) end))
		local idx = 1
		for _, childPart in pairs(config:GetChildren()) do
			if (childPart:IsA("Animation")) then
				table.insert(animTable[name].connections, childPart.Changed:connect(function(property) configureAnimationSet(name, fileList) end))
				animTable[name][idx] = {}
				animTable[name][idx].anim = childPart
				local weightObject = childPart:FindFirstChild("Weight")
				if (weightObject == nil) then
					animTable[name][idx].weight = 1
				else
					animTable[name][idx].weight = weightObject.Value
				end
				animTable[name].count = animTable[name].count + 1
				animTable[name].totalWeight = animTable[name].totalWeight + animTable[name][idx].weight
				--			print(name .. " [" .. idx .. "] " .. animTable[name][idx].anim.AnimationId .. " (" .. animTable[name][idx].weight .. ")")
				idx = idx + 1
			end
		end
	end

	-- fallback to defaults
	if (animTable[name].count <= 0) then
		for idx, anim in pairs(fileList) do
			animTable[name][idx] = {}
			animTable[name][idx].anim = Instance.new("Animation")
			animTable[name][idx].anim.Name = name
			animTable[name][idx].anim.AnimationId = anim.id
			animTable[name][idx].weight = anim.weight
			animTable[name].count = animTable[name].count + 1
			animTable[name].totalWeight = animTable[name].totalWeight + anim.weight
			--			print(name .. " [" .. idx .. "] " .. anim.id .. " (" .. anim.weight .. ")")
		end
	end
end

-- Setup animation objects
function scriptChildModified(child)
	local fileList = animNames[child.Name]
	if (fileList ~= nil) then
		configureAnimationSet(child.Name, fileList)
	end	
end

script.ChildAdded:connect(scriptChildModified)
script.ChildRemoved:connect(scriptChildModified)


for name, fileList in pairs(animNames) do 
	configureAnimationSet(name, fileList)
end	

-- ANIMATION

-- declarations
local toolAnim = "None"
local toolAnimTime = 0

local jumpAnimTime = 0
local jumpAnimDuration = 0.3

local toolTransitionTime = 0.1
local fallTransitionTime = 0.3
local jumpMaxLimbVelocity = 0.75

-- functions

function stopAllAnimations()
	local oldAnim = currentAnim
	-- return to idle if finishing an emote

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

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

function setAnimationSpeed(speed)
	if speed ~= currentAnimSpeed then
		currentAnimSpeed = speed
		currentAnimTrack:AdjustSpeed(currentAnimSpeed)
	end
end

function keyFrameReachedFunc(frameName)
	if (frameName == "End") then

		local repeatAnim = currentAnim
		-- return to idle if finishing an emote
		

		local animSpeed = currentAnimSpeed
		PlayAnimation(repeatAnim, 0.0, Humanoid)
		setAnimationSpeed(animSpeed)
	end
end

-- Preload animations
function PlayAnimation(animName, transitionTime, humanoid,animspeed) 

	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
	--		print(animName .. " " .. idx .. " [" .. origRoll .. "]")
	local anim = animTable[animName][idx].anim

	-- switch animation		
	if (anim ~= currentAnimInstance) then

		if (currentAnimTrack ~= nil) then
			currentAnimTrack:Stop(transitionTime)
			currentAnimTrack:Destroy()
		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)

	end

end

function playForcedAnimation(Animation, NewHumanoid)
	local rWeight = math.random(1, 10)
	local nWeight = 1
	while true do
		if 10 < rWeight then

		else
			break
		end
		rWeight = rWeight - 10
		nWeight = nWeight + 1	
	end
	local NewAnimationYes = NewHumanoid:LoadAnimation(animTable[Animation][nWeight].anim)
	NewAnimationYes.Priority = Enum.AnimationPriority.Action
	NewAnimationYes:Play(0.1)
	local Waiter = NewAnimationYes
	task.spawn(function()
		Waiter.Stopped:Wait()
		Waiter:Destroy()
		Waiter = nil
	end)
	return NewAnimationYes
end

-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------

local toolAnimName = ""
local toolAnimTrack = nil
local toolAnimInstance = nil
local currentToolAnimKeyframeHandler = nil

function toolKeyFrameReachedFunc(frameName)
	if (frameName == "End") then
		--		print("Keyframe : ".. frameName)	
		playToolAnimation(toolAnimName, 0.0, Humanoid)
	end
end


function playToolAnimation(animName, transitionTime, humanoid, priority)	 

	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
	--		print(animName .. " * " .. idx .. " [" .. origRoll .. "]")
	local anim = animTable[animName][idx].anim

	if (toolAnimInstance ~= anim) then

		if (toolAnimTrack ~= nil) then
			toolAnimTrack:Stop()
			toolAnimTrack:Destroy()
			transitionTime = 0
		end

		-- load it to the humanoid; get AnimationTrack
		toolAnimTrack = humanoid:LoadAnimation(anim)
		if priority then
			toolAnimTrack.Priority = priority
		end

		-- play the animation
		toolAnimTrack:Play(transitionTime)
		toolAnimName = animName
		toolAnimInstance = anim

		currentToolAnimKeyframeHandler = toolAnimTrack.KeyframeReached:connect(toolKeyFrameReachedFunc)
	end
end

function stopToolAnimations()
	local oldAnim = toolAnimName

	if (currentToolAnimKeyframeHandler ~= nil) then
		currentToolAnimKeyframeHandler:disconnect()
	end

	toolAnimName = ""
	toolAnimInstance = nil
	if (toolAnimTrack ~= nil) then
		toolAnimTrack:Stop()
		toolAnimTrack:Destroy()
		toolAnimTrack = nil
	end


	return oldAnim
end

local mrhege = nil

-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------

Humanoid:GetPropertyChangedSignal("Jump"):Connect(function()
	FootParticle.Enabled = false
end)

function onRunning(speed)
	if speed > 0.01 then
		if game.Players.LocalPlayer.Character.Head:FindFirstChild("EmoteMusic") then
			script.Emote:FireServer(2,"",script)
		end
		if bigrunning == true then
			FootParticle.Rate = 6
			PlayAnimation("fastrun", 0.25, Humanoid)
			spawn(function()
				setAnimationSpeed(Humanoid.WalkSpeed / 24.5)
			end)
		else
			PlayAnimation("walk", 0.25, Humanoid)
			FootParticle.Rate = 1
			spawn(function()
				setAnimationSpeed(Humanoid.WalkSpeed / 16.5)
			end)
		end
		FootParticle.Enabled = true
		pose = "Running"
	else
		FootParticle.Enabled = false
		pose = "Standing"
		PlayAnimation("idle", 0.25, Humanoid)
		setAnimationSpeed(0.7)
	end
end

function onDied()
	pose = "Dead"
end

function onJumping()
	if game.Players.LocalPlayer.Character.Head:FindFirstChild("EmoteMusic") then
		script.Emote:FireServer(2,"",script)
	end
	PlayAnimation("jump", 0.1, Humanoid)
	setAnimationSpeed(1)
	jumpAnimTime = jumpAnimDuration
	pose = "Jumping"
end

function onClimbing(speed)
	PlayAnimation("climb", 0.1, Humanoid)
	setAnimationSpeed(1)
	setAnimationSpeed(speed / 12.0)
	pose = "Climbing"
end

function onGettingUp()
	pose = "GettingUp"
end

function onFreeFall()
	if (jumpAnimTime <= 0) then
		PlayAnimation("fall", fallTransitionTime, Humanoid)
		setAnimationSpeed(1)
	end
	pose = "FreeFall"
end

function onFallingDown()
	pose = "FallingDown"
end

function onSeated()
	if game.Players.LocalPlayer.Character.Head:FindFirstChild("EmoteMusic") then
		script.Emote:FireServer(2,"",script)
	end
	pose = "Seated"
end

function onLanded()
	playForcedAnimation("land", Humanoid)
	setAnimationSpeed(1)
	pose = "Landed"
end

function onPlatformStanding()
	if game.Players.LocalPlayer.Character.Head:FindFirstChild("EmoteMusic") then
		script.Emote:FireServer(2,"",script)
	end
	pose = "PlatformStanding"
end

function onSwimming(speed)
	if speed > 0 then
		pose = "Running"
	else
		pose = "Standing"
	end
end

function getTool()	
	for _, kid in ipairs(Figure:GetChildren()) do
		if kid.className == "Tool" then return kid end
	end
	return nil
end

function getToolAnim(tool)
	for _, c in ipairs(tool:GetChildren()) do
		if c.Name == "toolanim" and c.className == "StringValue" then
			return c
		end
	end
	return nil
end

function animateTool()

	if (toolAnim == "None") then
		playToolAnimation("toolnone", toolTransitionTime, Humanoid, Enum.AnimationPriority.Idle)
		setAnimationSpeed(1)
		return
	end

	if (toolAnim == "Slash") then
		playToolAnimation("toolslash", 0, Humanoid, Enum.AnimationPriority.Action)
		setAnimationSpeed(1)
		return
	end

	if (toolAnim == "Lunge") then
		playToolAnimation("toollunge", 0, Humanoid, Enum.AnimationPriority.Action)
		setAnimationSpeed(1)
		return
	end
end

function moveSit()
	RightShoulder.MaxVelocity = 0.15
	LeftShoulder.MaxVelocity = 0.15
	RightShoulder:SetDesiredAngle(3.14 /2)
	LeftShoulder:SetDesiredAngle(-3.14 /2)
	RightHip:SetDesiredAngle(3.14 /2)
	LeftHip:SetDesiredAngle(-3.14 /2)
end

local lastTick = 0

function move(time)
	local amplitude = 1
	local frequency = 1
	local deltaTime = time - lastTick
	lastTick = time

	local climbFudge = 0
	local setAngles = false

	if (jumpAnimTime > 0) then
		jumpAnimTime = jumpAnimTime - deltaTime
	end

	if (pose == "FreeFall" and jumpAnimTime <= 0) then
		PlayAnimation("fall", fallTransitionTime, Humanoid)
	elseif (pose == "Seated") then
		PlayAnimation("sit", 0.5, Humanoid)
		return
	elseif (pose == "Running") then
		if bigrunning == true then
			PlayAnimation("fastrun", 0.1, Humanoid)
			setAnimationSpeed(Humanoid.WalkSpeed / 24.5)
		else
			PlayAnimation("walk", 0.1, Humanoid)
			setAnimationSpeed(Humanoid.WalkSpeed / 16.5)
		end
	elseif (pose == "Dead" or pose == "GettingUp" or pose == "FallingDown" or pose == "Seated" or pose == "PlatformStanding") then
		--		print("Wha " .. pose)
		stopAllAnimations()
		amplitude = 0.1
		frequency = 1
		setAngles = true
	end

	if (setAngles) then
		local desiredAngle = amplitude * math.sin(wait(0.1) * frequency)

		RightShoulder:SetDesiredAngle(desiredAngle + 0)
		LeftShoulder:SetDesiredAngle(desiredAngle - 0)
		RightHip:SetDesiredAngle(-desiredAngle)
		LeftHip:SetDesiredAngle(-desiredAngle)
	end

	-- Tool Animation handling
	local tool = getTool()
	if tool and tool:FindFirstChild("Handle") then

		local animStringValueObject = getToolAnim(tool)

		if animStringValueObject then
			toolAnim = animStringValueObject.Value
			-- message recieved, delete StringValue
			animStringValueObject.Parent = nil
			toolAnimTime = time + .3
		end

		if time > toolAnimTime then
			toolAnimTime = 0
			toolAnim = "None"
		end

		animateTool()		
	else
		stopToolAnimations()
		toolAnim = "None"
		toolAnimInstance = nil
		toolAnimTime = 0
	end
end

spawn(function()
	while wait() do
		if Humanoid.MoveDirection.Magnitude > 0 then
			mrhege = Humanoid.MoveDirection
		end
		if game.Players.LocalPlayer.Character.Values.Stunned.Value ~= true and game.Players.LocalPlayer.Character.Values.Freeze.Value ~= true then
			if game.Players.LocalPlayer.Team == game.Teams.Humans then
				if Humanoid.WalkSpeed >= 22 then
					bigrunning = true
				else
					bigrunning = false
				end
			else
				if Humanoid.WalkSpeed >= 28 then
					bigrunning = true
				else
					bigrunning = false
				end
			end
		end
	end
end)

function walc()
	if game.Players.LocalPlayer.Character.Values.Stunned.Value ~= true and game.Players.LocalPlayer.Character.Values.Freeze.Value ~= true and game.Players.LocalPlayer.Character.Values.Grabbing.Value ~= true then
		if game:GetService("Players").LocalPlayer.Team == game.Teams.Humans then
			local S = TweenService:Create(
				Humanoid,
				TweenInfo.new(
					0.1, -- Time
					Enum.EasingStyle.Sine, -- Type
					Enum.EasingDirection.In, -- Bounce
					0, -- Idk
					false, -- Idk
					0 -- Idk
				),{
					WalkSpeed = 16;
				})
			S:Play() -- The thing
		else
			local S = TweenService:Create(
				Humanoid,
				TweenInfo.new(
					0.1, -- Time
					Enum.EasingStyle.Sine, -- Type
					Enum.EasingDirection.In, -- Bounce
					0, -- Idk
					false, -- Idk
					0 -- Idk
				),{
					WalkSpeed = 18;
				})
			S:Play() -- The thing
		end	
	end
end

function Ran()
	if game.Players.LocalPlayer.Character.Values.Stunned.Value ~= true and game.Players.LocalPlayer.Character.Values.Freeze.Value ~= true and game.Players.LocalPlayer.Character.Values.Grabbing.Value ~= true then
		if game:GetService("Players").LocalPlayer.Team == game.Teams.Humans then
			local S = TweenService:Create(
				Humanoid,
				TweenInfo.new(
					0.1, -- Time
					Enum.EasingStyle.Sine, -- Type
					Enum.EasingDirection.In, -- Bounce
					0, -- Idk
					false, -- Idk
					0 -- Idk
				),{
					WalkSpeed = 24;
				})
			S:Play() -- The thing
		else
			local S = TweenService:Create(
				Humanoid,
				TweenInfo.new(
					0.1, -- Time
					Enum.EasingStyle.Sine, -- Type
					Enum.EasingDirection.In, -- Bounce
					0, -- Idk
					false, -- Idk
					0 -- Idk
				),{
					WalkSpeed = 30;
				})
			S:Play() -- The thing
		end	
	end
end

game:GetService("UserInputService").InputBegan:Connect(function(key)
	if key.KeyCode == Enum.KeyCode.LeftShift and game.Players.LocalPlayer.Character.Values.Stunned.Value ~= true and game.Players.LocalPlayer.Character.Values.Freeze.Value == false and game.Players.LocalPlayer.Character.Values.Stunned.Value == false then
		Ran()
	end
end)
game:GetService("UserInputService").InputEnded:Connect(function(key)
	if key.KeyCode == Enum.KeyCode.LeftShift and game.Players.LocalPlayer.Character.Values.Stunned.Value ~= true and game.Players.LocalPlayer.Character.Values.Freeze.Value == false and game.Players.LocalPlayer.Character.Values.Stunned.Value == false then
		walc()
	end
end)

-- connect events
Humanoid.Died:connect(onDied)
Humanoid.Running:connect(onRunning)
Humanoid.Jumping:connect(onJumping)
Humanoid.Climbing:connect(onClimbing)
Humanoid.GettingUp:connect(onGettingUp)
Humanoid.FreeFalling:connect(onFreeFall)
Humanoid.FallingDown:connect(onFallingDown)
Humanoid.Seated:connect(onSeated)
Humanoid.PlatformStanding:connect(onPlatformStanding)
Humanoid.Swimming:connect(onSwimming)
Humanoid.StateChanged:connect(function(Old, New)
	if New == Enum.HumanoidStateType.Landed then
		onLanded()
	end
end)

-- main program

spawn(function()
	for i,v in pairs(script:GetDescendants()) do
		if v:IsA("Animation") then
			v.Changed:Connect(function()
				stopAllAnimations()
				if pose == "Running" then
					if bigrunning then
						PlayAnimation("fastrun", 0.3, Humanoid)
						setAnimationSpeed(Humanoid.WalkSpeed / 24.5)
					else
						PlayAnimation("walk", 0.3, Humanoid)
						setAnimationSpeed(Humanoid.WalkSpeed / 16.5)
						
					end
					pose = "Running"
				elseif pose == "Standing" then
					PlayAnimation("idle", 1, Humanoid)
					setAnimationSpeed(0.7)
					pose = "Standing"
				elseif pose == "Fall" then
					PlayAnimation("fall", fallTransitionTime, Humanoid)
					setAnimationSpeed(1)
					pose = "Fall"
				elseif pose == "Jump" then
					PlayAnimation("jump", 0.1, Humanoid)
					setAnimationSpeed(1)
					jumpAnimTime = jumpAnimDuration
					pose = "Jumping"
				end
			end)
		end
	end
end)

spawn(function()
	game.Players.LocalPlayer.Character.Values.Grabbing.Changed:Connect(function()
		if game.Players.LocalPlayer.Character.Values.Grabbing.Value == true then
			local S = TweenService:Create(
				Humanoid,
				TweenInfo.new(
					0.1, -- Time
					Enum.EasingStyle.Sine, -- Type
					Enum.EasingDirection.In, -- Bounce
					0, -- Idk
					false, -- Idk
					0 -- Idk
				),{
					WalkSpeed = 5; -- The Values
				})
			S:Play() -- The thing
			--Humanoid.JumpPower = 0
		else
			if game.Players.LocalPlayer.Team == game.Teams.Infected then
				local S = TweenService:Create(
					Humanoid,
					TweenInfo.new(
						0.1, -- Time
						Enum.EasingStyle.Sine, -- Type
						Enum.EasingDirection.In, -- Bounce
						0, -- Idk
						false, -- Idk
						0 -- Idk
					),{
						WalkSpeed = 18; -- The Values
					})
				S:Play() -- The thing
				--Humanoid.JumpPower = 0
			else
				local S = TweenService:Create(
					Humanoid,
					TweenInfo.new(
						0.1, -- Time
						Enum.EasingStyle.Sine, -- Type
						Enum.EasingDirection.In, -- Bounce
						0, -- Idk
						false, -- Idk
						0 -- Idk
					),{
						WalkSpeed = 16; -- The Values
					})
				S:Play() -- The thing
				--Humanoid.JumpPower = 0
			end
		end
	end)
end)

spawn(function()
	game.Players.LocalPlayer.Character.Values.Freeze.Changed:Connect(function()
		if game.Players.LocalPlayer.Character.Values.Freeze.Value == true then
			local S = TweenService:Create(
				Humanoid,
				TweenInfo.new(
					0.1, -- Time
					Enum.EasingStyle.Sine, -- Type
					Enum.EasingDirection.In, -- Bounce
					0, -- Idk
					false, -- Idk
					0 -- Idk
				),{
					WalkSpeed = 0; -- The Values
				})
			S:Play() -- The thing
			--Humanoid.JumpPower = 0
		else
			if game.Players.LocalPlayer.Team == game.Teams.Infected then
				local S = TweenService:Create(
					Humanoid,
					TweenInfo.new(
						0.1, -- Time
						Enum.EasingStyle.Sine, -- Type
						Enum.EasingDirection.In, -- Bounce
						0, -- Idk
						false, -- Idk
						0 -- Idk
					),{
						WalkSpeed = 18; -- The Values
					})
				S:Play() -- The thing
				--Humanoid.JumpPower = 0
			else
				local S = TweenService:Create(
					Humanoid,
					TweenInfo.new(
						0.1, -- Time
						Enum.EasingStyle.Sine, -- Type
						Enum.EasingDirection.In, -- Bounce
						0, -- Idk
						false, -- Idk
						0 -- Idk
					),{
						WalkSpeed = 16; -- The Values
					})
				S:Play() -- The thing
				--Humanoid.JumpPower = 0
			end
		end
	end)
end)

if Mobile then
	game.Players.LocalPlayer:GetPropertyChangedSignal("Team"):Connect(function()
		if game.Players.LocalPlayer.TeamColor == game.Teams.Infected.TeamColor then
			MobileRan = false
			ContextActionService:SetTitle("Run", "Sprint")
		end
	end)
end

-- initialize to idle
PlayAnimation("idle", 0.1, Humanoid)
setAnimationSpeed(0.7)
pose = "Standing"

while true do
	local _, time = wait(0.1)
	move(time)
end
3 Likes

Can you provide a piece of code, please?

I think they made it using the animator. So here’s my animator:

local Figure = script.Parent
local Torso = Figure:WaitForChild("Torso")
local RightShoulder = Torso:WaitForChild("Right Shoulder")
local LeftShoulder = Torso:WaitForChild("Left Shoulder")
local RightHip = Torso:WaitForChild("Right Hip")
local LeftHip = Torso:WaitForChild("Left Hip")
local Neck = Torso:WaitForChild("Neck")
local Humanoid = Figure:WaitForChild("Humanoid") or Figure:FindFirstChildOfClass("Humanoid")
local pose = "Standing"
local TweenService = game:GetService("TweenService")
local ContextActionService = game:GetService("ContextActionService")
local UserInputService = game:GetService("UserInputService")
local MarketplaceService = game:GetService("MarketplaceService")
local Mobile = UserInputService.TouchEnabled
local MobileRan = false
local MobileDebounce = false

local ParticAttachment = Instance.new("Attachment")
ParticAttachment.Name = "FootParticles"
ParticAttachment.Position = Vector3.new(0, -3, 0)
ParticAttachment.Parent = Figure:WaitForChild("HumanoidRootPart")
local FootParticle = game.ReplicatedStorage:WaitForChild("Resources"):WaitForChild("FootstepParticles"):Clone()
FootParticle.Parent = ParticAttachment

game.Players.LocalPlayer.CharacterRemoving:Connect(function()
	ContextActionService:UnbindAction("Run")
end)

if Mobile then
	local function switch()
		if MobileDebounce then return end
		if game.Players.LocalPlayer.Character.Values.Stunned.Value ~= true and game.Players.LocalPlayer.Character.Values.Freeze.Value == false then
			if not MobileRan then
				MobileDebounce = true
				MobileRan = true
				Ran()
				ContextActionService:SetTitle("Run", "Walk")
				wait(1)
				MobileDebounce = false
			else
				MobileDebounce = true
				MobileRan = false
				walc()
				ContextActionService:SetTitle("Run", "Sprint")
				wait(1)
				MobileDebounce = false
			end
		end
	end
	ContextActionService:BindAction("Run", switch, true)
	ContextActionService:SetTitle("Run", "Sprint")
	ContextActionService:SetPosition("Run", UDim2.new(1, -70, 0, 30))
end

local bigrunning = false
local currentAnim = ""
local currentAnimInstance = nil
local currentAnimTrack = nil
local currentAnimKeyframeHandler = nil
local currentAnimSpeed = 1.0
local animTable = {}
local animNames = { 
	idle = 	{	
		{ id = "http://www.roblox.com/asset/?id=180435571", weight = 9 },
		{ id = "http://www.roblox.com/asset/?id=180435792", weight = 1 }
	},
	walk = 	{ 	
		{ id = "http://www.roblox.com/asset/?id=180426354", weight = 10 } 
	}, 
	run = 	{
		{ id = "run.xml", weight = 10 } 
	}, 
	fastrun = {
		{ id = "http://www.roblox.com/asset/?id=5895476473", weight = 10 }
	},
	jump = 	{
		{ id = "http://www.roblox.com/asset/?id=125750702", weight = 10 } 
	}, 
	land = 	{
		{ id = "http://www.roblox.com/asset/?id=125750702", weight = 10 } 
	},
	fall = 	{
		{ id = "http://www.roblox.com/asset/?id=180436148", weight = 10 } 
	}, 
	climb = {
		{ id = "http://www.roblox.com/asset/?id=180436334", weight = 10 } 
	}, 
	sit = 	{
		{ id = "http://www.roblox.com/asset/?id=178130996", weight = 10 } 
	},	
	toolnone = {
		{ id = "http://www.roblox.com/asset/?id=182393478", weight = 10 } 
	},
	toolslash = {
		{ id = "http://www.roblox.com/asset/?id=129967390", weight = 10 } 
		--				{ id = "slash.xml", weight = 10 } 
	},
	toollunge = {
		{ id = "http://www.roblox.com/asset/?id=129967478", weight = 10 } 
	},
	wave = {
		{ id = "http://www.roblox.com/asset/?id=128777973", weight = 10 } 
	},
	point = {
		{ id = "http://www.roblox.com/asset/?id=128853357", weight = 10 } 
	},
	dance1 = {
		{ id = "http://www.roblox.com/asset/?id=182435998", weight = 10 }, 
		{ id = "http://www.roblox.com/asset/?id=182491037", weight = 10 }, 
		{ id = "http://www.roblox.com/asset/?id=182491065", weight = 10 } 
	},
	dance2 = {
		{ id = "http://www.roblox.com/asset/?id=182436842", weight = 10 }, 
		{ id = "http://www.roblox.com/asset/?id=182491248", weight = 10 }, 
		{ id = "http://www.roblox.com/asset/?id=182491277", weight = 10 } 
	},
	dance3 = {
		{ id = "http://www.roblox.com/asset/?id=182436935", weight = 10 }, 
		{ id = "http://www.roblox.com/asset/?id=182491368", weight = 10 }, 
		{ id = "http://www.roblox.com/asset/?id=182491423", weight = 10 } 
	},
	laugh = {
		{ id = "http://www.roblox.com/asset/?id=129423131", weight = 10 } 
	},
	cheer = {
		{ id = "http://www.roblox.com/asset/?id=129423030", weight = 10 } 
	},
}

function configureAnimationSet(name, fileList)
	if (animTable[name] ~= nil) then
		for _, connection in pairs(animTable[name].connections) do
			connection:disconnect()
		end
	end
	animTable[name] = {}
	animTable[name].count = 0
	animTable[name].totalWeight = 0	
	animTable[name].connections = {}

	-- check for config values
	local config = script:FindFirstChild(name)
	if (config ~= nil) then
		--		print("Loading anims " .. name)
		table.insert(animTable[name].connections, config.ChildAdded:connect(function(child) configureAnimationSet(name, fileList) end))
		table.insert(animTable[name].connections, config.ChildRemoved:connect(function(child) configureAnimationSet(name, fileList) end))
		local idx = 1
		for _, childPart in pairs(config:GetChildren()) do
			if (childPart:IsA("Animation")) then
				table.insert(animTable[name].connections, childPart.Changed:connect(function(property) configureAnimationSet(name, fileList) end))
				animTable[name][idx] = {}
				animTable[name][idx].anim = childPart
				local weightObject = childPart:FindFirstChild("Weight")
				if (weightObject == nil) then
					animTable[name][idx].weight = 1
				else
					animTable[name][idx].weight = weightObject.Value
				end
				animTable[name].count = animTable[name].count + 1
				animTable[name].totalWeight = animTable[name].totalWeight + animTable[name][idx].weight
				--			print(name .. " [" .. idx .. "] " .. animTable[name][idx].anim.AnimationId .. " (" .. animTable[name][idx].weight .. ")")
				idx = idx + 1
			end
		end
	end

	-- fallback to defaults
	if (animTable[name].count <= 0) then
		for idx, anim in pairs(fileList) do
			animTable[name][idx] = {}
			animTable[name][idx].anim = Instance.new("Animation")
			animTable[name][idx].anim.Name = name
			animTable[name][idx].anim.AnimationId = anim.id
			animTable[name][idx].weight = anim.weight
			animTable[name].count = animTable[name].count + 1
			animTable[name].totalWeight = animTable[name].totalWeight + anim.weight
			--			print(name .. " [" .. idx .. "] " .. anim.id .. " (" .. anim.weight .. ")")
		end
	end
end

-- Setup animation objects
function scriptChildModified(child)
	local fileList = animNames[child.Name]
	if (fileList ~= nil) then
		configureAnimationSet(child.Name, fileList)
	end	
end

script.ChildAdded:connect(scriptChildModified)
script.ChildRemoved:connect(scriptChildModified)


for name, fileList in pairs(animNames) do 
	configureAnimationSet(name, fileList)
end	

-- ANIMATION

-- declarations
local toolAnim = "None"
local toolAnimTime = 0

local jumpAnimTime = 0
local jumpAnimDuration = 0.3

local toolTransitionTime = 0.1
local fallTransitionTime = 0.3
local jumpMaxLimbVelocity = 0.75

-- functions

function stopAllAnimations()
	local oldAnim = currentAnim
	-- return to idle if finishing an emote

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

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

function setAnimationSpeed(speed)
	if speed ~= currentAnimSpeed then
		currentAnimSpeed = speed
		currentAnimTrack:AdjustSpeed(currentAnimSpeed)
	end
end

function keyFrameReachedFunc(frameName)
	if (frameName == "End") then

		local repeatAnim = currentAnim
		-- return to idle if finishing an emote
		

		local animSpeed = currentAnimSpeed
		PlayAnimation(repeatAnim, 0.0, Humanoid)
		setAnimationSpeed(animSpeed)
	end
end

-- Preload animations
function PlayAnimation(animName, transitionTime, humanoid,animspeed) 

	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
	--		print(animName .. " " .. idx .. " [" .. origRoll .. "]")
	local anim = animTable[animName][idx].anim

	-- switch animation		
	if (anim ~= currentAnimInstance) then

		if (currentAnimTrack ~= nil) then
			currentAnimTrack:Stop(transitionTime)
			currentAnimTrack:Destroy()
		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)

	end

end

function playForcedAnimation(Animation, NewHumanoid)
	local rWeight = math.random(1, 10)
	local nWeight = 1
	while true do
		if 10 < rWeight then

		else
			break
		end
		rWeight = rWeight - 10
		nWeight = nWeight + 1	
	end
	local NewAnimationYes = NewHumanoid:LoadAnimation(animTable[Animation][nWeight].anim)
	NewAnimationYes.Priority = Enum.AnimationPriority.Action
	NewAnimationYes:Play(0.1)
	local Waiter = NewAnimationYes
	task.spawn(function()
		Waiter.Stopped:Wait()
		Waiter:Destroy()
		Waiter = nil
	end)
	return NewAnimationYes
end

-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------

local toolAnimName = ""
local toolAnimTrack = nil
local toolAnimInstance = nil
local currentToolAnimKeyframeHandler = nil

function toolKeyFrameReachedFunc(frameName)
	if (frameName == "End") then
		--		print("Keyframe : ".. frameName)	
		playToolAnimation(toolAnimName, 0.0, Humanoid)
	end
end


function playToolAnimation(animName, transitionTime, humanoid, priority)	 

	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
	--		print(animName .. " * " .. idx .. " [" .. origRoll .. "]")
	local anim = animTable[animName][idx].anim

	if (toolAnimInstance ~= anim) then

		if (toolAnimTrack ~= nil) then
			toolAnimTrack:Stop()
			toolAnimTrack:Destroy()
			transitionTime = 0
		end

		-- load it to the humanoid; get AnimationTrack
		toolAnimTrack = humanoid:LoadAnimation(anim)
		if priority then
			toolAnimTrack.Priority = priority
		end

		-- play the animation
		toolAnimTrack:Play(transitionTime)
		toolAnimName = animName
		toolAnimInstance = anim

		currentToolAnimKeyframeHandler = toolAnimTrack.KeyframeReached:connect(toolKeyFrameReachedFunc)
	end
end

function stopToolAnimations()
	local oldAnim = toolAnimName

	if (currentToolAnimKeyframeHandler ~= nil) then
		currentToolAnimKeyframeHandler:disconnect()
	end

	toolAnimName = ""
	toolAnimInstance = nil
	if (toolAnimTrack ~= nil) then
		toolAnimTrack:Stop()
		toolAnimTrack:Destroy()
		toolAnimTrack = nil
	end


	return oldAnim
end

local mrhege = nil

-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------

Humanoid:GetPropertyChangedSignal("Jump"):Connect(function()
	FootParticle.Enabled = false
end)

function onRunning(speed)
	if speed > 0.01 then
		if game.Players.LocalPlayer.Character.Head:FindFirstChild("EmoteMusic") then
			script.Emote:FireServer(2,"",script)
		end
		if bigrunning == true then
			FootParticle.Rate = 6
			PlayAnimation("fastrun", 0.25, Humanoid)
			spawn(function()
				setAnimationSpeed(Humanoid.WalkSpeed / 24.5)
			end)
		else
			PlayAnimation("walk", 0.25, Humanoid)
			FootParticle.Rate = 1
			spawn(function()
				setAnimationSpeed(Humanoid.WalkSpeed / 16.5)
			end)
		end
		FootParticle.Enabled = true
		pose = "Running"
	else
		FootParticle.Enabled = false
		pose = "Standing"
		PlayAnimation("idle", 0.25, Humanoid)
		setAnimationSpeed(0.7)
	end
end

function onDied()
	pose = "Dead"
end

function onJumping()
	if game.Players.LocalPlayer.Character.Head:FindFirstChild("EmoteMusic") then
		script.Emote:FireServer(2,"",script)
	end
	PlayAnimation("jump", 0.1, Humanoid)
	setAnimationSpeed(1)
	jumpAnimTime = jumpAnimDuration
	pose = "Jumping"
end

function onClimbing(speed)
	PlayAnimation("climb", 0.1, Humanoid)
	setAnimationSpeed(1)
	setAnimationSpeed(speed / 12.0)
	pose = "Climbing"
end

function onGettingUp()
	pose = "GettingUp"
end

function onFreeFall()
	if (jumpAnimTime <= 0) then
		PlayAnimation("fall", fallTransitionTime, Humanoid)
		setAnimationSpeed(1)
	end
	pose = "FreeFall"
end

function onFallingDown()
	pose = "FallingDown"
end

function onSeated()
	if game.Players.LocalPlayer.Character.Head:FindFirstChild("EmoteMusic") then
		script.Emote:FireServer(2,"",script)
	end
	pose = "Seated"
end

function onLanded()
	playForcedAnimation("land", Humanoid)
	setAnimationSpeed(1)
	pose = "Landed"
end

function onPlatformStanding()
	if game.Players.LocalPlayer.Character.Head:FindFirstChild("EmoteMusic") then
		script.Emote:FireServer(2,"",script)
	end
	pose = "PlatformStanding"
end

function onSwimming(speed)
	if speed > 0 then
		pose = "Running"
	else
		pose = "Standing"
	end
end

function getTool()	
	for _, kid in ipairs(Figure:GetChildren()) do
		if kid.className == "Tool" then return kid end
	end
	return nil
end

function getToolAnim(tool)
	for _, c in ipairs(tool:GetChildren()) do
		if c.Name == "toolanim" and c.className == "StringValue" then
			return c
		end
	end
	return nil
end

function animateTool()

	if (toolAnim == "None") then
		playToolAnimation("toolnone", toolTransitionTime, Humanoid, Enum.AnimationPriority.Idle)
		setAnimationSpeed(1)
		return
	end

	if (toolAnim == "Slash") then
		playToolAnimation("toolslash", 0, Humanoid, Enum.AnimationPriority.Action)
		setAnimationSpeed(1)
		return
	end

	if (toolAnim == "Lunge") then
		playToolAnimation("toollunge", 0, Humanoid, Enum.AnimationPriority.Action)
		setAnimationSpeed(1)
		return
	end
end

function moveSit()
	RightShoulder.MaxVelocity = 0.15
	LeftShoulder.MaxVelocity = 0.15
	RightShoulder:SetDesiredAngle(3.14 /2)
	LeftShoulder:SetDesiredAngle(-3.14 /2)
	RightHip:SetDesiredAngle(3.14 /2)
	LeftHip:SetDesiredAngle(-3.14 /2)
end

local lastTick = 0

function move(time)
	local amplitude = 1
	local frequency = 1
	local deltaTime = time - lastTick
	lastTick = time

	local climbFudge = 0
	local setAngles = false

	if (jumpAnimTime > 0) then
		jumpAnimTime = jumpAnimTime - deltaTime
	end

	if (pose == "FreeFall" and jumpAnimTime <= 0) then
		PlayAnimation("fall", fallTransitionTime, Humanoid)
	elseif (pose == "Seated") then
		PlayAnimation("sit", 0.5, Humanoid)
		return
	elseif (pose == "Running") then
		if bigrunning == true then
			PlayAnimation("fastrun", 0.1, Humanoid)
			setAnimationSpeed(Humanoid.WalkSpeed / 24.5)
		else
			PlayAnimation("walk", 0.1, Humanoid)
			setAnimationSpeed(Humanoid.WalkSpeed / 16.5)
		end
	elseif (pose == "Dead" or pose == "GettingUp" or pose == "FallingDown" or pose == "Seated" or pose == "PlatformStanding") then
		--		print("Wha " .. pose)
		stopAllAnimations()
		amplitude = 0.1
		frequency = 1
		setAngles = true
	end

	if (setAngles) then
		local desiredAngle = amplitude * math.sin(wait(0.1) * frequency)

		RightShoulder:SetDesiredAngle(desiredAngle + 0)
		LeftShoulder:SetDesiredAngle(desiredAngle - 0)
		RightHip:SetDesiredAngle(-desiredAngle)
		LeftHip:SetDesiredAngle(-desiredAngle)
	end

	-- Tool Animation handling
	local tool = getTool()
	if tool and tool:FindFirstChild("Handle") then

		local animStringValueObject = getToolAnim(tool)

		if animStringValueObject then
			toolAnim = animStringValueObject.Value
			-- message recieved, delete StringValue
			animStringValueObject.Parent = nil
			toolAnimTime = time + .3
		end

		if time > toolAnimTime then
			toolAnimTime = 0
			toolAnim = "None"
		end

		animateTool()		
	else
		stopToolAnimations()
		toolAnim = "None"
		toolAnimInstance = nil
		toolAnimTime = 0
	end
end

spawn(function()
	while wait() do
		if Humanoid.MoveDirection.Magnitude > 0 then
			mrhege = Humanoid.MoveDirection
		end
		if game.Players.LocalPlayer.Character.Values.Stunned.Value ~= true and game.Players.LocalPlayer.Character.Values.Freeze.Value ~= true then
			if game.Players.LocalPlayer.Team == game.Teams.Humans then
				if Humanoid.WalkSpeed >= 22 then
					bigrunning = true
				else
					bigrunning = false
				end
			else
				if Humanoid.WalkSpeed >= 28 then
					bigrunning = true
				else
					bigrunning = false
				end
			end
		end
	end
end)

function walc()
	if game.Players.LocalPlayer.Character.Values.Stunned.Value ~= true and game.Players.LocalPlayer.Character.Values.Freeze.Value ~= true and game.Players.LocalPlayer.Character.Values.Grabbing.Value ~= true then
		if game:GetService("Players").LocalPlayer.Team == game.Teams.Humans then
			local S = TweenService:Create(
				Humanoid,
				TweenInfo.new(
					0.1, -- Time
					Enum.EasingStyle.Sine, -- Type
					Enum.EasingDirection.In, -- Bounce
					0, -- Idk
					false, -- Idk
					0 -- Idk
				),{
					WalkSpeed = 16;
				})
			S:Play() -- The thing
		else
			local S = TweenService:Create(
				Humanoid,
				TweenInfo.new(
					0.1, -- Time
					Enum.EasingStyle.Sine, -- Type
					Enum.EasingDirection.In, -- Bounce
					0, -- Idk
					false, -- Idk
					0 -- Idk
				),{
					WalkSpeed = 18;
				})
			S:Play() -- The thing
		end	
	end
end

function Ran()
	if game.Players.LocalPlayer.Character.Values.Stunned.Value ~= true and game.Players.LocalPlayer.Character.Values.Freeze.Value ~= true and game.Players.LocalPlayer.Character.Values.Grabbing.Value ~= true then
		if game:GetService("Players").LocalPlayer.Team == game.Teams.Humans then
			local S = TweenService:Create(
				Humanoid,
				TweenInfo.new(
					0.1, -- Time
					Enum.EasingStyle.Sine, -- Type
					Enum.EasingDirection.In, -- Bounce
					0, -- Idk
					false, -- Idk
					0 -- Idk
				),{
					WalkSpeed = 24;
				})
			S:Play() -- The thing
		else
			local S = TweenService:Create(
				Humanoid,
				TweenInfo.new(
					0.1, -- Time
					Enum.EasingStyle.Sine, -- Type
					Enum.EasingDirection.In, -- Bounce
					0, -- Idk
					false, -- Idk
					0 -- Idk
				),{
					WalkSpeed = 30;
				})
			S:Play() -- The thing
		end	
	end
end

game:GetService("UserInputService").InputBegan:Connect(function(key)
	if key.KeyCode == Enum.KeyCode.LeftShift and game.Players.LocalPlayer.Character.Values.Stunned.Value ~= true and game.Players.LocalPlayer.Character.Values.Freeze.Value == false and game.Players.LocalPlayer.Character.Values.Stunned.Value == false then
		Ran()
	end
end)
game:GetService("UserInputService").InputEnded:Connect(function(key)
	if key.KeyCode == Enum.KeyCode.LeftShift and game.Players.LocalPlayer.Character.Values.Stunned.Value ~= true and game.Players.LocalPlayer.Character.Values.Freeze.Value == false and game.Players.LocalPlayer.Character.Values.Stunned.Value == false then
		walc()
	end
end)

-- connect events
Humanoid.Died:connect(onDied)
Humanoid.Running:connect(onRunning)
Humanoid.Jumping:connect(onJumping)
Humanoid.Climbing:connect(onClimbing)
Humanoid.GettingUp:connect(onGettingUp)
Humanoid.FreeFalling:connect(onFreeFall)
Humanoid.FallingDown:connect(onFallingDown)
Humanoid.Seated:connect(onSeated)
Humanoid.PlatformStanding:connect(onPlatformStanding)
Humanoid.Swimming:connect(onSwimming)
Humanoid.StateChanged:connect(function(Old, New)
	if New == Enum.HumanoidStateType.Landed then
		onLanded()
	end
end)

-- main program

spawn(function()
	for i,v in pairs(script:GetDescendants()) do
		if v:IsA("Animation") then
			v.Changed:Connect(function()
				stopAllAnimations()
				if pose == "Running" then
					if bigrunning then
						PlayAnimation("fastrun", 0.3, Humanoid)
						setAnimationSpeed(Humanoid.WalkSpeed / 24.5)
					else
						PlayAnimation("walk", 0.3, Humanoid)
						setAnimationSpeed(Humanoid.WalkSpeed / 16.5)
						
					end
					pose = "Running"
				elseif pose == "Standing" then
					PlayAnimation("idle", 1, Humanoid)
					setAnimationSpeed(0.7)
					pose = "Standing"
				elseif pose == "Fall" then
					PlayAnimation("fall", fallTransitionTime, Humanoid)
					setAnimationSpeed(1)
					pose = "Fall"
				elseif pose == "Jump" then
					PlayAnimation("jump", 0.1, Humanoid)
					setAnimationSpeed(1)
					jumpAnimTime = jumpAnimDuration
					pose = "Jumping"
				end
			end)
		end
	end
end)

spawn(function()
	game.Players.LocalPlayer.Character.Values.Grabbing.Changed:Connect(function()
		if game.Players.LocalPlayer.Character.Values.Grabbing.Value == true then
			local S = TweenService:Create(
				Humanoid,
				TweenInfo.new(
					0.1, -- Time
					Enum.EasingStyle.Sine, -- Type
					Enum.EasingDirection.In, -- Bounce
					0, -- Idk
					false, -- Idk
					0 -- Idk
				),{
					WalkSpeed = 5; -- The Values
				})
			S:Play() -- The thing
			--Humanoid.JumpPower = 0
		else
			if game.Players.LocalPlayer.Team == game.Teams.Infected then
				local S = TweenService:Create(
					Humanoid,
					TweenInfo.new(
						0.1, -- Time
						Enum.EasingStyle.Sine, -- Type
						Enum.EasingDirection.In, -- Bounce
						0, -- Idk
						false, -- Idk
						0 -- Idk
					),{
						WalkSpeed = 18; -- The Values
					})
				S:Play() -- The thing
				--Humanoid.JumpPower = 0
			else
				local S = TweenService:Create(
					Humanoid,
					TweenInfo.new(
						0.1, -- Time
						Enum.EasingStyle.Sine, -- Type
						Enum.EasingDirection.In, -- Bounce
						0, -- Idk
						false, -- Idk
						0 -- Idk
					),{
						WalkSpeed = 16; -- The Values
					})
				S:Play() -- The thing
				--Humanoid.JumpPower = 0
			end
		end
	end)
end)

spawn(function()
	game.Players.LocalPlayer.Character.Values.Freeze.Changed:Connect(function()
		if game.Players.LocalPlayer.Character.Values.Freeze.Value == true then
			local S = TweenService:Create(
				Humanoid,
				TweenInfo.new(
					0.1, -- Time
					Enum.EasingStyle.Sine, -- Type
					Enum.EasingDirection.In, -- Bounce
					0, -- Idk
					false, -- Idk
					0 -- Idk
				),{
					WalkSpeed = 0; -- The Values
				})
			S:Play() -- The thing
			--Humanoid.JumpPower = 0
		else
			if game.Players.LocalPlayer.Team == game.Teams.Infected then
				local S = TweenService:Create(
					Humanoid,
					TweenInfo.new(
						0.1, -- Time
						Enum.EasingStyle.Sine, -- Type
						Enum.EasingDirection.In, -- Bounce
						0, -- Idk
						false, -- Idk
						0 -- Idk
					),{
						WalkSpeed = 18; -- The Values
					})
				S:Play() -- The thing
				--Humanoid.JumpPower = 0
			else
				local S = TweenService:Create(
					Humanoid,
					TweenInfo.new(
						0.1, -- Time
						Enum.EasingStyle.Sine, -- Type
						Enum.EasingDirection.In, -- Bounce
						0, -- Idk
						false, -- Idk
						0 -- Idk
					),{
						WalkSpeed = 16; -- The Values
					})
				S:Play() -- The thing
				--Humanoid.JumpPower = 0
			end
		end
	end)
end)

if Mobile then
	game.Players.LocalPlayer:GetPropertyChangedSignal("Team"):Connect(function()
		if game.Players.LocalPlayer.TeamColor == game.Teams.Infected.TeamColor then
			MobileRan = false
			ContextActionService:SetTitle("Run", "Sprint")
		end
	end)
end

-- initialize to idle
PlayAnimation("idle", 0.1, Humanoid)
setAnimationSpeed(0.7)
pose = "Standing"

while true do
	local _, time = wait(0.1)
	move(time)
end



i believe you should use bodymovers for this, sorry for that late response.

2 Likes

Why don’t you change the walkspeed based on a loop that runs to accelerate the player’s speed while a key is being held. You can (I think) also change the animation speed as well. You may have to try it a few times to make it match visually though.

just for example, not real code:

Until whatever key is pressed stops being pressed
    for hold = 1, 10, 1 do
        walkspeed += 1
        animation speed += 1
        task.wait()
    end
-- not sure how to make sure the walking input keeps moving the player for this part though
    for hold = walkspeed,0, -1 do
        walkspeed -= 1
        animation speed -= 1
    end
end

But why not use tweens instead? aren’t those efficient and doesnt throttle the code? and as i said to keep moving the player a bodymover must be applied in this case i would say its BodyVelocity, but no it’s going to push the character away when they will jump.
I think this is somewhat corelating piece of code i can give:

local skidding=false
local timeset
local connection
local recordspeed
connection=game:GetService'RunService'.Stepped:Connect(function()
if Humanoid.MoveDirection == 1 then
skidding=false
recordspeed=Humanoid.WalkSpeed
timeset=tick()
else
skidding=true
if skidding and tick()- timeset < recordspeed/2 then
HumanoidRootPart.Velocity=recordspeed/2-(tick()-timeset)
end
end
end)

This isn’t tested and shouldn’t be the final code you should use but redacting over it and experimenting might help.

1 Like

Thanks for the help, but i found how to make it. I was supposed to edit the “RenderStepped” function of the ControlModule in the PlayerModule. Here is the code:

--[[
	ControlModule - This ModuleScript implements a singleton class to manage the
	selection, activation, and deactivation of the current character movement controller.
	This script binds to RenderStepped at Input priority and calls the Update() methods
	on the active controller instances.

	The character controller ModuleScripts implement classes which are instantiated and
	activated as-needed, they are no longer all instantiated up front as they were in
	the previous generation of PlayerScripts.

	2018 PlayerScripts Update - AllYourBlox
--]]
local ControlModule = {}
ControlModule.__index = ControlModule

--[[ Roblox Services ]]--
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Workspace = game:GetService("Workspace")
local UserGameSettings = UserSettings():GetService("UserGameSettings")
local VRService = game:GetService("VRService")

-- Roblox User Input Control Modules - each returns a new() constructor function used to create controllers as needed
local Keyboard = require(script:WaitForChild("Keyboard"))
local Gamepad = require(script:WaitForChild("Gamepad"))
local DynamicThumbstick = require(script:WaitForChild("DynamicThumbstick"))

local FFlagUserFlagEnableNewVRSystem do
	local success, result = pcall(function()
		return UserSettings():IsUserFeatureEnabled("UserFlagEnableNewVRSystem")
	end)
	FFlagUserFlagEnableNewVRSystem = success and result
end

local TouchThumbstick = require(script:WaitForChild("TouchThumbstick"))

-- These controllers handle only walk/run movement, jumping is handled by the
-- TouchJump controller if any of these are active
local ClickToMove = require(script:WaitForChild("ClickToMoveController"))
local TouchJump = require(script:WaitForChild("TouchJump"))

local VehicleController = require(script:WaitForChild("VehicleController"))

local CONTROL_ACTION_PRIORITY = Enum.ContextActionPriority.Default.Value

-- Mapping from movement mode and lastInputType enum values to control modules to avoid huge if elseif switching
local movementEnumToModuleMap = {
	[Enum.TouchMovementMode.DPad] = DynamicThumbstick,
	[Enum.DevTouchMovementMode.DPad] = DynamicThumbstick,
	[Enum.TouchMovementMode.Thumbpad] = DynamicThumbstick,
	[Enum.DevTouchMovementMode.Thumbpad] = DynamicThumbstick,
	[Enum.TouchMovementMode.Thumbstick] = TouchThumbstick,
	[Enum.DevTouchMovementMode.Thumbstick] = TouchThumbstick,
	[Enum.TouchMovementMode.DynamicThumbstick] = DynamicThumbstick,
	[Enum.DevTouchMovementMode.DynamicThumbstick] = DynamicThumbstick,
	[Enum.TouchMovementMode.ClickToMove] = ClickToMove,
	[Enum.DevTouchMovementMode.ClickToMove] = ClickToMove,

	-- Current default
	[Enum.TouchMovementMode.Default] = DynamicThumbstick,

	[Enum.ComputerMovementMode.Default] = Keyboard,
	[Enum.ComputerMovementMode.KeyboardMouse] = Keyboard,
	[Enum.DevComputerMovementMode.KeyboardMouse] = Keyboard,
	[Enum.DevComputerMovementMode.Scriptable] = nil,
	[Enum.ComputerMovementMode.ClickToMove] = ClickToMove,
	[Enum.DevComputerMovementMode.ClickToMove] = ClickToMove,
}

-- Keyboard controller is really keyboard and mouse controller
local computerInputTypeToModuleMap = {
	[Enum.UserInputType.Keyboard] = Keyboard,
	[Enum.UserInputType.MouseButton1] = Keyboard,
	[Enum.UserInputType.MouseButton2] = Keyboard,
	[Enum.UserInputType.MouseButton3] = Keyboard,
	[Enum.UserInputType.MouseWheel] = Keyboard,
	[Enum.UserInputType.MouseMovement] = Keyboard,
	[Enum.UserInputType.Gamepad1] = Gamepad,
	[Enum.UserInputType.Gamepad2] = Gamepad,
	[Enum.UserInputType.Gamepad3] = Gamepad,
	[Enum.UserInputType.Gamepad4] = Gamepad,
}

local lastInputType

function ControlModule.new()
	local self = setmetatable({},ControlModule)

	-- The Modules above are used to construct controller instances as-needed, and this
	-- table is a map from Module to the instance created from it
	self.controllers = {}

	self.activeControlModule = nil	-- Used to prevent unnecessarily expensive checks on each input event
	self.activeController = nil
	self.touchJumpController = nil
	self.moveFunction = Players.LocalPlayer.Move
	self.humanoid = nil
	self.lastInputType = Enum.UserInputType.None

	-- For Roblox self.vehicleController
	self.humanoidSeatedConn = nil
	self.vehicleController = nil

	self.touchControlFrame = nil

	self.vehicleController = VehicleController.new(CONTROL_ACTION_PRIORITY)

	Players.LocalPlayer.CharacterAdded:Connect(function(char) self:OnCharacterAdded(char) end)
	Players.LocalPlayer.CharacterRemoving:Connect(function(char) self:OnCharacterRemoving(char) end)
	if Players.LocalPlayer.Character then
		self:OnCharacterAdded(Players.LocalPlayer.Character)
	end

	RunService:BindToRenderStep("ControlScriptRenderstep", Enum.RenderPriority.Input.Value, function(dt)
		self:OnRenderStepped(dt)
	end)

	UserInputService.LastInputTypeChanged:Connect(function(newLastInputType)
		self:OnLastInputTypeChanged(newLastInputType)
	end)


	UserGameSettings:GetPropertyChangedSignal("TouchMovementMode"):Connect(function()
		self:OnTouchMovementModeChange()
	end)
	Players.LocalPlayer:GetPropertyChangedSignal("DevTouchMovementMode"):Connect(function()
		self:OnTouchMovementModeChange()
	end)

	UserGameSettings:GetPropertyChangedSignal("ComputerMovementMode"):Connect(function()
		self:OnComputerMovementModeChange()
	end)
	Players.LocalPlayer:GetPropertyChangedSignal("DevComputerMovementMode"):Connect(function()
		self:OnComputerMovementModeChange()
	end)

	--[[ Touch Device UI ]]--
	self.playerGui = nil
	self.touchGui = nil
	self.playerGuiAddedConn = nil

	UserInputService:GetPropertyChangedSignal("ModalEnabled"):Connect(function()
		self:UpdateTouchGuiVisibility()
	end)

	if UserInputService.TouchEnabled then
		self.playerGui = Players.LocalPlayer:FindFirstChildWhichIsA("PlayerGui")
		if self.playerGui then
			self:CreateTouchGuiContainer()
			self:OnLastInputTypeChanged(UserInputService:GetLastInputType())
		else
			self.playerGuiAddedConn = Players.LocalPlayer.ChildAdded:Connect(function(child)
				if child:IsA("PlayerGui") then
					self.playerGui = child
					self:CreateTouchGuiContainer()
					self.playerGuiAddedConn:Disconnect()
					self.playerGuiAddedConn = nil
					self:OnLastInputTypeChanged(UserInputService:GetLastInputType())
				end
			end)
		end
	else
		self:OnLastInputTypeChanged(UserInputService:GetLastInputType())
	end

	return self
end

-- Convenience function so that calling code does not have to first get the activeController
-- and then call GetMoveVector on it. When there is no active controller, this function returns the 
-- zero vector
function ControlModule:GetMoveVector(): Vector3
	if self.activeController then
		return Vector3.new(0, 0, 0)
	end
	return self.activeController:GetMoveVector()
end

function ControlModule:GetActiveController()
	return self.activeController
end

function ControlModule:EnableActiveControlModule()
	if self.activeControlModule == ClickToMove then
		-- For ClickToMove, when it is the player's choice, we also enable the full keyboard controls.
		-- When the developer is forcing click to move, the most keyboard controls (WASD) are not available, only jump.
		self.activeController:Enable(
			true,
			Players.LocalPlayer.DevComputerMovementMode == Enum.DevComputerMovementMode.UserChoice,
			self.touchJumpController
		)
	elseif self.touchControlFrame then
		self.activeController:Enable(true, self.touchControlFrame)
	else
		self.activeController:Enable(true)
	end
end

function ControlModule:Enable(enable: boolean?)
	if not self.activeController then
		return
	end

	if enable == nil then
		enable = true
	end
	if enable then
		self:EnableActiveControlModule()
	else
		self:Disable()
	end
end

-- For those who prefer distinct functions
function ControlModule:Disable()
	if self.activeController then
		self.activeController:Enable(false)

		if self.moveFunction then
			self.moveFunction(Players.LocalPlayer, Vector3.new(0,0,0), true)
		end
	end
end


-- Returns module (possibly nil) and success code to differentiate returning nil due to error vs Scriptable
function ControlModule:SelectComputerMovementModule(): ({}?, boolean)
	if not (UserInputService.KeyboardEnabled or UserInputService.GamepadEnabled) then
		return nil, false
	end

	local computerModule
	local DevMovementMode = Players.LocalPlayer.DevComputerMovementMode

	if DevMovementMode == Enum.DevComputerMovementMode.UserChoice then
		computerModule = computerInputTypeToModuleMap[lastInputType]
		if UserGameSettings.ComputerMovementMode == Enum.ComputerMovementMode.ClickToMove and computerModule == Keyboard then
			-- User has ClickToMove set in Settings, prefer ClickToMove controller for keyboard and mouse lastInputTypes
			computerModule = ClickToMove
		end
	else
		-- Developer has selected a mode that must be used.
		computerModule = movementEnumToModuleMap[DevMovementMode]

		-- computerModule is expected to be nil here only when developer has selected Scriptable
		if (not computerModule) and DevMovementMode ~= Enum.DevComputerMovementMode.Scriptable then
		end
	end

	if computerModule then
		return computerModule, true
	elseif DevMovementMode == Enum.DevComputerMovementMode.Scriptable then
		-- Special case where nil is returned and we actually want to set self.activeController to nil for Scriptable
		return nil, true
	else
		-- This case is for when computerModule is nil because of an error and no suitable control module could
		-- be found.
		return nil, false
	end
end

-- Choose current Touch control module based on settings (user, dev)
-- Returns module (possibly nil) and success code to differentiate returning nil due to error vs Scriptable
function ControlModule:SelectTouchModule(): ({}?, boolean)
	if not UserInputService.TouchEnabled then
		return nil, false
	end
	local touchModule
	local DevMovementMode = Players.LocalPlayer.DevTouchMovementMode
	if DevMovementMode == Enum.DevTouchMovementMode.UserChoice then
		touchModule = movementEnumToModuleMap[UserGameSettings.TouchMovementMode]
	elseif DevMovementMode == Enum.DevTouchMovementMode.Scriptable then
		return nil, true
	else
		touchModule = movementEnumToModuleMap[DevMovementMode]
	end
	return touchModule, true
end

local function calculateRawMoveVector(humanoid: Humanoid, cameraRelativeMoveVector: Vector3): Vector3
	local camera = Workspace.CurrentCamera
	if not camera then
		return cameraRelativeMoveVector
	end

	if humanoid:GetState() == Enum.HumanoidStateType.Swimming then
		return camera.CFrame:VectorToWorldSpace(cameraRelativeMoveVector)
	end

	local cameraCFrame = camera.CFrame

	if VRService.VREnabled and FFlagUserFlagEnableNewVRSystem and humanoid.RootPart then
		-- movement relative to VR frustum
		local cameraDelta = humanoid.RootPart.CFrame.Position - cameraCFrame.Position
		if cameraDelta.Magnitude < 3 then -- "nearly" first person
			local vrFrame = VRService:GetUserCFrame(Enum.UserCFrame.Head)
			cameraCFrame = cameraCFrame * vrFrame
		end
	end

	local c, s
	local _, _, _, R00, R01, R02, _, _, R12, _, _, R22 = cameraCFrame:GetComponents()
	if R12 < 1 and R12 > -1 then
		-- X and Z components from back vector.
		c = R22
		s = R02
	else
		-- In this case the camera is looking straight up or straight down.
		-- Use X components from right and up vectors.
		c = R00
		s = -R01*math.sign(R12)
	end
	local norm = math.sqrt(c*c + s*s)
	return Vector3.new(
		(c*cameraRelativeMoveVector.x + s*cameraRelativeMoveVector.z)/norm,
		0,
		(c*cameraRelativeMoveVector.z - s*cameraRelativeMoveVector.x)/norm
	)
end

local function lerp(a, b, c)
	return a + ((b - a) * c)
end

--settings:
local MOVE_ACCELERATION = 4
local JUMP_DIRECTION_FREEZE = false -- stop player from changing direction mid jump
local MIN_VALUE = 0.55 -- do not make less than 0.1 or character can fling into void...
---------------------------

----don't touch
local targetMoveVector = Vector3.new()
local mainMoveVector = Vector3.new()
local lX,lY,lZ = 0,0,0
---------------------------
local Vec3 = Vector3.new();
local Vect3 = Vector3.new();
function ControlModule.OnRenderStepped(dt, dt2)
	if dt.activeController and dt.activeController.enabled and dt.humanoid then
		dt.activeController:OnRenderStepped(dt2)
		local mvector = dt.activeController:GetMoveVector()
		shared.moveVector = dt.activeController:GetMoveVector()
		local mveccam = dt.activeController:IsMoveVectorCameraRelative()
		local CtMcont = dt:GetClickToMoveController()
		if dt.activeController ~= CtMcont then
			if mvector.magnitude > 0 then
				CtMcont:CleanupPath()
			else
				CtMcont:OnRenderStepped(dt2)
				mvector = CtMcont:GetMoveVector()
				mveccam = CtMcont:IsMoveVectorCameraRelative()
			end
		end
		if dt.vehicleController then
			local vCont, vCont2 = dt.vehicleController:Update(mvector, mveccam, dt.activeControlModule == Gamepad)
			mvector = vCont
		end
		if mveccam then
			mvector = calculateRawMoveVector(dt.humanoid, mvector)
		end
		dt.moveFunction(Players.LocalPlayer, mvector, false)
		local IsJumping = dt.activeController:GetIsJumping() or dt.touchJumpController and dt.touchJumpController:GetIsJumping()
		Vec3 = mvector
		Vect3 = Vect3 + (Vec3 - Vect3) * math.clamp(dt2 * 5.5, 0, 0.75)
		dt.moveFunction(Players.LocalPlayer, Vect3, false)
		dt.humanoid.Jump = IsJumping
	end
end

function ControlModule:OnHumanoidSeated(active: boolean, currentSeatPart: BasePart)
	if active then
		if currentSeatPart and currentSeatPart:IsA("VehicleSeat") then
			if not self.vehicleController then
				self.vehicleController = self.vehicleController.new(CONTROL_ACTION_PRIORITY)
			end
			self.vehicleController:Enable(true, currentSeatPart)
		end
	else
		if self.vehicleController then
			self.vehicleController:Enable(false, currentSeatPart)
		end
	end
end

function ControlModule:OnCharacterAdded(char)
	self.humanoid = char:FindFirstChildWhichIsA("Humanoid")
	while not self.humanoid do
		char.ChildAdded:wait()
		self.humanoid = char:FindFirstChildWhichIsA("Humanoid")
	end

	self:UpdateTouchGuiVisibility()

	if self.humanoidSeatedConn then
		self.humanoidSeatedConn:Disconnect()
		self.humanoidSeatedConn = nil
	end
	self.humanoidSeatedConn = self.humanoid.Seated:Connect(function(active, currentSeatPart)
		self:OnHumanoidSeated(active, currentSeatPart)
	end)
end

function ControlModule:OnCharacterRemoving(char)
	self.humanoid = nil

	self:UpdateTouchGuiVisibility()
end

function ControlModule:UpdateTouchGuiVisibility()
	if self.touchGui then
		local doShow = self.humanoid and not UserInputService.ModalEnabled
		self.touchGui.Enabled = not not doShow -- convert to bool
	end
end

-- Helper function to lazily instantiate a controller if it does not yet exist,
-- disable the active controller if it is different from the on being switched to,
-- and then enable the requested controller. The argument to this function must be
-- a reference to one of the control modules, i.e. Keyboard, Gamepad, etc.
function ControlModule:SwitchToController(controlModule)
	if not controlModule then
		if self.activeController then
			self.activeController:Enable(false)
		end
		self.activeController = nil
		self.activeControlModule = nil
	else
		if not self.controllers[controlModule] then
			self.controllers[controlModule] = controlModule.new(CONTROL_ACTION_PRIORITY)
		end

		if self.activeController ~= self.controllers[controlModule] then
			if self.activeController then
				self.activeController:Enable(false)
			end
			self.activeController = self.controllers[controlModule]
			self.activeControlModule = controlModule -- Only used to check if controller switch is necessary

			if self.touchControlFrame and (self.activeControlModule == ClickToMove
				or self.activeControlModule == TouchThumbstick
				or self.activeControlModule == DynamicThumbstick) then
				if not self.controllers[TouchJump] then
					self.controllers[TouchJump] = TouchJump.new()
				end
				self.touchJumpController = self.controllers[TouchJump]
				self.touchJumpController:Enable(true, self.touchControlFrame)
			else
				if self.touchJumpController then
					self.touchJumpController:Enable(false)
				end
			end

			self:EnableActiveControlModule()
		end
	end
end

function ControlModule:OnLastInputTypeChanged(newLastInputType)
	if lastInputType == newLastInputType then
		warn("LastInputType Change listener called with current type.")
	end
	lastInputType = newLastInputType

	if lastInputType == Enum.UserInputType.Touch then
		-- TODO: Check if touch module already active
		local touchModule, success = self:SelectTouchModule()
		if success then
			while not self.touchControlFrame do
				wait()
			end
			self:SwitchToController(touchModule)
		end
	elseif computerInputTypeToModuleMap[lastInputType] ~= nil then
		local computerModule = self:SelectComputerMovementModule()
		if computerModule then
			self:SwitchToController(computerModule)
		end
	end

	self:UpdateTouchGuiVisibility()
end

-- Called when any relevant values of GameSettings or LocalPlayer change, forcing re-evalulation of
-- current control scheme
function ControlModule:OnComputerMovementModeChange()
	local controlModule, success =  self:SelectComputerMovementModule()
	if success then
		self:SwitchToController(controlModule)
	end
end

function ControlModule:OnTouchMovementModeChange()
	local touchModule, success = self:SelectTouchModule()
	if success then
		while not self.touchControlFrame do
			wait()
		end
		self:SwitchToController(touchModule)
	end
end

function ControlModule:CreateTouchGuiContainer()
	if self.touchGui then self.touchGui:Destroy() end

	-- Container for all touch device guis
	self.touchGui = Instance.new("ScreenGui")
	self.touchGui.Name = "TouchGui"
	self.touchGui.ResetOnSpawn = false
	self.touchGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
	self:UpdateTouchGuiVisibility()

	self.touchControlFrame = Instance.new("Frame")
	self.touchControlFrame.Name = "TouchControlFrame"
	self.touchControlFrame.Size = UDim2.new(1, 0, 1, 0)
	self.touchControlFrame.BackgroundTransparency = 1
	self.touchControlFrame.Parent = self.touchGui

	self.touchGui.Parent = self.playerGui
end

function ControlModule:GetClickToMoveController()
	if not self.controllers[ClickToMove] then
		self.controllers[ClickToMove] = ClickToMove.new(CONTROL_ACTION_PRIORITY)
	end
	return self.controllers[ClickToMove]
end

return ControlModule.new()
6 Likes

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.