Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Services
- local RunService = game:GetService("RunService")
- local Players = game:GetService("Players")
- -- Variables
- local PlayerTracker = {}
- local PlayerTrackerData = {}
- local PlayerTrackerPrototype = {}
- local PlayerTrackerMeta = {
- __index = PlayerTrackerPrototype,
- __newindex = function() end,
- __metatable = "This metatable is locked."
- }
- -- Functions
- local function AnalyzePartsForPlayers(BaseParts)
- local PlayersFound = {}
- for _, BasePart in ipairs(BaseParts) do
- local Character = BasePart.Parent
- local Humanoid = Character:FindFirstChildWhichIsA("Humanoid")
- if (Humanoid and Humanoid.Health > 0) then
- local Player = Players:GetPlayerFromCharacter(Character)
- if (Player) then
- PlayersFound[Player] = true
- end
- end
- end
- return PlayersFound
- end
- local function UpdatePlayerMap(PlayerTracker, BaseParts)
- local TrackerData = PlayerTrackerData[PlayerTracker]
- local MaximumPlayers = TrackerData.MaximumPlayers
- local CurrentPopulation = TrackerData.Population
- local CurrentPlayers = TrackerData.Players
- local NewPlayers = AnalyzePartsForPlayers(BaseParts)
- for Player in pairs(NewPlayers) do
- if (MaximumPlayers and TrackerData.Population >= MaximumPlayers) then
- break
- end
- if (CurrentPlayers[Player] == nil) then
- CurrentPlayers[Player] = true
- TrackerData.Population += 1
- TrackerData.PlayerEnteredBindable:Fire(Player)
- end
- end
- for Player in pairs(CurrentPlayers) do
- if (NewPlayers[Player] == nil) then
- CurrentPlayers[Player] = nil
- TrackerData.Population -= 1
- TrackerData.PlayerLeftBindable:Fire(Player)
- end
- end
- end
- -- Constructors
- function PlayerTracker.new(TrackingSpace : BasePart, MaximumPlayers : number)
- local PlayerLeftBindable = Instance.new("BindableEvent")
- local PlayerEnteredBindable = Instance.new("BindableEvent")
- local Tracker = setmetatable(
- {
- PlayerLeft = PlayerLeftBindable.Event,
- PlayerEntered = PlayerEnteredBindable.Event
- },
- PlayerTrackerMeta
- )
- local TrackerData = {
- IsTracking = false,
- TrackingSpace = TrackingSpace,
- SpaceTrackingConnection = nil,
- MaximumPlayers = MaximumPlayers,
- Population = 0,
- Players = {},
- PlayerLeftBindable = PlayerLeftBindable,
- PlayerEnteredBindable = PlayerEnteredBindable,
- }
- PlayerTrackerData[Tracker] = TrackerData
- return Tracker
- end
- -- Methods
- function PlayerTrackerPrototype:StartTracking()
- local TrackerData = PlayerTrackerData[self]
- if (TrackerData.IsTracking == false) then
- TrackerData.IsTracking = true
- local TrackingSpace = TrackerData.TrackingSpace
- TrackerData.SpaceTrackingConnection = RunService.Heartbeat:Connect(function()
- UpdatePlayerMap(
- self,
- workspace:GetPartBoundsInBox(TrackingSpace.CFrame, TrackingSpace.Size)
- )
- end)
- end
- end
- function PlayerTrackerPrototype:StopTracking()
- local TrackerData = PlayerTrackerData[self]
- TrackerData.SpaceTrackingConnection:Disconnect()
- TrackerData.IsTracking = false
- end
- function PlayerTrackerPrototype:Destroy()
- if (PlayerTrackerData[self] ~= nil) then
- self:StopTracking()
- PlayerTrackerData[self] = nil
- end
- end
- function PlayerTrackerPrototype:GetPlayers()
- local Players = {}
- for Player in pairs(PlayerTrackerData[self].Players) do
- table.insert(Players, Player)
- end
- return Players
- end
- function PlayerTrackerPrototype:GetPopulation()
- return PlayerTrackerData[self].Population
- end
- -- Setup
- return PlayerTracker
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement