I'm trying to make a gun game, but my gun can kill my teammates. How can I edit this to avoid that? (Sorry if it looks really messy and really unoptimized, I'm really new to Roblox scripting.) Code:
local function createBullet(target) local bullet = tool.Bullet:Clone() table.insert(ignoreTable, bullet) bullet.Parent = workspace bullet.CFrame = CFrame.new(muzzle.CFrame.p, target) bullet.Trail.Enabled = true wait() -- so trail has time to load bullet.Transparency = 0 local missionAccomplished = false for i = 1, numSegments do if not missionAccomplished then local equation = bullet.CFrame * CFrame.new(0, 0, -segmentLength) * CFrame.Angles(dropAngle, 0, 0) local ray = Ray.new(bullet.Position, (equation.p - bullet.Position).unit * segmentLength) local part, pos, normal, material = workspace:FindPartOnRayWithIgnoreList(ray, ignoreTable) if part and part.Parent:FindFirstChild("Humanoid") then missionAccomplished = true bullet.HitSound:Play() hitEvent:FireClient(game.Players:GetPlayerFromCharacter(tool.Parent)) local hum = part.Parent.Humanoid if part.Name == "Head" and configs.headshotInstakill == true then local neck = part.Parent:FindFirstChild("Neck", true) neck:Destroy() elseif part.Name == "Head" then hum:TakeDamage(headDamage) elseif part.Name == "Torso" or part.Name == "UpperTorso" or part.Name == "LowerTorso" then -- Names to account for R6 and R15 hum:TakeDamage(torsoDamage) else hum:TakeDamage(otherDamage) end bullet.CFrame = CFrame.new(pos, equation.p) local weld = Instance.new("Weld", bullet) weld.C0 = bullet.CFrame:inverse() * part.CFrame weld.Part0 = bullet weld.Part1 = part bullet.Anchored = false --bullet.Trail.Enabled = false bullet.Transparency = 1 if configs.blood == true then bullet.EffectAttachment.BloodEmitter:Emit(20) end wait(1) for ii, v in pairs(ignoreTable) do if v == bullet then table.remove(ignoreTable, ii) end end bullet:Destroy() elseif part then missionAccomplished = true bullet.CFrame = CFrame.new(pos, equation.p) --bullet.Trail.Enabled = false bullet.Transparency = 1 bullet.ThudSound:Play() if hitParticles and part.Transparency and part.Transparency < 1 then if part.ClassName ~= "Terrain" then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(part.Color) elseif material == Enum.Material.Grass or material == Enum.Material.LeafyGrass or material == Enum.Material.Ground or material == Enum.Material.Mud or material == Enum.Material.Cobblestone then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(61/255, 51/255, 44/255)) elseif material == Enum.Material.Asphalt or material == Enum.Material.Concrete or material == Enum.Material.Pavement or material == Enum.Material.Slate then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(100/255, 99/255, 93/255)) elseif material == Enum.Material.Limestone or material == Enum.Material.Sand or material == Enum.Material.WoodPlanks then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(172/255, 153/255, 116/255)) elseif material == Enum.Material.Brick or material == Enum.Material.Sandstone then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(165/255, 114/255, 95/255)) elseif material == Enum.Material.Rock then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(93/255, 96/255, 103/255)) elseif material == Enum.Material.Basalt or material == Enum.Material.CrackedLava then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(22/255, 11/255, 10/255)) elseif material == Enum.Material.Salt or material == Enum.Material.Snow then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(190/255, 180/255, 190/255)) elseif material == Enum.Material.Glacier or material == Enum.Material.Ice then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(162/255, 194/255, 217/255)) end bullet.EffectAttachment.DebrisEmitter:Emit(10) end wait(1) for ii, v in pairs(ignoreTable) do if v == bullet then table.remove(ignoreTable, ii) end end bullet:Destroy() else bullet.CFrame = equation end wait(waitBetweenSegments) end end return
end
I guess this should work :
local function createBullet(target) local bullet = tool.Bullet:Clone() table.insert(ignoreTable, bullet) bullet.Parent = workspace bullet.CFrame = CFrame.new(muzzle.CFrame.p, target) bullet.Trail.Enabled = true wait() -- so trail has time to load bullet.Transparency = 0 local missionAccomplished = false for i = 1, numSegments do if not missionAccomplished then local equation = bullet.CFrame * CFrame.new(0, 0, -segmentLength) * CFrame.Angles(dropAngle, 0, 0) local ray = Ray.new(bullet.Position, (equation.p - bullet.Position).unit * segmentLength) local part, pos, normal, material = workspace:FindPartOnRayWithIgnoreList(ray, ignoreTable) if part and part.Parent:FindFirstChild("Humanoid") then missionAccomplished = true bullet.HitSound:Play() hitEvent:FireClient(game.Players:GetPlayerFromCharacter(tool.Parent)) local hum = part.Parent.Humanoid local plr = game.Players:GetPlayerFromCharacter(tool.Parent) local HitPlayer = game.Players:GetPlayerFromCharacter(part.Parent) --the Character of the hit player if HitPlayer.Team ~= plr.Team then if part.Name == "Head" and configs.headshotInstakill == true then local neck = part.Parent:FindFirstChild("Neck", true) neck:Destroy() elseif part.Name == "Head" then hum:TakeDamage(headDamage) elseif part.Name == "Torso" or part.Name == "UpperTorso" or part.Name == "LowerTorso" then -- Names to account for R6 and R15 hum:TakeDamage(torsoDamage) else hum:TakeDamage(otherDamage) end end bullet.CFrame = CFrame.new(pos, equation.p) local weld = Instance.new("Weld", bullet) weld.C0 = bullet.CFrame:inverse() * part.CFrame weld.Part0 = bullet weld.Part1 = part bullet.Anchored = false --bullet.Trail.Enabled = false bullet.Transparency = 1 if configs.blood == true then bullet.EffectAttachment.BloodEmitter:Emit(20) end wait(1) for ii, v in pairs(ignoreTable) do if v == bullet then table.remove(ignoreTable, ii) end end bullet:Destroy() elseif part then missionAccomplished = true bullet.CFrame = CFrame.new(pos, equation.p) --bullet.Trail.Enabled = false bullet.Transparency = 1 bullet.ThudSound:Play() if hitParticles and part.Transparency and part.Transparency < 1 then if part.ClassName ~= "Terrain" then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(part.Color) elseif material == Enum.Material.Grass or material == Enum.Material.LeafyGrass or material == Enum.Material.Ground or material == Enum.Material.Mud or material == Enum.Material.Cobblestone then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(61/255, 51/255, 44/255)) elseif material == Enum.Material.Asphalt or material == Enum.Material.Concrete or material == Enum.Material.Pavement or material == Enum.Material.Slate then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(100/255, 99/255, 93/255)) elseif material == Enum.Material.Limestone or material == Enum.Material.Sand or material == Enum.Material.WoodPlanks then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(172/255, 153/255, 116/255)) elseif material == Enum.Material.Brick or material == Enum.Material.Sandstone then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(165/255, 114/255, 95/255)) elseif material == Enum.Material.Rock then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(93/255, 96/255, 103/255)) elseif material == Enum.Material.Basalt or material == Enum.Material.CrackedLava then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(22/255, 11/255, 10/255)) elseif material == Enum.Material.Salt or material == Enum.Material.Snow then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(190/255, 180/255, 190/255)) elseif material == Enum.Material.Glacier or material == Enum.Material.Ice then bullet.EffectAttachment.DebrisEmitter.Color = ColorSequence.new(Color3.new(162/255, 194/255, 217/255)) end bullet.EffectAttachment.DebrisEmitter:Emit(10) end wait(1) for ii, v in pairs(ignoreTable) do if v == bullet then table.remove(ignoreTable, ii) end end bullet:Destroy() else bullet.CFrame = equation end wait(waitBetweenSegments) end end return