local Config = {
CaptureTime = 5,
WaitTimePerPointIncrease = 1.9,
CaptureSecondsIncreaseTime = .5,
SecondsUpdaterTweenTime = .2,
PointMaxPointAmount = 10
}
type Point = {
Capturable: BoolValue,
CapturedBy: StringValue,
Points: NumberValue,
capturedSeconds: NumberValue,
touchPart: Part
} & Part
type Points = {
Point
}
local PointA = game.Workspace.A
local PointB = game.Workspace.B
local PointC = game.Workspace.C
local Raiders = game.Teams.Raiders
local Defenders = game.Teams.Defenders
local CurrentPoint = nil :: Point
local CurrentPointConnect = nil
local function updatePointsLabel()
for _, Player in ipairs(game:GetService("Players"):GetPlayers()) do
local PlayerGUI = Player:FindFirstChild("PlayerGui")
if PlayerGUI then
local pointsLabel = PlayerGUI:FindFirstChild("RobloxStyledTerminal")
if pointsLabel then
local Frame = pointsLabel:FindFirstChild("LeftFrame")
if Frame then
local pointCount = Frame:FindFirstChild("PointCount")
if pointCount then
pointCount.Text = tostring(CurrentPoint.Points.Value)
end
end
end
end
end
end
local function UpdateSeconds()
task.spawn(function()
local tweenInfo = TweenInfo.new(Config.SecondsUpdaterTweenTime) -- Every time the bar changes, it will tween to the desired size over the span of 0.2 seconds
for _, Player in ipairs(game:GetService("Players"):GetPlayers()) do
local PlayerGUI = Player:FindFirstChild("PlayerGui")
if PlayerGUI then
local pointsLabel = PlayerGUI:FindFirstChild("RobloxStyledTerminal")
if pointsLabel then
local progress_percent = CurrentPoint.capturedSeconds.Value/Config.CaptureTime
local newTween = game:GetService("TweenService"):Create(PlayerGUI.RobloxStyledTerminal.LeftFrame.PointBar, tweenInfo, {
Size = UDim2.new(progress_percent, 0, 1, 0)
})
if Player.TeamColor == Raiders.TeamColor then
PlayerGUI.RobloxStyledTerminal.LeftFrame.PointBar.BackgroundColor3 = Color3.fromRGB(255,0,0)
newTween:Play()
else
PlayerGUI.RobloxStyledTerminal.LeftFrame.PointBar.BackgroundColor3 = Color3.fromRGB(0,0,255)
newTween:Play()
end
end
end
end
end)
end
local function GetPlayerTeam(Player)
return (Player.TeamColor == Defenders.TeamColor and "Def" or (Player.TeamColor == Raiders.TeamColor and "Raid" or nil))
end
local Table = {}
local function CapturableCheck(Point, Team)
if typeof(Point:GetTouchingParts()) == "table" and typeof(workspace:GetPartBoundsInBox(Point.CFrame, Point.Size)) then
for _, Part in ipairs(workspace:GetPartBoundsInBox(Point.CFrame, Point.Size)) do
for _, Player in ipairs(game:GetService("Players"):GetPlayers()) do
if Player.Character:IsAncestorOf(Part) and GetPlayerTeam(Player) ~= Team then
return false
end
end
end
end
return true
end
local function Connect(Point: Point)
return Point.Points.Changed:Connect(function()
task.spawn(updatePointsLabel)
task.spawn(UpdateSeconds)
end)
end
local function CombineTables(Table1, Table2)
Table = {}
for _, Val in ipairs(Table1) do
if not table.find(Table, Val) then
table.insert(Table, Val)
end
end
for _, Val in ipairs(Table2) do
if not table.find(Table, Val) then
table.insert(Table, Val)
end
end
return Table
end
local HitboxCheckDB = false
local TweenService = game:GetService('TweenService')
local function HitboxCheck(Part: Part, Player : Player)
if HitboxCheckDB == true then return end
HitboxCheckDB = true
local capturedSeconds = Part:FindFirstChild("capturedSeconds")
while ((GetPlayerTeam(Player) == "Raid" and capturedSeconds.Value < Config.CaptureTime) or (GetPlayerTeam(Player) == "Def" and capturedSeconds.Value > 0 and capturedSeconds.Value <= Config.CaptureTime)) do
if typeof(Part:GetTouchingParts()) == "table" and typeof(workspace:GetPartBoundsInBox(Part.CFrame, Part.Size)) == "table" then
for _, part in ipairs(Part:GetTouchingParts()) do
if Player.Character:IsAncestorOf(part) and table.find(workspace:GetPartBoundsInBox(Part.CFrame, Part.Size), part) and CapturableCheck(Part, GetPlayerTeam(Player)) then
capturedSeconds.Value = capturedSeconds.Value + (GetPlayerTeam(Player) == "Raid" and 1 or (GetPlayerTeam(Player) == "Def") and -1 or 0)
break
end
end
end
task.wait(Config.CaptureSecondsIncreaseTime)
print("a")
end
HitboxCheckDB = false
end
local GivePointsDB = false
local function SetUpPoints(...)
local Points = {...} :: Points
if not CurrentPoint then
CurrentPoint = Points[1] :: Point
CurrentPointConnect = Connect(CurrentPoint)
end
for Index, Point : Point in ipairs(Points) do
if Point.CapturedBy.Value == "" then Point.CapturedBy.Value = "Def" end
task.spawn(function()
Point.Touched:Connect(function(part)
if Point.Captureable.Value == true then
local Player = game:GetService("Players"):GetPlayerFromCharacter(part.Parent)
if Player then
local PlayerTeam = GetPlayerTeam(Player)
if not PlayerTeam then return end
local PlayerTeamMaxPoints = (PlayerTeam == "Raid" and Config.PointMaxPointAmount or 0)
HitboxCheck(Point, Player)
if ((PlayerTeam == "Raid" and Point.capturedSeconds.Value == Config.CaptureTime) or (PlayerTeam == "Def" and Point.capturedSeconds.Value == 0)) and PlayerTeam ~= Point.CapturedBy.Value and ((PlayerTeam == "Raid" and Point.Points.Value >= 0) or (PlayerTeam == "Def" and Point.Points.Value <= Config.PointMaxPointAmount)) and not ((PlayerTeam == "Raid" and Point.Points.Value == Config.PointMaxPointAmount) or (PlayerTeam == "Def" and Point.Points.Value == 0)) then
GivePointsDB = true
Point.CapturedBy.Value = PlayerTeam
while Point.Captureable.Value == true and ((PlayerTeam == "Raid" and Point.Points.Value >= 0) or (PlayerTeam == "Def" and Point.Points.Value <= Config.PointMaxPointAmount)) and not ((PlayerTeam == "Raid" and Point.Points.Value == Config.PointMaxPointAmount) or (PlayerTeam == "Def" and Point.Points.Value == 0)) and Point.CapturedBy.Value == PlayerTeam do
task.wait(Config.WaitTimePerPointIncrease)
Point.Points.Value = Point.Points.Value + (PlayerTeam == "Raid" and 1 or (PlayerTeam == "Def") and -1 or 0)
if Point.Points.Value == PlayerTeamMaxPoints then
Point.Captureable.Value = false
if not Points[Index - 1] and PlayerTeam == "Def" then
Point.Captureable.Value = true
end
if Points[Index + 1] and PlayerTeam == "Raid" then
Points[Index + 1].Captureable.Value = true
CurrentPointConnect:Disconnect()
CurrentPoint = Points[Index + 1]
CurrentPointConnect = Connect(CurrentPoint)
elseif Points[Index - 1] and PlayerTeam == "Def" then
Points[Index - 1].Captureable.Value = true
CurrentPointConnect:Disconnect()
CurrentPoint = Points[Index - 1]
CurrentPointConnect = Connect(CurrentPoint)
end
GivePointsDB = false
break
end
end
GivePointsDB = false
end
end
end
end)
end)
end
end
SetUpPoints(PointA, PointB, PointC)SetUpPoints(PointA, PointB, PointC)
How I want it to act (with difference when payer stand on it, not when he moves):
How does it look like now:
Anything I can do to change that?