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