GUI acting weird

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?

1 Like

Try this. If it worked, please put my reply as a solution! :slight_smile:

local Config = {
	CaptureTime = 5,
	WaitTimePerPointIncrease = 0.1, -- Adjust this value to control the speed of capturing
	CaptureSecondsIncreaseTime = 0.1,
	SecondsUpdaterTweenTime = 0.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)
		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 function HitboxCheck(Part: Part, Player: Player)
	if HitboxCheckDB == true then return end
	HitboxCheckDB = true
	local capturedSeconds = Part:FindFirstChild("capturedSeconds")
	local captureDirection = GetPlayerTeam(Player) == "Raid" and 1 or -1

	while 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 + captureDirection
					break
				end
			end
		end
		task.wait(Config.CaptureSecondsIncreaseTime)
	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

							local captureDirection = PlayerTeam == "Raid" and 1 or -1

							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)) do
								if Player.Character:IsAncestorOf(part) and CapturableCheck(Point, PlayerTeam) then
									Point.Points.Value = Point.Points.Value + captureDirection
								end
								task.wait(Config.WaitTimePerPointIncrease)
							end
							GivePointsDB = false
						end
					end
				end
			end)
		end)
	end
end

SetUpPoints(PointA, PointB, PointC)

It now completly stopped working :face_with_diagonal_mouth: