I'll oversimplify this. Alright so I have a local script which handles most of everything that includes shooting it. Although I'm having trouble adding friendly fire. does anybody know how to do it?
--Roblox Services--
local Players = game.Players
--//Variables\\--
local tool = script.Parent.Parent
local player = game:GetService("Players").LocalPlayer
local mouse = player:GetMouse()
local hole = tool:WaitForChild("Hole")
local handle = tool:WaitForChild("Handle")
local actionService = game:GetService("ContextActionService")
local mouseDown = false
local equipped = false
local Configurations = tool.Configurations
--//Folders\\--
local animations = tool:WaitForChild("Animations")
local configs = tool:WaitForChild("Configurations")
local remotes = tool:WaitForChild("Remotes")
local bindables = tool:WaitForChild("Bindables")
--//Animations\\--
local recoilAnim = animations:WaitForChild("Recoil")
local reloadAnim = animations:WaitForChild("Reload")
local holdAnim = animations:WaitForChild("Hold")
--//Animation Tracks\\--
local recoilTrack
local reloadTrack
local holdTrack
--//Configs\\--
local allowTracing = configs:WaitForChild("AllowTracing")
local range = configs:WaitForChild("Range")
--//Remotes\\--
local canShoot = remotes:WaitForChild("CanShoot")
local canReload = remotes:WaitForChild("CanReload")
local hitRemote = remotes:WaitForChild("Hit")
local reloadRemote = remotes:WaitForChild("Reload")
local shootRemote = remotes:WaitForChild("Shoot")
--//Assets\\--
local flashGui = hole:WaitForChild("FlashGui")
--//Bindables\\--
local reloadBind = bindables:WaitForChild("Reload")
--//Functions\\--
local function equip()
equipped = true
--//Get humanoid
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
if humanoid then
--//Load animations
pcall(function()
--//Hold animation
holdTrack = humanoid:LoadAnimation(holdAnim)
holdTrack:Play()
end)
pcall(function()
--//Reload animation
reloadTrack = humanoid:LoadAnimation(reloadAnim)
end)
pcall(function()
--//Recoil animation
recoilTrack = humanoid:LoadAnimation(recoilAnim)
end)
end
end
local function unequip()
equipped = false
--//Stop animations
if holdTrack then
holdTrack:Stop()
end
if reloadTrack then
reloadTrack:Stop()
end
if recoilTrack then
recoilTrack:Stop()
end
end
local function reload()
if canReload:InvokeServer() then
--//Reload
reloadRemote:FireServer()
if reloadTrack then
reloadTrack:Play()
end
end
end
local function fire()
--//Checks
if canShoot:InvokeServer() then
--//Initialize
if recoilTrack then
recoilTrack:Play()
end
flashGui.Enabled = true
--//Cast ray
local ray = Ray.new(hole.CFrame.p, (mouse.hit.p - hole.CFrame.p).unit * range.Value)
local touch, position = workspace:FindPartOnRay(ray, player.Character, false, true)
--//Hit detection
if touch then
hitRemote:FireServer(touch)
end
shootRemote:FireServer()
--//Trace
if allowTracing.Value then
--//Create
local trace = Instance.new("Part")
trace.Anchored = trace
trace.CanCollide = false
trace.Transparency = 0.5
trace.BrickColor = BrickColor.new("Bright yellow")
trace.Material = Enum.Material.SmoothPlastic
--//Calculate
local distance = (hole.CFrame.p - position).magnitude
trace.Size = Vector3.new(0, 0, distance)
trace.CFrame = CFrame.new(hole.CFrame.p, position) * CFrame.new(0, 0, -distance/2)
trace.Parent = workspace
--//Clean-up
game:GetService("Debris"):AddItem(trace, 0.1)
wait(0.1)
flashGui.Enabled = false
end
end
end

2 comments
You can make an if statement to check the hitted player's team.
Find the player instance from the players character(using GetPlayerFromCharacter) then check which team the player is on. Compare that with the team of the player shooting(with an IF statement)