Hello guys! I'm trying to make a Battle Royale game, with guns. The problem is that I have invisible parts with CanCollide = false around it for a system to discover the regions. I grouped them all along with the storm in a model called "MapEnvironment". I set that model as mouse.TargetFilter, but the ray is still detecting collision with those parts. Any help? Thank you! Client Script:
repeat
wait()
until game:IsLoaded()
local ts = game:GetService("TweenService")
local tool = script.Parent
local handle = tool:WaitForChild("Handle")
local effects = tool.Effects
local uis = game:GetService("UserInputService")
local plr = game.Players.LocalPlayer
local char = plr.Character
local mouse = plr:GetMouse()
local gui = tool.GunInterface
local fire = false
local firing = false
local equip = false
local reloadtime = tool.ReloadTime.Value
local projectiles = tool.Projectiles.Value --number of bullets shot at once
local spread = tool.Spread.Value/100 --bullet spread
local damage = tool.Damage.Value/projectiles --hit damage
local firerate = tool.FireRate.Value
local cooldown = 1/firerate --fire delay
local reloading = false
mouse.TargetFilter = game.Workspace.MapEnvironment
gui.Background.WeaponName.Text = tool.Name
gui.Background.Magazine.Text = tool.Magazine.Value.."/"..tool.MagazineSize.Value
function newbullet()
local x = math.random(-spread*100,spread*100)/100
local y = math.random(-spread*100,spread*100)/100
local direction = (CFrame.new(handle.CFrame.p,mouse.Hit.p)*CFrame.Angles(math.rad(x),math.rad(y),0)).lookVector
local ray = Ray.new(effects.CFrame.p,(direction).unit*999)
local part,pos = workspace:FindPartOnRay(ray,char)
if part then
if part.Parent.Name ~= plr.Name then
tool:WaitForChild("Fire"):FireServer(part,pos,damage,tool.Magazine.Value,ray)
end
else
tool:WaitForChild("Fire"):FireServer(part,pos,damage,tool.Magazine.Value,ray)
end
end
local function getelim()
local pa = game.Players.LocalPlayer.PlayerGui.ElimGui.Background
local ti = TweenInfo.new(1)
local go = {}
go.Position = UDim2.new(0.25,0,0.08,0)
pa.Position = UDim2.new(-0.5,0,0.08,0)
local tw = ts:Create(pa,ti,go)
tw:Play()
wait(3)
local go2 = {}
go2.Position = UDim2.new(1,0,0.08,0)
local tw2 = ts:Create(pa,ti,go2)
tw2:Play()
end
local function reload()
if equip == true and reloading == false and tool.Magazine.Value < tool.MagazineSize.Value then
firing = false
reloading = true
fire = true
tool.Reload:FireServer(reloadtime)
wait(reloadtime)
reloading = false
fire = false
end
end
tool.Magazine.Changed:Connect(function()
gui.Background.Magazine.Text = tool.Magazine.Value.."/"..tool.MagazineSize.Value
end)
mouse.Button1Down:Connect(function()
if equip then
firing = true
end
end)
mouse.Button1Up:Connect(function()
firing = false
end)
tool.Equipped:Connect(function()
if game.Players.LocalPlayer:WaitForChild("PlayerValues"):WaitForChild("Spanish").Value == false then
if tool.Rarity.Value == "Común" then
tool.Rarity.Value = "Common"
end
if tool.Rarity.Value == "Poco común" then
tool.Rarity.Value = "Uncommon"
end
if tool.Rarity.Value == "Raro" then
tool.Rarity.Value = "Rare"
end
if tool.Rarity.Value == "Épico" then
tool.Rarity.Value = "Epic"
end
if tool.Rarity.Value == "Legendario" then
tool.Rarity.Value = "Legendary"
end
if tool.Rarity.Value == "Mítico" then
tool.Rarity.Value = "Mythic"
end
gui.Controls.Drop.Text = "V - Drop"
gui.Controls.Reload.Text = "R - Reload"
gui.Controls.ScopeIn.Text = "Right click - Scope in"
gui.Stats.Damage.Text = "Damage: ".. tool.Damage.Value
gui.Stats.FireRate.Text = "Fire rate: ".. tool.FireRate.Value
gui.Stats.HeadshotMultiplier.Text = "Headshot multiplier: ".. tool.HeadshotMultiplier.Value
gui.Stats.MagazineSize.Text = "Magazine size: ".. tool.MagazineSize.Value
gui.Stats.Rarity.Text = tool.Rarity.Value
gui.Stats.ReloadTime.Text = "Reload time: ".. tool.ReloadTime.Value
else
if tool.Rarity.Value == "Common" then
tool.Rarity.Value = "Común"
end
if tool.Rarity.Value == "Uncommon" then
tool.Rarity.Value = "Poco común"
end
if tool.Rarity.Value == "Rare" then
tool.Rarity.Value = "Raro"
end
if tool.Rarity.Value == "Epic" then
tool.Rarity.Value = "Épico"
end
if tool.Rarity.Value == "Legendary" then
tool.Rarity.Value = "Legendario"
end
if tool.Rarity.Value == "Mythic" then
tool.Rarity.Value = "Mítico"
end
gui.Controls.Drop.Text = "V - Soltar"
gui.Controls.Reload.Text = "R - Recargar"
gui.Controls.ScopeIn.Text = "Click derecho - Apuntar"
gui.Stats.Damage.Text = "Daño: ".. tool.Damage.Value
gui.Stats.FireRate.Text = "Cadencia: ".. tool.FireRate.Value
gui.Stats.HeadshotMultiplier.Text = "Multiplicador cabeza: ".. tool.HeadshotMultiplier.Value
gui.Stats.MagazineSize.Text = "Tamaño cargador: ".. tool.MagazineSize.Value
gui.Stats.Rarity.Text = tool.Rarity.Value
gui.Stats.ReloadTime.Text = "Tiempo recarga: ".. tool.ReloadTime.Value
end
equip = true
gui.Parent = game.Players.LocalPlayer.PlayerGui
mouse.Icon = "http://www.roblox.com/asset/?id=7074439897"
end)
tool.Unequipped:Connect(function()
equip = false
firing = false
gui.Parent = tool
mouse.Icon = "rbxasset://SystemCursors/Arrow"
end)
uis.InputBegan:Connect(function(key)
if key.KeyCode == Enum.KeyCode.R and equip == true then
reload()
end
end)
tool.Fire.OnClientEvent:Connect(function(plr)
game.Players.LocalPlayer.PlayerGui.ElimGui.Background.ElimName.Text = tool.ElimName.Value
game.Workspace.ElimSound:Play()
getelim()
end)
uis.InputBegan:Connect(function(key)
if key.KeyCode == Enum.KeyCode.V then
if equip then
tool.Drop:FireServer(plr)
end
end
end)
tool.Headshot.OnClientEvent:Connect(function(plr)
game.Workspace.HeadshotSound:Play()
end)
tool.BreakShield.OnClientEvent:Connect(function(plr)
game.Workspace.BreakShield:Play()
end)
tool.DamageEvent.OnClientEvent:Connect(function(damage,victim,Shields)
local ti = TweenInfo.new(
1,
Enum.EasingStyle.Sine,
Enum.EasingDirection.Out,
0,
false,
0
)
local go1 = {}
go1.StudsOffsetWorldSpace = Vector3.new(2,5,0)
local go2 = {}
go2.TextTransparency = 1
go2.TextStrokeTransparency = 1
local bbg = Instance.new("BillboardGui")
bbg.Size = UDim2.new(10,0,10,0)
bbg.AlwaysOnTop = true
bbg.StudsOffsetWorldSpace = Vector3.new(2,0,0)
bbg.LightInfluence = 0
bbg.Parent = victim
if bbg.Parent.Name ~= "Head" then
bbg.Parent = victim.Head
end
local tlbl = Instance.new("TextLabel")
tlbl.Size = UDim2.new(1,0,1,0)
tlbl.BackgroundTransparency = 1
tlbl.TextScaled = true
tlbl.Font = Enum.Font.Jura
tlbl.TextStrokeTransparency = 0
if Shields >= 1 then
tlbl.TextColor3 = Color3.fromRGB(0,200,255)
tlbl.TextStrokeColor3 = Color3.fromRGB(0,0,0)
else
tlbl.TextColor3 = Color3.fromRGB(255,0,0)
tlbl.TextStrokeColor3 = Color3.fromRGB(255,255,255)
end
tlbl.Text = "-"..math.round(damage)
tlbl.Parent = bbg
ts:Create(bbg,ti,go1):Play()
ts:Create(tlbl,ti,go2):Play()
end)
while true do
if firing == true then
if tool.Magazine.Value ~= 0 and equip and not reloading == true then
if fire == false then
reloading = false
fire = true
for i = 1,projectiles do
newbullet()
end
wait(0.1)
wait(cooldown-0.1)
fire = false
end
else
reload()
end
end
if firing == false then
wait()
end
end
Server Script (part of the fire event):
local tool = script.Parent
local fsize = 4
local handle = tool:WaitForChild("Handle")
local damagereceived = 0
local dmgind = false
local frate = (1/tool.FireRate.Value)/3
local tw = game:GetService("TweenService")
local pa = tool.Effects.Flare
local gui = tool.GunInterface
local function makerayvisible(ray)
local ti = TweenInfo.new(1)
local go = {}
go.Transparency = 1
local radius = 0.25
local midpoint = ray.Origin + ray.Direction/2
local raypart = Instance.new("Part")
local ts = tw:Create(raypart,ti,go)
raypart.Parent = tool
raypart.Anchored = true
raypart.CanCollide = false
raypart.CanTouch = false
raypart.CanQuery = false
raypart.CFrame = CFrame.new(midpoint,ray.Origin)
raypart.Size = Vector3.new(radius,radius,ray.Direction.magnitude)
raypart.BackSurface = Enum.SurfaceType.Smooth
raypart.FrontSurface = Enum.SurfaceType.Smooth
raypart.TopSurface = Enum.SurfaceType.Smooth
raypart.BottomSurface = Enum.SurfaceType.Smooth
raypart.LeftSurface = Enum.SurfaceType.Smooth
raypart.RightSurface = Enum.SurfaceType.Smooth
raypart.Material = Enum.Material.Plastic
raypart.Color = Color3.fromRGB(255,255,0)
raypart.Name = "RayPart"
game.Debris:AddItem(raypart,1)
ts:Play()
return raypart
end
tool:WaitForChild("Fire").OnServerEvent:Connect(function(plr,part,pos,damage,magazine,ray)
handle.FireSound:Play()
tool.Magazine.Value = magazine - 1
local ti = TweenInfo.new(0.1)
local go = {}
go.Size = UDim2.new(fsize,0,fsize,0)
local ts1 = tw:Create(pa,ti,go)
ts1:Play()
if part then
if part.Parent and part.Parent:FindFirstChild("Humanoid") and part.Parent.Humanoid.Health > 0 or part.Parent.Parent:FindFirstChild("Humanoid") then
if part.Name == "Head" or part.Name == "Handle" and humanoid.Health > 0 then
humanoid:TakeDamage(damage)
end
end)

1 comment
I tried it and the local script works well. The problem is that for any reason, "pos" is nil in the Server Script after the Local Script sent the "pos" (which isn't nll in that script) through Fire RemoteEvent. I edited the question adding the original Server Script, like if I didn't modify it.