JoJo stand script-Star Platinum
Key RequiredUniversal

JoJo stand script-Star Platinum

Universal ScriptStaticAmourStaticAmour 3.3K views 9.7K executesUpdated Sep 26, 2026
5.0/ 5(2 votes)
20100% Positive
Lua Script•1226 lines (31137 chars)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local Debris = game:GetService("Debris")
local UserInputService = game:GetService("UserInputService")
local TextChatService = game:GetService("TextChatService")

local function SendChatMessage(message)
    if TextChatService.ChatVersion == Enum.ChatVersion.TextChatService then
        local textChannel = TextChatService.TextChannels:FindFirstChild("RBXGeneral")
        if textChannel then
            textChannel:SendAsync(message)
        end
    else
        game:GetService("ReplicatedStorage").DefaultChatSystemChatEvents.SayMessageRequest:FireServer(message, "All")
    end
end

local player = Players.LocalPlayer

local function GetNearestPlayerInFront(targetPlayer, maxAngle)
    maxAngle = maxAngle or 60

    if not targetPlayer.Character then return nil end
    local targetHRP = targetPlayer.Character:FindFirstChild("HumanoidRootPart")
    if not targetHRP then return nil end

    local targetLook = targetHRP.CFrame.LookVector

    local closest = nil
    local closestDist = math.huge

    for _, p in pairs(Players:GetPlayers()) do
        if p ~= player and p ~= targetPlayer and p.Character then
            local hrp = p.Character:FindFirstChild("HumanoidRootPart")
            if hrp then
                local difference = hrp.Position - targetHRP.Position

                if difference.Magnitude > 0 then
                    local vec = difference.Unit
                    local dot = math.clamp(targetLook:Dot(vec), -1, 1)
                    local angle = math.deg(math.acos(dot))

                    if angle <= maxAngle then
                        local dist = difference.Magnitude

                        if dist < closestDist then
                            closestDist = dist
                            closest = hrp
                        end
                    end
                end
            end
        end
    end

    return closest
end

local character = player.Character or player.CharacterAdded:Wait()
local humanoidRootPart = character:WaitForChild("HumanoidRootPart")
local humanoid = character:FindFirstChildOfClass("Humanoid") or character:WaitForChild("Humanoid")

local standDistance = 3
local sideOffset = 2
local heightOffset = 2
local followSpeed = 0.35
local flingDuration = 1
local followDuration = 0.6

local punchSoundId = "rbxassetid://6186250072"
local heavyPunchSoundId = "rbxassetid://6164853733"

local summonSoundIds = {
    "rbxassetid://2102274452",
    "rbxassetid://2554017604"
}

--JOJO STAND CONTROLLER GUI

local screenGui = Instance.new("ScreenGui")
screenGui.Name = "StandControllerGUI"
screenGui.ResetOnSpawn = false
screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
screenGui.Parent = player:WaitForChild("PlayerGui")

-- Star Platinum themed colors
local JOJO_BLACK = Color3.fromRGB(8, 5, 15)
local JOJO_PURPLE = Color3.fromRGB(91, 35, 145)
local JOJO_DARK_PURPLE = Color3.fromRGB(28, 12, 48)
local JOJO_PURPLE_BLUE = Color3.fromRGB(65, 50, 135)
local JOJO_GOLD = Color3.fromRGB(255, 205, 75)
local JOJO_WHITE = Color3.fromRGB(245, 240, 255)
local JOJO_RED = Color3.fromRGB(190, 35, 55)

-- Image assets supplied for the GUI
local MENACING_IMAGE = "rbxassetid://6252277153"
local STAR_PLATINUM_IMAGE = "rbxassetid://5471971645"

-- Main frame
local mainFrame = Instance.new("Frame")
mainFrame.Name = "StarPlatinumController"
mainFrame.Size = UDim2.new(0, 220, 0, 310)
mainFrame.Position = UDim2.new(0.05, 0, 0.5, -155)
mainFrame.BackgroundColor3 = JOJO_BLACK
mainFrame.BorderSizePixel = 0
-- IMPORTANT: false lets the decorative images extend outside the GUI.
mainFrame.ClipsDescendants = false
mainFrame.ZIndex = 5
mainFrame.Parent = screenGui

local mainCorner = Instance.new("UICorner")
mainCorner.CornerRadius = UDim.new(0, 14)
mainCorner.Parent = mainFrame

local border = Instance.new("UIStroke")
border.Color = JOJO_PURPLE
border.Thickness = 3
border.Parent = mainFrame

-- Gold inner outline
local innerBorder = Instance.new("UIStroke")
innerBorder.Color = JOJO_GOLD
innerBorder.Thickness = 1
innerBorder.Transparency = 0.2
innerBorder.Parent = mainFrame

--STAR PLATINUM STAND DISPLAY
--This is attached to the GUI, so it follows the GUI when dragged.

local standImage = Instance.new("ImageLabel")
standImage.Name = "StarPlatinum"
standImage.Size = UDim2.new(0, 245, 0, 300)
standImage.Position = UDim2.new(0, -155, 0, 5)
standImage.BackgroundTransparency = 1
standImage.Image = STAR_PLATINUM_IMAGE
standImage.ScaleType = Enum.ScaleType.Fit
standImage.ImageTransparency = 0
standImage.Active = false
standImage.ZIndex = 1
standImage.Parent = mainFrame

-- Soft purple glow behind Star Platinum
local standGlow = Instance.new("ImageLabel")
standGlow.Name = "StandGlow"
standGlow.Size = UDim2.new(0, 270, 0, 320)
standGlow.Position = UDim2.new(0, -170, 0, -10)
standGlow.BackgroundTransparency = 1
standGlow.Image = STAR_PLATINUM_IMAGE
standGlow.ImageColor3 = JOJO_PURPLE
standGlow.ImageTransparency = 0.82
standGlow.ScaleType = Enum.ScaleType.Fit
standGlow.Active = false
standGlow.ZIndex = 0
standGlow.Parent = mainFrame

--MENACING DECORATIONS
--Multiple copies are placed around the controller

local function addMenacing(name, size, position, rotation, transparency)
    local img = Instance.new("ImageLabel")
    img.Name = name
    img.Size = size
    img.Position = position
    img.BackgroundTransparency = 1
    img.Image = MENACING_IMAGE
    img.ImageTransparency = transparency or 0
    img.Rotation = rotation or 0
    img.ScaleType = Enum.ScaleType.Fit
    img.Active = false
    img.ZIndex = 0
    img.Parent = mainFrame
    return img
end

addMenacing(
    "MenacingTopLeft",
    UDim2.new(0, 105, 0, 75),
    UDim2.new(0, -78, 0, -48),
    -12,
    0.05
)

addMenacing(
    "MenacingTop",
    UDim2.new(0, 100, 0, 70),
    UDim2.new(0, 58, 0, -58),
    8,
    0.05
)

addMenacing(
    "MenacingTopRight",
    UDim2.new(0, 100, 0, 70),
    UDim2.new(1, 5, 0, -45),
    15,
    0.05
)

addMenacing(
    "MenacingLeft",
    UDim2.new(0, 90, 0, 65),
    UDim2.new(0, -72, 0, 125),
    -10,
    0.1
)

addMenacing(
    "MenacingBottomLeft",
    UDim2.new(0, 105, 0, 75),
    UDim2.new(0, -65, 1, -25),
    12,
    0.05
)

addMenacing(
    "MenacingBottom",
    UDim2.new(0, 95, 0, 68),
    UDim2.new(0, 70, 1, -18),
    -8,
    0.05
)

addMenacing(
    "MenacingRight",
    UDim2.new(0, 100, 0, 70),
    UDim2.new(1, 5, 1, -70),
    10,
    0.08
)

--GUI PANEL DETAILS

-- Top bar
local topBar = Instance.new("Frame")
topBar.Size = UDim2.new(1, 0, 0, 6)
topBar.Position = UDim2.new(0, 0, 0, 0)
topBar.BackgroundColor3 = JOJO_PURPLE
topBar.BorderSizePixel = 0
topBar.ZIndex = 6
topBar.Parent = mainFrame

-- Gold accent line
local goldBar = Instance.new("Frame")
goldBar.Size = UDim2.new(1, -18, 0, 2)
goldBar.Position = UDim2.new(0, 9, 0, 57)
goldBar.BackgroundColor3 = JOJO_GOLD
goldBar.BackgroundTransparency = 0.25
goldBar.BorderSizePixel = 0
goldBar.ZIndex = 7
goldBar.Parent = mainFrame

-- Side bar
local sideBar = Instance.new("Frame")
sideBar.Size = UDim2.new(0, 4, 1, -6)
sideBar.Position = UDim2.new(0, 0, 0, 6)
sideBar.BackgroundColor3 = JOJO_GOLD
sideBar.BorderSizePixel = 0
sideBar.ZIndex = 6
sideBar.Parent = mainFrame

-- Title
local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, -55, 0, 30)
title.Position = UDim2.new(0, 15, 0, 9)
title.BackgroundTransparency = 1
title.Text = "「 STAR PLATINUM 」"
title.TextColor3 = JOJO_GOLD
title.Font = Enum.Font.GothamBlack
title.TextSize = 17
title.TextXAlignment = Enum.TextXAlignment.Left
title.ZIndex = 7
title.Parent = mainFrame

-- Subtitle
local subtitle = Instance.new("TextLabel")
subtitle.Size = UDim2.new(1, -20, 0, 18)
subtitle.Position = UDim2.new(0, 15, 0, 35)
subtitle.BackgroundTransparency = 1
subtitle.Text = "ORA ORA • STAND CONTROL"
subtitle.TextColor3 = JOJO_WHITE
subtitle.TextTransparency = 0.08
subtitle.Font = Enum.Font.GothamBold
subtitle.TextSize = 9
subtitle.TextXAlignment = Enum.TextXAlignment.Left
subtitle.ZIndex = 7
subtitle.Parent = mainFrame

-- Close button
local closeBtn = Instance.new("TextButton")
closeBtn.Size = UDim2.new(0, 30, 0, 27)
closeBtn.Position = UDim2.new(1, -39, 0, 10)
closeBtn.Text = "X"
closeBtn.Font = Enum.Font.GothamBlack
closeBtn.TextSize = 14
closeBtn.TextColor3 = JOJO_WHITE
closeBtn.BackgroundColor3 = JOJO_DARK_PURPLE
closeBtn.BorderSizePixel = 0
closeBtn.ZIndex = 10
closeBtn.Parent = mainFrame

local closeCorner = Instance.new("UICorner")
closeCorner.CornerRadius = UDim.new(0, 7)
closeCorner.Parent = closeBtn

local closeStroke = Instance.new("UIStroke")
closeStroke.Color = JOJO_RED
closeStroke.Thickness = 1.5
closeStroke.Parent = closeBtn

-- Divider
local divider = Instance.new("Frame")
divider.Size = UDim2.new(1, -28, 0, 2)
divider.Position = UDim2.new(0, 14, 0, 59)
divider.BackgroundColor3 = JOJO_PURPLE
divider.BorderSizePixel = 0
divider.ZIndex = 7
divider.Parent = mainFrame

-- GUI toggle
local guiToggle = Instance.new("TextButton")
guiToggle.Size = UDim2.new(0, 68, 0, 30)
guiToggle.Position = UDim2.new(0.5, -34, 1, -42)
guiToggle.Text = "「 GUI 」"
guiToggle.Font = Enum.Font.GothamBlack
guiToggle.TextSize = 12
guiToggle.TextColor3 = JOJO_GOLD
guiToggle.BackgroundColor3 = JOJO_BLACK
guiToggle.BorderSizePixel = 0
guiToggle.ZIndex = 20
guiToggle.Parent = screenGui

local toggleCorner = Instance.new("UICorner")
toggleCorner.CornerRadius = UDim.new(0, 8)
toggleCorner.Parent = guiToggle

local toggleStroke = Instance.new("UIStroke")
toggleStroke.Color = JOJO_PURPLE
toggleStroke.Thickness = 2
toggleStroke.Parent = guiToggle

local guiVisible = true

guiToggle.MouseButton1Click:Connect(function()
    guiVisible = not guiVisible
    mainFrame.Visible = guiVisible
end)

closeBtn.MouseButton1Click:Connect(function()
    mainFrame.Visible = false
    guiVisible = false
end)

-- Button creator
local function makeButton(text, y)
    local b = Instance.new("TextButton")

    b.Size = UDim2.new(0.78, 0, 0, 36)
    b.Position = UDim2.new(0.11, 0, 0, y)

    b.Text = "「 " .. text .. " 」"
    b.Font = Enum.Font.GothamBlack
    b.TextSize = 13
    b.TextColor3 = JOJO_WHITE

    b.BackgroundColor3 = JOJO_DARK_PURPLE
    b.BorderSizePixel = 0
    b.AutoButtonColor = false
    b.ZIndex = 10
    b.Parent = mainFrame

    local corner = Instance.new("UICorner")
    corner.CornerRadius = UDim.new(0, 9)
    corner.Parent = b

    local stroke = Instance.new("UIStroke")
    stroke.Color = JOJO_PURPLE
    stroke.Thickness = 2
    stroke.Parent = b

    b.MouseEnter:Connect(function()
        b.BackgroundColor3 = JOJO_PURPLE
        b.TextColor3 = JOJO_GOLD
        stroke.Color = JOJO_GOLD
    end)

    b.MouseLeave:Connect(function()
        b.BackgroundColor3 = JOJO_DARK_PURPLE
        b.TextColor3 = JOJO_WHITE
        stroke.Color = JOJO_PURPLE
    end)

    return b
end

local standBtn = makeButton("STAND: OFF", 68)

local targetBox = Instance.new("TextBox")
targetBox.Size = UDim2.new(0.78, 0, 0, 36)
targetBox.Position = UDim2.new(0.11, 0, 0, 112)
targetBox.PlaceholderText = "ENTER TARGET NAME"
targetBox.ClearTextOnFocus = false
targetBox.Font = Enum.Font.GothamBold
targetBox.TextSize = 13
targetBox.BackgroundColor3 = JOJO_DARK_PURPLE
targetBox.TextColor3 = JOJO_WHITE
targetBox.PlaceholderColor3 = Color3.fromRGB(150, 130, 170)
targetBox.BorderSizePixel = 0
targetBox.ZIndex = 10
targetBox.Parent = mainFrame

local targetCorner = Instance.new("UICorner")
targetCorner.CornerRadius = UDim.new(0, 9)
targetCorner.Parent = targetBox

local targetStroke = Instance.new("UIStroke")
targetStroke.Color = JOJO_PURPLE
targetStroke.Thickness = 2
targetStroke.Parent = targetBox

targetBox.Focused:Connect(function()
    targetStroke.Color = JOJO_GOLD
end)

targetBox.FocusLost:Connect(function()
    targetStroke.Color = JOJO_PURPLE
end)

local punchBtn = makeButton("ORA ORA!", 154)

local function makeSlider(labelText, y, default, min, max, callback)

    local lbl = Instance.new("TextLabel")
    lbl.Size = UDim2.new(0.72, 0, 0, 16)
    lbl.Position = UDim2.new(0.14, 0, 0, y)
    lbl.BackgroundTransparency = 1
    lbl.Text = labelText .. ": " .. tostring(default)
    lbl.TextColor3 = JOJO_GOLD
    lbl.Font = Enum.Font.GothamBold
    lbl.TextSize = 11
    lbl.TextXAlignment = Enum.TextXAlignment.Left
    lbl.ZIndex = 10
    lbl.Parent = mainFrame

    local box = Instance.new("TextBox")
    box.Size = UDim2.new(0.72, 0, 0, 20)
    box.Position = UDim2.new(0.14, 0, 0, y + 16)
    box.Text = tostring(default)
    box.ClearTextOnFocus = false
    box.BackgroundColor3 = JOJO_DARK_PURPLE
    box.TextColor3 = JOJO_WHITE
    box.Font = Enum.Font.GothamBold
    box.TextSize = 13
    box.BorderSizePixel = 0
    box.ZIndex = 10
    box.Parent = mainFrame

    local corner = Instance.new("UICorner")
    corner.CornerRadius = UDim.new(0, 6)
    corner.Parent = box

    local stroke = Instance.new("UIStroke")
    stroke.Color = JOJO_PURPLE
    stroke.Thickness = 1
    stroke.Parent = box

    box.Focused:Connect(function()
        stroke.Color = JOJO_GOLD
    end)

    box.FocusLost:Connect(function()
        stroke.Color = JOJO_PURPLE

        local num = tonumber(box.Text)

        if num then
            num = math.clamp(num, min, max)
            box.Text = tostring(num)
            lbl.Text = labelText .. ": " .. tostring(num)
            callback(num)
        else
            box.Text = tostring(default)
        end
    end)

    return box, lbl
end

local posBox, posLabel = makeSlider(
    "POSITION",
    192,
    standDistance,
    0,
    20,
    function(v)
        standDistance = v
    end
)

local offBox, offLabel = makeSlider(
    "OFFSET",
    220,
    sideOffset,
    -10,
    10,
    function(v)
        sideOffset = v
    end
)

local heightBox, heightLabel = makeSlider(
    "FLOAT HEIGHT",
    248,
    heightOffset,
    0,
    10,
    function(v)
        heightOffset = v
    end
)

-- Dragging
-- The decorative Star Platinum and menacing images are children of mainFrame,
-- so they automatically move with the controller.
do
    local dragging = false
    local dragStart = Vector2.new()
    local startPos = mainFrame.Position

    mainFrame.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1
            or input.UserInputType == Enum.UserInputType.Touch then

            -- Don't drag when clicking controls or decorative images.
            if input.Target == closeBtn
                or input.Target == guiToggle
                or input.Target == targetBox
                or input.Target == standBtn
                or input.Target == punchBtn
                or input.Target == posBox
                or input.Target == offBox
                or input.Target == heightBox then
                return
            end

            dragging = true
            dragStart = input.Position
            startPos = mainFrame.Position

            input.Changed:Connect(function()
                if input.UserInputState == Enum.UserInputState.End then
                    dragging = false
                end
            end)
        end
    end)

    RunService.RenderStepped:Connect(function()
        if dragging then
            local mousePos = UserInputService:GetMouseLocation()
            local delta = mousePos - dragStart

            local newX = math.clamp(
                startPos.X.Offset + delta.X,
                0,
                workspace.CurrentCamera.ViewportSize.X - mainFrame.Size.X.Offset
            )

            local newY = math.clamp(
                startPos.Y.Offset + delta.Y,
                0,
                workspace.CurrentCamera.ViewportSize.Y - mainFrame.Size.Y.Offset
            )

            mainFrame.Position = UDim2.new(0, newX, 0, newY)
        end
    end)
end


local function findTargetByName(namePart)
    if not namePart or namePart == "" then
        return nil
    end

    namePart = namePart:lower()

    for _, p in pairs(Players:GetPlayers()) do
        if p ~= player and p.Name:lower():find(namePart) then
            return p
        end
    end

    return nil
end

local standOn = false
local bp, gyro = nil, nil
local floatTime = 0

local vanished = false
local savedCharacterCFrame = nil
local savedCameraSubject = nil

local VANISH_HEIGHT = 1000

local BLOCK_DISTANCE = 3
local blocking = false

local function enableStand()
    for _, part in pairs(character:GetDescendants()) do
        if part:IsA("BasePart") then
            part.CanCollide = false
        end
    end

    if not bp then
        bp = Instance.new("BodyPosition")
        bp.MaxForce = Vector3.new(4e5, 4e5, 4e5)
        bp.P = 2000
        bp.D = 50
        bp.Position = humanoidRootPart.Position
        bp.Parent = humanoidRootPart
    end

    if not gyro then
        gyro = Instance.new("BodyGyro")
        gyro.P = 2000
        gyro.D = 50
        gyro.MaxTorque = Vector3.new(4e5, 4e5, 4e5)
        gyro.CFrame = humanoidRootPart.CFrame
        gyro.Parent = humanoidRootPart
    end
end

local function disableStand()
    for _, part in pairs(character:GetDescendants()) do
        if part:IsA("BasePart") then
            part.CanCollide = true
        end
    end

    if bp then
        bp:Destroy()
        bp = nil
    end

    if gyro then
        gyro:Destroy()
        gyro = nil
    end
end

standBtn.MouseButton1Click:Connect(function()
    standOn = not standOn

    standBtn.Text = standOn
        and "「 STAND: ON 」"
        or "「 STAND: OFF 」"

    if standOn then
        enableStand()

        local t = findTargetByName(targetBox.Text)

        if t and t.Character and t.Character:FindFirstChild("HumanoidRootPart") then
            for _, id in ipairs(summonSoundIds) do
                local summon = Instance.new("Sound", humanoidRootPart)
                summon.SoundId = id
                summon.Volume = 1
                summon:Play()
                Debris:AddItem(summon, 3)
            end
        end

        SendChatMessage(
            "I am now your stand, type these in chat to control me, VANISH, SUMMON, BARRAGE, BLOCK, UNBLOCK"
        )
    else
        blocking = false
        disableStand()
    end
end)

RunService.RenderStepped:Connect(function(dt)
    if standOn and bp and gyro and targetBox.Text ~= "" then

        if vanished and savedCharacterCFrame then
            bp.Position = Vector3.new(
                savedCharacterCFrame.Position.X,
                VANISH_HEIGHT,
                savedCharacterCFrame.Position.Z
            )

            gyro.CFrame = CFrame.new(
                bp.Position,
                bp.Position + savedCharacterCFrame.LookVector
            )

            return
        end

        floatTime += dt * 2
        local floatOffset = math.sin(floatTime) * 0.5

        local t = findTargetByName(targetBox.Text)

        if t and t.Character and t.Character:FindFirstChild("HumanoidRootPart") then
            local targetHRP = t.Character.HumanoidRootPart
            local tcf = targetHRP.CFrame
            local desiredPos

            if blocking then
                desiredPos =
                    tcf.Position
                    + tcf.LookVector * BLOCK_DISTANCE
                    + Vector3.new(0, heightOffset, 0)
            else
                desiredPos =
                    tcf.Position
                    - tcf.LookVector * standDistance
                    + tcf.RightVector * sideOffset
                    + Vector3.new(0, heightOffset + floatOffset, 0)
            end

            bp.Position = bp.Position:Lerp(
                desiredPos,
                math.clamp(followSpeed, 0.01, 1)
            )

            gyro.CFrame = CFrame.new(
                humanoidRootPart.Position,
                humanoidRootPart.Position + tcf.LookVector
            )
        end
    end
end)

local function runPastebinStyleFling(duration)
    local start = tick()
    local movel = 0.1

    while tick() - start < duration do
        RunService.Heartbeat:Wait()

        local c = player.Character
        local hrp = c and c:FindFirstChild("HumanoidRootPart")

        if hrp then
            local vel = hrp.Velocity

            hrp.Velocity =
                vel * 10000
                + Vector3.new(0, 10000, 0)

            RunService.RenderStepped:Wait()

            hrp.Velocity = vel

            RunService.Stepped:Wait()

            hrp.Velocity =
                vel
                + Vector3.new(0, movel, 0)

            movel = -movel
        end
    end
end

local function punchTarget()
    local punchAnim = Instance.new("Animation")
    punchAnim.AnimationId = "rbxassetid://86464152593138"

    local punchTrack = humanoid:LoadAnimation(punchAnim)
    punchTrack.Priority = Enum.AnimationPriority.Action
    punchTrack:Play()

    task.delay(1, function()
        if punchTrack then
            punchTrack:Stop()
            punchTrack:Destroy()
        end
    end)

    local targetPlayer = findTargetByName(targetBox.Text)

    if not targetPlayer or not targetPlayer.Character then
        return
    end

    local targetHRP =
        targetPlayer.Character:FindFirstChild("HumanoidRootPart")

    if not targetHRP then
        return
    end

    SendChatMessage("ORA! ORA! ORA! ORA!")

    local nearest = GetNearestPlayerInFront(targetPlayer)

    if not nearest then
        return
    end

    local wasStandOn = standOn

    if wasStandOn then
        standOn = false
        standBtn.Text = "「 STAND: OFF 」"
        disableStand()
    end

    humanoidRootPart.CFrame =
        CFrame.new(nearest.Position + Vector3.new(0, 3, 0))

    local tempBP = Instance.new("BodyPosition")
    tempBP.MaxForce = Vector3.new(1e6, 1e6, 1e6)
    tempBP.P = 4000
    tempBP.D = 100
    tempBP.Position = nearest.Position
    tempBP.Parent = humanoidRootPart

    local tempGyro = Instance.new("BodyGyro")
    tempGyro.MaxTorque = Vector3.new(1e6, 1e6, 1e6)
    tempGyro.P = 4000
    tempGyro.D = 100
    tempGyro.CFrame = humanoidRootPart.CFrame
    tempGyro.Parent = humanoidRootPart

    local followConnection

    followConnection = RunService.RenderStepped:Connect(function()
        if not (
            tempBP
            and tempGyro
            and nearest
            and nearest.Parent
        ) then
            return
        end

        tempBP.Position = nearest.Position

        local lookVec = nearest.CFrame.LookVector

        tempGyro.CFrame =
            CFrame.new(
                humanoidRootPart.Position,
                humanoidRootPart.Position + lookVec
            )
    end)

    task.delay(followDuration, function()
        if followConnection then
            followConnection:Disconnect()
            followConnection = nil
        end

        if tempBP then
            tempBP:Destroy()
            tempBP = nil
        end

        if tempGyro then
            tempGyro:Destroy()
            tempGyro = nil
        end
    end)

    local effect = Instance.new("ColorCorrectionEffect")
    effect.Saturation = -1
    effect.Parent = game.Lighting

    local s = Instance.new("Sound", humanoidRootPart)
    s.SoundId = punchSoundId
    s.Volume = 1
    s:Play()
    Debris:AddItem(s, 3)

    task.delay(0.2, function()
        local s2 = Instance.new("Sound", humanoidRootPart)
        s2.SoundId = heavyPunchSoundId
        s2.Volume = 1
        s2:Play()
        Debris:AddItem(s2, 3)
    end)

    task.spawn(function()
        runPastebinStyleFling(flingDuration)
    end)

    task.delay(flingDuration + 0.25, function()
        if followConnection then
            followConnection:Disconnect()
            followConnection = nil
        end

        if tempBP then
            tempBP:Destroy()
            tempBP = nil
        end

        if tempGyro then
            tempGyro:Destroy()
            tempGyro = nil
        end

        if effect and effect.Parent then
            effect:Destroy()
        end

        if wasStandOn then
            standOn = true
            standBtn.Text = "「 STAND: ON 」"
            enableStand()

            if bp then
                bp.Position = humanoidRootPart.Position
            end
        end
    end)
end

punchBtn.MouseButton1Click:Connect(punchTarget)

local function onPlayerChatted(otherPlayer, message)
    local targetName = targetBox.Text

    if not targetName or targetName == "" then
        return
    end

    local lowerMessage = message:lower()

    local targetMatches =
        otherPlayer.Name:lower():find(targetName:lower())

    if not targetMatches then
        return
    end

    if standOn and lowerMessage:find("barrage") then
        punchTarget()
        return
    end

    if lowerMessage:find("block")
        and standOn
        and not vanished
        and not blocking then

        blocking = true
        SendChatMessage("BLOCK")
        return
    end

    if lowerMessage:find("unblock")
        and standOn
        and blocking then

        blocking = false
        SendChatMessage("UNBLOCK")
        return
    end

    if lowerMessage:find("vanish")
        and standOn
        and not vanished then

        vanished = true

        savedCharacterCFrame =
            humanoidRootPart.CFrame

        local camera = workspace.CurrentCamera
        savedCameraSubject = camera.CameraSubject

        humanoidRootPart.CFrame =
            CFrame.new(
                humanoidRootPart.Position.X,
                VANISH_HEIGHT,
                humanoidRootPart.Position.Z
            )

        local target =
            findTargetByName(targetBox.Text)

        if target and target.Character then
            local targetHumanoid =
                target.Character:FindFirstChildOfClass("Humanoid")

            if targetHumanoid then
                camera.CameraSubject = targetHumanoid
            end
        end

        SendChatMessage("Yare Yare Daze")
        return
    end

    if lowerMessage:find("summon") then

        if blocking then
            blocking = false
        end

        if vanished then
            vanished = false

            if savedCharacterCFrame
                and humanoidRootPart
                and humanoidRootPart.Parent then

                humanoidRootPart.CFrame =
                    savedCharacterCFrame
            end

            local camera = workspace.CurrentCamera

            if humanoid then
                camera.CameraSubject = humanoid
            elseif savedCameraSubject then
                camera.CameraSubject = savedCameraSubject
            end

            savedCharacterCFrame = nil
            savedCameraSubject = nil

            SendChatMessage("Star Platinum, Toki wo Tomare")
            return
        end

        standOn = not standOn

        standBtn.Text =
            standOn
            and "「 STAND: ON 」"
            or "「 STAND: OFF 」"

        if standOn then
            enableStand()

            local t =
                findTargetByName(targetBox.Text)

            if t
                and t.Character
                and t.Character:FindFirstChild("HumanoidRootPart") then

                for _, id in ipairs(summonSoundIds) do
                    local summon =
                        Instance.new("Sound", humanoidRootPart)

                    summon.SoundId = id
                    summon.Volume = 1
                    summon:Play()

                    Debris:AddItem(summon, 3)
                end
            end

            SendChatMessage("Star Platinum, Toki wo Tomare")
        else
            disableStand()
        end
    end
end

for _, p in pairs(Players:GetPlayers()) do
    if p ~= player then
        p.Chatted:Connect(function(msg)
            onPlayerChatted(p, msg)
        end)
    end
end

Players.PlayerAdded:Connect(function(p)
    if p ~= player then
        p.Chatted:Connect(function(msg)
            onPlayerChatted(p, msg)
        end)
    end
end)

player.CharacterAdded:Connect(function(char)
    character = char

    humanoidRootPart =
        character:WaitForChild("HumanoidRootPart")

    humanoid =
        character:FindFirstChildOfClass("Humanoid")
        or character:WaitForChild("Humanoid")

    if vanished then
        vanished = false
        savedCharacterCFrame = nil
        savedCameraSubject = nil

        local camera = workspace.CurrentCamera
        camera.CameraSubject = humanoid
    end

    disableStand()

    standOn = false
    blocking = false

    standBtn.Text = "「 STAND: OFF 」"
end)

local levitateIdle = Instance.new("Animation")
levitateIdle.AnimationId = "rbxassetid://122746752555782"

local moveAnim = Instance.new("Animation")
moveAnim.AnimationId = "rbxassetid://10921135644"

local levitateTrack
local moveTrack

local function playLevitateIdle()
    if humanoid and not levitateTrack then
        levitateTrack =
            humanoid:LoadAnimation(levitateIdle)

        levitateTrack.Priority =
            Enum.AnimationPriority.Idle

        levitateTrack.Looped = true
        levitateTrack:Play()
    end
end

local function stopLevitateIdle()
    if levitateTrack then
        levitateTrack:Stop()
        levitateTrack:Destroy()
        levitateTrack = nil
    end
end

local function playMoveAnim()
    if humanoid and not moveTrack then
        moveTrack =
            humanoid:LoadAnimation(moveAnim)

        moveTrack.Priority =
            Enum.AnimationPriority.Movement

        moveTrack.Looped = true
        moveTrack:Play()
    end
end

local function stopMoveAnim()
    if moveTrack then
        moveTrack:Stop()
        moveTrack:Destroy()
        moveTrack = nil
    end
end

RunService.RenderStepped:Connect(function(dt)
    if standOn then
        local target =
            findTargetByName(targetBox.Text)

        if target
            and target.Character
            and target.Character:FindFirstChild("HumanoidRootPart") then

            local targetHumanoid =
                target.Character:FindFirstChildOfClass("Humanoid")

            if targetHumanoid then
                if targetHumanoid.MoveDirection.Magnitude > 0 then
                    stopLevitateIdle()
                    playMoveAnim()
                else
                    stopMoveAnim()
                    playLevitateIdle()
                end
            end
        else
            stopMoveAnim()
            playLevitateIdle()
        end
    else
        stopLevitateIdle()
        stopMoveAnim()
    end
end)

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

local player = Players.LocalPlayer
local noclip = false

local function setNoclip(enabled)
	noclip = enabled
end

UserInputService.InputBegan:Connect(function(input, gameProcessed)
	if gameProcessed then return end

	if input.KeyCode == Enum.KeyCode.N then
		setNoclip(not noclip)
		print("Noclip:", noclip and "ON" or "OFF")
	end
end)

RunService.Stepped:Connect(function()
	if not noclip then return end

	local character = player.Character
	if not character then return end

	for _, part in ipairs(character:GetDescendants()) do
		if part:IsA("BasePart") then
			part.CanCollide = false
		end
	end
end)

Features & Information

⭐ JoJo Stand Controller — Star Platinum -pls give me your honest opinion on this script so i know what to add or fix- ALSO [THE WORLD] VERSION IS OUT ON MY PROFILE Original script by [GuestEZQ](https://scriptblox.com/u/GuestEZQ) This version has been tweaked and modified by me. All credit for the original script goes to GuestEZQ. A JoJo-inspired Stand Controller with target following, blocking, vanish/summon, barrage, animations, sounds, and a [REDACTED] GUI. 🎮 How to Use 1. Execute the script. 2. Enter the **target player's name** in the Target Name box. 3. Press **Stand: OFF** to activate the Stand. 4. The Stand will automatically follow the selected player. 💬 Chat Commands Type these commands in chat: `SUMMON` — Summons/activates the Stand. `VANISH` — Sends your character high into the sky while your camera follows the target. `SUMMON` — Returns your character after VANISH. `BARRAGE` — Performs the Skull Crusher/Barrage attack. `BLOCK` — Moves the Stand in front of the target. `UNBLOCK` — Stops blocking. 👊 Skull Crusher Use the **ORA! ORA!** button in the GUI to perform the attack. Includes: Punch animation ORA! ORA! ORA! voice line Punch sound effects Fling effect Temporary color effect ⚙️ GUI Settings Position — Controls how far behind the target the Stand stays. Offset — Moves the Stand left/right. Float Height — Controls the Stand's height. GUI— Hides/shows the controller. GUI can be [REDACTED] around the screen. 🕴️ Stand Animations The Stand automatically switches between an idle levitation animation and a movement animation depending on whether the target is moving. 🔧 Extra Press N to toggle the included noclip feature.-for places with thick walls 📜 Credits Original Script: [GuestEZQ](https://scriptblox.com/u/GuestEZQ) Current version: Tweaked/modified version of GuestEZQ's script. Please give credit to GuestEZQ for the original work.
#JJBA STAND#JoJo#UNIVERSAL#Stand#Block

Community Comments (8)

StaticAmourStaticAmourSep 28, 2026

Ill frequently update this so just tell me what i need to add or any bugs to fix:)

Replying to @StaticAmour
alidabestjralidabestjrSep 28, 2026

@StaticAmour what game is this for?

Replying to @alidabestjr
StaticAmourStaticAmourSep 29, 2026

@alidabestjr its universal

Replying to @StaticAmour
guynamedskyguynamedskySep 28, 2026

@StaticAmour add a option to remove the text perhaps?

Replying to @guynamedsky
StaticAmourStaticAmourSep 29, 2026

@guynamedsky I will but in the meanwhile you can look through the script and change it

StaticAmourStaticAmourOct 3, 2026

im working on a THE WORLD script right might be up an a couple weeks

daggydraftydaggydraftyOct 9, 2026

This script is pretty bizarre. One might even say it's a golden experience to use.

NEON_TEAMNEON_TEAMOct 10, 2026

I used an old script before, and it was good! But THIS ONE IS THE BOMB!!! MAKE EVEN MORE SCRIPTS!

More Scripts for Universal Scripts