Animaciones
Key RequiredUniversal

Animaciones

Universal ScriptJuliohub5Juliohub5 325 views 207 executesUpdated Oct 8, 2026
Unrated
00
Lua Script•605 lines (23270 chars)
-- ═══════════════════════════════════════════
-- ANIMACIONES PREMIUM · FLUID EDITION
-- by Eren · discord.gg/eCkeBVA4S
-- ═══════════════════════════════════════════

local Rayfield = loadstring(game:HttpGet('https://sirius.menu/rayfield'))()

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")

local player = Players.LocalPlayer

-- ═══════════════════════════════════════════
-- DATOS DE ANIMACIONES
-- ═══════════════════════════════════════════
local animationData = {
    ["Adidas Aura"] = { Walk = 83842218823011, Run = 118320322718866, Jump = 109996626521204, Fall = 95603166884636, SwimIdle = 94922130551805, Swim = 134530128383903, Idle = 110211186840347, Idle2 = 114191137265065, Climb = 97824616490448 },
    ["Adidas Sports"] = { Walk = 18537392113, Run = 18537384940, Jump = 18537380791, Fall = 18537367238, SwimIdle = 18537387180, Swim = 18537389531, Idle = 18537376492, Idle2 = 18537371272, Climb = 18537363391 },
    ["Adidas Community"] = { Walk = 122150855457006, Run = 82598234841035, Jump = 75290611992385, Fall = 98600215928904, SwimIdle = 109346520324160, Swim = 133308483266208, Idle = 122257458498464, Idle2 = 102357151005774, Climb = 88763136693023 },
    ["Old School"] = { Walk = 10921244891, Run = 10921240218, Jump = 10921242013, Fall = 10921241244, SwimIdle = 10921244018, Swim = 10921243048, Idle = 10921230744, Idle2 = 10921232093, Climb = 10921229866 },
    ["Wicked Popular"] = { Walk = 92072849924640, Run = 72301599441680, Jump = 104325245285198, Fall = 121152442762481, Idle = 118832222982049, Idle2 = 76049494037641, SwimIdle = 113199415118199, Swim = 99384245425157, Climb = 131326830509784 },
    ["Catwalk Glam"] = { Walk = 109168724482748, Run = 81024476153754, Jump = 116936326516985, Fall = 92294537340807, SwimIdle = 98854111361360, Swim = 134591743181628, Idle = 133806214992291, Idle2 = 94970088341563, Climb = 119377220967554 },
    ["Astronaut"] = { Walk = 10921046031, Run = 10921039308, Jump = 10921042494, Fall = 10921040576, SwimIdle = 10921045006, Swim = 10921044000, Idle = 10921034824, Idle2 = 10921036806, Climb = 10921032124 },
    ["No Boundaries"] = { Walk = 18747074203, Run = 18747070484, Jump = 18747069148, Fall = 18747062535, SwimIdle = 18747071682, Swim = 18747073181, Idle = 18747067405, Idle2 = 18747063918, Climb = 18747060903 },
    ["NFL"] = { Walk = 110358958299415, Run = 117333533048078, Jump = 119846112151352, Fall = 129773241321032, SwimIdle = 79090109939093, Swim = 132697394189921, Idle = 92080889861410, Idle2 = 74451233229259, Climb = 134630013742019 },
    ["Amazon Unboxed"] = { Walk = 90478085024465, Run = 134824450619865, Jump = 121454505477205, Fall = 94788218468396, SwimIdle = 129126268464847, Swim = 105962919001086, Idle = 98281136301627, Climb = 121145883950231 },
    ["Elder"] = { Walk = 10921111375, Run = 10921104374, Jump = 10921107367, Fall = 10921105765, SwimIdle = 10921110146, Swim = 10921108971, Idle = 10921101664, Idle2 = 10921102574, Climb = 10921100400 },
    ["Zombie"] = { Walk = 10921355261, Run = 616163682, Jump = 10921351278, Fall = 10921350320, SwimIdle = 10921353442, Swim = 10921352344, Idle = 10921344533, Idle2 = 10921345304, Climb = 10921343576 },
    ["Mage"] = { Walk = 10921152678, Run = 10921148209, Jump = 10921149743, Fall = 10921148939, SwimIdle = 10921151661, Swim = 10921150788, Idle = 10921144709, Idle2 = 10921145797, Climb = 10921143404 },
    ["Werewolf"] = { Walk = 10921342074, Run = 10921336997, Fall = 10921337907, SwimIdle = 10921341319, Swim = 10921340419, Idle = 10921330408, Idle2 = 10921333667, Climb = 10921329322 },
    ["Superhero"] = { Walk = 10921298616, Run = 10921291831, Jump = 10921294559, Fall = 10921293373, SwimIdle = 10921297391, Swim = 10921295495, Idle = 10921288909, Idle2 = 10921290167, Climb = 10921286911 },
    ["Toy"] = { Walk = 10921312010, Run = 10921306285, Jump = 10921308158, Fall = 10921307241, SwimIdle = 10921310341, Swim = 10921309319, Idle = 10921301576, Climb = 10921300839 },
    ["Vampire"] = { Walk = 10921326949, Run = 10921320299, Jump = 10921322186, Fall = 10921321317, SwimIdle = 10921325443, Swim = 10921324408, Idle = 10921315373, Climb = 10921314188 },
    ["Ninja"] = { Walk = 656121766, Run = 656118852, Jump = 656117878, Fall = 656115606, SwimIdle = 656121397, Swim = 656119721, Idle = 656117400, Idle2 = 656118341, Climb = 656114359 },
    ["Robot"] = { Walk = 616095330, Run = 616091570, Jump = 616090535, Fall = 616087089, SwimIdle = 616094091, Swim = 616092998, Idle = 616088211, Idle2 = 616089559, Climb = 616086039 },
    ["Levitation"] = { Walk = 616013216, Run = 616010382, Jump = 616008936, Fall = 616005863, SwimIdle = 616012453, Swim = 616011509, Idle = 616006778, Idle2 = 616008087, Climb = 616003713 },
    ["Stylish"] = { Walk = 616146177, Run = 616140816, Jump = 616139451, Fall = 616134815, SwimIdle = 616144772, Swim = 616143378, Idle = 616136790, Idle2 = 616138447, Climb = 616133594 },
    ["Bubbly"] = { Walk = 910034870, Run = 910025107, Jump = 910016857, Fall = 910001910, SwimIdle = 910030921, Swim = 910028158, Idle = 910004836, Idle2 = 910009958, Climb = 909997997 },
    ["Cartoon"] = { Walk = 742640026, Run = 742638842, Jump = 742637942, Fall = 742637151, SwimIdle = 742639812, Swim = 742639220, Idle = 742637544, Idle2 = 742638445, Climb = 742636889 }
}

-- ═══════════════════════════════════════════
-- CONTROLADOR FLUIDO
-- ═══════════════════════════════════════════
local activeController = nil

local FADE = 0.15
local IDLE_CYCLE_TIME = 5
local FALL_VELOCITY_THRESHOLD = -10

local function stopController()
    if not activeController then return end
    for _, conn in ipairs(activeController.connections) do
        pcall(function() conn:Disconnect() end)
    end
    for _, track in pairs(activeController.tracks) do
        pcall(function() if track then track:Stop(0.1) end end)
    end
    activeController = nil
end

local function applyCustomAnims(customData, nombre)
    if not customData then return end
    local char = player.Character
    if not char then return end
    local hum = char:FindFirstChildOfClass("Humanoid")
    if not hum then return end
    local animator = hum:FindFirstChildOfClass("Animator")
    if not animator then return end

    stopController()

    local animate = char:FindFirstChild("Animate")
    if animate then animate.Disabled = true end

    for _, t in ipairs(animator:GetPlayingAnimationTracks()) do
        pcall(function() t:Stop(FADE) end)
    end
    task.wait(FADE + 0.05)

    local function load(id, priority, looped)
        if not id then return nil end
        local a = Instance.new("Animation")
        a.AnimationId = "rbxassetid://" .. tostring(id)
        local ok, t = pcall(function() return animator:LoadAnimation(a) end)
        if not ok or not t then return nil end
        t.Priority = priority
        t.Looped = looped
        return t
    end

    local P_IDLE = Enum.AnimationPriority.Idle
    local P_MOVE = Enum.AnimationPriority.Movement

    local tracks = {
        idle1    = load(customData.Idle, P_IDLE, true),
        idle2    = load(customData.Idle2 or customData.Idle, P_IDLE, true),
        walk     = load(customData.Walk, P_MOVE, true),
        run      = load(customData.Run or customData.Walk, P_MOVE, true),
        jump     = load(customData.Jump, P_MOVE, false),
        fall     = load(customData.Fall, P_MOVE, true),
        climb    = load(customData.Climb, P_MOVE, true),
        swim     = load(customData.Swim, P_MOVE, true),
        swimIdle = load(customData.SwimIdle or customData.Swim, P_IDLE, true),
    }

    local controller = {
        tracks = tracks,
        connections = {},
        currentState = nil,
        idleIndex = 1,
        data = customData,
        nombre = nombre or "Custom",
        char = char,
        hum = hum,
        alive = true
    }
    activeController = controller

    local function stopStateTracks(state)
        if state == "idle" then
            if tracks.idle1 and tracks.idle1.IsPlaying then pcall(function() tracks.idle1:Stop(FADE) end) end
            if tracks.idle2 and tracks.idle2.IsPlaying then pcall(function() tracks.idle2:Stop(FADE) end) end
        elseif state == "swimIdle" then
            if tracks.swimIdle and tracks.swimIdle.IsPlaying then pcall(function() tracks.swimIdle:Stop(FADE) end) end
        elseif state and tracks[state] and tracks[state].IsPlaying then
            pcall(function() tracks[state]:Stop(FADE) end)
        end
    end

    local function setState(newState)
        if controller.currentState == newState then return end
        local oldState = controller.currentState
        controller.currentState = newState

        if oldState then stopStateTracks(oldState) end

        if newState == "idle" then
            controller.idleIndex = 1
            if tracks.idle1 then pcall(function() tracks.idle1:Play(FADE) end) end
        elseif newState == "swimIdle" then
            if tracks.swimIdle then pcall(function() tracks.swimIdle:Play(FADE) end) end
        elseif tracks[newState] then
            pcall(function() tracks[newState]:Play(FADE) end)
        end
    end

    local function ajustarVelocidad()
        local vel = hum.WalkSpeed
        local factor = vel / 16
        if factor < 0.5 then factor = 0.5 end
        if factor > 3 then factor = 3 end

        if tracks.walk and tracks.walk.IsPlaying then
            pcall(function() tracks.walk:AdjustSpeed(factor) end)
        end
        if tracks.run and tracks.run.IsPlaying then
            pcall(function() tracks.run:AdjustSpeed(factor) end)
        end
    end

    -- ═══════════════════════════════════════
    -- UPDATE CON DETECCIÓN DE FALL POR VELOCIDAD
    -- ═══════════════════════════════════════
    local function update()
        if not controller.alive then return end
        if not char.Parent or hum.Health <= 0 then return end

        local state = hum:GetState()
        local moveDir = hum.MoveDirection
        local moving = moveDir.Magnitude > 0.1

        -- Detección de caída por velocidad vertical
        local root = char:FindFirstChild("HumanoidRootPart")
        local velY = root and root.AssemblyLinearVelocity.Y or 0
        local cayendo = velY < FALL_VELOCITY_THRESHOLD

        local newState
        if state == Enum.HumanoidStateType.Swimming then
            newState = moving and "swim" or "swimIdle"
        elseif state == Enum.HumanoidStateType.Climbing then
            newState = "climb"
        elseif cayendo then
            -- Prioridad alta: si está cayendo, mostrar fall
            newState = "fall"
        elseif state == Enum.HumanoidStateType.Jumping then
            newState = "jump"
        elseif state == Enum.HumanoidStateType.Freefall then
            newState = "fall"
        elseif moving then
            newState = hum.WalkSpeed >= 20 and "run" or "walk"
        else
            newState = "idle"
        end

        setState(newState)
        ajustarVelocidad()
    end

    table.insert(controller.connections, RunService.Heartbeat:Connect(update))
    table.insert(controller.connections, hum.StateChanged:Connect(update))

    local function cycleIdle()
        if not controller.alive or activeController ~= controller then return end
        if controller.currentState == "idle" and tracks.idle1 and tracks.idle2 then
            if controller.idleIndex == 1 then
                if tracks.idle1.IsPlaying then tracks.idle1:Stop(0.4) end
                tracks.idle2:Play(0.4)
                controller.idleIndex = 2
            else
                if tracks.idle2.IsPlaying then tracks.idle2:Stop(0.4) end
                tracks.idle1:Play(0.4)
                controller.idleIndex = 1
            end
        end
        task.delay(IDLE_CYCLE_TIME, cycleIdle)
    end
    task.delay(IDLE_CYCLE_TIME, cycleIdle)

    table.insert(controller.connections, hum.Died:Connect(function()
        controller.alive = false
    end))

    if tracks.idle1 then pcall(function() tracks.idle1:Play(FADE) end) end
    controller.currentState = "idle"

    return controller
end

player.CharacterAdded:Connect(function()
    if activeController and activeController.data then
        local savedData = activeController.data
        local savedName = activeController.nombre
        task.spawn(function()
            task.wait(1)
            applyCustomAnims(savedData, savedName)
        end)
    end
end)

-- ═══════════════════════════════════════════
-- MEZCLADOR
-- ═══════════════════════════════════════════
local mixSelection = {
    Idle = "Adidas Aura", Walk = "Adidas Aura", Run = "Adidas Aura",
    Jump = "Adidas Aura", Fall = "Adidas Aura", Climb = "Adidas Aura", Swim = "Adidas Aura"
}

local function getMixedData()
    local mix = {}
    if mixSelection.Idle ~= "Ninguno" then
        mix.Idle = animationData[mixSelection.Idle].Idle
        mix.Idle2 = animationData[mixSelection.Idle].Idle2 or animationData[mixSelection.Idle].Idle
    end
    if mixSelection.Walk ~= "Ninguno" then mix.Walk = animationData[mixSelection.Walk].Walk end
    if mixSelection.Run ~= "Ninguno" then mix.Run = animationData[mixSelection.Run].Run end
    if mixSelection.Jump ~= "Ninguno" then mix.Jump = animationData[mixSelection.Jump].Jump end
    if mixSelection.Fall ~= "Ninguno" then mix.Fall = animationData[mixSelection.Fall].Fall end
    if mixSelection.Climb ~= "Ninguno" then mix.Climb = animationData[mixSelection.Climb].Climb end
    if mixSelection.Swim ~= "Ninguno" then
        mix.Swim = animationData[mixSelection.Swim].Swim
        mix.SwimIdle = animationData[mixSelection.Swim].SwimIdle or animationData[mixSelection.Swim].Swim
    end
    return mix
end

local nombres = {}
for name, _ in pairs(animationData) do table.insert(nombres, name) end
table.sort(nombres)

local listaConNinguno = {"Ninguno"}
for _, n in ipairs(nombres) do table.insert(listaConNinguno, n) end

-- ═══════════════════════════════════════════
-- VENTANA RAYFIELD
-- ═══════════════════════════════════════════
local Window = Rayfield:CreateWindow({
    Name = "Animaciones Premium",
    Icon = 0,
    LoadingTitle = "Cargando animaciones...",
    LoadingSubtitle = "by Eren",
    Theme = "Amethyst",
    ConfigurationSaving = {
        Enabled = false,
        FolderName = nil,
        FileName = "AnimConfig"
    },
    Discord = {
        Enabled = false,
        Invite = "noinvite",
        RememberJoins = true
    },
    KeySystem = false
})

-- ═══════════════════════════════════════════
-- TAB: PAQUETES
-- ═══════════════════════════════════════════
local TabPaquetes = Window:CreateTab("Paquetes", 4483362458)

TabPaquetes:CreateSection("⭐ Destacado")

Rayfield:Notify({
    Title = "Menú cargado",
    Content = "Selecciona un paquete para aplicar",
    Duration = 4,
    Image = 4483362458
})

TabPaquetes:CreateButton({
    Name = "⭐ Adidas Aura",
    Callback = function()
        applyCustomAnims(animationData["Adidas Aura"], "Adidas Aura")
        Rayfield:Notify({
            Title = "Adidas Aura",
            Content = "Animación aplicada correctamente",
            Duration = 3,
            Image = 4483362458
        })
    end
})

TabPaquetes:CreateSection("🎭 Todos los paquetes")

for _, name in ipairs(nombres) do
    if name ~= "Adidas Aura" then
        TabPaquetes:CreateButton({
            Name = name,
            Callback = function()
                applyCustomAnims(animationData[name], name)
                Rayfield:Notify({
                    Title = name,
                    Content = "Animación aplicada",
                    Duration = 3,
                    Image = 4483362458
                })
            end
        })
    end
end

TabPaquetes:CreateSection("⚙️ Opciones")

TabPaquetes:CreateButton({
    Name = "🔄 Restaurar Default",
    Callback = function()
        stopController()
        local char = player.Character
        if char then
            local animate = char:FindFirstChild("Animate")
            if animate then animate.Disabled = false end
        end
        Rayfield:Notify({
            Title = "Restaurado",
            Content = "Animaciones default activas",
            Duration = 3,
            Image = 4483362458
        })
    end
})

-- ═══════════════════════════════════════════
-- TAB: MEZCLADOR
-- ═══════════════════════════════════════════
local TabMezclar = Window:CreateTab("Mezclador", 4483362458)

TabMezclar:CreateSection("🎨 Combina animaciones")

TabMezclar:CreateDropdown({
    Name = "🧍 Reposo (Idle)",
    Options = listaConNinguno,
    CurrentOption = {mixSelection.Idle},
    MultipleOptions = false,
    Flag = "mix_idle",
    Callback = function(Option)
        mixSelection.Idle = Option[1] or "Adidas Aura"
    end,
})

TabMezclar:CreateDropdown({
    Name = "🚶 Caminar (Walk)",
    Options = listaConNinguno,
    CurrentOption = {mixSelection.Walk},
    MultipleOptions = false,
    Flag = "mix_walk",
    Callback = function(Option)
        mixSelection.Walk = Option[1] or "Adidas Aura"
    end,
})

TabMezclar:CreateDropdown({
    Name = "🏃 Correr (Run)",
    Options = listaConNinguno,
    CurrentOption = {mixSelection.Run},
    MultipleOptions = false,
    Flag = "mix_run",
    Callback = function(Option)
        mixSelection.Run = Option[1] or "Adidas Aura"
    end,
})

TabMezclar:CreateDropdown({
    Name = "⬆️ Saltar (Jump)",
    Options = listaConNinguno,
    CurrentOption = {mixSelection.Jump},
    MultipleOptions = false,
    Flag = "mix_jump",
    Callback = function(Option)
        mixSelection.Jump = Option[1] or "Adidas Aura"
    end,
})

TabMezclar:CreateDropdown({
    Name = "⬇️ Caer (Fall)",
    Options = listaConNinguno,
    CurrentOption = {mixSelection.Fall},
    MultipleOptions = false,
    Flag = "mix_fall",
    Callback = function(Option)
        mixSelection.Fall = Option[1] or "Adidas Aura"
    end,
})

TabMezclar:CreateDropdown({
    Name = "🧗 Escalar (Climb)",
    Options = listaConNinguno,
    CurrentOption = {mixSelection.Climb},
    MultipleOptions = false,
    Flag = "mix_climb",
    Callback = function(Option)
        mixSelection.Climb = Option[1] or "Adidas Aura"
    end,
})

TabMezclar:CreateDropdown({
    Name = "🏊 Nadar (Swim)",
    Options = listaConNinguno,
    CurrentOption = {mixSelection.Swim},
    MultipleOptions = false,
    Flag = "mix_swim",
    Callback = function(Option)
        mixSelection.Swim = Option[1] or "Adidas Aura"
    end,
})

TabMezclar:CreateSection("✨ Aplicar")

TabMezclar:CreateButton({
    Name = "✨ Aplicar Mezcla",
    Callback = function()
        local mix = getMixedData()
        local algo = false
        for _ in pairs(mix) do algo = true break end
        if algo then
            applyCustomAnims(mix, "Mezcla personalizada")
            Rayfield:Notify({
                Title = "Mezcla aplicada",
                Content = "Tu combinación personalizada está activa",
                Duration = 3,
                Image = 4483362458
            })
        else
            Rayfield:Notify({
                Title = "Aviso",
                Content = "No hay nada seleccionado",
                Duration = 3,
                Image = 4483362458
            })
        end
    end
})

TabMezclar:CreateButton({
    Name = "🔴 Reiniciar selección",
    Callback = function()
        mixSelection.Idle = "Adidas Aura"
        mixSelection.Walk = "Adidas Aura"
        mixSelection.Run = "Adidas Aura"
        mixSelection.Jump = "Adidas Aura"
        mixSelection.Fall = "Adidas Aura"
        mixSelection.Climb = "Adidas Aura"
        mixSelection.Swim = "Adidas Aura"
        Rayfield:Notify({
            Title = "Reiniciado",
            Content = "Selección vuelta a Adidas Aura",
            Duration = 3,
            Image = 4483362458
        })
    end
})

-- ═══════════════════════════════════════════
-- TAB: INFO
-- ═══════════════════════════════════════════
local TabInfo = Window:CreateTab("Info", 4483362458)

TabInfo:CreateSection("📖 Sobre el script")

TabInfo:CreateParagraph({
    Title = "Animaciones Premium",
    Content = "Script que te permite cambiar las animaciones de tu personaje con paquetes completos o combinaciones personalizadas. Los cambios se ven en todos los jugadores de la partida."
})

TabInfo:CreateSection("🎯 Cómo usar")

TabInfo:CreateParagraph({
    Title = "Paquetes",
    Content = "Ve a la pestaña Paquetes y elige cualquier paquete para aplicarlo completo."
})

TabInfo:CreateParagraph({
    Title = "Mezclador",
    Content = "Ve a Mezclador y combina animaciones de distintos paquetes. Por ejemplo: Idle de Adidas Aura + Walk de Ninja + Run de Zombie."
})

TabInfo:CreateSection("⚡ Notas")

TabInfo:CreateParagraph({
    Title = "Replicación",
    Content = "Los cambios se replican automáticamente a todos los jugadores del servidor."
})

-- ═══════════════════════════════════════════
-- TAB: CRÉDITOS
-- ═══════════════════════════════════════════
local TabCreditos = Window:CreateTab("Créditos", 4483362458)

TabCreditos:CreateSection("👑 Desarrollador")

TabCreditos:CreateParagraph({
    Title = "Eren",
    Content = "Creador y desarrollador del script. Todas las funciones, diseños y sistemas fueron hechos por él."
})

TabCreditos:CreateSection("💬 Discord Oficial")

TabCreditos:CreateParagraph({
    Title = "Únete al servidor",
    Content = "https://discord.gg/eCkeBVA4S\n\nAhí puedes reportar bugs, pedir nuevas funciones, sugerir animaciones o simplemente charlar con la comunidad."
})

TabCreditos:CreateButton({
    Name = "📋 Copiar link del Discord",
    Callback = function()
        if setclipboard then
            setclipboard("https://discord.gg/eCkeBVA4S")
            Rayfield:Notify({
                Title = "¡Copiado!",
                Content = "El link del Discord está en tu portapapeles",
                Duration = 4,
                Image = 4483362458
            })
        else
            Rayfield:Notify({
                Title = "Discord",
                Content = "discord.gg/eCkeBVA4S",
                Duration = 6,
                Image = 4483362458
            })
        end
    end
})

TabCreditos:CreateButton({
    Name = "🌐 Abrir Discord en navegador",
    Callback = function()
        pcall(function()
            local url = "https://discord.gg/eCkeBVA4S"
            if request then
                request({
                    Url = url,
                    Method = "GET"
                })
            end
        end)
        Rayfield:Notify({
            Title = "Discord",
            Content = "Busca: discord.gg/eCkeBVA4S",
            Duration = 6,
            Image = 4483362458
        })
    end
})

TabCreditos:CreateSection("🙏 Agradecimientos")

TabCreditos:CreateParagraph({
    Title = "Rayfield UI",
    Content = "Por la interfaz gráfica utilizada en este script."
})

TabCreditos:CreateParagraph({
    Title = "Comunidad",
    Content = "A todos los usuarios que probaron versiones anteriores y ayudaron a mejorarlo con sus reportes."
})

TabCreditos:CreateSection("ℹ️ Versión")

TabCreditos:CreateParagraph({
    Title = "Animaciones Premium · v7.0",
    Content = "Fluid Edition · Fall Fix · Credits Update"
})

print("✅ Animaciones Premium v7.0 cargado · discord.gg/eCkeBVA4S")

Features & Information

Animaciones aceco de animaciones

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts