I've been working on developing a script without using preset animations, but came across some trouble recently on trying to get the left arm of the player to rotate systematically (custom) while the player is walking (only when the mouse is held down). Below is my attempt to solve it, and following that is the original code I had:
wait(1)
q= 1
while q==1 do
local Player = game.Players.LocalPlayer
local Mouse = Player:GetMouse()
if game.Players.LocalPlayer.Character.LeftArmClone then
fg= game.Players.LocalPlayer.Character.LeftArmClone
for i=1,100 do
fg.CFrame= fg.CFrame*CFrame.Angles(0,0,0.1)*CFrame.new(0.05,0,0)
wait(0)
end
wait(0.2)
end
wait(0)
end
Here, this script was inserted under a model in the Workspace, and its goal was to try to CFrame a rotation of the brick by steps.fg.CFrame= fg.CFrame*CFrame.Angles(0,0,0.1)*CFrame.new(0.05,0,0)represents the original position, the angle of rotation, and some translation to prevent the part from sliding off, respectively. This was influenced by a previously successful script for an NPC model I used before.
local Player = game.Players.LocalPlayer
local Mouse = Player:GetMouse()
--creates a weld to join the animated arm to the torso
local function weldBetween(a,b)
local weld= Instance.new("ManualWeld",a)
weld.Part0= a
weld.Part1= b
weld.C0= a.CFrame:inverse()*b.CFrame
return weld
end
local vb= 0--extra variable for testing purposes
local holdVal= 0
ResetValue= function(Self)
holdVal= 0
end
--this acts also like a hold function, the value increases as the left button is held down
Mouse.Button1Down:connect(function()
local leftArmClone= game.Players.LocalPlayer.Character["Left Arm"]:Clone()
leftArmClone.Parent= game.Players.LocalPlayer.Character
leftArmClone.Name= "LeftArmClone"
leftArmClone.Anchored= true
leftArmClone.TopSurface= "Smooth"
leftArmClone.BottomSurface= "Smooth"
leftArmClone.FrontSurface= "Smooth"
leftArmClone.BackSurface= "Smooth"
leftArmClone.LeftSurface= "Smooth"
leftArmClone.RightSurface= "Smooth"
--game.Players.LocalPlayer.Character["Right Arm"].TopSurface= "Weld"
weldBetween(game.Players.LocalPlayer.Character.Torso,leftArmClone)
local kl= game.Players.LocalPlayer.Character["Left Arm"]
leftArmClone.Position= Vector3.new(kl.Position.X,kl.Position.Y,kl.Position.Z)
leftArmClone.Anchored= false
--]]
--[[
--another attempt by changing the surface to get a desired weld type, didn't work
local leftArmClone= game.Players.LocalPlayer.Character["Left Arm"]:Clone()
leftArmClone.Parent= game.Players.LocalPlayer.Character
leftArmClone.Name= "LeftArmClone"
leftArmClone.Anchored= true
leftArmClone.TopSurface= "SmoothNoOutlines"
leftArmClone.BottomSurface= "SmoothNoOutlines"
leftArmClone.FrontSurface= "SmoothNoOutlines"
leftArmClone.BackSurface= "SmoothNoOutlines"
leftArmClone.LeftSurface= "SmoothNoOutlines"
leftArmClone.RightSurface= "SmoothNoOutlines"
--]]
--[[
--in-script left arm animation; haven't gotten to work; it is modeled off NPC left arm animation
local fg= game.Players.LocalPlayer.Character.LeftArmClone
if game.Players.LocalPlayer.Character.LeftArmClone then
fg.CFrame= fg.CFrame*CFrame.Angles(0,0,0.1)*CFrame.new(0.05,0,0)
wait(0)
end
--]]
Mouse.Button1Up:connect(function()--inside button down so holdVal can recount if pos changes
holdSwitch= 1
ResetValue()
if game.Players.LocalPlayer.Character:FindFirstChild("LeftArmClone") then
leftArmClone:Destroy()
end
end)
holdSwitch= 0
while holdSwitch== 0 do
wait(0)
holdVal= holdVal+1
print(holdVal)
game.Players.LocalPlayer.Character["Left Arm"].Transparency= 1
----------------
-----------------------
if holdVal==1 then
game.Players.LocalPlayer.Character["Left Arm"].Transparency= 0
end
end
end)
The script above is the original script I have. Basically, the left arm is cloned, beginning at local leftArmClone= game.Players.LocalPlayer.Character["Left Arm"]:Clone(). Next, the surfaces of the cloned arm is changed to smooth, a function to weld the left arm to the torso is instantiated, the left arm is shifted to prevent overlap with the torso, and finally the part becomes un-anchored as the left arm clone won't fall off. If the mouse button is released, the original arm reappears, in:
if holdVal==1 then
game.Players.LocalPlayer.Character["Left Arm"].Transparency= 0
end
Because, when the right mouse button is released the value of holdVal is 1, not 0.
For a supplement just to help with my question/ get an idea, this was my left arm NPC animation script that worked just because it only had to translate in a fixed single direction and velocity while rotating. What this one does is that it rocks the arm back and forth in a swinging motion, non-stop as the server is running:
while true do
local pos1= workspace.NPC.LeftArm.Position.Y
--print("Pos 1: "..workspace.NPC.LeftArm.Position.Y)
for i=1,7 do
workspace.NPC.LeftArm.CFrame= workspace.NPC.LeftArm.CFrame*CFrame.Angles(0,0,0.1)*CFrame.new(0.05,0,0)
wait(0)
end
wait(0.2)
for i=1,7 do
workspace.NPC.LeftArm.CFrame= workspace.NPC.LeftArm.CFrame*CFrame.Angles(0,0,-0.1)*CFrame.new(-0.05,0,0)
wait(0)
end
for i=1,7 do
workspace.NPC.LeftArm.CFrame= workspace.NPC.LeftArm.CFrame*CFrame.Angles(0,0,-0.1)*CFrame.new(-0.05,0,0)
wait(0)
end
wait(0.2)
for i=1,7 do
workspace.NPC.LeftArm.CFrame= workspace.NPC.LeftArm.CFrame*CFrame.Angles(0,0,0.1)*CFrame.new(0.05,0,0)
wait(0)
end
--workspace.NPC.LeftArm.CFrame= workspace.NPC.LeftArm.CFrame*CFrame.new(0,-0.05,0)
local pos2= workspace.NPC.LeftArm.Position.Y
local pos3= pos2-pos1--positive
--print("Pos 2: "..workspace.NPC.LeftArm.Position.Y)
workspace.NPC.LeftArm.CFrame= workspace.NPC.LeftArm.CFrame*CFrame.new(0,-pos3,0)--if too high should go down, so '-' sign
end
Referring back to the original code, when the left mouse is held down the left arm clone becomes frozen (no rotation) at the last site where the original left arm became transparent, but translates well with the player and the player's faced direction. In advance, thanks for taking a look at this; I will follow up with any inquiries.
