Hello, I am looking into a way to create a WallBang system,
Currently I have the code below and it does work.
My question is, in a large server, with people constantly shooting. Would such a system create noticeable lag?
The incremental moving of the one part in my code I think would slow down the game if done many times over, however I am not certain.
Here is the code:
local mouse = game.Players.LocalPlayer:GetMouse()
local parmas = RaycastParams.new()
parmas.FilterType = Enum.RaycastFilterType.Exclude
parmas.FilterDescendantsInstances = {game.Players.LocalPlayer.Character}
local char = game.Players.LocalPlayer.Character or game.Players.LocalPlayer.CharacterAdded:Wait()
function visualizeRay(origin, result ,position, colour)
local distance = (origin - result.Position).Magnitude
local p = Instance.new("Part", workspace.Visualizers)
p.Name = 'Visualizer'
p.Anchored = true
p.CanCollide = false
p.BrickColor = colour
p.Size = Vector3.new(0.1, 0.1, distance)
p.CFrame = CFrame.lookAt(origin, position)*CFrame.new(0, 0, -distance/2)
end
mouse.Button1Down:Connect(function()
local screenRay = game.Workspace.CurrentCamera:ScreenPointToRay(mouse.X, mouse.Y)
local rayResultInitial = game.Workspace:Raycast(screenRay.Origin, screenRay.Direction * 10000, parmas)
if not rayResultInitial then
return
end
visualizeRay(screenRay.Origin, rayResultInitial, rayResultInitial.Position, BrickColor.new("Really red"))
local direction = (rayResultInitial.Position - char.HumanoidRootPart.Position).Unit
local newPart = Instance.new("Part", workspace)
newPart.Anchored = true
newPart.Position = rayResultInitial.Position
newPart.Transparency = 1
newPart.Size = Vector3.new(0.01,0.01,0.01)
newPart.CFrame = CFrame.new(rayResultInitial.Position, rayResultInitial.Position + screenRay.Direction)
while true do
newPart.CFrame = newPart.CFrame + newPart.CFrame.LookVector * 0.1
local touching = newPart:GetTouchingParts()
if #touching == 0 then
local rayResult = game.Workspace:Raycast(newPart.Position, newPart.CFrame.LookVector * 10000, parmas)
if not rayResult then
return
end
visualizeRay(newPart.Position, rayResult, rayResult.Position, BrickColor.new("Really red"))
break
end
end
local penetrationDistance = (newPart.Position - rayResultInitial.Position).Magnitude
print(penetrationDistance)
local rayResultPenetration = game.Workspace:Raycast(rayResultInitial.Position, screenRay.Direction * penetrationDistance, parmas)
visualizeRay(rayResultInitial.Position, newPart, newPart.Position, BrickColor.new("Royal blue"))
newPart:Destroy()
end)
In the case that the system is inefficient I would appreciate if someone could suggest an alternative
Thanks