- 
What do you want to achieve? Keep it simple and clear! 
 I wanted to make the spray pattern to looks like counter strike ak47 spray pattern
 
- 
What is the issue? Include screenshots / videos if possible! 
 
It’s not going to the pattern that I expected it to looks like.
3. What solutions have you tried so far? Did you look for solutions on the Developer Hub?
I tried adjusting the spray pattern position but it does not work.
After that, you should include more details if you have any. Try to make your topic as descriptive as possible, so that it’s easier for people to help you!
ServerScript (inside tool)
local shotCount = 0
function fire(player,mousePos)
	if ammoInMag > 0 and not reloading then
		
		local startPos = handle.Muzzle.WorldPosition
		local velocity = 1650
		
		shotCount = math.min(shotCount + 1, #module.sprayPattern)
		local pattern = module.sprayPattern[shotCount]
		local adjustedDirection = CFrame.new(startPos, mousePos) * CFrame.Angles(0, math.rad(pattern.x), math.rad(pattern.y))
		
		local direction = CFrame.new(startPos,mousePos)
		direction = direction.lookVector*velocity
		local range = 3000
		
		canFire = true
		
		local fireSound = tool.Handle.Sound:WaitForChild("Fire")
		fireSound:Play()
		
		local mFlash = tool:WaitForChild("Flash"):Clone()
		mFlash.Parent = tool.Handle.Muzzle
		wait(.2)
		
		if mFlash.Parent == tool.Handle.Muzzle then
			mFlash:Destroy()
		end
		
		--[[
		fireSound.Ended:Connect(function()
			fireSound:Destroy()
		end)
		--]]
		
		bulletReplicator:FireAllClients(player.Character,startPos,direction,range)
		
		if ammoInMag > 0 then ammoInMag -= 1 end
		updateClientAmmo(player, ammoInMag, ammoStored)
		print("Ammo"..ammoInMag)
		
		local startTime = tick()
		local lastPos = startPos
		local blacklist = {player.Character}
		local rayFilter = RaycastParams.new()
		rayFilter.FilterType = Enum.RaycastFilterType.Exclude
		for _,char in pairs(workspace:GetChildren()) do
			if char:FindFirstChildOfClass("Humanoid") then
				for _,accessory in pairs(char:GetChildren()) do
					if accessory:IsA("Accessory") then
						table.insert(blacklist,accessory.Handle)
					end
				end
			end
		end
		rayFilter.FilterDescendantsInstances = blacklist
		while range > 0 do
			local timeLength = (tick()-startTime)
			local currentPos = startPos + (direction*timeLength)
			local distance = (lastPos-currentPos).Magnitude
			range -= distance
			local ray = workspace:Raycast(lastPos,currentPos-lastPos,rayFilter)
			if ray == nil then
				ray = workspace:Raycast(currentPos,lastPos-currentPos,rayFilter)
			end
			if ray then
				local hit = ray.Instance
				currentPos = ray.Position
				local model = hit:FindFirstAncestorOfClass("Model")
				if model then
					local humanoid = model:FindFirstChildWhichIsA("Humanoid")
					if humanoid then
						
						if hit.Name == "Head" then
							humanoid:TakeDamage(bodyDamage * headDamMultiplier)
						else
							humanoid:TakeDamage(bodyDamage)
						end
						print("Target HP "..humanoid.Health)
					end
				end
				
				local newHole = bulletHole:Clone()
				newHole.CFrame = CFrame.new(ray.Position, ray.Position + ray.Normal)
				newHole.Parent = workspace
				Debris:AddItem(newHole, 5)  -- Automatically clean up the bullet hole after 5 seconds
				
				break
			end
			lastPos = currentPos
			task.wait()
			
		end
end
The spray patterns in Module Script
	sprayPattern = {
		{x = 0, y = 5},   
		{x = -3, y = 2},  
		{x = -5, y = 1},
		{x = 1, y = 1},
		{x = 5, y = 0},   
		{x = 6, y = -0.5},
		{x = -5, y = 0},
		{x = -6, y = 0},
		{x = 2, y = 0},
		{x = 5, y = 0},
		{x = 0, y = -2},
		{x = -3, y = 3},
		{x = 4, y = 2},
	}
Sorry for not cleaning up the codes for uneccessary things beside the spraying pattern. So glad if you help!
