Advertisement
pluginfactory

Roblox Animation Script

Jan 21st, 2017
52,345
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.61 KB | None | 0 0
  1. function waitForChild(parent, childName)
  2. local child = parent:findFirstChild(childName)
  3. if child then return child end
  4. while true do
  5. child = parent.ChildAdded:wait()
  6. if child.Name==childName then return child end
  7. end
  8. end
  9.  
  10. local Figure = script.Parent
  11. local Torso = waitForChild(Figure, "Torso")
  12. local RightShoulder = waitForChild(Torso, "Right Shoulder")
  13. local LeftShoulder = waitForChild(Torso, "Left Shoulder")
  14. local RightHip = waitForChild(Torso, "Right Hip")
  15. local LeftHip = waitForChild(Torso, "Left Hip")
  16. local Neck = waitForChild(Torso, "Neck")
  17. local Humanoid = waitForChild(Figure, "Humanoid")
  18. local pose = "Standing"
  19.  
  20. local currentAnim = ""
  21. local currentAnimInstance = nil
  22. local currentAnimTrack = nil
  23. local currentAnimKeyframeHandler = nil
  24. local currentAnimSpeed = 1.0
  25. local animTable = {}
  26. local animNames = {
  27. idle = {
  28. { id = "http://www.roblox.com/asset/?id=180435571", weight = 9 },
  29. { id = "http://www.roblox.com/asset/?id=180435792", weight = 1 }
  30. },
  31. walk = {
  32. { id = "http://www.roblox.com/asset/?id=180426354", weight = 10 }
  33. },
  34. run = {
  35. { id = "run.xml", weight = 10 }
  36. },
  37. jump = {
  38. { id = "http://www.roblox.com/asset/?id=125750702", weight = 10 }
  39. },
  40. fall = {
  41. { id = "http://www.roblox.com/asset/?id=180436148", weight = 10 }
  42. },
  43. climb = {
  44. { id = "http://www.roblox.com/asset/?id=180436334", weight = 10 }
  45. },
  46. sit = {
  47. { id = "http://www.roblox.com/asset/?id=178130996", weight = 10 }
  48. },
  49. toolnone = {
  50. { id = "http://www.roblox.com/asset/?id=182393478", weight = 10 }
  51. },
  52. toolslash = {
  53. { id = "http://www.roblox.com/asset/?id=129967390", weight = 10 }
  54. -- { id = "slash.xml", weight = 10 }
  55. },
  56. toollunge = {
  57. { id = "http://www.roblox.com/asset/?id=129967478", weight = 10 }
  58. },
  59. wave = {
  60. { id = "http://www.roblox.com/asset/?id=128777973", weight = 10 }
  61. },
  62. point = {
  63. { id = "http://www.roblox.com/asset/?id=128853357", weight = 10 }
  64. },
  65. dance1 = {
  66. { id = "http://www.roblox.com/asset/?id=182435998", weight = 10 },
  67. { id = "http://www.roblox.com/asset/?id=182491037", weight = 10 },
  68. { id = "http://www.roblox.com/asset/?id=182491065", weight = 10 }
  69. },
  70. dance2 = {
  71. { id = "http://www.roblox.com/asset/?id=182436842", weight = 10 },
  72. { id = "http://www.roblox.com/asset/?id=182491248", weight = 10 },
  73. { id = "http://www.roblox.com/asset/?id=182491277", weight = 10 }
  74. },
  75. dance3 = {
  76. { id = "http://www.roblox.com/asset/?id=182436935", weight = 10 },
  77. { id = "http://www.roblox.com/asset/?id=182491368", weight = 10 },
  78. { id = "http://www.roblox.com/asset/?id=182491423", weight = 10 }
  79. },
  80. laugh = {
  81. { id = "http://www.roblox.com/asset/?id=129423131", weight = 10 }
  82. },
  83. cheer = {
  84. { id = "http://www.roblox.com/asset/?id=129423030", weight = 10 }
  85. },
  86. }
  87. local dances = {"dance1", "dance2", "dance3"}
  88.  
  89. -- Existance in this list signifies that it is an emote, the value indicates if it is a looping emote
  90. local emoteNames = { wave = false, point = false, dance1 = true, dance2 = true, dance3 = true, laugh = false, cheer = false}
  91.  
  92. function configureAnimationSet(name, fileList)
  93. if (animTable[name] ~= nil) then
  94. for _, connection in pairs(animTable[name].connections) do
  95. connection:disconnect()
  96. end
  97. end
  98. animTable[name] = {}
  99. animTable[name].count = 0
  100. animTable[name].totalWeight = 0
  101. animTable[name].connections = {}
  102.  
  103. -- check for config values
  104. local config = script:FindFirstChild(name)
  105. if (config ~= nil) then
  106. -- print("Loading anims " .. name)
  107. table.insert(animTable[name].connections, config.ChildAdded:connect(function(child) configureAnimationSet(name, fileList) end))
  108. table.insert(animTable[name].connections, config.ChildRemoved:connect(function(child) configureAnimationSet(name, fileList) end))
  109. local idx = 1
  110. for _, childPart in pairs(config:GetChildren()) do
  111. if (childPart:IsA("Animation")) then
  112. table.insert(animTable[name].connections, childPart.Changed:connect(function(property) configureAnimationSet(name, fileList) end))
  113. animTable[name][idx] = {}
  114. animTable[name][idx].anim = childPart
  115. local weightObject = childPart:FindFirstChild("Weight")
  116. if (weightObject == nil) then
  117. animTable[name][idx].weight = 1
  118. else
  119. animTable[name][idx].weight = weightObject.Value
  120. end
  121. animTable[name].count = animTable[name].count + 1
  122. animTable[name].totalWeight = animTable[name].totalWeight + animTable[name][idx].weight
  123. -- print(name .. " [" .. idx .. "] " .. animTable[name][idx].anim.AnimationId .. " (" .. animTable[name][idx].weight .. ")")
  124. idx = idx + 1
  125. end
  126. end
  127. end
  128.  
  129. -- fallback to defaults
  130. if (animTable[name].count <= 0) then
  131. for idx, anim in pairs(fileList) do
  132. animTable[name][idx] = {}
  133. animTable[name][idx].anim = Instance.new("Animation")
  134. animTable[name][idx].anim.Name = name
  135. animTable[name][idx].anim.AnimationId = anim.id
  136. animTable[name][idx].weight = anim.weight
  137. animTable[name].count = animTable[name].count + 1
  138. animTable[name].totalWeight = animTable[name].totalWeight + anim.weight
  139. -- print(name .. " [" .. idx .. "] " .. anim.id .. " (" .. anim.weight .. ")")
  140. end
  141. end
  142. end
  143.  
  144. -- Setup animation objects
  145. function scriptChildModified(child)
  146. local fileList = animNames[child.Name]
  147. if (fileList ~= nil) then
  148. configureAnimationSet(child.Name, fileList)
  149. end
  150. end
  151.  
  152. script.ChildAdded:connect(scriptChildModified)
  153. script.ChildRemoved:connect(scriptChildModified)
  154.  
  155.  
  156. for name, fileList in pairs(animNames) do
  157. configureAnimationSet(name, fileList)
  158. end
  159.  
  160. -- ANIMATION
  161.  
  162. -- declarations
  163. local toolAnim = "None"
  164. local toolAnimTime = 0
  165.  
  166. local jumpAnimTime = 0
  167. local jumpAnimDuration = 0.3
  168.  
  169. local toolTransitionTime = 0.1
  170. local fallTransitionTime = 0.3
  171. local jumpMaxLimbVelocity = 0.75
  172.  
  173. -- functions
  174.  
  175. function stopAllAnimations()
  176. local oldAnim = currentAnim
  177.  
  178. -- return to idle if finishing an emote
  179. if (emoteNames[oldAnim] ~= nil and emoteNames[oldAnim] == false) then
  180. oldAnim = "idle"
  181. end
  182.  
  183. currentAnim = ""
  184. currentAnimInstance = nil
  185. if (currentAnimKeyframeHandler ~= nil) then
  186. currentAnimKeyframeHandler:disconnect()
  187. end
  188.  
  189. if (currentAnimTrack ~= nil) then
  190. currentAnimTrack:Stop()
  191. currentAnimTrack:Destroy()
  192. currentAnimTrack = nil
  193. end
  194. return oldAnim
  195. end
  196.  
  197. function setAnimationSpeed(speed)
  198. if speed ~= currentAnimSpeed then
  199. currentAnimSpeed = speed
  200. currentAnimTrack:AdjustSpeed(currentAnimSpeed)
  201. end
  202. end
  203.  
  204. function keyFrameReachedFunc(frameName)
  205. if (frameName == "End") then
  206.  
  207. local repeatAnim = currentAnim
  208. -- return to idle if finishing an emote
  209. if (emoteNames[repeatAnim] ~= nil and emoteNames[repeatAnim] == false) then
  210. repeatAnim = "idle"
  211. end
  212.  
  213. local animSpeed = currentAnimSpeed
  214. playAnimation(repeatAnim, 0.0, Humanoid)
  215. setAnimationSpeed(animSpeed)
  216. end
  217. end
  218.  
  219. -- Preload animations
  220. function playAnimation(animName, transitionTime, humanoid)
  221.  
  222. local roll = math.random(1, animTable[animName].totalWeight)
  223. local origRoll = roll
  224. local idx = 1
  225. while (roll > animTable[animName][idx].weight) do
  226. roll = roll - animTable[animName][idx].weight
  227. idx = idx + 1
  228. end
  229. -- print(animName .. " " .. idx .. " [" .. origRoll .. "]")
  230. local anim = animTable[animName][idx].anim
  231.  
  232. -- switch animation
  233. if (anim ~= currentAnimInstance) then
  234.  
  235. if (currentAnimTrack ~= nil) then
  236. currentAnimTrack:Stop(transitionTime)
  237. currentAnimTrack:Destroy()
  238. end
  239.  
  240. currentAnimSpeed = 1.0
  241.  
  242. -- load it to the humanoid; get AnimationTrack
  243. currentAnimTrack = humanoid:LoadAnimation(anim)
  244.  
  245. -- play the animation
  246. currentAnimTrack:Play(transitionTime)
  247. currentAnim = animName
  248. currentAnimInstance = anim
  249.  
  250. -- set up keyframe name triggers
  251. if (currentAnimKeyframeHandler ~= nil) then
  252. currentAnimKeyframeHandler:disconnect()
  253. end
  254. currentAnimKeyframeHandler = currentAnimTrack.KeyframeReached:connect(keyFrameReachedFunc)
  255.  
  256. end
  257.  
  258. end
  259.  
  260. -------------------------------------------------------------------------------------------
  261. -------------------------------------------------------------------------------------------
  262.  
  263. local toolAnimName = ""
  264. local toolAnimTrack = nil
  265. local toolAnimInstance = nil
  266. local currentToolAnimKeyframeHandler = nil
  267.  
  268. function toolKeyFrameReachedFunc(frameName)
  269. if (frameName == "End") then
  270. -- print("Keyframe : ".. frameName)
  271. playToolAnimation(toolAnimName, 0.0, Humanoid)
  272. end
  273. end
  274.  
  275.  
  276. function playToolAnimation(animName, transitionTime, humanoid)
  277.  
  278. local roll = math.random(1, animTable[animName].totalWeight)
  279. local origRoll = roll
  280. local idx = 1
  281. while (roll > animTable[animName][idx].weight) do
  282. roll = roll - animTable[animName][idx].weight
  283. idx = idx + 1
  284. end
  285. -- print(animName .. " * " .. idx .. " [" .. origRoll .. "]")
  286. local anim = animTable[animName][idx].anim
  287.  
  288. if (toolAnimInstance ~= anim) then
  289.  
  290. if (toolAnimTrack ~= nil) then
  291. toolAnimTrack:Stop()
  292. toolAnimTrack:Destroy()
  293. transitionTime = 0
  294. end
  295.  
  296. -- load it to the humanoid; get AnimationTrack
  297. toolAnimTrack = humanoid:LoadAnimation(anim)
  298.  
  299. -- play the animation
  300. toolAnimTrack:Play(transitionTime)
  301. toolAnimName = animName
  302. toolAnimInstance = anim
  303.  
  304. currentToolAnimKeyframeHandler = toolAnimTrack.KeyframeReached:connect(toolKeyFrameReachedFunc)
  305. end
  306. end
  307.  
  308. function stopToolAnimations()
  309. local oldAnim = toolAnimName
  310.  
  311. if (currentToolAnimKeyframeHandler ~= nil) then
  312. currentToolAnimKeyframeHandler:disconnect()
  313. end
  314.  
  315. toolAnimName = ""
  316. toolAnimInstance = nil
  317. if (toolAnimTrack ~= nil) then
  318. toolAnimTrack:Stop()
  319. toolAnimTrack:Destroy()
  320. toolAnimTrack = nil
  321. end
  322.  
  323.  
  324. return oldAnim
  325. end
  326.  
  327. -------------------------------------------------------------------------------------------
  328. -------------------------------------------------------------------------------------------
  329.  
  330.  
  331. function onRunning(speed)
  332. if speed>0.01 then
  333. playAnimation("walk", 0.1, Humanoid)
  334. if currentAnimInstance and currentAnimInstance.AnimationId == "http://www.roblox.com/asset/?id=180426354" then
  335. setAnimationSpeed(speed / 14.5)
  336. end
  337. pose = "Running"
  338. else
  339. if emoteNames[currentAnim] == nil then
  340. playAnimation("idle", 0.1, Humanoid)
  341. pose = "Standing"
  342. end
  343. end
  344. end
  345.  
  346. function onDied()
  347. pose = "Dead"
  348. end
  349.  
  350. function onJumping()
  351. playAnimation("jump", 0.1, Humanoid)
  352. jumpAnimTime = jumpAnimDuration
  353. pose = "Jumping"
  354. end
  355.  
  356. function onClimbing(speed)
  357. playAnimation("climb", 0.1, Humanoid)
  358. setAnimationSpeed(speed / 12.0)
  359. pose = "Climbing"
  360. end
  361.  
  362. function onGettingUp()
  363. pose = "GettingUp"
  364. end
  365.  
  366. function onFreeFall()
  367. if (jumpAnimTime <= 0) then
  368. playAnimation("fall", fallTransitionTime, Humanoid)
  369. end
  370. pose = "FreeFall"
  371. end
  372.  
  373. function onFallingDown()
  374. pose = "FallingDown"
  375. end
  376.  
  377. function onSeated()
  378. pose = "Seated"
  379. end
  380.  
  381. function onPlatformStanding()
  382. pose = "PlatformStanding"
  383. end
  384.  
  385. function onSwimming(speed)
  386. if speed>0 then
  387. pose = "Running"
  388. else
  389. pose = "Standing"
  390. end
  391. end
  392.  
  393. function getTool()
  394. for _, kid in ipairs(Figure:GetChildren()) do
  395. if kid.className == "Tool" then return kid end
  396. end
  397. return nil
  398. end
  399.  
  400. function getToolAnim(tool)
  401. for _, c in ipairs(tool:GetChildren()) do
  402. if c.Name == "toolanim" and c.className == "StringValue" then
  403. return c
  404. end
  405. end
  406. return nil
  407. end
  408.  
  409. function animateTool()
  410.  
  411. if (toolAnim == "None") then
  412. playToolAnimation("toolnone", toolTransitionTime, Humanoid)
  413. return
  414. end
  415.  
  416. if (toolAnim == "Slash") then
  417. playToolAnimation("toolslash", 0, Humanoid)
  418. return
  419. end
  420.  
  421. if (toolAnim == "Lunge") then
  422. playToolAnimation("toollunge", 0, Humanoid)
  423. return
  424. end
  425. end
  426.  
  427. function moveSit()
  428. RightShoulder.MaxVelocity = 0.15
  429. LeftShoulder.MaxVelocity = 0.15
  430. RightShoulder:SetDesiredAngle(3.14 /2)
  431. LeftShoulder:SetDesiredAngle(-3.14 /2)
  432. RightHip:SetDesiredAngle(3.14 /2)
  433. LeftHip:SetDesiredAngle(-3.14 /2)
  434. end
  435.  
  436. local lastTick = 0
  437.  
  438. function move(time)
  439. local amplitude = 1
  440. local frequency = 1
  441. local deltaTime = time - lastTick
  442. lastTick = time
  443.  
  444. local climbFudge = 0
  445. local setAngles = false
  446.  
  447. if (jumpAnimTime > 0) then
  448. jumpAnimTime = jumpAnimTime - deltaTime
  449. end
  450.  
  451. if (pose == "FreeFall" and jumpAnimTime <= 0) then
  452. playAnimation("fall", fallTransitionTime, Humanoid)
  453. elseif (pose == "Seated") then
  454. playAnimation("sit", 0.5, Humanoid)
  455. return
  456. elseif (pose == "Running") then
  457. playAnimation("walk", 0.1, Humanoid)
  458. elseif (pose == "Dead" or pose == "GettingUp" or pose == "FallingDown" or pose == "Seated" or pose == "PlatformStanding") then
  459. -- print("Wha " .. pose)
  460. stopAllAnimations()
  461. amplitude = 0.1
  462. frequency = 1
  463. setAngles = true
  464. end
  465.  
  466. if (setAngles) then
  467. desiredAngle = amplitude * math.sin(time * frequency)
  468.  
  469. RightShoulder:SetDesiredAngle(desiredAngle + climbFudge)
  470. LeftShoulder:SetDesiredAngle(desiredAngle - climbFudge)
  471. RightHip:SetDesiredAngle(-desiredAngle)
  472. LeftHip:SetDesiredAngle(-desiredAngle)
  473. end
  474.  
  475. -- Tool Animation handling
  476. local tool = getTool()
  477. if tool and tool:FindFirstChild("Handle") then
  478.  
  479. animStringValueObject = getToolAnim(tool)
  480.  
  481. if animStringValueObject then
  482. toolAnim = animStringValueObject.Value
  483. -- message recieved, delete StringValue
  484. animStringValueObject.Parent = nil
  485. toolAnimTime = time + .3
  486. end
  487.  
  488. if time > toolAnimTime then
  489. toolAnimTime = 0
  490. toolAnim = "None"
  491. end
  492.  
  493. animateTool()
  494. else
  495. stopToolAnimations()
  496. toolAnim = "None"
  497. toolAnimInstance = nil
  498. toolAnimTime = 0
  499. end
  500. end
  501.  
  502. -- connect events
  503. Humanoid.Died:connect(onDied)
  504. Humanoid.Running:connect(onRunning)
  505. Humanoid.Jumping:connect(onJumping)
  506. Humanoid.Climbing:connect(onClimbing)
  507. Humanoid.GettingUp:connect(onGettingUp)
  508. Humanoid.FreeFalling:connect(onFreeFall)
  509. Humanoid.FallingDown:connect(onFallingDown)
  510. Humanoid.Seated:connect(onSeated)
  511. Humanoid.PlatformStanding:connect(onPlatformStanding)
  512. Humanoid.Swimming:connect(onSwimming)
  513.  
  514. -- setup emote chat hook
  515. game.Players.LocalPlayer.Chatted:connect(function(msg)
  516. local emote = ""
  517. if msg == "/e dance" then
  518. emote = dances[math.random(1, #dances)]
  519. elseif (string.sub(msg, 1, 3) == "/e ") then
  520. emote = string.sub(msg, 4)
  521. elseif (string.sub(msg, 1, 7) == "/emote ") then
  522. emote = string.sub(msg, 8)
  523. end
  524.  
  525. if (pose == "Standing" and emoteNames[emote] ~= nil) then
  526. playAnimation(emote, 0.1, Humanoid)
  527. end
  528.  
  529. end)
  530.  
  531.  
  532. -- main program
  533.  
  534. local runService = game:service("RunService");
  535.  
  536. -- initialize to idle
  537. playAnimation("idle", 0.1, Humanoid)
  538. pose = "Standing"
  539.  
  540. while Figure.Parent~=nil do
  541. local _, time = wait(0.1)
  542. move(time)
  543. end
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement