Advertisement
DarielDev

DanceController

May 29th, 2023 (edited)
900
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.85 KB | None | 0 0
  1. --//Services//--
  2.  
  3. local Players = game:GetService("Players")
  4.  
  5. --//--//--//--//--
  6.  
  7. local DanceController = {Catalog = {}}
  8. DanceController.__index = DanceController
  9.  
  10. function DanceController.new(Player : Player)
  11.     local self = setmetatable({}, DanceController)
  12.     self.Player = Player
  13.     self.Animator = nil
  14.     self.PlayingDance = nil
  15.     self.SynchronizedTo = nil
  16.     self.Connections = {}
  17.     self.SynchronizedPlayers = {}
  18.    
  19.     Player.CharacterAdded:Connect(function(Character)
  20.         self:setEvents(Character)
  21.     end)
  22.    
  23.     Player.CharacterRemoving:Connect(function()
  24.         for _, Controller in pairs(self.SynchronizedPlayers) do
  25.             Controller:stopPlayingDance()
  26.         end
  27.     end)
  28.    
  29.     local OnPlayerRemoving;
  30.     OnPlayerRemoving = Players.PlayerRemoving:Connect(function(Player)
  31.         if not (Player == self.Player) then return end;
  32.         OnPlayerRemoving:Disconnect()
  33.        
  34.         for _, Controller in pairs(self.SynchronizedPlayers) do
  35.             Controller:unsync()
  36.         end
  37.        
  38.         self = nil
  39.     end)
  40.    
  41.     DanceController.Catalog[self.Player] = self
  42.     return self
  43. end
  44.  
  45. function DanceController:setEvents(Character)
  46.     for _, Connection in pairs(self.Connections) do
  47.         Connection:Disconnect()
  48.     end
  49.     table.clear(self.Connections)
  50.    
  51.     self.Animator = Character:WaitForChild("Humanoid"):WaitForChild("Animator")
  52.    
  53.     table.insert(self.Connections, self.Animator.AnimationPlayed:Connect(function(LTrack : AnimationTrack)
  54.         if not LTrack:GetAttribute("CanSync") then return end;
  55.        
  56.         for _, Controller in pairs(self.SynchronizedPlayers) do
  57.             if not Controller.Animator then return end;
  58.            
  59.             Controller:stopPlayingDance()
  60.            
  61.             local Track : AnimationTrack = Controller.Animator:LoadAnimation(LTrack.Animation)
  62.             Controller.PlayingDance = Track
  63.             Track:SetAttribute("CanSync", true)
  64.             Track:Play()
  65.            
  66.             local OnTrackStopped;
  67.             OnTrackStopped = LTrack.Stopped:Connect(function()
  68.                 OnTrackStopped:Disconnect()
  69.                
  70.                 if Controller.PlayingDance == Track then
  71.                     Controller:stopPlayingDance()
  72.                    
  73.                 else
  74.                     Track:Stop()
  75.                     Track:Destroy()
  76.                 end
  77.             end)
  78.         end
  79.     end))
  80. end
  81.  
  82. function DanceController:playDance(Animation)
  83.     self:stopPlayingDance()
  84.  
  85.     local Track = self.Animator:LoadAnimation(Animation)
  86.     Track:SetAttribute("CanSync", true)
  87.     Track:Play()
  88.  
  89.     self.PlayingDance = Track
  90. end
  91.  
  92. function DanceController:stopPlayingDance()
  93.     if not self.PlayingDance then return end;
  94.     self.PlayingDance:Stop()
  95.     self.PlayingDance:Destroy()
  96.     self.PlayingDance = nil
  97. end
  98.  
  99. function DanceController:sync(Player)
  100.     if Player == self.Player then return end;
  101.     local Leader = DanceController.getLeaderFromPlayer(Player)
  102.     local Controller = DanceController.getDanceControllerFromPlayer(Player)
  103.    
  104.     if not Controller or Controller.SynchronizedPlayers[self.Player] or Leader == self or Controller.SynchronizedTo == self.Player then return end;
  105.    
  106.     self:stopPlayingDance()
  107.     if self.SynchronizedTo then self:unsync() end;
  108.     self.Player:SetAttribute("Synchronized", true)
  109.     self.SynchronizedTo = Player
  110.    
  111.     Controller.SynchronizedPlayers[self.Player] = self
  112.  
  113.     if Leader.PlayingDance then Leader.PlayingDance:Stop() Leader.PlayingDance:Play() end;
  114.    
  115.     return true
  116. end
  117.  
  118. function DanceController:unsync()
  119.     if not self.SynchronizedTo then return end;
  120.     local Controller = DanceController.getDanceControllerFromPlayer(self.SynchronizedTo)
  121.     Controller.SynchronizedPlayers[self.Player] = nil
  122.     self.SynchronizedTo = nil
  123.    
  124.     self.Player:SetAttribute("Synchronized", nil)
  125.     self:stopPlayingDance()
  126. end
  127.  
  128. function DanceController.getDanceControllerFromPlayer(Player : Player)
  129.     return DanceController.Catalog[Player]
  130. end
  131.  
  132. function DanceController.getLeaderFromPlayer(Player : Player)
  133.     local Controller = DanceController.getDanceControllerFromPlayer(Player)
  134.     if not Controller.SynchronizedTo then return Controller end
  135.  
  136.     return DanceController.getLeaderFromPlayer(Controller.SynchronizedTo)
  137. end
  138.  
  139. return DanceController
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement