local g={Damage=20;AttackTime=1,CoolDown=2,LastSwing=0,LastHit=0,Part=nil;Owner=nil,OnHit=nil,OnHitHumanoid=nil,OnAttackReady=nil,OnAttack=nil;SwingSound=nil,HitSound=nil,SwingAnimation=nil,ActiveConnections={}}do UTIL.MakeClass(g)function g.New(h,l)local V=UTIL.DeepCopy(g)V.Part=h V.Owner=l table.insert(V.ActiveConnections,V.Part.Touched:connect(function(g)V:SwordTouch(g)end))V.OnHit=InternalEvent.New()V.OnHitHumanoid=InternalEvent.New()V.OnAttackReady=InternalEvent.New()V.OnAttack=InternalEvent.New()return V end function g.SwordTouch(h,g)if tick()-h.LastSwing>h.AttackTime or tick()-h.LastHit<h.AttackTime then return end h.OnHit:Fire(g)local l,V=UTIL.FindCharacterAncestor(g)if l and l~=h.Owner.Character then V:TakeDamage(h.Damage)h.OnHitHumanoid:Fire(V,g)h.LastHit=tick()if h.HitSound then h.HitSound:Play()end end end function g.DoSwing(g)if tick()-g.LastSwing<g.AttackTime+g.CoolDown then return end if g.SwingAnimation then g.SwingAnimation:Play()end if g.SwingSound then g.SwingSound:Play()end g.LastSwing=tick()g.OnAttack:Fire()end function g.Destroy(g)for g,h in pairs(g.ActiveConnections)do h:disconnect()end end end do local h=script.Parent local l=h.Parent local V=game.Players.LocalPlayer local G=UTIL.WaitForValidCharacter(V)local d=(UTIL.Instantiate("\065\110\105\109\097\116\105\111\110"))({AnimationId="\104\116\116\112\058\047\047\119\119\119\046\114\111\098\108\111\120\046\099\111\109\047\065\115\115\101\116\063\073\068\061\056\057\050\056\057\056\055\057"})local k=h:WaitForChild("\072\105\116")local v=h:WaitForChild("\083\119\105\110\103")local i local t l.Equipped:connect(function(l)t=g.New(h,V)t.Damage=40 t.HitSound=k t.SwingSound=v G=UTIL.WaitForValidCharacter(V)local a=G:FindFirstChild("\072\117\109\097\110\111\105\100")i=a:LoadAnimation(d)t.SwingAnimation=i t.OnHitHumanoid:Connect(function(g,l)local V=G:FindFirstChild("\084\111\114\115\111")local d=g.Parent:FindFirstChild("\084\111\114\115\111")if not d or not V then return end if l.Name=="\082\105\103\104\116 \065\114\109"or l.Name=="\076\101\102\116 \065\114\109"or l.Name=="\082\105\103\104\116 \076\101\103"or l.Name=="\076\101\102\116 \076\101\103"then l:BreakJoints()WeldUtil.WeldBetween(l,h)Delay(1,function()l:BreakJoints()end)end end)l.Button1Down:connect(function()t:DoSwing()end)end)l.Unequipped:connect(function()t:Destroy()end)end
--[[Sword Part Class]]
--

local SwordPart = {
	Damage = 20,
	AttackTime = 1,
	CoolDown = 2,

	LastSwing = 0,
	LastHit = 0,

	Part = nil,
	Owner = nil, --player object that owns this sword

	OnHit = nil,
	OnHitHumanoid = nil,
	OnAttackReady = nil,
	OnAttack = nil,

	SwingSound = nil,
	HitSound = nil,
	SwingAnimation = nil, --animation track!

	ActiveConnections = {},
}
do
	UTIL.MakeClass(SwordPart)
	function SwordPart.New(npart, nowner)
		local init = UTIL.DeepCopy(SwordPart)
		init.Part = npart
		init.Owner = nowner
		table.insert(
			init.ActiveConnections,
			init.Part.Touched:connect(function(hit)
				init:SwordTouch(hit)
			end)
		)

		init.OnHit = InternalEvent.New()
		init.OnHitHumanoid = InternalEvent.New()
		init.OnAttackReady = InternalEvent.New()
		init.OnAttack = InternalEvent.New()

		return init
	end

	function SwordPart:SwordTouch(hit)
		if tick() - self.LastSwing > self.AttackTime or tick() - self.LastHit < self.AttackTime then
			return
		end
		self.OnHit:Fire(hit)
		local character, humanoid = UTIL.FindCharacterAncestor(hit)
		if character and character ~= self.Owner.Character then
			humanoid:TakeDamage(self.Damage)
			self.OnHitHumanoid:Fire(humanoid, hit)
			self.LastHit = tick()
			if self.HitSound then
				self.HitSound:Play()
			end
		end
	end

	function SwordPart:DoSwing()
		if tick() - self.LastSwing < self.AttackTime + self.CoolDown then
			return
		end

		if self.SwingAnimation then
			self.SwingAnimation:Play()
		end
		if self.SwingSound then
			self.SwingSound:Play()
		end
		self.LastSwing = tick()
		self.OnAttack:Fire()
	end

	function SwordPart:Destroy()
		for _, i in pairs(self.ActiveConnections) do
			i:disconnect()
		end
	end
end
do
	local Handle = script.Parent
	local Tool = Handle.Parent

	local Player = game.Players.LocalPlayer
	local Character = UTIL.WaitForValidCharacter(Player)
	local SwingAni = UTIL.Instantiate("Animation")({ AnimationId = "http://www.roblox.com/Asset?ID=89289879" })

	local HitSound = Handle:WaitForChild("Hit")
	local SwingSound = Handle:WaitForChild("Swing")

	local SwingAniTrack

	local Sword

	Tool.Equipped:connect(function(mouse)
		Sword = SwordPart.New(Handle, Player)
		Sword.Damage = 40
		Sword.HitSound = HitSound
		Sword.SwingSound = SwingSound
		Character = UTIL.WaitForValidCharacter(Player)
		local Humanoid = Character:FindFirstChild("Humanoid")

		SwingAniTrack = Humanoid:LoadAnimation(SwingAni)
		Sword.SwingAnimation = SwingAniTrack

		Sword.OnHitHumanoid:Connect(function(humanoid, hit)
			local myTorso = Character:FindFirstChild("Torso")
			local torso = humanoid.Parent:FindFirstChild("Torso")
			if not torso or not myTorso then
				return
			end

			if
				hit.Name == "Right Arm"
				or hit.Name == "Left Arm"
				or hit.Name == "Right Leg"
				or hit.Name == "Left Leg"
			then
				hit:BreakJoints()
				WeldUtil.WeldBetween(hit, Handle)
				Delay(1, function()
					hit:BreakJoints()
				end)
			end
		end)

		mouse.Button1Down:connect(function()
			Sword:DoSwing()
		end)
	end)
	Tool.Unequipped:connect(function()
		Sword:Destroy()
	end)
end
