Debris=game:GetService("\068\101\098\114\105\115")RbxUtility=LoadLibrary("\082\098\120\085\116\105\108\105\116\121")Create=RbxUtility.Create ProjectileNames={"\087\097\116\101\114";"\065\114\114\111\119","\080\114\111\106\101\099\116\105\108\101","\069\102\102\101\099\116","\082\097\105\108";"\076\097\115\101\114";"\066\117\108\108\101\116"}Functions={FindCharacterAncestor=function(Q)if Q and Q~=game:GetService("\087\111\114\107\115\112\097\099\101")then local B=Q:FindFirstChild("\072\117\109\097\110\111\105\100")if B then return Q,B else return Functions.FindCharacterAncestor(Q.Parent)end end return nil end,CheckTableForString=function(Q,B)for Q,Z in pairs(Q)do if string.lower(Z)==string.lower(B)then return true end end return false end;CheckIntangible=function(Q)if Q and Q.Parent then if Functions.CheckTableForString(ProjectileNames,Q.Name)then return true end local B=Q.Parent local Z=B.Parent local X=Z:FindFirstChild("\072\117\109\097\110\111\105\100")if X and(X.Health>0 and B:IsA("\072\097\116"))then return true end end return false end;CastRay=function(Q,B,Z,X,n)local y,j,l=(game:GetService("\087\111\114\107\115\112\097\099\101")):FindPartOnRayWithIgnoreList(Ray.new(Q,B*Z),X)if y and Functions.CheckIntangible(y)then if n then wait()end y,j,l=Functions.CastRay(j+B*.01,B,Z-(Q-j).magnitude,X,n)end return y,j,l end,IsTeamMate=function(Q,B)return Q and(B and(not Q.Neutral and(not B.Neutral and Q.TeamColor==B.TeamColor)))end,TagHumanoid=function(Q,B)local Z=(Create("\079\098\106\101\099\116\086\097\108\117\101"))({Name="\099\114\101\097\116\111\114",Value=B})Debris:AddItem(Z,2)Z.Parent=Q end;UntagHumanoid=function(Q)for Q,B in pairs(Q:GetChildren())do if B:IsA("\079\098\106\101\099\116\086\097\108\117\101")and B.Name=="\099\114\101\097\116\111\114"then B:Destroy()end end end;CheckTableForString=function(Q,B)for Q,Z in pairs(Q)do if string.lower(Z)==string.lower(B)then return true end end return false end,Clamp=function(Q,B,Z)return math.max(math.min(Z,Q),B)end,GetPercentage=function(Q,B,Z)return((Z-Q)/(B-Q))*100 end,Round=function(Q,B)local Z,X=math.modf(Q)return X>=B and math.ceil(Q)or X<B and math.floor(Q)end}return Functions
--Made by Luckymaxer

Debris = game:GetService("Debris")

RbxUtility = LoadLibrary("RbxUtility")
Create = RbxUtility.Create

ProjectileNames = { "Water", "Arrow", "Projectile", "Effect", "Rail", "Laser", "Bullet" }

Functions = {

	FindCharacterAncestor = function(Object)
		if Object and Object ~= game:GetService("Workspace") then
			local Humanoid = Object:FindFirstChild("Humanoid")
			if Humanoid then
				return Object, Humanoid
			else
				return Functions.FindCharacterAncestor(Object.Parent)
			end
		end
		return nil
	end,

	CheckTableForString = function(Table, String)
		for i, v in pairs(Table) do
			if string.lower(v) == string.lower(String) then
				return true
			end
		end
		return false
	end,

	CheckIntangible = function(Hit)
		if Hit and Hit.Parent then
			if Functions.CheckTableForString(ProjectileNames, Hit.Name) then
				return true
			end
			local ObjectParent = Hit.Parent
			local Character = ObjectParent.Parent
			local Humanoid = Character:FindFirstChild("Humanoid")
			if Humanoid and Humanoid.Health > 0 and ObjectParent:IsA("Hat") then
				return true
			end
		end
		return false
	end,

	CastRay = function(StartPos, Vec, Length, Ignore, DelayIfHit)
		local RayHit, RayPos, RayNormal = game:GetService("Workspace")
			:FindPartOnRayWithIgnoreList(Ray.new(StartPos, Vec * Length), Ignore)
		if RayHit and Functions.CheckIntangible(RayHit) then
			if DelayIfHit then
				wait()
			end
			RayHit, RayPos, RayNormal = Functions.CastRay(
				(RayPos + (Vec * 0.01)),
				Vec,
				(Length - (StartPos - RayPos).magnitude),
				Ignore,
				DelayIfHit
			)
		end
		return RayHit, RayPos, RayNormal
	end,

	IsTeamMate = function(Player1, Player2)
		return (
			Player1
			and Player2
			and not Player1.Neutral
			and not Player2.Neutral
			and Player1.TeamColor == Player2.TeamColor
		)
	end,

	TagHumanoid = function(humanoid, player)
		local Creator_Tag = Create("ObjectValue")({
			Name = "creator",
			Value = player,
		})
		Debris:AddItem(Creator_Tag, 2)
		Creator_Tag.Parent = humanoid
	end,

	UntagHumanoid = function(humanoid)
		for i, v in pairs(humanoid:GetChildren()) do
			if v:IsA("ObjectValue") and v.Name == "creator" then
				v:Destroy()
			end
		end
	end,

	CheckTableForString = function(Table, String)
		for i, v in pairs(Table) do
			if string.lower(v) == string.lower(String) then
				return true
			end
		end
		return false
	end,

	Clamp = function(Number, Min, Max)
		return math.max(math.min(Max, Number), Min)
	end,

	GetPercentage = function(Start, End, Number)
		return (((Number - Start) / (End - Start)) * 100)
	end,

	Round = function(Number, RoundDecimal)
		local WholeNumber, Decimal = math.modf(Number)
		return ((Decimal >= RoundDecimal and math.ceil(Number)) or (Decimal < RoundDecimal and math.floor(Number)))
	end,
}

return Functions
