Projection Sorcery
Key RequiredUniversal

Projection Sorcery

Universal ScriptVeryFreshNoirVeryFreshNoir 2.8K views 230 executesUpdated Aug 16, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•393 lines (11713 chars)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local TweenService = game:GetService("TweenService")
local LocalPlayer = Players.LocalPlayer

if game:GetService("CoreGui"):FindFirstChild("NaoyaGui") then
   game:GetService("CoreGui").NaoyaGui:Destroy()
end
if LocalPlayer.Character then
   if LocalPlayer.Character:FindFirstChild("NaoyaTheme") then LocalPlayer.Character.NaoyaTheme:Destroy() end
   if LocalPlayer.Character:FindFirstChild("NaoyaTrailAttachment1") then LocalPlayer.Character.NaoyaTrailAttachment1:Destroy() end
   if LocalPlayer.Character:FindFirstChild("NaoyaTrailAttachment2") then LocalPlayer.Character.NaoyaTrailAttachment2:Destroy() end
   if LocalPlayer.Character:FindFirstChild("NaoyaSpeedTrail") then LocalPlayer.Character.NaoyaSpeedTrail:Destroy() end
end

local isActive = false
local isLockedOut = false 
local currentMultiplier = 1.0
local stamina = 100
local maxStamina = 100
local speedTimer = 0
local cloneTimer = 0 
local speedHighlight = nil
local audioTrack = nil
local movementTrail = nil
local att1, att2 = nil, nil

local NaoyaGui = Instance.new("ScreenGui")
local MainFrame = Instance.new("Frame")
local UIStroke = Instance.new("UIStroke")
local Title = Instance.new("TextLabel")
local ToggleButton = Instance.new("TextButton")
local StaminaBackground = Instance.new("Frame")
local StaminaBar = Instance.new("Frame")
local UIGradient = Instance.new("UIGradient")
local SpeedDisplay = Instance.new("TextLabel")

NaoyaGui.Name = "NaoyaGui"
NaoyaGui.Parent = game:GetService("CoreGui")
NaoyaGui.ResetOnSpawn = false

MainFrame.Name = "MainFrame"
MainFrame.Parent = NaoyaGui
MainFrame.BackgroundColor3 = Color3.fromRGB(8, 8, 10)
MainFrame.Position = UDim2.new(0.05, 0, 0.4, 0)
MainFrame.Size = UDim2.new(0, 250, 0, 150)
MainFrame.Active = true
MainFrame.Draggable = true

UIStroke.Color = Color3.fromRGB(0, 140, 255)
UIStroke.Thickness = 2
UIStroke.Parent = MainFrame

Title.Name = "Title"
Title.Parent = MainFrame
Title.BackgroundTransparency = 1
Title.Position = UDim2.new(0, 0, 0, 10)
Title.Size = UDim2.new(1, 0, 0, 25)
Title.Font = Enum.Font.RobotoMono
Title.Text = "Projection Sorcery" -- REQUESTED TEXT
Title.TextColor3 = Color3.fromRGB(255, 255, 255)
Title.TextSize = 15

ToggleButton.Name = "ToggleButton"
ToggleButton.Parent = MainFrame
ToggleButton.BackgroundColor3 = Color3.fromRGB(15, 15, 18)
ToggleButton.BorderSizePixel = 1
ToggleButton.BorderColor3 = Color3.fromRGB(255, 50, 50)
ToggleButton.Position = UDim2.new(0.08, 0, 0.32, 0)
ToggleButton.Size = UDim2.new(0.84, 0, 0, 34)
ToggleButton.Font = Enum.Font.SourceSansBold
ToggleButton.Text = "Off"
ToggleButton.TextColor3 = Color3.fromRGB(255, 75, 75)
ToggleButton.TextSize = 16

StaminaBackground.Name = "StaminaBackground"
StaminaBackground.Parent = MainFrame
StaminaBackground.BackgroundColor3 = Color3.fromRGB(20, 20, 24)
StaminaBackground.BorderSizePixel = 1
StaminaBackground.BorderColor3 = Color3.fromRGB(35, 35, 40)
StaminaBackground.Position = UDim2.new(0.08, 0, 0.64, 0)
StaminaBackground.Size = UDim2.new(0.84, 0, 0, 10)

StaminaBar.Name = "StaminaBar"
StaminaBar.Parent = StaminaBackground
StaminaBar.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
StaminaBar.BorderSizePixel = 0
StaminaBar.Size = UDim2.new(1, 0, 1, 0)

UIGradient.Color = ColorSequence.new{
   ColorSequenceKeypoint.new(0, Color3.fromRGB(0, 100, 255)),
   ColorSequenceKeypoint.new(1, Color3.fromRGB(0, 220, 255))
}
UIGradient.Parent = StaminaBar

SpeedDisplay.Name = "SpeedDisplay"
SpeedDisplay.Parent = MainFrame
SpeedDisplay.BackgroundTransparency = 1
SpeedDisplay.Position = UDim2.new(0, 0, 0.78, 0)
SpeedDisplay.Size = UDim2.new(1, 0, 0, 20)
SpeedDisplay.Font = Enum.Font.SourceSans
SpeedDisplay.Text = "VELOCITY BOOSTER: 0.0"
SpeedDisplay.TextColor3 = Color3.fromRGB(160, 160, 160)
SpeedDisplay.TextSize = 12

local function createProjectionClone(char)
   if not char or not char:FindFirstChild("HumanoidRootPart") then return end
   
   local cloneModel = Instance.new("Model")
   cloneModel.Name = "NaoyaSorceryAfterimage"
   cloneModel.Parent = workspace
   
   local rootOrigin = char.HumanoidRootPart.CFrame
   
 
   for _, item in pairs(char:GetChildren()) do
       if item:IsA("BasePart") and item.Name ~= "HumanoidRootPart" then
           local partCopy = item:Clone()
           partCopy.CanCollide = false
           partCopy.CastShadow = false
           partCopy.Color = Color3.fromRGB(0, 130, 255)
           partCopy.Material = Enum.Material.Neon
           partCopy.Transparency = 0.45
           partCopy.Parent = cloneModel
           
           local relativeCFrame = char.HumanoidRootPart.CFrame:ToObjectSpace(item.CFrame)
           partCopy.CFrame = rootOrigin:ToWorldSpace(relativeCFrame)
           partCopy.Anchored = true
           
           
           for _, subItem in pairs(partCopy:GetChildren()) do
               if not subItem:IsA("SpecialMesh") and not subItem:IsA("BlockMesh") and not subItem:IsA("CylinderMesh") then
                   subItem:Destroy()
               end
           end
           
          
           task.delay(2.2, function()
               if partCopy then
                   local fadeTween = TweenService:Create(partCopy, TweenInfo.new(0.8, Enum.EasingStyle.Linear), {Transparency = 1})
                   fadeTween:Play()
               end
           end)
       end
   end
   
   
   task.delay(3.0, function()
       cloneModel:Destroy()
   end)
end


local function manageAudio(state)
   local character = LocalPlayer.Character
   local rootPart = character and character:FindFirstChild("HumanoidRootPart")
   if not rootPart then return end
   
   if state == "PLAY" then
       if not audioTrack or audioTrack.Parent ~= rootPart then
           if audioTrack then audioTrack:Destroy() end
           audioTrack = Instance.new("Sound")
           audioTrack.Name = "NaoyaTheme"
           audioTrack.SoundId = "rbxassetid://9046863110" -- Defeat Here - Jujutsu Kaisen Track ID
           audioTrack.Volume = 2.5
           audioTrack.Looped = true
           audioTrack.Parent = rootPart
       end
       audioTrack.Volume = 2.5
       if not audioTrack.IsPlaying then audioTrack:Play() end
   elseif state == "FADE" then
       if audioTrack and audioTrack.IsPlaying then
           local fadeTween = TweenService:Create(audioTrack, TweenInfo.new(1.5, Enum.EasingStyle.Linear), {Volume = 0})
           fadeTween:Play()
           task.delay(1.5, function()
               if audioTrack and audioTrack.Volume == 0 then audioTrack:Stop() end
           end)
       end
   end
end

local function manageTrail(state)
   local character = LocalPlayer.Character
   local rootPart = character and character:FindFirstChild("HumanoidRootPart")
   if not rootPart then return end

   if state == "ENABLE" then
       if not movementTrail or movementTrail.Parent ~= character then
           att1 = Instance.new("Attachment")
           att1.Name = "NaoyaTrailAttachment1"
           att1.Position = Vector3.new(0, 2, 0)
           att1.Parent = rootPart

           att2 = Instance.new("Attachment")
           att2.Name = "NaoyaTrailAttachment2"
           att2.Position = Vector3.new(0, -2, 0)
           att2.Parent = rootPart

           movementTrail = Instance.new("Trail")
           movementTrail.Name = "NaoyaSpeedTrail"
           movementTrail.Attachment0 = att1
           movementTrail.Attachment1 = att2
           movementTrail.FaceCamera = true
           movementTrail.Lifetime = 0.45 
           movementTrail.Color = ColorSequence.new(Color3.fromRGB(0, 180, 255))
           movementTrail.Transparency = NumberSequence.new({
               NumberSequenceKeypoint.new(0, 0.1),
               NumberSequenceKeypoint.new(1, 1)
           })
           movementTrail.Parent = character
       end
       movementTrail.Enabled = true
   elseif state == "DISABLE" then
       if movementTrail then movementTrail.Enabled = false end
   end
end

local function updateOutline()
   local character = LocalPlayer.Character
   if isActive and character then
       if not speedHighlight or speedHighlight.Parent ~= character then
           if speedHighlight then speedHighlight:Destroy() end
           speedHighlight = Instance.new("Highlight")
           speedHighlight.Name = "NaoyaRunOutline"
           speedHighlight.OutlineColor = Color3.fromRGB(0, 180, 255)
           speedHighlight.OutlineTransparency = 0.1
           speedHighlight.FillColor = Color3.fromRGB(0, 100, 255)
           speedHighlight.FillTransparency = 0.85
           speedHighlight.Adornee = character
           speedHighlight.Parent = character
       end
   else
       if speedHighlight then
           speedHighlight:Destroy()
           speedHighlight = nil
       end
   end
end

local function toggleState()
   if isLockedOut and not isActive then return end 
   
   isActive = not isActive
   if isActive then
       ToggleButton.Text = "On"
       ToggleButton.TextColor3 = Color3.fromRGB(75, 255, 75)
       ToggleButton.BorderColor3 = Color3.fromRGB(75, 255, 75)
       manageAudio("PLAY")
       manageTrail("ENABLE")
       cloneTimer = 0 
   else
       isActive = false
       ToggleButton.Text = "Off"

ToggleButton.TextColor3 = Color3.fromRGB(255, 75, 75)

ToggleButton.BorderColor3 = Color3.fromRGB(255, 50, 50)

currentMultiplier = 1.0

speedTimer = 0

manageAudio("FADE")

manageTrail("DISABLE")

end

updateOutline()

end

ToggleButton.MouseButton1Click:Connect(toggleState)

LocalPlayer.CharacterAdded:Connect(function()

task.wait(0.5)

if isActive then

updateOutline()

manageAudio("PLAY")

manageTrail("ENABLE")

end

end)

-- Balanced Heartbeat Teleportation Loop

RunService.Heartbeat:Connect(function(deltaTime)

local character = LocalPlayer.Character

local humanoid = character and character:FindFirstChildOfClass("Humanoid")

local rootPart = character and character:FindFirstChild("HumanoidRootPart")

if not humanoid or not rootPart or humanoid.Health <= 0 then

if isActive then toggleState() end

return

end

if isActive then

if stamina > 0 then

speedTimer = speedTimer + deltaTime

cloneTimer = cloneTimer + deltaTime

if speedTimer >= 3.5 then

currentMultiplier = math.clamp(currentMultiplier * 1.5, 1.0, 5.2)

speedTimer = 0

end

-- Consumes stamina perfectly balanced to match the Defeat Here timeline (Drains over ~120s)

stamina = math.clamp(stamina - (0.83 * deltaTime), 0, maxStamina)

if humanoid.MoveDirection.Magnitude > 0 then

local positionOffset = humanoid.MoveDirection * (currentMultiplier * 16 * deltaTime)

rootPart.CFrame = rootPart.CFrame + positionOffset

if movementTrail then movementTrail.Enabled = true end

-- Drops an animation matching clone exactly every 0.35 seconds

if cloneTimer >= 0.35 then

createProjectionClone(character)

cloneTimer = 0

end

else

if movementTrail then movementTrail.Enabled = false end

end

else

toggleState()

isLockedOut = true

ToggleButton.Text = "RECHARGING..."

ToggleButton.TextColor3 = Color3.fromRGB(255, 140, 0)

ToggleButton.BorderColor3 = Color3.fromRGB(255, 140, 0)

end

else

-- Heals as much as it lasts (Set to match the slow 0.83 active depletion rate exactly)

stamina = math.clamp(stamina + (0.83 * deltaTime), 0, maxStamina)

if isLockedOut and stamina >= maxStamina then

isLockedOut = false

ToggleButton.Text = "Off"

ToggleButton.TextColor3 = Color3.fromRGB(255, 75, 75)

ToggleButton.BorderColor3 = Color3.fromRGB(255, 50, 50)

end

end

-- Rendering text updates

SpeedDisplay.Text = "VELOCITY BOOSTER: +" .. string.format("%.1f", (currentMultiplier * 10))

TweenService:Create(StaminaBar, TweenInfo.new(0.05, Enum.EasingStyle.Linear), {Size = UDim2.new(stamina / maxStamina, 0, 1, 0)}):Play()

end)

Features & Information

The Projection Technique from "Jujutsu Kaisen" Is open source Speeds you up Works with r15 and R6 Made all by myself
#Jjk#Jjs#Larp#Naoya#Projection

Community Comments (3)

VeryFreshNoirVeryFreshNoirAug 20, 2026

Not works rn,gonna fix it with an update

VeryFreshNoirVeryFreshNoirSep 2, 2026

Fixed now You can use it

somerandompersonsomerandompersonSep 8, 2026

peak

More Scripts for Universal Scripts