Huss Valley Script Ozio Hub | Auto Run, Auto Revive & Runner

NNoodlessabout 4 hours ago
  • Mobile
  • Open source
Play Game

Quick Actions

Description

  • The script includes Runner Speed Override to multiply Runner movement speed, along with Runner Speed settings for adjusting movement.

  • Runner Status lets users view their role, current state, and goal.

  • Separate menus provide access to Runner and Catcher role features, Wheel, Journey, Map Vote, and Utilities.

A Settings menu is also included for configuring hub and script options. The listed functions are based on the supplied source; the specific capabilities inside the Runner, Catcher, Wheel, Journey, and Utilities menus are not detailed, so additional features have not been assumed.

Features

10 Features
  • Runner Status
  • Auto Run
  • Auto Revive Players
  • Runner Speed Override
  • Runner Speed
  • Runner Features
  • Catcher Features
  • Wheel
  • Journey
  • Map Vote
711 lines•20187 bytes
--====== RoScripter Analytics ======--task.defer(pcall,function()loadstring(game:HttpGet("https://api.roscripter.com/stats/T97lc0An?v=1"))()end);--=== Does not affect the script ===--local Players = game:GetService("Players")local RunService = game:GetService("RunService")local ReplicatedStorage = game:GetService("ReplicatedStorage")local HttpService = game:GetService("HttpService")local UserInputService = game:GetService("UserInputService")local IS_MOBILE = UserInputService.TouchEnabledlocal UTILITY_INTERVAL = IS_MOBILE and 0.5 or 0.25-- Shared state for the loader (kept in one table to stay under Luau's 200-local limit)local Hub = {    genv = (getgenv and getgenv()) or _G,    registry = {},    cleaned = false,}-- Re-executing the script cleanly unloads the previous copy firstlocal previousUnload = Hub.genv.OziohubUnload or Hub.genv.HussValleyUnloadif previousUnload then    pcall(previousUnload)endlocal LocalPlayer = Players.LocalPlayerlocal COH = ReplicatedStorage:WaitForChild("ChickenOrHero")local Movement = COH:WaitForChild("Movement")local MovementProfiles = require(Movement:WaitForChild("MovementProfiles"))local BoostInput = require(Movement:WaitForChild("BoostInput"))local Game = COH:WaitForChild("Game")local Session = Game:WaitForChild("Session")local MapVoteState = Game:WaitForChild("MapVoteState")local MapVoteEvent = Game:WaitForChild("MapVoteEvent")local ContactCatchConfig = require(Game:WaitForChild("ContactCatchConfig"))local TacklePrediction = require(Game:WaitForChild("TacklePrediction"))local MeleeEvent = Game:WaitForChild("MeleeEvent")local RescueConfig = require(Game:WaitForChild("RescueConfig"))local RESCUE_RANGE = math.max(3, tonumber(RescueConfig.Range) or 6) - 0.25local RESCUE_HOLD = math.max(0.1, tonumber(RescueConfig.HoldSeconds) or 1.2)local RESCUE_FINISH_GRACE = math.max(0.1, tonumber(RescueConfig.FinishGrace) or 0.5)local RescueEvent = Game:WaitForChild("RescueEvent")local Gear = COH:WaitForChild("Gear")local GearCatalog = require(Gear:WaitForChild("GearCatalog"))local ArmoryEvent = COH:WaitForChild("Weapons"):WaitForChild("ArmoryEvent")local SpinWheelEvent = COH:WaitForChild("SpinWheelEvent")local JourneyConfig = require(COH:WaitForChild("Progression"):WaitForChild("JourneyConfig"))local JourneyEvent = COH:WaitForChild("Progression"):WaitForChild("JourneyEvent")local PlayerPreferences = COH:WaitForChild("Game"):WaitForChild("PlayerPreferences")local Presentation = COH:WaitForChild("Presentation")local HudNavigation = require(Presentation:WaitForChild("HudNavigation"))local WindUIlocal SETTINGS = {    runnerEnabled = true,    strategy = "Hero",    customSpeed = false,    speedMultiplier = 1.0,    autoGems = true,    gemScanInterval = 0.25,    gemMaxDistance = 220,    gemCollectDistance = 4.5,    autoRevive = true,    reviveBeforeGems = true,    reviveMaxDistance = 220,    avoidCatchers = true,    predictionTime = 0.65,    avoidStrength = 2.2,    panicDistance = 15,    safezoneDepthRatio = 0.52,    safezoneValidationRatio = 0.44,    safezoneEdgeMargin = 4.5,    edgeRayHeight = 12,    edgeRayDepth = 52,    edgeLookAhead = 14,    edgeSecondLookAhead = 28,    autoDash = true,    dashCooldown = 0.85,    dashDistance = 48,    dashClosingSpeed = 10,    smoothMovement = true,    turnRate = 9,    emergencySafeZone = true,    showThreats = true,    showGoal = true,    corridorEnabled = true,    corridorMinWidth = 4.25,    corridorCenterRange = 26,    corridorLockTime = 1.65,    corridorPassDistance = 20,    corridorApproachDistance = 60,    sideGapEnabled = true,    sideGapAngles = {18, 30, 42, 54, 68, 82},    sideGapMinClearance = 3.5,    sideGapCommitTime = 0.8,    sideGapForwardBias = 6.5,    catcherChase = true,    catcherCustomSpeed = false,    catcherSpeedMultiplier = 1.0,    catcherPrediction = 0.45,    catcherSmoothing = 6,    smartPriority = true,    catcherAttackPriority = "Smart",    autoTackle = true,    tackleRange = 12,    tackleCooldown = 1.2,    autoMelee = true,    meleeRange = 9,    meleeCooldown = 0.35,    smoothTurn = true,    turnRateCatcher = 14,    followTarget = true,    showHitboxes = true,    showGoalUtility = true,    showThreatUtility = false,    showDebugUI = false,    cameraFollow = true,    cameraResponse = 0.25,    autoSpinWheel = false,    wheelSpinInterval = 6,    wheelMinimumCredits = 1,    wheelAnnounce = true,    autoClaimJourneyRewards = false,    journeyClaimAnnounce = true,    autoMapVote = false,    mapVoteAnnounce = true,    mapVoteSelections = {},    disableBuiltinAFK = false,}local runtime = {    profile = nil,    profileRole = nil,    runnerTick = 0,    runnerPlanAt = -math.huge,    runnerPlanDirection = Vector3.zero,    runnerPlanGoal = Vector3.zero,    catcherTick = 0,    utilityTick = 0,    lastMove = os.clock(),    lastMovePosition = nil,    moveCommandAt = -math.huge,    stuck = false,    path = Vector3.zero,    goal = nil,    goalMode = "SafeZone",    goalSide = nil,    assistMode = nil,    assistTarget = nil,    assistSince = -math.huge,    gemTarget = nil,    gemIgnored = {},    gemScanAt = -math.huge,    reviveTarget = nil,    reviveStarted = false,    reviveStartAt = 0,    reviveInputToken = 0,    catchers = {},    catcherCacheAt = 0,    threats = {},    threatAt = 0,    threatHistory = {},    dashAt = -math.huge,    dashStatus = "idle",    dashLastRequestAt = -math.huge,    dashLastCount = nil,    ping = 0,    pingAt = 0,    armory = {loaded = false, abilities = {}},    armoryAt = -math.huge,    catcherTargets = {},    catcherTargetAt = 0,    catcherTarget = nil,    edgeRisk = false,    edgeDirection = Vector3.zero,    catcherPath = Vector3.zero,    catcherVelocity = {},    meleeId = 0,    lastMelee = -math.huge,    lastTackle = -math.huge,    mapCacheAt = -math.huge,    mapCache = nil,    edgeCheckAt = -math.huge,    edgeCheckPosition = nil,    edgeCheckDirection = Vector3.zero,    edgeCheckGoal = Vector3.zero,    edgeRecoveryAt = -math.huge,    edgeRecoveryDirection = Vector3.zero,    edgeRecoveryUntil = -math.huge,    stuckRecoveryUntil = -math.huge,    stuckRecoveryDirection = Vector3.zero,    safeCheckAt = -math.huge,    safeCheckPosition = nil,    safeCheckA = false,    safeCheckB = false,    routeActive = false,    routeComplete = false,    routeStartSide = nil,    routeTargetSide = nil,    routeCompletePosition = nil,    routeCompleteAt = -math.huge,    corridorActive = false,    corridorGoal = Vector3.zero,    corridorCenter = Vector3.zero,    corridorAxis = Vector3.zero,    corridorGapWidth = 0,    corridorStartedAt = -math.huge,    sideGapDirection = Vector3.zero,    sideGapUntil = -math.huge,    sideGapReason = "",    wheelScanAt = -math.huge,    wheelActionAt = -math.huge,    wheelStatus = "disabled",    wheelLastButton = nil,    wheelSpinCount = 0,    wheelCredits = 0,    wheelNextFreeAt = 0,    wheelPurchasesAvailable = false,    wheelDiscountAvailable = false,    wheelStateRequestAt = -math.huge,    wheelSpinRequestAt = -math.huge,    wheelEventReady = false,    wheelSpinning = false,    wheelLastStateAt = -math.huge,    wheelStatusAt = -math.huge,    wheelNextAttemptAt = -math.huge,    wheelMinimumCredits = 1,    afkOverrideStatus = "disabled",    afkOverrideLastRequestAt = -math.huge,    afkOverrideRequestInterval = 2.0,    afkOverrideInLobby = false,    afkOverrideRequestCount = 0,    journeyScanAt = -math.huge,    journeyStatus = "disabled",    journeyClaimCount = 0,    journeyLastClaimAt = -math.huge,    journeyClaimedButtons = {},    journeyLoaded = false,    journeySeasonId = nil,    journeyRequestAt = -math.huge,    journeyClaimInFlight = false,    journeyLastStateAt = -math.huge,    journeyTier = 1,    journeyPremium = false,    journeyClaims = {},    journeyLastClaimResultAt = -math.huge,    mapVoteScanAt = -math.huge,    mapVoteStatus = "disabled",    mapVoteOptions = {},    mapVoteLastActionAt = -math.huge,    mapVoteOpen = false,    mapVotePhase = "Waiting",    mapVoteToken = nil,    mapVoteOptionIds = {},    mapVoteLastStateAt = -math.huge,    debugLastError = nil,    debugLastErrorAt = -math.huge,    debugEnabled = false,    debugGui = nil,    debugLabel = nil,    debugPanelAt = -math.huge,    journeyNextClaimAt = -math.huge,    journeyManualPending = false,}local safezone = {    map = nil,    a = nil,    b = nil,    cached = false,}local visuals = {    goal = nil,    threats = {},    hitboxes = {},}local MAP_VOTE_SLOT_IDS = {    "Map 1",    "Map 2",    "Map 3",}local MapVoteDropdownlocal function flat(v)    return Vector3.new(v.X, 0, v.Z)endlocal function getCharacter(player)    return (player or LocalPlayer).Characterendlocal function getHumanoid(player)    local c = getCharacter(player)    return c and c:FindFirstChildOfClass("Humanoid") or nilendlocal function getRoot(player)    local c = getCharacter(player)    return c and c:FindFirstChild("HumanoidRootPart") or nilendlocal function getRole()    return LocalPlayer:GetAttribute("GameRole") or "Lobby"endlocal function getRunState()    return LocalPlayer:GetAttribute("RunState") or "Idle"endlocal function isRunnerActive()    if LocalPlayer:GetAttribute("InMatch") ~= true then        return false    end    local role = getRole()    if role ~= "Runner" then        return false    end    return getRunState() == "Active"endlocal function isCatcherActive()    if LocalPlayer:GetAttribute("InMatch") ~= true then        return false    end    if getRole() ~= "Catcher" then        return false    end    return getRunState() == "Active"endlocal function canMove()    if LocalPlayer:GetAttribute("ClientReady") ~= true then        return false    end    if Session:GetAttribute("GlobalPaused") == true then        return false    end    if Session:GetAttribute("MapChanging") == true then        return false    end    local c = getCharacter()    if not c then        return false    end    if c:GetAttribute("Ragdolled") == true then        return false    end    if c:GetAttribute("GearMotion") == true then        return false    end    if c:GetAttribute("MovementLocked") == true then        return false    end    local h = getHumanoid()    if not h or h.Health <= 0 then        return false    end    if h.PlatformStand or h.Sit then        return false    end    return trueendlocal function getBaseSpeed(role)    role = role or getRole()    if runtime.profile and runtime.profileRole == role then        return runtime.profile.MaxSpeed or 16    end    local ok, profile = pcall(MovementProfiles.get, role, LocalPlayer)    if ok and profile then        runtime.profile = profile        runtime.profileRole = role        return profile.MaxSpeed or 16    end    return 16endlocal function getRunnerSpeed()    local speed = math.max(getBaseSpeed("Runner"), 1)    if SETTINGS.customSpeed then        speed *= math.clamp(SETTINGS.speedMultiplier, 1, 2)    end    return speedendlocal function getCatcherSpeed()    local speed = math.max(getBaseSpeed("Catcher"), 1)    if SETTINGS.catcherCustomSpeed then        speed *= math.clamp(SETTINGS.catcherSpeedMultiplier, 1, 2)    end    return speedendlocal function restoreNativeWalkSpeed()    local hum = getHumanoid()    local character = getCharacter()    if not hum or not character then        return    end    local native = tonumber(character:GetAttribute("MovementSpeed"))    if native and native > 0 then        hum.WalkSpeed = native    endendlocal function refreshPing(now)    if now - runtime.pingAt < 0.5 then        return    end    runtime.pingAt = now    local value = 0    pcall(function()        value = LocalPlayer:GetNetworkPing() * 0.5    end)    runtime.ping = math.max(value, 0)endlocal function getMap()    local now = os.clock()    if now - runtime.mapCacheAt < 0.35 then        return runtime.mapCache    end    runtime.mapCacheAt = now    local handle = Game:FindFirstChild("ActiveMap")    if handle and handle:IsA("ObjectValue") and handle.Value and handle.Value:IsDescendantOf(workspace) then        runtime.mapCache = handle.Value        return runtime.mapCache    end    local found = nil    for _, obj in ipairs(workspace:GetChildren()) do        if obj:FindFirstChild("Field") then            found = obj            break        end    end    runtime.mapCache = found    return foundendlocal edgeRayCache = {    map = nil,    field = nil,    invisWall = nil,    params = nil,    wallParams = nil,}local function resolveActiveField(map)    if not map then        return nil    end    local field = map:FindFirstChild("Field")    if field then        return field    end    return map:FindFirstChild("Field", true)endlocal function resolveActiveInvisWall(field)    if not field then        return nil    end    return field:FindFirstChild("InvisWall", true)endlocal function refreshEdgeRayCache()    local map = getMap()    local field = resolveActiveField(map)    local wall = resolveActiveInvisWall(field)    local include = field or map    if edgeRayCache.map == map        and edgeRayCache.field == field        and edgeRayCache.invisWall == wall        and edgeRayCache.params then        return    end    local params = RaycastParams.new()    params.FilterType = Enum.RaycastFilterType.Include    params.FilterDescendantsInstances = include and {include} or {}    params.IgnoreWater = true    edgeRayCache.map = map    edgeRayCache.field = field    edgeRayCache.invisWall = wall    edgeRayCache.params = params    edgeRayCache.wallParams = nilendlocal function getEdgeRayParams()    refreshEdgeRayCache()    return edgeRayCache.paramsendlocal function getInvisWallParams()    refreshEdgeRayCache()    local wall = edgeRayCache.invisWall    if not wall or not wall:IsDescendantOf(workspace) then        edgeRayCache.invisWall = nil        edgeRayCache.wallParams = nil        return nil    end    if edgeRayCache.wallParams then        return edgeRayCache.wallParams    end    local wallParams = RaycastParams.new()    wallParams.FilterType = Enum.RaycastFilterType.Include    wallParams.FilterDescendantsInstances = {wall}    wallParams.IgnoreWater = true    edgeRayCache.wallParams = wallParams    return wallParamsendlocal function invisWallHit(position, direction, distance)    local dir = flat(direction)    if dir.Magnitude < 0.05 then        return nil    end    local params = getInvisWallParams()    if not params then        return nil    end    dir = dir.Unit    local origin = Vector3.new(position.X, position.Y + 2.5, position.Z)    return workspace:Raycast(origin, dir * distance, params)endlocal function floorRay(point, y)    local map = getMap()    if not map then        return true    end    local params = getEdgeRayParams()    if not params or #params.FilterDescendantsInstances == 0 then        return false    end    local origin = Vector3.new(point.X, math.max(y + 12, point.Y + 10), point.Z)    local direction = Vector3.new(0, -(SETTINGS.edgeRayHeight + SETTINGS.edgeRayDepth), 0)    local hit = workspace:Raycast(origin, direction, params)    return hit ~= nil and hit.Normal.Y >= 0.35endlocal function hasFloorAt(point, y)    return floorRay(point, y)endlocal function getPlayfieldCenter()    if safezone.a and safezone.b then        return (safezone.a.center + safezone.b.center) * 0.5    end    if safezone.a then        return safezone.a.center    end    if safezone.b then        return safezone.b.center    end    return nilendlocal function groundSupportScore(position, direction, y)    local dir = flat(direction)    if dir.Magnitude < 0.05 then        return 0    end    dir = dir.Unit    local side = Vector3.new(-dir.Z, 0, dir.X)    local score = 0    if hasFloorAt(position + dir * 6, y) then score += 2 end    if hasFloorAt(position + dir * 14, y) then score += 2 end    if hasFloorAt(position + dir * 24, y) then score += 1 end    if hasFloorAt(position + dir * 14 + side * 3, y) then score += 1 end    if hasFloorAt(position + dir * 14 - side * 3, y) then score += 1 end    return scoreendlocal function boundaryInwardDirection(position, y)    local dirs = {        Vector3.new(1, 0, 0),        Vector3.new(-1, 0, 0),        Vector3.new(0, 0, 1),        Vector3.new(0, 0, -1),    }    local outward = Vector3.zero    local missing = 0    for _, dir in ipairs(dirs) do        local wallHit = invisWallHit(position, dir, 9)        if wallHit or not hasFloorAt(position + dir * 7, y) then            outward += dir            missing += 1        end    end    if missing == 0 or outward.Magnitude < 0.05 then        return Vector3.zero    end    local inward = flat(-outward)    if inward.Magnitude < 0.05 then        return Vector3.zero    end    inward = inward.Unit    if groundSupportScore(position, inward, y) < 3 then        return Vector3.zero    end    return inwardendlocal function edgeDirectionClear(position, direction, y, distance)    local dir = flat(direction)    if dir.Magnitude < 0.05 then        return false    end    dir = dir.Unit    if invisWallHit(position, dir, math.max(8, distance)) then        return false    end    local score = groundSupportScore(position, dir, y)    if distance <= 14 then        return score >= 4    end    return score >= 5endlocal function edgeRiskForDirection(position, direction, y)    local dir = flat(direction)    if dir.Magnitude < 0.05 then        return true    end    dir = dir.Unit    return not edgeDirectionClear(position, dir, y, SETTINGS.edgeLookAhead)        or not edgeDirectionClear(position, dir, y, SETTINGS.edgeSecondLookAhead)endlocal function rotateEdge(dir, angle)    local r = math.rad(angle)    local c = math.cos(r)    local s = math.sin(r)    return Vector3.new(dir.X * c - dir.Z * s, 0, dir.X * s + dir.Z * c)endlocal function chooseEdgeDirection(position, desired, goal, y)    local dir = flat(desired)    if dir.Magnitude < 0.05 then        return Vector3.zero, false    end    dir = dir.Unit    local now = os.clock()    if runtime.edgeCheckPosition and runtime.edgeCheckDirection.Magnitude > 0.05        and now - runtime.edgeCheckAt < 0.055        and flat(position - runtime.edgeCheckPosition).Magnitude < 2.5        and runtime.edgeCheckDirection:Dot(dir) > 0.96        and runtime.edgeCheckGoal.Magnitude > 0.05        and flat(goal - runtime.edgeCheckGoal).Magnitude < 8 then        return runtime.edgeDirection, runtime.edgeRisk    end    local boundary = boundaryInwardDirection(position, y)    local desiredRisk = edgeRiskForDirection(position, dir, y)    local nearBoundary = boundary.Magnitude > 0.05 and boundary:Dot(dir) < 0.35    runtime.edgeCheckAt = now    runtime.edgeCheckPosition = position    runtime.edgeCheckDirection = dir    runtime.edgeCheckGoal = flat(goal)    if not desiredRisk and not nearBoundary then        runtime.edgeDirection = dir        runtime.edgeRisk = false        return dir, false    end    local toGoal = flat(goal - position)    if toGoal.Magnitude < 0.05 then        toGoal = dir    else        toGoal = toGoal.Unit    end    local inward = boundary    if inward.Magnitude < 0.05 then        local center = getPlayfieldCenter()        if center then            inward = flat(center - position)            if inward.Magnitude > 0.05 then                inward = inward.Unit            end        end    end    local candidates = {}    local function addCandidate(v)        v = flat(v)        if v.Magnitude < 0.05 then            return        end        v = v.Unit        for _, item in ipairs(candidates) do            if item:Dot(v) > 0.985 then                return            end        end        candidates[#candidates + 1] = v    end    addCandidate(inward)    addCandidate(toGoal)    addCandid

Comments

0

Did it work for you? Sign in to share your experience.

Sign in to comment

No comments yet

Tried it? Let others know if it works.