Spawn Follower/Husk
Key RequiredUniversal

Spawn Follower/Husk

Universal ScriptMexicoeggMexicoegg 220 views 1.4K executesUpdated Aug 22, 2026
Unrated
00
Lua Script•357 lines (6414 chars)
local Players=game:GetService("Players")
local RunService=game:GetService("RunService")
local Debris=game:GetService("Debris")

local Player=Players.LocalPlayer
local Target=Player

local PURPLE=Color3.fromRGB(170,0,255)

local TRAIL_DELAY=1
local RECORD_RATE=.03
local INDICATOR_TIME=3
local INITIAL_DELAY=3
local FOLLOWER_LIFETIME=60
local RESPAWN_DELAY=30
local FOLLOWER_DELAY=1.2

local Followers={}
local Trail={}
local Running=true
local SpawnQueue=0
local Spawning=false

local function getCharacter()
	return Target.Character
end

local function getRoot()
	local Character=getCharacter()
	if not Character then return end
	return Character:FindFirstChild("HumanoidRootPart")
end

local function clearFollowers()
	for i=#Followers,1,-1 do
		local F=Followers[i]
		if F.Model then
			F.Model:Destroy()
		end
		table.remove(Followers,i)
	end
end

local function safeSpawn(Position)
	local NewPosition=Position

	for _,F in ipairs(Followers) do
		if F.Model and F.Model.Parent then
			if (NewPosition-F.Body.Position).Magnitude<6 then
				NewPosition+=Vector3.new(6,0,0)
			end
		end
	end

	return NewPosition
end

local function makeIndicator(Position)
	local Indicator=Instance.new("Part")
	Indicator.Name="FollowerIndicator"
	Indicator.Size=Vector3.new(2,2,2)
	Indicator.Color=PURPLE
	Indicator.Material=Enum.Material.Neon
	Indicator.Anchored=true
	Indicator.CanCollide=false
	Indicator.CanTouch=false
	Indicator.CanQuery=false
	Indicator.CFrame=CFrame.new(Position)
	Indicator.Parent=workspace

	local Sound=Instance.new("Sound")
	Sound.SoundId="rbxassetid://139310882854462"
	Sound.Looped=true
	Sound.Volume=1
	Sound.Parent=Indicator
	Sound:Play()

	local Rotation=0

	local Connection

	Connection=RunService.Heartbeat:Connect(function(DT)
		if not Indicator.Parent then
			Connection:Disconnect()
			return
		end

		Rotation+=DT*35

		Indicator.CFrame=
			CFrame.new(Position)*
			CFrame.Angles(
				Rotation,
				Rotation*1.3,
				Rotation*1.7
			)
	end)

	return Indicator,Connection
end

local function createDeathBlocks(Position)
	for i=1,20 do
		local Block=Instance.new("Part")
		Block.Name="PurpleMiniBlock"
		Block.Size=Vector3.new(.4,.4,.4)
		Block.Color=PURPLE
		Block.Material=Enum.Material.Neon
		Block.Anchored=false
		Block.CanCollide=true

		Block.Position=
			Position+
			Vector3.new(
				math.random(-2,2),
				math.random(0,4),
				math.random(-2,2)
			)

		Block.Parent=workspace

		Block.AssemblyLinearVelocity=
			Vector3.new(
				math.random(-15,15),
				math.random(5,25),
				math.random(-15,15)
			)

		Debris:AddItem(Block,5)
	end
end

local function killTarget()
	local Character=getCharacter()
	if not Character then return end

	local Humanoid=Character:FindFirstChildOfClass("Humanoid")
	local Root=Character:FindFirstChild("HumanoidRootPart")

	if not Humanoid or Humanoid.Health<=0 then
		return
	end

	if Root then
		createDeathBlocks(Root.Position)
	end

	local Sound=Instance.new("Sound")
	Sound.SoundId="rbxassetid://107071619177667"
	Sound.Volume=3
	Sound.Parent=workspace
	Sound:Play()

	Debris:AddItem(Sound,5)

	Humanoid.Health=0
end

local function createFollower(Position)
	local Model=Instance.new("Model")
	Model.Name="Follower"

	local Body=Instance.new("Part")
	Body.Name="Body"
	Body.Size=Vector3.new(2,5,2)
	Body.Color=PURPLE
	Body.Material=Enum.Material.Neon
	Body.Anchored=true
	Body.CanCollide=false
	Body.CanTouch=false
	Body.CanQuery=false
	Body.CFrame=CFrame.new(Position)
	Body.Parent=Model

	local Hitbox=Instance.new("Part")
	Hitbox.Name="Hitbox"
	Hitbox.Size=Vector3.new(2.5,5.5,2.5)
	Hitbox.Transparency=1
	Hitbox.Anchored=true
	Hitbox.CanCollide=false
	Hitbox.CanTouch=true
	Hitbox.CanQuery=true
	Hitbox.CFrame=CFrame.new(Position)
	Hitbox.Parent=Model

	Model.PrimaryPart=Body
	Model.Parent=workspace

	local ChaseSound=Instance.new("Sound")
	ChaseSound.Name="ChaseSound"
	ChaseSound.SoundId="rbxassetid://7405472944"
	ChaseSound.Looped=true
	ChaseSound.Volume=1
	ChaseSound.Parent=Model
	ChaseSound:Play()

	local Data={
		Model=Model,
		Body=Body,
		Hitbox=Hitbox,
		SpawnTime=os.clock(),
		Alive=true
	}

	table.insert(Followers,Data)

	Hitbox.Touched:Connect(function(Hit)
		if not Data.Alive then
			return
		end

		local Character=Hit:FindFirstAncestorOfClass("Model")

		if Character==getCharacter() then
			Data.Alive=false
			killTarget()
		end
	end)
end

local function spawnFollower()
	local Root=getRoot()

	if not Root then
		return
	end

	local Position=safeSpawn(Root.Position)

	local Indicator,Connection=makeIndicator(Position)

	task.wait(INDICATOR_TIME)

	if Connection then
		Connection:Disconnect()
	end

	if Indicator then
		Indicator:Destroy()
	end

	if Running then
		createFollower(Position)
	end
end

local function requestFollower()
	SpawnQueue+=1

	if Spawning then
		return
	end

	Spawning=true

	task.spawn(function()
		while SpawnQueue>0 and Running do
			SpawnQueue-=1

			spawnFollower()

			if SpawnQueue>0 then
				task.wait(FOLLOWER_DELAY)
			end
		end

		Spawning=false
	end)
end

RunService.Heartbeat:Connect(function()
	if not Running then
		return
	end

	local Root=getRoot()

	if Root then
		table.insert(Trail,{
			Time=os.clock(),
			CFrame=Root.CFrame
		})
	end

	local Cutoff=os.clock()-10

	while #Trail>0 and Trail[1].Time<Cutoff do
		table.remove(Trail,1)
	end

	local Now=os.clock()

	for i=#Followers,1,-1 do
		local F=Followers[i]

		if not F.Model or not F.Model.Parent then
			table.remove(Followers,i)
			continue
		end

		if Now-F.SpawnTime>=FOLLOWER_LIFETIME then
			local Position=F.Body.Position

			F.Alive=false

			local Explosion=Instance.new("Explosion")
			Explosion.Position=Position
			Explosion.BlastRadius=8
			Explosion.BlastPressure=0
			Explosion.DestroyJointRadiusPercent=0
			Explosion.Parent=workspace

			F.Model:Destroy()
			table.remove(Followers,i)

			task.delay(RESPAWN_DELAY,function()
				if Running then
					requestFollower()
				end
			end)

			continue
		end

		local WantedTime=Now-TRAIL_DELAY
		local OldCFrame

		for j=#Trail,1,-1 do
			if Trail[j].Time<=WantedTime then
				OldCFrame=Trail[j].CFrame
				break
			end
		end

		if OldCFrame then
			F.Body.CFrame=OldCFrame
			F.Hitbox.CFrame=OldCFrame
		end
	end
end)

Player.CharacterAdded:Connect(function()
	clearFollowers()
	table.clear(Trail)

	task.wait(INITIAL_DELAY)

	if Running then
		requestFollower()
	end
end)

task.wait(INITIAL_DELAY)

if Running and getRoot() then
	requestFollower()
end

Features & Information

Follower is just a ripoff of husk from nullscape lol Want to make game your playing harder? then try this script! you know what it does if u know how husk from nullscape works and also start moving when purple box appears.

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts