I’ve done digging from my script which has led me to conclusions that my ‘lava’ does not collide with any parts of the HQ. However, it registers collisions with characters.
(The script does get enabled if you happen to wonder)
local tweenService = game:GetService("TweenService")
local lava = script.Parent.Lava
local debounce = false
lava.Touched:Connect(function(hit)
if debounce then return end
print("uh1")
print(hit:GetFullName())
print(workspace:FindFirstChild("CanBurn", true):GetFullName())
print(hit.Parent:FindFirstAncestor("CanBurn") ~= nil)
if hit and hit.Parent:FindFirstChildWhichIsA("Humanoid") then
debounce = true
hit.Parent.Humanoid.Health -= 10
elseif hit:FindFirstAncestor("CanBurn") then
print("uh2")
task.spawn(collapse, hit)
end
debounce = false
end)
function collapse(part)
print("YO UH")
tweenService:Create(part, TweenInfo.new(5), {Transparency = 1, Color = Color3.fromRGB(0, 0, 0)}):Play()
for _, v in part:GetTouchingParts() do
task.spawn(collapse, v)
end
part.Anchored = false
game.Debris:AddItem(part, 5)
end
tweenService:Create(lava, TweenInfo.new(50, Enum.EasingStyle.Quint), {Size = Vector3.new(118.5, 27.7, 99.3), CFrame = CFrame.new(83.25, 80.55, -29.95)}):Play()
That output displays that you ran the false logic twice, not the hi being printed twice.
if debounce then return end just means if debounce ~= nil and debounce ~= false then return end which since debounce is a boolean, the only way to satisfy the logic is if debounce is equal to true, so that wouldn’t make a difference.
Is the lava and the HQ building both Anchored? Touches only register between Parts if at least one if them is unanchored during their physics simulation.
You should use :GetPartBoundsInBox() to do this, Part.Touched is a very bad event to use for hitboxes, you can use a loop that checks all the parts colliding with the lava and unanchor them or kill them if they are a player, example code:
-- Lava Script
local LavaPart = script.Parent
while true do
local CollidingParts = game.Workspace:GetPartBoundsInBox(LavaPart.CFrame, LavaPart.Size)
for PartI, Part in pairs(CollidingParts) do
if Part ~= LavaPart then
local Humanoid = Part.Parent:FindFirstChildOfClass("Humanoid")
if Humanoid then
Humanoid:TakeDamage(25)
else
Part.Anchored = false
Part:BreakJoints() -- Removes all welds connected to this part.
end
end
end
task.wait(0.1)
end
local tweenService = game:GetService("TweenService")
local lava = script.Parent.Lava
local function collapse(part)
if part.Parent == script.Parent.Burned then return end
if not part:FindFirstAncestor("CanBurn") then return end
part.Parent = script.Parent.Burned
tweenService:Create(part, TweenInfo.new(5), {Transparency = 1, Color = Color3.fromRGB(0, 0, 0)}):Play()
for _, v in part:GetTouchingParts() do
task.spawn(collapse, v)
end
part.Anchored = false
game.Debris:AddItem(part, 5)
end
task.spawn(function()
while task.wait(0.1) do
local collisions = workspace:GetPartBoundsInBox(lava.CFrame, lava.Size)
for _, v in collisions do
if v ~= lava then
if not v then continue end
if v.Parent:FindFirstChildWhichIsA("Humanoid") ~= nil then
v.Parent:FindFirstChildWhichIsA("Humanoid").Health -= 5
else
task.spawn(collapse, v)
end
end
end
end
end
end)
tweenService:Create(lava, TweenInfo.new(50, Enum.EasingStyle.Quint), {Size = Vector3.new(118.5, 27.7, 99.3), CFrame = CFrame.new(83.25, 80.55, -29.95)}):Play()
Now for some reason it says line 29: attempt to index nil with FindFirstChildWhichIsA("Humanoid") even when I put a non-existence check.
task.spawn(function()
while task.wait(0.1) do
local collisions = workspace:GetPartBoundsInBox(lava.CFrame, lava.Size)
for _, v in collisions do
v.Archivable = true -- Makes sure Archivable is set to true.
if v ~= lava then
if not v then continue end
if v.Parent:FindFirstChildWhichIsA("Humanoid") ~= nil then
v.Parent:FindFirstChildWhichIsA("Humanoid").Health -= 5
else
task.spawn(collapse, v)
end
end
end
end
end
end)
Same error occurs, I even made sure it was all archivable before the map clones. For context, the script (disabled) is in the map and when cloned, is automatically enabled.
You should use ZonePlus. It’s a module very simple to use that allows you to check for hitboxes and based on this you can take certain actions like killing the player or damaging it.
I tried it in my studio, I edited some things and this works fine for me:
local tweenService = game:GetService("TweenService")
local lava = script.Parent.Lava
local function collapse(part)
if part.Parent == script.Parent.Burned then return end
--if not part:FindFirstAncestor("CanBurn") then return end
part.Parent = script.Parent.Burned
tweenService:Create(part, TweenInfo.new(5), {Transparency = 1, Color = Color3.fromRGB(0, 0, 0)}):Play()
if part ~= lava then
part.Anchored = false
end
game.Debris:AddItem(part, 5)
end
task.spawn(function()
while task.wait(0.1) do
local collisions = workspace:GetPartBoundsInBox(lava.CFrame, lava.Size)
for _, v in pairs(collisions) do
v.Archivable = true
if v ~= lava then
if not v then continue end
if v.Parent:FindFirstChildWhichIsA("Humanoid") ~= nil then
v.Parent:FindFirstChildWhichIsA("Humanoid").Health -= 5
else
task.spawn(collapse, v)
end
end
end
end
end)