Made a big brick that destroys certain parts it touches - I.E. a part with a specific name. It works wonders when destroying a players limbs and torso, but doesn't consistently work when destroying other parts; it may destroy a part near the player, or one the player is standing on, but it's inconsistent and never destroys the same parts upon contact when testing.
This is the script I have so far, are there any adjustments or alternative methods I could use to make the destruction more reliable?
-- lava brick script yay local DB = script.Parent function onTouched(hit) local hum = hit.Parent:FindFirstChild("Humanoid") if hit.Name == "destructable" or hit.Parent:FindFirstChild("Humanoid") then print 'part found' hit:Destroy() end end DB.Touched:Connect(onTouched)
I have tried GetTouchingParts, but it requires parts to have collision enabled, and the main destruction brick has collisions off. A players legs also have collision disabled which makes it pointless.
I suppose it's also worth noting the brick is constantly moving across the X plane; I'm not sure if that would affect anything in terms of scripting.
a region3 basically gets two points, the bottom left corner and the top right corner, to make a cube which you can use to detect things. try this thing I cooked up.
local brickODoom = Instance.new("Part", workspace) brickODoom.Position = Vector3.new(5, 5, 5) brickODoom.Size = Vector3.new(10, 10, 10) brickODoom.BrickColor = BrickColor.new("Really red") brickODoom.Transparency = 0.75 brickODoom.Anchored = true brickODoom.CanCollide = false function translate(offset) for i = 1, 30 do brickODoom.Position = brickODoom.Position + offset local region = Region3.new(brickODoom.Position - brickODoom.Size / 2, brickODoom.Position + brickODoom.Size / 2) for _, part in pairs(workspace:FindPartsInRegion3(region)) do if part.Name == "Destructible" or part.Parent:FindFirstChild("Humanoid") then part:Destroy() end end wait(0.1) end end while true do translate(Vector3.new(1, 0, 0)) translate(Vector3.new(-1, 0, 0)) end
you can try putting some bricks in front and see what happens.
your brick isn't actually doing anything, it's really the region3. the brick is just there to make it visible. you also can't move a region3 so by moving the brick, you can construct a new region3 around the brick every loop.
you said your brick is constantly moving so I did a check for parts every translation. if not, you can of course run a separate loop and scan for parts. scanning a region3 can also be pretty costly especially if there are a lot of parts, just like GetTouchingParts
.
it's also worth mentioning that there is a method called FindPartsInRegion3WithWhiteList
where you can put a list of parts you want to destroy. if possible, passing in all of your destructible parts as a table along with a list of players may improve the efficiency.
local DB = script.Parent DB.Touched:Connect(function(hit) if hit.Name == "destructable" then print("Part found") hit:Destroy() hit:BreakJoints() elseif hit.Parent:FindFirstChild("Humanoid") then print("Player found") hit:Destroy() hit.Parent:BreakJoints() end end)
This script should work.