Hello, i have a water float script and it works perfectly fine but there is this one person that will not float. Is there a way to fix this? Here is my script:
local runInterval = 1 / 60 local humanoidFloatDamage = 15 local humanoidFloatDamageFrequency = 1.5 --local waterLevel = -12.5
local clippingPlaneDist = 0.5
--------------------------------[[ Running ]]-----------------------------------
local runService = game:GetService("RunService") local player = game.Players.LocalPlayer
local sGui = script.UnserwaterOverlay sGui.Image.Visible = false sGui.Parent = script.Parent.Parent
function newCharacter()
local force = Instance.new("BodyPosition")
force.D = 6
force.P = 180
local drag = Instance.new("BodyVelocity")
drag.velocity = Vector3.new()
drag.maxForce = Vector3.new(1, 0, 1) * 100
local dragRot = Instance.new("BodyAngularVelocity")
dragRot.maxTorque = Vector3.new(1, 0, 1) * 100
dragRot.angularvelocity = Vector3.new()
local bodyMovers = {force, drag, dragRot} local character = player.Character or player.CharacterAdded:wait() local humanoid = player.Character:WaitForChild("Humanoid") local torso = character:WaitForChild("Torso") local camera = workspace.CurrentCamera local mouse = player:GetMouse() local floating = Instance.new("BoolValue", character) floating.Name = "Floating" local lastDamage = 0 local allParts = {} local _a = {torso, character:WaitForChild("HumanoidRootPart"), character:WaitForChild("Head"), character:WaitForChild("Left Arm"), character:WaitForChild("Right Arm"), character:WaitForChild("Left Leg"), character:WaitForChild("Right Leg")} for _, v in pairs(_a) do table.insert(allParts, {p = v, mass = v:GetMass()}) end local characterMass = 0 for _, v in pairs(allParts) do characterMass = characterMass + v.p:GetMass() end local torsoOnly = {{p = torso, mass = characterMass}} wait(1) local function doGui() local dist, waterLevel = withinWaterBoundsXZ(camera.CoordinateFrame.p) local topFOV = dist < 0 and (camera.CoordinateFrame * CFrame.new(0, math.tan(camera.FieldOfView / 2) * clippingPlaneDist, -clippingPlaneDist)).p.Y local bottomFOV = dist < 0 and(camera.CoordinateFrame * CFrame.new(0, math.tan(camera.FieldOfView / 2) * -clippingPlaneDist, -clippingPlaneDist)).p.Y if dist < 0 and bottomFOV < waterLevel then sGui.Image.Visible = true if topFOV < waterLevel then sGui.Image.Position = UDim2.new() else local pos = (waterLevel - bottomFOV) / (topFOV - bottomFOV) sGui.Image.Position = UDim2.new(0, 0, 0, mouse.ViewSizeY - mouse.ViewSizeY * pos) end else sGui.Image.Visible = false end end local characterParts = torsoOnly local dead = false humanoid.Died:connect(function() characterParts = allParts dead = true end) local waterLevel while character.Parent do runService.RenderStepped:wait() --[[characterParts = torsoOnly if humanoid.Health <= 0 then characterParts = allParts dead = true wait() end ]] local healthSet for _, v in pairs(characterParts) do local dist, w = isInWater(v) waterLevel = w or waterLevel local existingForce = v.p:FindFirstChild("BodyPosition") if dist > 0 and not dead then if existingForce then for _, f in pairs(bodyMovers) do if v.p:FindFirstChild(f.Name) then v.p[f.Name]:Destroy() end end floating.Value = false sGui.Image.Visible = false end lastDamage = tick() elseif dist <= 0 or dead and floating.Value then if not existingForce then for _, f in pairs(bodyMovers) do if not v.p:FindFirstChild(f.Name) then if f.Name == "BodyPosition" then f.maxForce = Vector3.new(0, 4000 * v.mass, 0) f.position = Vector3.new(0, waterLevel + 0.5, 0) end f:clone().Parent = v.p end end else if v.p:FindFirstChild("BodyPosition") then v.p.BodyPosition.position = Vector3.new(0, waterLevel + 0.5, 0) end end floating.Value = true sGui.Image.Visible = true if not healthSet then healthSet = true if tick() - lastDamage > humanoidFloatDamageFrequency then game.ReplicatedStorage.Interaction.DamageHumanoid:FireServer(humanoidFloatDamage) lastDamage = tick() end end end end if dead then break end doGui() end while character.Parent do runService.RenderStepped:wait() doGui() end
end
local waterParts = {}
function isInWater(v)
local dist, waterLevel = withinWaterBoundsXZ(v.p.Position) if dist > 0 then return 1 else return dist, waterLevel end return 1
end
function withinWaterBoundsXZ(pos)
for _, part in pairs(waterParts) do if part.Transparency < 1 then local corner1 = part.CFrame * CFrame.new(part.Size / -2) local corner2 = part.CFrame * CFrame.new(part.Size / 2) local cornerSmall = Vector3.new(math.min(corner1.X, corner2.X), 0, math.min(corner1.Z, corner2.Z)) local cornerBig = Vector3.new(math.max(corner1.X, corner2.X), 0, math.max(corner1.Z, corner2.Z)) if pos.X > cornerSmall.X and pos.Z > cornerSmall.Z and pos.X < cornerBig.X and pos.Z < cornerBig.Z then local dist = pos.Y - part.CFrame.p.Y if dist < -40 then return 1 end return dist, part.CFrame.p.Y end end end return 1
end
function getWater(perent) for _, v in pairs(perent:GetChildren()) do if v:IsA("BasePart") and (v.Name == "Water" or v:FindFirstChild("WaterForce")) then table.insert(waterParts, v) end getWater(v) end end getWater(workspace)
player.CharacterAdded:wait() player.CharacterAdded:connect(newCharacter) newCharacter()