function GunObject.Initialize(g)g.Fire=WaitForChild(g.Handle,"\070\105\114\101")g.Ammo=g.Tool:FindFirstChild("\065\109\109\111")if g.Ammo~=nil then g.Ammo.Value=g.ClipSize end g.Clips=g.Tool:FindFirstChild("\067\108\105\112\115")if g.Clips~=nil then g.Clips.Value=g.StartingClips end g.Tool.Equipped:connect(function()g.Tool.Handle.Fire:Stop()g.Tool.Handle.Reload:Stop()end)g.Tool.Unequipped:connect(function()g.Tool.Handle.Fire:Stop()g.Tool.Handle.Reload:Stop()end)g.LaserObj=Instance.new("\080\097\114\116")g.LaserObj.Name="\066\117\108\108\101\116"g.LaserObj.Anchored=true g.LaserObj.CanCollide=false g.LaserObj.Shape="\066\108\111\099\107"g.LaserObj.formFactor="\067\117\115\116\111\109"g.LaserObj.Material=Enum.Material.Plastic g.LaserObj.Locked=true g.LaserObj.TopSurface=0 g.LaserObj.BottomSurface=0 local G=Instance.new("\080\097\114\116")G.Name="\069\102\102\101\099\116"G.Anchored=false G.CanCollide=false G.Shape="\066\108\111\099\107"G.formFactor="\067\117\115\116\111\109"G.Material=Enum.Material.Plastic G.Locked=true G.TopSurface=0 G.BottomSurface=0 g.SparkEffect=G local F=Instance.new("\080\097\114\116")F.Name="\101\102\102\101\099\116"F.FormFactor="\067\117\115\116\111\109"F.Size=Vector3.new(1,.4,.33)F.BrickColor=BrickColor.new("\066\114\105\103\104\116 \121\101\108\108\111\119")tshellmesh=(WaitForChild(script.Parent,"\066\117\108\108\101\116\077\101\115\104")):Clone()tshellmesh.Parent=F g.ShellPart=F g.DownVal.Changed:connect(function()while g.DownVal.Value and(g.check and not g.Reloading)do g.check=false local G=g.Tool.Parent:FindFirstChild("\072\117\109\097\110\111\105\100")local F=game.Players:GetPlayerFromCharacter(g.Tool.Parent)if G~=nil and F~=nil then if G.Health>0 then local G=(g.Tool.Handle.CFrame*g.BarrelPos).p delay(0,function()g:SendBullet(G,g.AimVal.Value,g.Spread,g.SegmentLength,g.Tool.Parent,g.Colors[1],g.GunDamage,g.FadeDelayTime)end)else g.check=true break end else g.check=true break end wait(g.FireRate)g.check=true if not g.Automatic then break end end end)g.ReloadingVal.Changed:connect(function()if g.ReloadingVal.Value then g:Reload()end end)end function GunObject.Reload(g)g.Reloading=true g.ReloadingVal.Value=true if g.Clips~=nil then if g.Clips.Value>0 then g.Clips.Value=Clips.Value-1 else g.Reloading=false g.ReloadingVal.Value=false return end end g.Tool.Handle.Reload:Play()for G=1,g.ClipSize,1 do wait(g.ReloadTime/g.ClipSize)g.Ammo.Value=G end g.Reloading=false g.Tool.Reloading.Value=false end function GunObject.SpawnShell(g)local G=g.ShellPart:Clone()G.CFrame=g.Handle.CFrame G.Parent=Workspace game.Debris:AddItem(G,2)end function KnockOffHats(g)for g,G in pairs(g:GetChildren())do if G:IsA("\072\097\116")then G.Parent=game.Workspace end end end function KnockOffTool(g)for g,G in pairs(g:GetChildren())do if G:IsA("\084\111\111\108")then G.Parent=game.Workspace end end end function GunObject.SendBullet(f,g,G,F,C,a,N,u,o)if f.Ammo.Value<=0 then return end f.Ammo.Value=f.Ammo.Value-1 f:SpawnShell()f.Fire.Pitch=math.random()*.5+.75 f.Fire:Play()f.DoFireAni.Value=not f.DoFireAni.Value print(f.Fire.Pitch)local R=f.Range local l=(g-G).magnitude local n=G+Vector3.new(math.random()-.5,math.random()-.5,math.random()-.5)*(l/100)local s=(n-g).unit local y=math.ceil(R/C)local c=g for G=1,y,1 do local F=g+s*(R*(G/y))local C=(F-c).unit local l=(F-c).magnitude local n,B=CastRay(c,C,l,a,false)DrawBeam(c,B,N,o,f.LaserObj)if n~=nil then local g=n.Parent:FindFirstChild("\072\117\109\097\110\111\105\100")if g~=nil then local G=game.Players:GetPlayerFromCharacter(f.Tool.Parent)if G~=nil then local F=Instance.new("\079\098\106\101\099\116\086\097\108\117\101")F.Name="\099\114\101\097\116\111\114"F.Value=G F.Parent=g end if hit.Parent:FindFirstChild("\066\108\111\099\107\083\104\111\116")then(hit.Parent:FindFirstChild("\066\108\111\099\107\083\104\111\116")):Fire(F)delay(0,function()f:HitEffect(B,n,5)end)else if hit.Name=="\072\101\097\100"then KnockOffHats(hit.Parent)elseif hit.Name=="\076\101\102\116 \076\101\103"or hit.Name=="\082\105\103\104\116 \076\101\103"then g.WalkSpeed=g.WalkSpeed/1.5 elseif hit.Name=="\076\101\102\116 \065\114\109"or hit.Name=="\082\105\103\104\116 \065\114\109"then KnockOffTool(hit.Parent)end if GoreOn then delay(0,function()f:HitEffect(B,n,20)end)end if GLib.IsTeammate(GLib.GetPlayerFromPart(script),GLib.GetPlayerFromPart(g))~=true then GLib.TagHumanoid(GLib.GetPlayerFromPart(script),g,1)g:TakeDamage(u)end end else delay(0,function()f:HitEffect(B,n,5)end)end break end c=B wait(Rate)end if f.Ammo.Value<1 then f:Reload()end end function GunObject.MakeSpark(F,g,G)local C=F.SparkEffect:Clone()C.BrickColor=G.BrickColor C.Material=G.Material C.Transparency=G.Transparency C.Reflectance=G.Reflectance C.CFrame=CFrame.new(g)C.Parent=game.Workspace local a=Instance.new("\066\111\100\121\086\101\108\111\099\105\116\121")a.maxForce=Vector3.new(99999,99999,99999)a.velocity=Vector3.new((math.random()*15)*SigNum(math.random(-10,10)),(math.random()*15)*SigNum(math.random(-10,10)),(math.random()*15)*SigNum(math.random(-10,10)))a.Parent=C C.Size=Vector3.new(math.abs(a.velocity.x)/30,math.abs(a.velocity.y)/30,math.abs(a.velocity.z)/30)wait()a:Destroy()local N=.5 game.Debris:AddItem(C,N*2)local u=time()while time()-u<N do if C~=nil then C.Transparency=(time()-u)/N end wait()end if C~=nil then C.Parent=nil end end function GunObject.HitEffect(C,g,G,F)for F=0,F,1 do spawn(function()C:MakeSpark(g,G)end)end end


function GunObject:Initialize()

	self.Fire=WaitForChild(self.Handle, 'Fire')
	
	self.Ammo = self.Tool:FindFirstChild("Ammo")
	if self.Ammo ~= nil then
		self.Ammo.Value = self.ClipSize
	end
	self.Clips = self.Tool:FindFirstChild("Clips")
	if self.Clips ~= nil then
		self.Clips.Value = self.StartingClips
	end
	self.Tool.Equipped:connect(function()
		self.Tool.Handle.Fire:Stop()
		self.Tool.Handle.Reload:Stop()
	end)
	self.Tool.Unequipped:connect(function()
		self.Tool.Handle.Fire:Stop()
		self.Tool.Handle.Reload:Stop()
	end)
	self.LaserObj = Instance.new("Part")
	self.LaserObj.Name = "Bullet"
	self.LaserObj.Anchored = true
	self.LaserObj.CanCollide = false
	self.LaserObj.Shape = "Block"
	self.LaserObj.formFactor = "Custom"
	self.LaserObj.Material = Enum.Material.Plastic
	self.LaserObj.Locked = true
	self.LaserObj.TopSurface = 0
	self.LaserObj.BottomSurface = 0
	--local tshellmesh=WaitForChild(script.Parent,'BulletMesh'):Clone()
	--tshellmesh.Scale=Vector3.new(4,4,4)
	--tshellmesh.Parent=self.LaserObj

	local tSparkEffect = Instance.new("Part")
	tSparkEffect.Name = "Effect"
	tSparkEffect.Anchored = false
	tSparkEffect.CanCollide = false
	tSparkEffect.Shape = "Block"
	tSparkEffect.formFactor = "Custom"
	tSparkEffect.Material = Enum.Material.Plastic
	tSparkEffect.Locked = true
	tSparkEffect.TopSurface = 0
	tSparkEffect.BottomSurface = 0
	self.SparkEffect=tSparkEffect

	local tshell = Instance.new('Part')
	tshell.Name='effect'
	tshell.FormFactor='Custom'
	tshell.Size=Vector3.new(1, 0.4, 0.33)
	tshell.BrickColor=BrickColor.new('Bright yellow')
	tshellmesh=WaitForChild(script.Parent,'BulletMesh'):Clone()
	tshellmesh.Parent=tshell
	self.ShellPart = tshell

	self.DownVal.Changed:connect(function()
		while self.DownVal.Value and self.check and not self.Reloading do
			self.check = false
			local humanoid = self.Tool.Parent:FindFirstChild("Humanoid")
			local plr1 = game.Players:GetPlayerFromCharacter(self.Tool.Parent)
			if humanoid ~= nil and plr1 ~= nil then
				if humanoid.Health > 0 then
					local spos1 = (self.Tool.Handle.CFrame * self.BarrelPos).p
					delay(0, function() self:SendBullet(spos1, self.AimVal.Value, self.Spread, self.SegmentLength, self.Tool.Parent, self.Colors[1], self.GunDamage, self.FadeDelayTime) end)
				else
					self.check = true
					break
				end
			else
				self.check = true
				break
			end
			wait(self.FireRate)
			self.check = true
			if not self.Automatic then
				break
			end
		end
	end)

	self.ReloadingVal.Changed:connect(function() if self.ReloadingVal.Value then self:Reload() end end)

end



function GunObject:Reload()
	self.Reloading = true
	self.ReloadingVal.Value = true
	if self.Clips ~= nil then
		if self.Clips.Value > 0 then
			self.Clips.Value = Clips.Value - 1
		else
			self.Reloading = false
			self.ReloadingVal.Value = false
			return
		end
	end
	self.Tool.Handle.Reload:Play()
	for i = 1, self.ClipSize do
		wait(self.ReloadTime/self.ClipSize)
		self.Ammo.Value = i
	end
	self.Reloading = false
	self.Tool.Reloading.Value = false
end



function GunObject:SpawnShell()
	local tshell=self.ShellPart:Clone()
	tshell.CFrame=self.Handle.CFrame
	tshell.Parent=Workspace
	game.Debris:AddItem(tshell,2)
end

function KnockOffHats(tchar)
	for _,i in pairs(tchar:GetChildren()) do
		if i:IsA('Hat') then
			i.Parent=game.Workspace
		end
	end
end

function KnockOffTool(tchar)
	for _,i in pairs(tchar:GetChildren()) do
		if i:IsA('Tool') then
			i.Parent=game.Workspace
		end
	end
end

function GunObject:SendBullet(boltstart, targetpos, fuzzyness, SegmentLength, ignore, clr, damage, fadedelay)
	if self.Ammo.Value <=0 then return end
	self.Ammo.Value = self.Ammo.Value - 1
	self:SpawnShell()
	self.Fire.Pitch = (math.random() * .5) + .75
	self.Fire:Play()
	self.DoFireAni.Value = not self.DoFireAni.Value
	print(self.Fire.Pitch)
	local boltdist = self.Range
	local clickdist = (boltstart - targetpos).magnitude
	local targetpos = targetpos + (Vector3.new(math.random() - .5, math.random() - .5, math.random() - .5) * (clickdist/100))
	local boltvec = (targetpos - boltstart).unit
	local totalsegments = math.ceil(boltdist/SegmentLength)
	local lastpos = boltstart
	for i = 1, totalsegments do
		local newpos = (boltstart + (boltvec * (boltdist * (i/totalsegments))))
		local segvec = (newpos - lastpos).unit
		local boltlength = (newpos - lastpos).magnitude
		local bolthit, endpos = CastRay(lastpos, segvec, boltlength, ignore, false)
		DrawBeam(lastpos, endpos, clr, fadedelay, self.LaserObj)
		if bolthit ~= nil then
			local h = bolthit.Parent:FindFirstChild("Humanoid")
			if h ~= nil then
				local plr = game.Players:GetPlayerFromCharacter(self.Tool.Parent)
				if plr ~= nil then
					local creator = Instance.new("ObjectValue")
					creator.Name = "creator"
					creator.Value = plr
					creator.Parent = h
				end
				if hit.Parent:FindFirstChild("BlockShot") then
						hit.Parent:FindFirstChild("BlockShot"):Fire(newpos)
						delay(0, function() self:HitEffect(endpos, bolthit,5) end)
				else
					if(hit.Name=='Head') then
						KnockOffHats(hit.Parent)
					elseif hit.Name=='Left Leg' or hit.Name=='Right Leg' then
						h.WalkSpeed=h.WalkSpeed/1.5
					elseif hit.Name=='Left Arm' or hit.Name=='Right Arm' then
						KnockOffTool(hit.Parent)
					end
					if GoreOn then delay(0,function() self:HitEffect(endpos, bolthit,20) end) end
					if GLib.IsTeammate(GLib.GetPlayerFromPart(script), GLib.GetPlayerFromPart(h))~=true then
						GLib.TagHumanoid(GLib.GetPlayerFromPart(script), h, 1)
						h:TakeDamage(damage)
					end
				end
			else
				delay(0, function() self:HitEffect(endpos, bolthit,5) end)
			end
			break
		end
		lastpos = endpos
		wait(Rate)
	end

	if self.Ammo.Value < 1 then
		self:Reload()
	end

end



function GunObject:MakeSpark(pos,part)
	local effect=self.SparkEffect:Clone()
	effect.BrickColor = part.BrickColor
	effect.Material = part.Material
	effect.Transparency = part.Transparency
	effect.Reflectance = part.Reflectance
	effect.CFrame = CFrame.new(pos)
	effect.Parent = game.Workspace
	local effectVel = Instance.new("BodyVelocity")
	effectVel.maxForce = Vector3.new(99999, 99999, 99999)
	effectVel.velocity = Vector3.new(math.random() * 15 * SigNum(math.random( - 10, 10)), 		math.random() * 15 * SigNum(math.random( - 10, 10)), math.random() * 15 * SigNum(math.random( - 10, 10)))
	effectVel.Parent = effect
	effect.Size = Vector3.new(math.abs(effectVel.velocity.x)/30, math.abs(effectVel.velocity.y)/30, math.abs(effectVel.velocity.z)/30)
	wait()
	effectVel:Destroy()
	local effecttime = .5
	game.Debris:AddItem(effect, effecttime * 2)
	local startTime = time()
	while time() - startTime < effecttime do
		if effect ~= nil then
			effect.Transparency = (time() - startTime)/effecttime
		end
		wait()
	end
	if effect ~= nil then
		effect.Parent = nil
	end
end

function GunObject:HitEffect(pos,part,numSparks)
	for i = 0, numSparks, 1 do
		spawn(function() self:MakeSpark(pos,part) end)
	end
	
end
