Debris=game:GetService("\068\101\098\114\105\115")ProjectileNames={"\077\101\115\104\080\097\114\116","\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";"\082\097\121","\066\117\108\108\101\116","\080\097\114\116\105\099\108\101\080\097\114\116"}Functions={CreateConfiguration=function(w,i)for w,Y in pairs(w:GetChildren())do if string.find(Y.ClassName,"\086\097\108\117\101")then i[Y.Name]=Y:Clone()elseif Y:IsA("\070\111\108\100\101\114")or Y:IsA("\067\111\110\102\105\103\117\114\097\116\105\111\110")then i[Y.Name]=Functions.CreateConfiguration(Y,i)end end return i end;FindCharacterAncestor=function(w)if w and w~=game:GetService("\087\111\114\107\115\112\097\099\101")then local i=w:FindFirstChild("\072\117\109\097\110\111\105\100")if i then return w,i else return Functions.FindCharacterAncestor(w.Parent)end end return nil end,CheckTableForString=function(w,i)for w,Y in pairs(w)do if string.lower(Y)==string.lower(i)then return true end end return false end;CheckIntangible=function(w)if w and w.Parent then if Functions.CheckTableForString(ProjectileNames,w.Name)then return true end local i=w.Parent local Y=i.Parent local W=Y:FindFirstChild("\072\117\109\097\110\111\105\100")if W and(W.Health>0 and i:IsA("\072\097\116"))then return true end end return false end,CastRay=function(w,i,Y,W,o)local v,k,C=(game:GetService("\087\111\114\107\115\112\097\099\101")):FindPartOnRayWithIgnoreList(Ray.new(w,i*Y),W)if v and Functions.CheckIntangible(v)then if o then wait()end v,k,C=Functions.CastRay(k+i*.01,i,Y-(w-k).magnitude,W,o)end return v,k,C end;IsTeamMate=function(w,i)return w and(i and(not w.Neutral and(not i.Neutral and w.TeamColor==i.TeamColor)))end,TagHumanoid=function(w,i)local Y=Instance.new("\079\098\106\101\099\116\086\097\108\117\101")Y.Name="\099\114\101\097\116\111\114"Y.Value=i Debris:AddItem(Y,2)Y.Parent=w end,UntagHumanoid=function(w)for w,i in pairs(w:GetChildren())do if i:IsA("\079\098\106\101\099\116\086\097\108\117\101")and i.Name=="\099\114\101\097\116\111\114"then i:Destroy()end end end;CheckTableForString=function(w,i)for w,Y in pairs(w)do if string.lower(Y)==string.lower(i)then return true end end return false end,Clamp=function(w,i,Y)return math.max(math.min(Y,w),i)end;GetPercentage=function(w,i,Y)return((Y-w)/(i-w))*100 end,Round=function(w,i)local Y,W=math.modf(w)return W>=i and math.ceil(w)or W<i and math.floor(w)end}return Functions


Debris = game:GetService("Debris")

ProjectileNames = {"MeshPart", "Arrow", "Projectile", "Effect", "Rail", "Laser", "Ray", "Bullet", "ParticlePart"}

Functions = {
	
	CreateConfiguration = (function(Configurations, Table)
		for i, v in pairs(Configurations:GetChildren()) do
			if string.find(v.ClassName, "Value") then
				Table[v.Name] = v:Clone()
			elseif v:IsA("Folder") or v:IsA("Configuration") then
				Table[v.Name] = Functions.CreateConfiguration(v, Table)
			end
		end
		return Table
	end),
	
	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 = Instance.new("ObjectValue")
		Creator_Tag.Name = "creator"
		Creator_Tag.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
