
KeylessUniversal

-- ================================================
-- 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")No comments yet for this script.



