local G={}G.__index=G local l=Vector2.new(0,1)function G.setGravity(G)l=G end function G.createParticle(l,E,Y,B)local p={}setmetatable(p,G)colors=B local J=E.X if J<0 then J=J*-1 end local t=0-J E=Vector2.new(E.X,E.Y+t*.75)if B==nil then B=colors end p.EmitterPosition=l p.EmitterPower=E p.Position=Vector2.new(0,0)p.Power=E p.Color=B[math.random(#B)]local function A()local G=shapes[math.random(#shapes)]:Clone()G.ImageColor3=p.Color G.Parent=Y G.Rotation=math.random(360)G.Visible=true G.ZIndex=20 return G end p.Label=A()p.DefaultSize=30 p.Size=1 p.Side=-1 p.OutOfBounds=false p.Enabled=false p.Cycles=0 return p end function G.Update(E,G)if E.Enabled and E.OutOfBounds then E.Label.ImageColor3=E.Color E.Position=Vector2.new(0,0)E.Power=Vector2.new((E.EmitterPower.X+math.random(10))-5,(E.EmitterPower.Y+math.random(10))-5)E.Cycles=E.Cycles+1 end if not E.Enabled and E.OutOfBounds or not E.Enabled and E.Cycles==0 then E.Label.Visible=false E.OutOfBounds=true E.Color=colors[math.random(#colors)]return else E.Label.Visible=true end local Y,B,p=E.EmitterPosition,E.Position,E.Power local J=E.Label if J then local G=Vector2.new(B.X-p.X,B.Y-p.Y)local t=Vector2.new(p.X/1.09-l.X,p.Y/1.1-l.Y)local A=Camera.ViewportSize J.Position=UDim2.new(Y.X,G.X,Y.Y,G.Y)E.OutOfBounds=J.AbsolutePosition.X>A.X and l.X>0 or J.AbsolutePosition.Y>A.Y and l.Y>0 or J.AbsolutePosition.X<0 and l.X<0 or J.AbsolutePosition.Y<0 and l.Y<0 E.Position,E.Power=G,t if t.Y<0 then if E.Size<=0 then E.Side=1 J.ImageColor3=E.Color end if E.Size>=E.DefaultSize then E.Side=-1 J.ImageColor3=Color3.new(E.Color.r*.65,E.Color.g*.65,E.Color.b*.65)end E.Size=E.Size+E.Side*2 J.Size=UDim2.new(0,E.DefaultSize,0,E.Size)end end end function G.Toggle(G)G.Enabled=not G.Enabled end function G.SetColors(l,G)colors=G end return G
-- Module.
local _Confetti = {}
_Confetti.__index = _Confetti
-- Set the gravitational pull for the confetti.
local gravity = Vector2.new(0, 1)
function _Confetti.setGravity(paramVec2)
	gravity = paramVec2
end
-- Create a confetti particle.
function _Confetti.createParticle(paramEmitter, paramForce, paramParent, paramColors)
	local _Particle = {}
	setmetatable(_Particle, _Confetti)
	colors = paramColors
	-- Adjust forces.
	local xforce = paramForce.X
	if xforce < 0 then
		xforce = xforce * -1
	end
	local distanceFromZero = 0 - xforce
	paramForce = Vector2.new(paramForce.X, paramForce.Y + (distanceFromZero * 0.75))
	if paramColors == nil then
		paramColors = colors
	end
	-- Confetti data.
	_Particle.EmitterPosition = paramEmitter
	_Particle.EmitterPower = paramForce
	_Particle.Position = Vector2.new(0, 0)
	_Particle.Power = paramForce
	_Particle.Color = paramColors[math.random(#paramColors)]
	local function getParticle()
		local label = shapes[math.random(#shapes)]:Clone()
		label.ImageColor3 = _Particle.Color
		label.Parent = paramParent
		label.Rotation = math.random(360)
		label.Visible = true
		label.ZIndex = 20
		return label
	end
	_Particle.Label = getParticle()
	_Particle.DefaultSize = 30
	_Particle.Size = 1
	_Particle.Side = -1
	_Particle.OutOfBounds = false
	_Particle.Enabled = false
	_Particle.Cycles = 0
	return _Particle
end
-- Update the position of the confetti.
function _Confetti:Update(paramDeltaTime)
	if self.Enabled and self.OutOfBounds then
		self.Label.ImageColor3 = self.Color
		self.Position = Vector2.new(0, 0)
		self.Power = Vector2.new(self.EmitterPower.X + math.random(10) - 5, self.EmitterPower.Y + math.random(10) - 5)
		self.Cycles = self.Cycles + 1
	end
	if (not self.Enabled and self.OutOfBounds) or (not self.Enabled and (self.Cycles == 0)) then
		self.Label.Visible = false
		self.OutOfBounds = true
		self.Color = colors[math.random(#colors)]
		return
	else
		self.Label.Visible = true
	end
	local startPosition, currentPosition, currentPower = self.EmitterPosition, self.Position, self.Power
	local imageLabel = self.Label
	-- Apply change.
	if imageLabel then
		-- Update position.
		local newPosition = Vector2.new(currentPosition.X - currentPower.X, currentPosition.Y - currentPower.Y)
		local newPower = Vector2.new((currentPower.X / 1.09) - gravity.X, (currentPower.Y / 1.1) - gravity.Y)
		local ViewportSize = Camera.ViewportSize
		imageLabel.Position = UDim2.new(startPosition.X, newPosition.X, startPosition.Y, newPosition.Y)
		self.OutOfBounds = (imageLabel.AbsolutePosition.X > ViewportSize.X and gravity.X > 0)
			or (imageLabel.AbsolutePosition.Y > ViewportSize.Y and gravity.Y > 0)
			or (imageLabel.AbsolutePosition.X < 0 and gravity.X < 0)
			or (imageLabel.AbsolutePosition.Y < 0 and gravity.Y < 0)
		self.Position, self.Power = newPosition, newPower
		-- Start spinning if it's reached max height.
		if newPower.Y < 0 then
			if self.Size <= 0 then
				self.Side = 1
				imageLabel.ImageColor3 = self.Color
			end
			if self.Size >= self.DefaultSize then
				self.Side = -1
				imageLabel.ImageColor3 = Color3.new(self.Color.r * 0.65, self.Color.g * 0.65, self.Color.b * 0.65)
			end
			self.Size = self.Size + (self.Side * 2)
			imageLabel.Size = UDim2.new(0, self.DefaultSize, 0, self.Size)
		end
	end
end
-- Stops a confetti from firing again once it's out of bounds.
function _Confetti:Toggle()
	self.Enabled = not self.Enabled
end

function _Confetti:SetColors(paramColors)
	colors = paramColors
end

return _Confetti
