Advertisement
Guest User

Player Tracker - Ziffixture

a guest
Mar 6th, 2022
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.94 KB | None | 0 0
  1. -- Services
  2. local RunService = game:GetService("RunService")
  3.  
  4. local Players = game:GetService("Players")
  5.  
  6.  
  7. -- Variables
  8. local PlayerTracker = {}
  9. local PlayerTrackerData = {}
  10.  
  11. local PlayerTrackerPrototype = {}
  12. local PlayerTrackerMeta = {
  13.            
  14.     __index = PlayerTrackerPrototype,
  15.     __newindex = function() end,
  16.  
  17.     __metatable = "This metatable is locked."
  18.        
  19. }
  20.  
  21.  
  22. -- Functions
  23. local function AnalyzePartsForPlayers(BaseParts)
  24.     local PlayersFound = {}
  25.  
  26.     for _, BasePart in ipairs(BaseParts) do
  27.         local Character = BasePart.Parent
  28.         local Humanoid = Character:FindFirstChildWhichIsA("Humanoid")
  29.         if (Humanoid and Humanoid.Health > 0) then
  30.  
  31.             local Player = Players:GetPlayerFromCharacter(Character)
  32.             if (Player) then
  33.                 PlayersFound[Player] = true
  34.             end
  35.  
  36.         end
  37.     end
  38.  
  39.     return PlayersFound
  40. end
  41.  
  42. local function UpdatePlayerMap(PlayerTracker, BaseParts)
  43.     local TrackerData = PlayerTrackerData[PlayerTracker]
  44.  
  45.     local MaximumPlayers = TrackerData.MaximumPlayers
  46.     local CurrentPopulation = TrackerData.Population
  47.     local CurrentPlayers = TrackerData.Players
  48.  
  49.     local NewPlayers = AnalyzePartsForPlayers(BaseParts)
  50.  
  51.     for Player in pairs(NewPlayers) do
  52.         if (MaximumPlayers and TrackerData.Population >= MaximumPlayers) then
  53.             break
  54.         end
  55.  
  56.         if (CurrentPlayers[Player] == nil) then
  57.             CurrentPlayers[Player] = true
  58.  
  59.             TrackerData.Population += 1
  60.             TrackerData.PlayerEnteredBindable:Fire(Player)
  61.         end
  62.     end
  63.  
  64.     for Player in pairs(CurrentPlayers) do
  65.         if (NewPlayers[Player] == nil) then
  66.             CurrentPlayers[Player] = nil
  67.  
  68.             TrackerData.Population -= 1
  69.             TrackerData.PlayerLeftBindable:Fire(Player)
  70.         end
  71.     end
  72. end
  73.  
  74.  
  75. -- Constructors
  76. function PlayerTracker.new(TrackingSpace : BasePart, MaximumPlayers : number)
  77.     local PlayerLeftBindable = Instance.new("BindableEvent")
  78.     local PlayerEnteredBindable = Instance.new("BindableEvent")
  79.  
  80.     local Tracker = setmetatable(
  81.         {
  82.             PlayerLeft = PlayerLeftBindable.Event,
  83.             PlayerEntered = PlayerEnteredBindable.Event    
  84.         },
  85.         PlayerTrackerMeta
  86.     )
  87.  
  88.     local TrackerData = {
  89.        
  90.         IsTracking = false,
  91.         TrackingSpace = TrackingSpace,
  92.         SpaceTrackingConnection = nil,
  93.  
  94.         MaximumPlayers = MaximumPlayers,
  95.         Population = 0,
  96.  
  97.         Players = {},
  98.  
  99.         PlayerLeftBindable = PlayerLeftBindable,
  100.         PlayerEnteredBindable = PlayerEnteredBindable,
  101.  
  102.     }
  103.  
  104.     PlayerTrackerData[Tracker] = TrackerData
  105.  
  106.     return Tracker
  107. end
  108.  
  109.  
  110. -- Methods
  111. function PlayerTrackerPrototype:StartTracking()
  112.     local TrackerData = PlayerTrackerData[self]
  113.     if (TrackerData.IsTracking == false) then
  114.         TrackerData.IsTracking = true
  115.        
  116.         local TrackingSpace = TrackerData.TrackingSpace
  117.  
  118.         TrackerData.SpaceTrackingConnection = RunService.Heartbeat:Connect(function()
  119.             UpdatePlayerMap(
  120.                 self,
  121.                 workspace:GetPartBoundsInBox(TrackingSpace.CFrame, TrackingSpace.Size)
  122.             )
  123.         end)
  124.     end
  125. end
  126.  
  127. function PlayerTrackerPrototype:StopTracking()
  128.     local TrackerData = PlayerTrackerData[self]
  129.    
  130.     TrackerData.SpaceTrackingConnection:Disconnect()
  131.     TrackerData.IsTracking = false
  132. end
  133.  
  134. function PlayerTrackerPrototype:Destroy()
  135.     if (PlayerTrackerData[self] ~= nil) then
  136.         self:StopTracking()
  137.        
  138.         PlayerTrackerData[self] = nil
  139.     end
  140. end
  141.  
  142.  
  143. function PlayerTrackerPrototype:GetPlayers()
  144.     local Players = {}
  145.  
  146.     for Player in pairs(PlayerTrackerData[self].Players) do
  147.         table.insert(Players, Player)
  148.     end
  149.  
  150.     return Players
  151. end
  152.  
  153. function PlayerTrackerPrototype:GetPopulation()
  154.     return PlayerTrackerData[self].Population
  155. end
  156.  
  157.  
  158. -- Setup
  159. return PlayerTracker
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement