Super-Nostalgia-Zone/Player/FloorDrag.client.lua

61 lines
1.5 KiB
Lua

local RunService = game:GetService("RunService")
local char = script.Parent
local humanoid = char:WaitForChild("Humanoid")
local rootPart = char:WaitForChild("HumanoidRootPart")
local climbForce = rootPart:WaitForChild("ClimbForce")
local rayDown = Vector3.new(0, -5000, 0)
local function moveTowards(value, goal, rate)
if value < goal then
return math.min(goal, value + rate)
elseif value > goal then
return math.max(goal, value - rate)
else
return goal
end
end
local function getFloorLevel()
local origin = rootPart.Position
local ray = Ray.new(origin, rayDown)
local hit, pos = workspace:FindPartOnRay(ray, char)
return pos.Y, math.clamp(math.abs(pos.Y - origin.Y), -1, 1)
end
local stepRate = (20 / 3)
local decayRate = 0.925
local lastLevel = getFloorLevel()
local updateCon
local function update(dt)
local level, dist = getFloorLevel()
local dt = math.min(0.1, dt)
if humanoid.Health == 0 then
updateCon:Disconnect()
return
end
if humanoid.SeatPart then
humanoid.HipHeight = 0
lastLevel = level
return
end
local yVel = rootPart.Velocity.Y
if math.abs(yVel) > 8 then
local goal = math.sign(yVel)
humanoid.HipHeight = moveTowards(humanoid.HipHeight, goal, stepRate * dt)
elseif lastLevel ~= level then
humanoid.HipHeight = math.sign(lastLevel - level) * math.clamp(dist - 3, 0, 1)
lastLevel = level
else
local decay = decayRate ^ (dt * 60)
humanoid.HipHeight = humanoid.HipHeight * decay
end
end
updateCon = RunService.RenderStepped:Connect(update)