JoJo Stand
Key RequiredUniversal

JoJo Stand

Universal ScriptGOOGLEEXPLOITSGOOGLEEXPLOITS 556 views 3.4K executesUpdated Sep 7, 2026
0.0/ 5(1 votes)
010% Positive
Lua Script•341 lines (9662 chars)
-- ================================================
-- JOJO STAND SYSTEM
-- Stand stays more distant
-- Never attacks the Stand owner
-- Attacks Players + NPCs
-- ================================================

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

local player = Players.LocalPlayer
local mouse = player:GetMouse()
local playerGui = player:WaitForChild("PlayerGui")

print("⭐ JoJo Stand System Loading...")

if playerGui:FindFirstChild("StandGUI") then
	playerGui.StandGUI:Destroy()
end

local stand = nil
local standRoot = nil
local connection = nil
local selected = false
local floating = false
local defenseOn = true
local usedParts = {}

-- ==================== GUI ====================
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "StandGUI"
screenGui.ResetOnSpawn = false
screenGui.Parent = playerGui

local function createButton(text, yPos, color)
	local btn = Instance.new("TextButton")
	btn.Size = UDim2.new(0, 150, 0, 40)
	btn.Position = UDim2.new(0, 15, 0, yPos)
	btn.BackgroundColor3 = color
	btn.Text = text
	btn.TextColor3 = Color3.new(1,1,1)
	btn.TextScaled = true
	btn.Font = Enum.Font.GothamBold
	btn.Parent = screenGui
	Instance.new("UICorner", btn)
	return btn
end

local punchBtn = createButton("PUNCH", 80, Color3.fromRGB(180, 50, 50))
local kickBtn = createButton("KICK", 130, Color3.fromRGB(200, 120, 40))
local floatBtn = createButton("FLOAT", 180, Color3.fromRGB(50, 100, 180))
local specialBtn = createButton("SPECIAL", 230, Color3.fromRGB(140, 50, 180))
local buildBtn = createButton("BUILD STAND", 280, Color3.fromRGB(80, 80, 80))

local statusLabel = Instance.new("TextLabel")
statusLabel.Size = UDim2.new(0, 160, 0, 30)
statusLabel.Position = UDim2.new(0, 15, 0, 40)
statusLabel.BackgroundTransparency = 1
statusLabel.Text = "Click NPC or Build"
statusLabel.TextColor3 = Color3.new(1,1,1)
statusLabel.TextScaled = true
statusLabel.Parent = screenGui

-- ==================== BUILD FROM PARTS ====================
local function getUnanchoredParts()
	local parts = {}
	for _, obj in ipairs(workspace:GetDescendants()) do
		if obj:IsA("BasePart") and not obj.Anchored then
			local model = obj:FindFirstAncestorOfClass("Model")
			if model and Players:GetPlayerFromCharacter(model) then
				continue
			end
			if not table.find(usedParts, obj) then
				table.insert(parts, obj)
			end
		end
	end
	return parts
end

local function buildStandFromParts()
	local parts = getUnanchoredParts()
	if #parts < 3 then
		statusLabel.Text = "Not enough parts"
		return nil
	end

	local model = Instance.new("Model")
	model.Name = "PartStand"

	local root = Instance.new("Part")
	root.Name = "HumanoidRootPart"
	root.Size = Vector3.new(2, 2, 1)
	root.Transparency = 1
	root.Anchored = true
	root.CanCollide = false
	root.Massless = true
	root.Parent = model
	model.PrimaryPart = root

	local amount = math.min(#parts, math.random(6, 14))
	local height = math.random(6, 14)

	for i = 1, amount do
		local part = parts[i]
		table.insert(usedParts, part)
		pcall(function()
			part.Anchored = true
			part.CanCollide = false
			part.Massless = true
			part.Parent = model
			part.CFrame = root.CFrame * CFrame.new(math.random(-3,3), math.random(0,height), math.random(-2,2))
			local w = Instance.new("WeldConstraint")
			w.Part0 = root
			w.Part1 = part
			w.Parent = root
		end)
	end

	Instance.new("Humanoid", model)
	model.Parent = workspace
	statusLabel.Text = "Stand Built!"
	return model
end

-- ==================== TARGET (never yourself / never your stand) ====================
local function getClosestTarget(range)
	local character = player.Character
	if not character then return nil end
	local root = character:FindFirstChild("HumanoidRootPart")
	if not root then return nil end

	local closest, closestDist = nil, range or 25

	-- Players (skip yourself)
	for _, plr in ipairs(Players:GetPlayers()) do
		if plr ~= player and plr.Character then
			local tRoot = plr.Character:FindFirstChild("HumanoidRootPart")
			local hum = plr.Character:FindFirstChildOfClass("Humanoid")
			if tRoot and hum and hum.Health > 0 then
				local dist = (root.Position - tRoot.Position).Magnitude
				if dist < closestDist then
					closestDist = dist
					closest = plr.Character
				end
			end
		end
	end

	-- NPCs (skip your own stand)
	for _, obj in ipairs(workspace:GetDescendants()) do
		if obj:IsA("Model") and obj:FindFirstChildOfClass("Humanoid") then
			if obj ~= stand and obj ~= character and not Players:GetPlayerFromCharacter(obj) then
				local tRoot = obj:FindFirstChild("HumanoidRootPart") or obj.PrimaryPart
				local hum = obj:FindFirstChildOfClass("Humanoid")
				if tRoot and hum and hum.Health > 0 then
					local dist = (root.Position - tRoot.Position).Magnitude
					if dist < closestDist then
						closestDist = dist
						closest = obj
					end
				end
			end
		end
	end

	return closest
end

local function flingTarget(target, power)
	if not target or target == player.Character or target == stand then return end

	local root = target:FindFirstChild("HumanoidRootPart") or target.PrimaryPart
	local hum = target:FindFirstChildOfClass("Humanoid")
	if not root then return end

	for _, part in ipairs(target:GetDescendants()) do
		if part:IsA("BasePart") then
			pcall(function()
				part:SetNetworkOwner(player)
				part.Anchored = false
			end)
		end
	end

	local dir = player.Character.HumanoidRootPart.CFrame.LookVector
	root.AssemblyLinearVelocity = dir * power + Vector3.new(0, power * 0.4, 0)
	root.AssemblyAngularVelocity = Vector3.new(
		math.random(-80, 80),
		math.random(-80, 80),
		math.random(-80, 80)
	)

	if hum and not Players:GetPlayerFromCharacter(target) then
		hum.Health = 0
	end
end

local function specialEffect(target)
	if not target or target == player.Character or target == stand then return end

	for _, part in ipairs(target:GetDescendants()) do
		if part:IsA("BasePart") then
			pcall(function()
				part.Anchored = false
				part.CanCollide = true
				part:BreakJoints()
				part.AssemblyLinearVelocity = Vector3.new(
					math.random(-60, 60),
					math.random(50, 100),
					math.random(-60, 60)
				)
			end)
		end
	end

	local hum = target:FindFirstChildOfClass("Humanoid")
	if hum then hum.Health = 0 end
end

-- ==================== START STAND (more distant) ====================
local function startStand(npc)
	local character = player.Character
	if not character then return end
	local root = character:FindFirstChild("HumanoidRootPart")
	standRoot = npc:FindFirstChild("HumanoidRootPart") or npc.PrimaryPart
	if not root or not standRoot then return end

	stand = npc
	selected = true
	statusLabel.Text = "Stand: " .. npc.Name

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

	if connection then connection:Disconnect() end

	connection = RunService.Heartbeat:Connect(function()
		if not stand or not stand.Parent or not root or not root.Parent then return end
		local sRoot = stand:FindFirstChild("HumanoidRootPart") or stand.PrimaryPart
		if not sRoot then return end

		local time = tick()

		-- More distant position (further back + a bit to the right)
		sRoot.CFrame = root.CFrame * CFrame.new(2.4, 1.5 + math.sin(time * 2) * 0.35, 4.5)

		if floating then
			root.AssemblyLinearVelocity = Vector3.new(
				root.AssemblyLinearVelocity.X,
				7 + math.sin(time * 2) * 2,
				root.AssemblyLinearVelocity.Z
			)
		end

		if defenseOn then
			for _, obj in ipairs(workspace:GetDescendants()) do
				if obj:IsA("BasePart") then
					local name = string.lower(obj.Name)
					if obj:FindFirstChildOfClass("TouchInterest") or string.find(name, "kill") or string.find(name, "lava") then
						if (root.Position - obj.Position).Magnitude < 9 then
							local dir = (root.Position - obj.Position).Unit
							root.CFrame = CFrame.new(root.Position + dir * 22 + Vector3.new(0, 5, 0))
							break
						end
					end
				end
			end
		end
	end)
end

-- Select NPC
mouse.Button1Down:Connect(function()
	if selected then return end
	local target = mouse.Target
	if not target then return end
	local model = target:FindFirstAncestorOfClass("Model")
	if not model then return end
	if not model:FindFirstChildOfClass("Humanoid") then return end
	if Players:GetPlayerFromCharacter(model) then return end
	startStand(model)
end)

-- Build Stand
buildBtn.MouseButton1Click:Connect(function()
	if selected then return end
	local partStand = buildStandFromParts()
	if partStand then
		startStand(partStand)
	end
end)

-- Attacks
punchBtn.MouseButton1Click:Connect(function()
	if not selected then return end
	local target = getClosestTarget(25)
	if target then
		flingTarget(target, 180)
		statusLabel.Text = "PUNCH!"
	else
		statusLabel.Text = "No target"
	end
end)

kickBtn.MouseButton1Click:Connect(function()
	if not selected then return end
	local target = getClosestTarget(25)
	if target then
		flingTarget(target, 260)
		statusLabel.Text = "KICK!"
	else
		statusLabel.Text = "No target"
	end
end)

floatBtn.MouseButton1Click:Connect(function()
	floating = not floating
	floatBtn.Text = floating and "FLOAT: ON" or "FLOAT"
	floatBtn.BackgroundColor3 = floating and Color3.fromRGB(0, 160, 80) or Color3.fromRGB(50, 100, 180)
end)

specialBtn.MouseButton1Click:Connect(function()
	if not selected then return end
	local target = getClosestTarget(28)
	if target then
		specialEffect(target)
		statusLabel.Text = "SPECIAL!"
	else
		statusLabel.Text = "No target"
	end
end)

print("✅ JoJo Stand Ready!")
print("• Stand is more distant")
print("• Will never attack you or your own Stand")
print("• Attacks work on other Players + NPCs")

Features & Information

Idk choose a npc to be your stand.

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts