ViewModelComponent.lua 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. local Component = require(script.Parent.Component)
  2. local TransformComponent = require(script.Parent.TransformComponent)
  3. local ViewModelComponent = setmetatable({},{__index = Component})
  4. local function Recurse(root,func)
  5. for _,obj in pairs(root:GetChildren()) do
  6. func(obj)
  7. Recurse(obj,func)
  8. end
  9. end
  10. local function CacheCFrames(model)
  11. local CFrameCache = {}
  12. Recurse(model,function(obj)
  13. if obj:IsA("BasePart") and obj ~= model.PrimaryPart then
  14. CFrameCache[obj] = model.PrimaryPart.CFrame:inverse() * obj.CFrame
  15. end
  16. end)
  17. return CFrameCache
  18. end
  19. function ViewModelComponent.new(viewModel)
  20. local self = setmetatable(Component.new(),{__index = ViewModelComponent})
  21. self.ComponentType = "ViewModelComponent"
  22. self.ViewModel = viewModel
  23. self.CFrameCache = CacheCFrames(self.ViewModel)
  24. self.TransformComponent = nil
  25. return self
  26. end
  27. function ViewModelComponent:Create(world)
  28. Component.Create(self,world)
  29. self.ViewModel.Parent = workspace
  30. end
  31. function ViewModelComponent:Destroy()
  32. Component.Destroy(self)
  33. self.ViewModel:Destroy()
  34. self.CFrameCache = nil
  35. end
  36. -- Called when added to an entity
  37. function ViewModelComponent:Adding(entity)
  38. Component.Adding(self,entity)
  39. self.TransformComponent = entity:GetComponent("TransformComponent")
  40. if not self.TransformComponent then
  41. self.TransformComponent = TransformComponent.new()
  42. entity:AddComponent(self.TransformComponent)
  43. end
  44. self.TransformConnection = self.TransformComponent.Changed:Connect(function(newCf) self:SetModelCFrame(newCf) end)
  45. end
  46. function ViewModelComponent:Removing()
  47. self.Entity = nil
  48. end
  49. function ViewModelComponent:CleanUp()
  50. Component.CleanUp(self)
  51. self.World = nil
  52. self.ViewModel.Parent = nil
  53. if self.TransformConnection then
  54. self.TransformConnection:Disconnect()
  55. end
  56. end
  57. function ViewModelComponent:SetModelCFrame(cframe)
  58. self.ViewModel.PrimaryPart.CFrame = cframe
  59. for part,relativeCFrame in pairs(self.CFrameCache) do
  60. part.CFrame = self.ViewModel.PrimaryPart.CFrame * relativeCFrame
  61. end
  62. end
  63. return ViewModelComponent