step distance counter with progress and reset
Key RequiredUniversal

step distance counter with progress and reset

Universal Scriptpixelganpixelgan 22 views 22 executesUpdated Jul 9, 2026
Unrated
00
Lua Script•261 lines (8260 chars)
-- Сервисы
local TweenService = game:GetService("TweenService")
local RunService = game:GetService("RunService")
local player = game.Players.LocalPlayer

-- Ожидаем персонажа
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")

-- Создаём GUI
local screenGui = Instance.new("ScreenGui")
screenGui.Parent = player:WaitForChild("PlayerGui")

-- Основная панель (чуть больше для прогресс-бара)
local mainFrame = Instance.new("Frame")
mainFrame.Size = UDim2.new(0, 380, 0, 230)
mainFrame.Position = UDim2.new(0.5, -190, 0.5, -115)
mainFrame.BackgroundColor3 = Color3.new(0.1, 0.1, 0.1)
mainFrame.BorderSizePixel = 0
mainFrame.ClipsDescendants = true
mainFrame.Parent = screenGui

-- Скругление углов
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 20)
corner.Parent = mainFrame

-- Текстовая метка (информация о шагах, дистанции, уровне и опыте)
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(1, -20, 0, 100)
textLabel.Position = UDim2.new(0, 10, 0, 10)
textLabel.BackgroundTransparency = 1
textLabel.TextColor3 = Color3.new(1, 1, 1)
textLabel.Text = "Шаги: 0\nДистанция: 0.0 м\nКилометры: 0.00 км\nУровень: 1 (EXP: 0 / 64)"
textLabel.Font = Enum.Font.SourceSans
textLabel.TextSize = 18
textLabel.TextXAlignment = Enum.TextXAlignment.Left
textLabel.TextYAlignment = Enum.TextYAlignment.Top
textLabel.Parent = mainFrame

-- Прогресс-бар (под текстом)
local progressBarBg = Instance.new("Frame")
progressBarBg.Size = UDim2.new(0.9, 0, 0, 12)
progressBarBg.Position = UDim2.new(0.05, 0, 0, 115)
progressBarBg.BackgroundColor3 = Color3.new(0.2, 0.2, 0.2)
progressBarBg.BorderSizePixel = 0
local bgCorner = Instance.new("UICorner")
bgCorner.CornerRadius = UDim.new(0, 6)
bgCorner.Parent = progressBarBg
progressBarBg.Parent = mainFrame

local progressBarFill = Instance.new("Frame")
progressBarFill.Size = UDim2.new(0, 0, 1, 0)   -- ширина будет меняться
progressBarFill.BackgroundColor3 = Color3.new(0.2, 0.6, 1)   -- голубой
progressBarFill.BorderSizePixel = 0
local fillCorner = Instance.new("UICorner")
fillCorner.CornerRadius = UDim.new(0, 6)
fillCorner.Parent = progressBarFill
progressBarFill.Parent = progressBarBg

-- Кнопка закрытия (крестик)
local closeButton = Instance.new("TextButton")
closeButton.Size = UDim2.new(0, 30, 0, 30)
closeButton.Position = UDim2.new(1, -40, 0, 10)
closeButton.BackgroundColor3 = Color3.new(0.6, 0.1, 0.1)
closeButton.BorderSizePixel = 0
closeButton.Text = "✕"
closeButton.TextColor3 = Color3.new(1, 1, 1)
closeButton.TextSize = 20
closeButton.Font = Enum.Font.SourceSans
local closeCorner = Instance.new("UICorner")
closeCorner.CornerRadius = UDim.new(0, 10)
closeCorner.Parent = closeButton
closeButton.Parent = mainFrame

-- Кнопка Сброс (обнуляет шаги и дистанцию, но не уровень/опыт)
local resetButton = Instance.new("TextButton")
resetButton.Size = UDim2.new(0, 80, 0, 30)
resetButton.Position = UDim2.new(1, -90, 1, -40)
resetButton.BackgroundColor3 = Color3.new(0.2, 0.4, 0.6)
resetButton.BorderSizePixel = 0
resetButton.Text = "Сброс"
resetButton.TextColor3 = Color3.new(1, 1, 1)
resetButton.TextSize = 16
resetButton.Font = Enum.Font.SourceSans
local resetCorner = Instance.new("UICorner")
resetCorner.CornerRadius = UDim.new(0, 10)
resetCorner.Parent = resetButton
resetButton.Parent = mainFrame

-- Переменные шагомера
local stepCount = 0
local totalDistance = 0
local distanceWalked = 0
local stepLength = 0.7
local lastPosition = character.PrimaryPart.Position
local isMoving = false
local STUD_TO_METER = 1   -- можно 0.28 для реальных метров

-- Переменные уровней
local level = 1
local exp = 0
local expToNext = 64   -- для 1 уровня

-- Состояние открытости
local isOpen = true

-- Функция сокращения чисел (K, M, B, T)
local function abbreviateNumber(num)
    if num < 1000 then
        return string.format("%.1f", num)
    elseif num < 1e6 then
        return string.format("%.1fK", num / 1000)
    elseif num < 1e9 then
        return string.format("%.1fM", num / 1e6)
    elseif num < 1e12 then
        return string.format("%.1fB", num / 1e9)
    else
        return string.format("%.1fT", num / 1e12)
    end
end

-- Обновление интерфейса
local function updateDisplay()
    local meters = totalDistance * STUD_TO_METER
    local kilometers = meters / 1000

    -- Обновляем текст
    textLabel.Text = string.format(
        "Шаги: %d\nДистанция: %s м\nКилометры: %s км\nУровень: %d (EXP: %d / %d)",
        stepCount,
        abbreviateNumber(meters),
        abbreviateNumber(kilometers),
        level,
        exp,
        expToNext
    )

    -- Обновляем прогресс-бар
    local progress = math.clamp(exp / expToNext, 0, 1)
    progressBarFill.Size = UDim2.new(progress, 0, 1, 0)
end

-- Проверка повышения уровня
local function checkLevelUp()
    while exp >= expToNext do
        exp = exp - expToNext
        level = level + 1
        expToNext = level * 64   -- следующий уровень требует 64 * новый_уровень
    end
    updateDisplay()
end

-- Начисление опыта за шаг (вызывается при засчитывании шага)
local function addExp(amount)
    exp = exp + amount
    checkLevelUp()
end

-- Анимация появления
local function animateOpen()
    mainFrame.Size = UDim2.new(0, 0, 0, 0)
    mainFrame.Position = UDim2.new(0.5, 0, 0.5, 0)
    mainFrame.BackgroundTransparency = 1
    mainFrame.Visible = true

    local tweenInfo = TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
    local sizeGoal = {Size = UDim2.new(0, 380, 0, 230)}
    local posGoal = {Position = UDim2.new(0.5, -190, 0.5, -115)}
    local transGoal = {BackgroundTransparency = 0}

    TweenService:Create(mainFrame, tweenInfo, sizeGoal):Play()
    TweenService:Create(mainFrame, tweenInfo, posGoal):Play()
    TweenService:Create(mainFrame, tweenInfo, transGoal):Play()
end

-- Анимация закрытия
local function animateClose()
    local tweenInfo = TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.In)
    local sizeGoal = {Size = UDim2.new(0, 0, 0, 0)}
    local posGoal = {Position = UDim2.new(0.5, 0, 0.5, 0)}
    local transGoal = {BackgroundTransparency = 1}

    TweenService:Create(mainFrame, tweenInfo, sizeGoal):Play()
    TweenService:Create(mainFrame, tweenInfo, posGoal):Play()
    local transTween = TweenService:Create(mainFrame, tweenInfo, transGoal)
    transTween:Play()
    transTween.Completed:Connect(function()
        mainFrame.Visible = false
    end)
end

-- Обработка кнопки закрытия
closeButton.MouseButton1Click:Connect(function()
    if isOpen then
        isOpen = false
        animateClose()
    end
end)

-- Обработка сброса (обнуляем шаги и дистанцию, уровень и опыт не трогаем)
resetButton.MouseButton1Click:Connect(function()
    stepCount = 0
    totalDistance = 0
    distanceWalked = 0
    updateDisplay()
end)

-- Основной цикл подсчёта (RenderStepped)
local function onRenderStep()
    if not character or not character.PrimaryPart then return end
    local currentPos = character.PrimaryPart.Position
    local delta = (currentPos - lastPosition).Magnitude

    if isMoving then
        totalDistance = totalDistance + delta
        distanceWalked = distanceWalked + delta
        if distanceWalked >= stepLength then
            stepCount = stepCount + 1
            distanceWalked = distanceWalked - stepLength
            -- Начисляем опыт за каждый шаг (например, 1 EXP)
            addExp(1)
        end
        updateDisplay()
    else
        distanceWalked = 0
    end

    lastPosition = currentPos
end

-- Отслеживание движения
humanoid.Running:Connect(function(speed)
    isMoving = speed > 0
end)

-- Подписка на каждый кадр
RunService.RenderStepped:Connect(onRenderStep)

-- Запуск
animateOpen()
updateDisplay()

-- Обработка респавна (сохраняем уровень, опыт, шаги и дистанцию)
player.CharacterAdded:Connect(function(newCharacter)
    character = newCharacter
    humanoid = character:WaitForChild("Humanoid")
    lastPosition = character.PrimaryPart.Position
    distanceWalked = 0   -- обнуляем накопление, но шаги и дистанция сохраняются

    if isOpen then
        mainFrame.Visible = true
        animateOpen()
    end

    updateDisplay()

    humanoid.Running:Connect(function(speed)
        isMoving = speed > 0
    end)
end)

Features & Information

for all games, tested on xeno, the downside of the script is that it needs to be injected constantly

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts