Advertisement
George148

lols

Jun 5th, 2015
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.88 KB | None | 0 0
  1. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  2. -- @CloneTrooper1019, 2015
  3. -- Viewmodel script
  4. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  5.  
  6. local c = workspace.CurrentCamera
  7. local rs = game:GetService("RunService")
  8. local player = game.Players.LocalPlayer
  9. local char = player.Character or player.CharacterAdded:wait()
  10. local charTorso = char:WaitForChild("Torso")
  11. local charHead = char:WaitForChild("Head")
  12. local root = char:WaitForChild("HumanoidRootPart")
  13. local rootJ = root:WaitForChild("RootJoint")
  14. local lhip = charTorso:WaitForChild("Left Hip")
  15. local rhip = charTorso:WaitForChild("Right Hip")
  16. local neck = charTorso:WaitForChild("Neck")
  17. local humanoid = char:WaitForChild("Humanoid")
  18. local origins = {}
  19. local factors = {}
  20.  
  21. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  22. -- Torso Kinematics
  23.  
  24. local function recordOrigins(...)
  25. for _,joint in pairs{...} do
  26. origins[joint] = { C0 = joint.C0, C1 = joint.C1 }
  27. end
  28. end
  29.  
  30. local function onCharAdded(char)
  31. -- Set variables
  32. humanoid = char:WaitForChild("Humanoid")
  33. charTorso = char:WaitForChild("Torso")
  34. root = char:WaitForChild("HumanoidRootPart")
  35. rootJ = root:WaitForChild("RootJoint")
  36. lhip = charTorso:WaitForChild("Left Hip")
  37. rhip = charTorso:WaitForChild("Right Hip")
  38. neck = charTorso:WaitForChild("Neck")
  39. -- Setup custom rig.
  40. origins = {}
  41. recordOrigins(rootJ,lhip,rhip,neck)
  42. factors =
  43. {
  44. [rootJ] = Vector3.new(-.4,0,0);
  45. [lhip] = Vector3.new(0,0,.4);
  46. [rhip] = Vector3.new(0,0,-.4);
  47. [neck] = Vector3.new(-1.17,0,0);
  48. }
  49. end
  50.  
  51. local function updateHip()
  52. if factors then
  53. local look = c.CoordinateFrame.lookVector.y
  54. for joint,factor in pairs(factors) do
  55. local origin = origins[joint]
  56. local factor = factor * look
  57. local x,y,z = factor.X, factor.Y, factor.Z
  58. joint.C0 = origin.C0 * CFrame.Angles(x,y,z)
  59. end
  60. end
  61. end
  62.  
  63. if player.Character then
  64. onCharAdded(player.Character)
  65. end
  66.  
  67. player.CharacterAdded:connect(onCharAdded)
  68. rs.RenderStepped:connect(updateHip)
  69.  
  70. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  71. -- View Bobbling
  72.  
  73. local waveScale = 0
  74. local scaleIncrement = 0.05
  75. local offStates = {"Jumping","PlatformStanding","Ragdoll","Seated","FallingDown","FreeFalling","GettingUp","Swimming"}
  76. local onStates = {"Running","Climbing"}
  77.  
  78. for _,state in pairs(offStates) do
  79. humanoid[state]:connect(function ()
  80. active = false
  81. end)
  82. end
  83.  
  84. for _,state in pairs(onStates) do
  85. humanoid[state]:connect(function (speed)
  86. active = (speed>1)
  87. end)
  88. end
  89.  
  90. local function glideTorwards(currentValue,targetValue,rate)
  91. if currentValue < targetValue then
  92. return math.min(targetValue,currentValue + rate)
  93. elseif currentValue > targetValue then
  94. return math.max(targetValue,currentValue - rate)
  95. else
  96. return targetValue
  97. end
  98. end
  99.  
  100. local function getCamBobble()
  101. local goal = active and 0.5 or 0
  102. waveScale = glideTorwards(waveScale,goal,0.05)
  103. local t = math.cos(tick() * 7.85)
  104. return CFrame.new((t/3)*waveScale,math.abs(t/5)*waveScale,0)
  105. end
  106.  
  107. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  108. -- Build Viewmodel
  109.  
  110. local limbs = {}
  111.  
  112. local vm = Instance.new("Model")
  113. vm.Name = "ViewModel"
  114. local h = Instance.new("Humanoid",vm)
  115.  
  116. local function newLimb(name,size)
  117. local limb = Instance.new("Part",vm)
  118. limb.FormFactor = "Custom"
  119. limb.Name = name
  120. limb.Size = size
  121. limb.Anchored = true
  122. if size.magnitude < 0.4 then
  123. limb.Transparency = 1
  124. end
  125. table.insert(limbs,limb)
  126. return limb
  127. end
  128.  
  129. local function newJoint(name,p0,p1)
  130. local j = Instance.new("Motor6D",p0)
  131. j.Name = name
  132. j.Part0 = p0
  133. j.Part1 = p1
  134. end
  135.  
  136. local torso = newLimb("Torso",Vector3.new(2,2,1))
  137. local head = newLimb("Head",Vector3.new())
  138. local leftarm = newLimb("Left Arm",Vector3.new(1,2,1))
  139. local rightarm = newLimb("Right Arm",Vector3.new(1,2,1))
  140.  
  141. vm.PrimaryPart = torso
  142.  
  143. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  144. -- Break Humanoid Collisions using a nasty hack.
  145.  
  146. spawn(function ()
  147. local cache = {}
  148. for _,limb in pairs(limbs) do
  149. cache[limb] = limb.Name
  150. limb.Name = "BREAK"
  151. end
  152. wait()
  153. for part,name in pairs(cache) do
  154. part.Name = name
  155. part.CanCollide = false
  156. end
  157. end)
  158.  
  159. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  160. -- Character Object Tracking
  161.  
  162. local toolEquipped = false
  163.  
  164. local function trackTool(tool)
  165. -- This is a lot, but I need to make sure I carefully track tools
  166. -- as they can be unpredictable
  167. local cons = {}
  168. local parts = {}
  169. toolEquipped = true
  170. local function watchPart(handle)
  171. local repHandle = handle:clone()
  172. repHandle.Parent = vm
  173. repHandle.CanCollide = false
  174. repHandle.Anchored = true
  175. local function visualUpdate()
  176. local shouldHide = (c.Focus.p-c.CoordinateFrame.p).magnitude < 1
  177. handle.LocalTransparencyModifier = shouldHide and 1 or 0
  178. local relative = charTorso.CFrame:toObjectSpace(handle.CFrame)
  179. if repHandle then
  180. repHandle.CFrame = torso.CFrame * relative
  181. end
  182. end
  183. local con = rs.RenderStepped:connect(visualUpdate)
  184. table.insert(cons,rs.RenderStepped:connect(visualUpdate))
  185. table.insert(parts,repHandle)
  186. end
  187. local function initWatch(child)
  188. if child:IsA("BasePart") then
  189. watchPart(child)
  190. end
  191. end
  192. for _,child in pairs(tool:GetChildren()) do
  193. initWatch(child)
  194. end
  195. table.insert(cons,tool.ChildAdded:connect(initWatch))
  196. local function onUnequipped()
  197. toolEquipped = false
  198. for _,con in pairs(cons) do
  199. con:disconnect()
  200. end
  201. for _,part in pairs(parts) do
  202. pcall(function ()
  203. part:Destroy()
  204. end)
  205. end
  206. end
  207. table.insert(cons,tool.Unequipped:connect(onUnequipped))
  208. end
  209.  
  210. local function pullObject(child)
  211. if child:IsA("CharacterAppearance") then
  212. child:clone().Parent = vm
  213. elseif child:IsA("Tool") then
  214. trackTool(child)
  215. end
  216. end
  217.  
  218. for _,child in pairs(char:GetChildren()) do
  219. pullObject(child)
  220. end
  221.  
  222. for _,part in pairs(vm:GetChildren()) do
  223. Spawn(function ()
  224. if part:IsA("BasePart") and part.Name ~= "Handle" then
  225. local actual = char:WaitForChild(part.Name)
  226. part.BrickColor = actual.BrickColor
  227. actual.Changed:connect(function ()
  228. actual.BrickColor = part.BrickColor
  229. end)
  230. end
  231. end)
  232. end
  233.  
  234.  
  235. char.ChildAdded:connect(pullObject)
  236.  
  237. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  238. -- Camera Code
  239.  
  240. if c:findFirstChild("ViewModel") then
  241. c.ViewModel:Destroy()
  242. end
  243.  
  244. wait(1)
  245.  
  246. local function renderUpdate()
  247. -- Figure out where the head is in the world relative to the HumanoidRootPart (and its base camera offset)
  248. local offset = CFrame.new()
  249. local bobble = getCamBobble()
  250. if (c.Focus.p-c.CoordinateFrame.p).magnitude <= 1 then -- If we are in first person...
  251. -- Sync the viewmodel joints with the character joints
  252. vm.Parent = c
  253. for _,part in pairs(limbs) do
  254. local actual = char:findFirstChild(part.Name)
  255. if actual then
  256. part.BrickColor = actual.BrickColor
  257. part.CFrame = torso.CFrame * charTorso.CFrame:toObjectSpace(actual.CFrame)
  258. end
  259. end
  260. -- Move our viewmodel relative to the camera
  261. vm:SetPrimaryPartCFrame(c.CoordinateFrame * CFrame.new(0,-1.5,-1) * bobble:inverse())
  262. -- Offset the camera based on where the head is in the world relative to the HumanoidRootPart
  263. local neckOffset = (charTorso.Position-charHead.Position).magnitude
  264. local expectedHeadPos = root.CFrame * CFrame.new(0,neckOffset,0)
  265. offset = expectedHeadPos:toObjectSpace(charHead.CFrame)
  266. else
  267. -- Hide it for now.
  268. vm.Parent = nil
  269. end
  270. humanoid.CameraOffset = (offset * bobble).p
  271. end
  272.  
  273. local con = rs.RenderStepped:connect(renderUpdate)
  274.  
  275. local function onDied()
  276. con:disconnect()
  277. vm:Destroy()
  278. end
  279.  
  280. humanoid.Died:connect(onDied)
  281.  
  282. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement