-- ================================================ -- 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")