Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

CFrame messing up animation?

So here is my script:

local lookVector = script.Parent.Parent.Adornee.Parent["LOOK AT ME"].Position
local cookingAnimation = script.Parent["Animation"]

script.Parent.TextButton.MouseButton1Click:connect(function() 
	local playerWhoClick = game.Players.LocalPlayer
	

	playerWhoClick.Character.HumanoidRootPart.CFrame = CFrame.new(Vector3.new(-5.75, 3, 62.7), lookVector)
	
	playerWhoClick.Character.Humanoid.WalkSpeed = 0
	playerWhoClick.Character.Humanoid.JumpPower = 0
	local animationTrack = playerWhoClick.Character.Humanoid:LoadAnimation(cookingAnimation)
	
	animationTrack:Play()
	wait(1)
	animationTrack:Play()
	wait(1)
	animationTrack:Play()
	wait(1)
	
	print("Played.")
	
	playerWhoClick.Character.Humanoid.WalkSpeed = 16
	playerWhoClick.Character.Humanoid.JumpPower = 50

end)

Everything was working fine until I modified line 08. I added in the lookVector in it's initialization. What's strange is that is that it's not like after the CFrame line exits the script or anything, and the lines where I change the WalkSpeed and JumpPower work fine. I assume the problem is in the

animationTrack:Play()

lines. No animation plays. This wasn't happening before, please help.

1 answer

Having good names for your objects that are in your game and variables in scripts comes with the benefit of organization and efficiency.

One of the problems I think you may have is that your script is running before things load in. When you identify the variable on Line 2 like script.Parent["Animation"], you should use the bracket method when working with tables. You don't have to but it's usually what you use it for.

Instead use :WaitForChild() or :FindFirstChild(). In our case, since we want the script to wait for our objects we will use :WaitForChild()

--Make sure these lead to the right location. If they don't the server will stay on an infinite wait.
local lookAtPart = script.Parent.Parent.Adornee.Parent:WaitForChild("LookAtMe")
local cookingAnimation =  script.Parent:WaitForChild("Animation")

script.Parent.MouseButton1Click:connect(function() 
    local playerWhoClick = game.Players.LocalPlayer

--I had change the name of lookVector to LookAtPart. We also access its Vector3 pos here.
    playerWhoClick.Character.HumanoidRootPart.CFrame = CFrame.new(Vector3.new(-5.75, 3, 62.7), lookAtPart.Position)

    playerWhoClick.Character.Humanoid.WalkSpeed = 0
    playerWhoClick.Character.Humanoid.JumpPower = 0
   

One of the things you can fix and try using more are for loops. Most beginner scripters always repeat code that you can condense into a small piece of code.

We're going to use a counting for loop to go up to 3 after waiting a second and playing the animation.

local animationTrack = playerWhoClick.Character.Humanoid:LoadAnimation(cookingAnimation)

--For loops help a lot. Find reference for it on the wiki.
--I also don't know why you want the animation to play multiple times?
--Try using a function that plays it until its finish if this doesn't help.
	for i = 1, 3, 1 do
		animationTrack:Play()
		wait(1)
	end

    print("Played.")

    playerWhoClick.Character.Humanoid.WalkSpeed = 16
    playerWhoClick.Character.Humanoid.JumpPower = 50

end)

Make sure the defined variables lead to the right locations of your objects. Also since we're in a local script, the CFrame-ing of the player might not be seen by other players.

This discussion is preserved as it was. New answers, comments, and votes are closed.