I improved on the code from earlier today (it's not perfect) and now it's acting weird. When I touch all the bricks (meaning the "Health" should set to zero) it does not set to zero. I'm sure it's in my math somewhere but I cannot find where or how
Instead, it sets to 36.61%: Photo
My code (Please answer my question if you can, not ridiculing on how my code can be improved without explaining how :FrowningFace: )
local debounce = false local house_1 = workspace:WaitForChild("House") local house_1_pieces = house_1:WaitForChild("Building") local house_1_health = house_1:WaitForChild("Config"):WaitForChild("Health") for _, parts in pairs(house_1_pieces:GetChildren()) do parts.Touched:Connect(function(plr) if plr.Parent:FindFirstChild("Humanoid") ~= nil then if parts:FindFirstChild("wasTouched").Value ~= true then if debounce ~= true then debounce = true local unRounded = house_1_health.Value - (house_1_health.Value/#house_1_pieces:GetChildren()) house_1_health.Value = math.floor(((unRounded*100)+0.5))/100 parts.wasTouched.Value = true local start = Color3.new(1,1,1) local End = Color3.new(1,0,0) parts.Color = Color3.fromRGB(255, 255, 255) parts.Anchored = false parts.Material = Enum.Material.Neon wait(0.1) debounce = false wait(1) parts.Color = Color3.fromRGB(255, 0,0) end end end end) end
Inside the "Health" BillboardGui:
script.Parent.Text = "Health: 100%" workspace:WaitForChild("House").Config.Health.Changed:Connect(function() script.Parent.Text = "Health: "..workspace:WaitForChild("House").Config.Health.Value.."%" end)
If I am understanding the problem correctly, you are trying to lower the "health" of a building every time one of its children is touched (Excluding repeated bricks), and the health % is based on the amount of untouched bricks remaining. If this is the case, then your error is on line 13.
In order to solve this you need to define what the max health of the object is. The reason for this is that you are currently dividing the CURRENT health of the object by the number of parts in the object.
Here is an example of why this is problematic. If I have a building whose health is 100 and has 5 parts inside of it, ideally the health goes down by 20 every time a brick is touched (100 - 5 * 20 = 0).
Right now, according to your calculations the results would be:
local health = 100; health = 100 - (100/5) -- 80 health = 80 - (80/5) -- 64 health = 64 - (64/5) -- 51.2 health = 51.2 - (51.2/5) -- 40.96 health = 40.96 - (40.96/5) -- 32.768, final health after all objects touched
See the problem? you are not subtracting the correct amount.
To solve this, I would suggest adding another config value called MaxHealth that stores the object's max health. This way you can get the correct value you are supposed to be subtracting by.
Once you have done that line 13 should end up looking something like this:
local unRounded = house_1_health.Value - (house_1_MaxHealth.Value/#house_1_pieces:GetChildren())
Hope this helps. Let me know if I misunderstood the problem or something doesn't work.