
Key RequiredUniversal

--========================================================--
-- GOJO NPC KILLER
-- R6 + R15 | MOBILE + PC
--
-- Blue = 3s cooldown
-- Red = 5s cooldown + red explosion
-- Hollow Purple = 10s cooldown + BIG
-- Limitless Fly = 5s cooldown / INFINITE FLIGHT
-- Teleport = 3s cooldown
--
-- LIMITLESS FLY:
-- • Infinite duration
-- • Control with WASD / mobile joystick
-- • Camera controls direction
-- • Unequip tool to stop flying
-- NPC ONLY
--========================================================--
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local Debris = game:GetService("Debris")
local TweenService = game:GetService("TweenService")
local Player = Players.LocalPlayer
--========================================================--
-- CHARACTER
--========================================================--
local Character
local Humanoid
local Root
local function SetupCharacter(char)
Character = char
Humanoid = char:WaitForChild("Humanoid")
Root = char:WaitForChild("HumanoidRootPart")
end
SetupCharacter(
Player.Character or Player.CharacterAdded:Wait()
)
--========================================================--
-- SETTINGS
--========================================================--
local BLUE_DAMAGE = 35
local RED_DAMAGE = 50
local PURPLE_DAMAGE = 500
local NPC_PUSH = 35
local NPC_FREEZE_TIME = 2.5
local BLUE_COOLDOWN = 3
local RED_COOLDOWN = 5
local PURPLE_COOLDOWN = 10
local FLY_COOLDOWN = 5
local TELEPORT_COOLDOWN = 3
local FLY_SPEED = 75
local TELEPORT_DISTANCE = 35
local BLUE_SPEED = 50
local RED_SPEED = 135
local PURPLE_SPEED = 180
local BLUE_SIZE = 1.5
local RED_SIZE = 1.8
local PURPLE_SIZE = 5
--========================================================--
-- SOUNDS
--========================================================--
local SOUND = {
BlueCharge = "rbxassetid://911882310",
BlueFire = "rbxassetid://12222216",
RedCharge = "rbxassetid://911882310",
RedFire = "rbxassetid://12222216",
PurpleCharge = "rbxassetid://911882310",
PurpleFire = "rbxassetid://12222216",
Impact = "rbxassetid://12222152",
Teleport = "rbxassetid://5568266006",
FlyStart = "rbxassetid://911882310",
FlyEnd = "rbxassetid://12222152",
}
--========================================================--
-- COOLDOWNS
--========================================================--
local Cooldown = {
Blue = false,
Red = false,
Purple = false,
Fly = false,
Teleport = false
}
local function TryCooldown(name, time)
if Cooldown[name] then
return false
end
Cooldown[name] = true
task.delay(time, function()
Cooldown[name] = false
end)
return true
end
--========================================================--
-- SOUND
--========================================================--
local function PlaySound(id, volume, speed)
if not Root then
return
end
local sound = Instance.new("Sound")
sound.SoundId = id
sound.Volume = volume or 1
sound.PlaybackSpeed = speed or 1
sound.RollOffMaxDistance = 120
sound.RollOffMinDistance = 5
sound.Parent = Root
sound:Play()
Debris:AddItem(sound, 10)
end
--========================================================--
-- NPC CHECK
--========================================================--
local function GetNPC(part)
if not part then
return nil
end
local model =
part:FindFirstAncestorOfClass("Model")
if not model then
return nil
end
if model == Character then
return nil
end
-- NEVER target players
if Players:GetPlayerFromCharacter(model) then
return nil
end
local humanoid =
model:FindFirstChildOfClass("Humanoid")
if not humanoid then
return nil
end
if humanoid.Health <= 0 then
return nil
end
return model
end
--========================================================--
-- RED EXPLOSION
--========================================================--
local function RedExplosion(position)
local part = Instance.new("Part")
part.Name = "RedExplosion"
part.Shape = Enum.PartType.Ball
part.Material = Enum.Material.Neon
part.Color = Color3.fromRGB(
255,
20,
20
)
part.Size = Vector3.new(2, 2, 2)
part.Transparency = 0.1
part.Anchored = true
part.CanCollide = false
part.CanTouch = false
part.CanQuery = false
part.Position = position
part.Parent = workspace
local light = Instance.new("PointLight")
light.Color = Color3.fromRGB(
255,
0,
0
)
light.Brightness = 15
light.Range = 30
light.Parent = part
local tween = TweenService:Create(
part,
TweenInfo.new(
0.4,
Enum.EasingStyle.Quad,
Enum.EasingDirection.Out
),
{
Size = Vector3.new(14, 14, 14),
Transparency = 1
}
)
tween:Play()
PlaySound(
SOUND.Impact,
1.5,
0.8
)
Debris:AddItem(
part,
0.5
)
end
--========================================================--
-- PURPLE EXPLOSION
--========================================================--
local function PurpleExplosion(position)
local part = Instance.new("Part")
part.Name = "HollowPurpleExplosion"
part.Shape = Enum.PartType.Ball
part.Material = Enum.Material.Neon
part.Color = Color3.fromRGB(
180,
0,
255
)
part.Size = Vector3.new(5, 5, 5)
part.Transparency = 0.1
part.Anchored = true
part.CanCollide = false
part.CanTouch = false
part.CanQuery = false
part.Position = position
part.Parent = workspace
local light = Instance.new("PointLight")
light.Color = Color3.fromRGB(
190,
50,
255
)
light.Brightness = 30
light.Range = 50
light.Parent = part
local tween = TweenService:Create(
part,
TweenInfo.new(
0.7,
Enum.EasingStyle.Exponential,
Enum.EasingDirection.Out
),
{
Size = Vector3.new(30, 30, 30),
Transparency = 1
}
)
tween:Play()
Debris:AddItem(
part,
0.8
)
end
--========================================================--
-- NPC HIT
--========================================================--
local function DamageNPC(
npc,
damage,
direction,
ability
)
local humanoid =
npc:FindFirstChildOfClass("Humanoid")
local npcRoot =
npc:FindFirstChild("HumanoidRootPart")
if not humanoid then
return
end
if humanoid.Health <= 0 then
return
end
-- NEVER damage players
if Players:GetPlayerFromCharacter(npc) then
return
end
-- DAMAGE
humanoid:TakeDamage(damage)
-- RED EFFECT
if ability == "Red" and npcRoot then
RedExplosion(npcRoot.Position)
end
-- PURPLE EFFECT
if ability == "Purple" and npcRoot then
PurpleExplosion(npcRoot.Position)
end
-- PUSH
if npcRoot and direction then
local push =
Instance.new("BodyVelocity")
push.MaxForce =
Vector3.new(
100000,
100000,
100000
)
push.Velocity =
direction.Unit *
NPC_PUSH
+
Vector3.new(
0,
8,
0
)
push.Parent = npcRoot
Debris:AddItem(
push,
0.15
)
end
-- FREEZE
local oldWalk =
humanoid.WalkSpeed
local oldJump =
humanoid.JumpPower
local oldRotate =
humanoid.AutoRotate
humanoid.WalkSpeed = 0
humanoid.JumpPower = 0
humanoid.AutoRotate = false
task.delay(
NPC_FREEZE_TIME,
function()
if humanoid
and humanoid.Parent
and humanoid.Health > 0
then
humanoid.WalkSpeed =
oldWalk
humanoid.JumpPower =
oldJump
humanoid.AutoRotate =
oldRotate
end
end
)
end
--========================================================--
-- CREATE PROJECTILE
--========================================================--
local function CreateOrb(
color,
size
)
local orb =
Instance.new("Part")
orb.Name = "GojoProjectile"
orb.Shape =
Enum.PartType.Ball
orb.Material =
Enum.Material.Neon
orb.Color =
color
orb.Size =
Vector3.new(
size,
size,
size
)
orb.CanCollide = false
orb.CanTouch = true
orb.CanQuery = false
orb.CastShadow = false
orb.Parent = workspace
local light =
Instance.new("PointLight")
light.Color =
color
light.Brightness =
size * 7
light.Range =
size * 8
light.Parent =
orb
return orb
end
--========================================================--
-- SHOOT
--========================================================--
local function Shoot(
color,
size,
speed,
lifetime,
damage,
fireSound,
ability
)
if not Root then
return
end
local camera =
workspace.CurrentCamera
if not camera then
return
end
local direction =
camera.CFrame.LookVector
local orb =
CreateOrb(
color,
size
)
orb.CFrame =
CFrame.new(
Root.Position
+
direction * 4
+
Vector3.new(
0,
1,
0
)
)
local velocity =
Instance.new("BodyVelocity")
velocity.MaxForce =
Vector3.new(
math.huge,
math.huge,
math.huge
)
velocity.Velocity =
direction * speed
velocity.Parent =
orb
PlaySound(
fireSound,
1.5,
1
)
local hit = false
local connection
connection =
orb.Touched:Connect(
function(part)
if hit then
return
end
local npc =
GetNPC(part)
if npc then
hit = true
DamageNPC(
npc,
damage,
direction,
ability
)
if connection then
connection:Disconnect()
end
orb:Destroy()
end
end
)
Debris:AddItem(
orb,
lifetime
)
task.delay(
lifetime,
function()
if connection then
connection:Disconnect()
end
end
)
end
--========================================================--
-- BLUE
--========================================================--
local function UseBlue()
if not TryCooldown(
"Blue",
BLUE_COOLDOWN
) then
return
end
PlaySound(
SOUND.BlueCharge,
1.2,
1.15
)
task.wait(0.15)
Shoot(
Color3.fromRGB(
0,
170,
255
),
BLUE_SIZE,
BLUE_SPEED,
3,
BLUE_DAMAGE,
SOUND.BlueFire,
"Blue"
)
end
--========================================================--
-- RED
--========================================================--
local function UseRed()
if not TryCooldown(
"Red",
RED_COOLDOWN
) then
return
end
PlaySound(
SOUND.RedCharge,
1.3,
0.85
)
task.wait(0.15)
Shoot(
Color3.fromRGB(
255,
40,
40
),
RED_SIZE,
RED_SPEED,
3,
RED_DAMAGE,
SOUND.RedFire,
"Red"
)
end
--========================================================--
-- HOLLOW PURPLE
--========================================================--
local function UsePurple()
if not TryCooldown(
"Purple",
PURPLE_COOLDOWN
) then
return
end
PlaySound(
SOUND.PurpleCharge,
1.5,
0.7
)
local charge =
Instance.new("Part")
charge.Shape =
Enum.PartType.Ball
charge.Material =
Enum.Material.Neon
charge.Color =
Color3.fromRGB(
170,
0,
255
)
charge.Size =
Vector3.new(
2,
2,
2
)
charge.Anchored = true
charge.CanCollide = false
charge.CanTouch = false
charge.CFrame =
Root.CFrame *
CFrame.new(
0,
1,
-5
)
charge.Parent =
workspace
local light =
Instance.new("PointLight")
light.Color =
Color3.fromRGB(
190,
50,
255
)
light.Brightness = 25
light.Range = 45
light.Parent =
charge
local tween =
TweenService:Create(
charge,
TweenInfo.new(
0.7,
Enum.EasingStyle.Quad,
Enum.EasingDirection.Out
),
{
Size =
Vector3.new(
PURPLE_SIZE,
PURPLE_SIZE,
PURPLE_SIZE
)
}
)
tween:Play()
task.wait(0.7)
if charge then
charge:Destroy()
end
Shoot(
Color3.fromRGB(
170,
0,
255
),
PURPLE_SIZE,
PURPLE_SPEED,
4,
PURPLE_DAMAGE,
SOUND.PurpleFire,
"Purple"
)
end
--========================================================--
-- LIMITLESS FLY
--========================================================--
local Flying = false
local FlyConnection
local FlyVelocity
local FlyTool
local function StopFly()
if not Flying then
return
end
Flying = false
if FlyConnection then
FlyConnection:Disconnect()
FlyConnection = nil
end
if FlyVelocity then
FlyVelocity:Destroy()
FlyVelocity = nil
end
if Humanoid then
Humanoid.AutoRotate = true
end
PlaySound(
SOUND.FlyEnd,
1.2,
1.2
)
end
local function StartFly()
if Flying then
return
end
if not TryCooldown(
"Fly",
FLY_COOLDOWN
) then
return
end
if not Root or not Humanoid then
return
end
Flying = true
Humanoid.AutoRotate = false
PlaySound(
SOUND.FlyStart,
1.5,
0.8
)
FlyVelocity =
Instance.new("BodyVelocity")
FlyVelocity.MaxForce =
Vector3.new(
math.huge,
math.huge,
math.huge
)
FlyVelocity.Velocity =
Vector3.zero
FlyVelocity.Parent =
Root
FlyConnection =
RunService.RenderStepped:Connect(
function()
if not Flying then
return
end
if not Root
or not Root.Parent
or not Humanoid
or Humanoid.Health <= 0
then
StopFly()
return
end
local camera =
workspace.CurrentCamera
if not camera then
return
end
-- Get normal player movement
local moveDirection =
Humanoid.MoveDirection
-- Camera direction
local cameraLook =
camera.CFrame.LookVector
local cameraRight =
camera.CFrame.RightVector
-- Convert normal movement into
-- camera-relative 3D flight movement.
local forwardAmount =
moveDirection:Dot(
Vector3.new(
cameraLook.X,
0,
cameraLook.Z
).Unit
)
local rightAmount =
moveDirection:Dot(
Vector3.new(
cameraRight.X,
0,
cameraRight.Z
).Unit
)
local direction =
Vector3.zero
-- Forward/backward follows camera
direction +=
cameraLook *
forwardAmount
-- Left/right follows camera
direction +=
cameraRight *
rightAmount
-- Preserve vertical camera direction
-- when moving forward/backward.
if direction.Magnitude > 0.01 then
direction =
direction.Unit
FlyVelocity.Velocity =
direction *
FLY_SPEED
-- Face the direction of flight
Root.CFrame =
CFrame.lookAt(
Root.Position,
Root.Position +
direction
)
else
-- No movement = hover in place
FlyVelocity.Velocity =
Vector3.zero
end
end
)
end
--========================================================--
-- TELEPORT
--========================================================--
local function UseTeleport()
if not TryCooldown(
"Teleport",
TELEPORT_COOLDOWN
) then
return
end
if not Root then
return
end
PlaySound(
SOUND.Teleport,
1.5,
1
)
local camera =
workspace.CurrentCamera
if not camera then
return
end
local direction =
camera.CFrame.LookVector
local params =
RaycastParams.new()
params.FilterType =
Enum.RaycastFilterType.Exclude
params.FilterDescendantsInstances = {
Character
}
local result =
workspace:Raycast(
Root.Position,
direction *
TELEPORT_DISTANCE,
params
)
local destination
if result then
destination =
result.Position -
direction * 3
else
destination =
Root.Position +
direction *
TELEPORT_DISTANCE
end
Root.CFrame =
CFrame.new(
destination,
destination + direction
)
end
--========================================================--
-- TOOL CREATION
--========================================================--
local ToolData = {
{
Name = "Blue",
Tooltip = "Gojo Blue | Cooldown 3s",
Action = UseBlue
},
{
Name = "Red",
Tooltip = "Gojo Red | Cooldown 3s",
Action = UseRed
},
{
Name = "Hollow Purple",
Tooltip = "Hollow Purple | Cooldown 10s",
Action = UsePurple
},
{
Name = "Limitless Fly",
Tooltip = "Infinite Flight | Unequip to stop",
Action = StartFly
},
{
Name = "Teleport",
Tooltip = "Teleport | Cooldown 3s",
Action = UseTeleport
}
}
--========================================================--
-- REMOVE ONLY OUR TOOLS
--========================================================--
local function RemoveGojoTools()
local backpack =
Player:FindFirstChildOfClass(
"Backpack"
)
local function Clean(container)
if not container then
return
end
for _, object in
ipairs(container:GetChildren())
do
if object:IsA("Tool") then
for _, data in
ipairs(ToolData)
do
if object.Name ==
data.Name
then
object:Destroy()
break
end
end
end
end
end
Clean(backpack)
Clean(Character)
end
--========================================================--
-- CREATE ONE TOOL
--========================================================--
local function CreateTool(data)
local backpack =
Player:WaitForChild(
"Backpack",
10
)
if not backpack then
warn("GOJO: Backpack was not found!")
return
end
-- Don't create duplicate
if backpack:FindFirstChild(data.Name) then
return
end
if Character and
Character:FindFirstChild(data.Name)
then
return
end
local tool =
Instance.new("Tool")
tool.Name =
data.Name
tool.ToolTip =
data.Tooltip
tool.RequiresHandle =
false
tool.CanBeDropped =
false
tool.Enabled =
true
tool.Parent =
backpack
-- Special handling for Limitless Fly
if data.Name == "Limitless Fly" then
FlyTool = tool
tool.Unequipped:Connect(
function()
StopFly()
end
)
end
tool.Activated:Connect(
function()
if not tool.Enabled then
return
end
task.spawn(
data.Action
)
end
)
end
--========================================================--
-- CREATE ALL TOOLS
--========================================================--
local CreatingTools = false
local function CreateAllTools()
if CreatingTools then
return
end
CreatingTools = true
local backpack =
Player:WaitForChild(
"Backpack",
10
)
if not backpack then
warn(
"GOJO: Could not find Backpack!"
)
CreatingTools = false
return
end
-- Small delay prevents respawn race conditions
task.wait(0.2)
RemoveGojoTools()
task.wait(0.1)
for _, data in
ipairs(ToolData)
do
CreateTool(data)
end
CreatingTools = false
print(
"GOJO: All 5 tools created!"
)
end
--========================================================--
-- RESPAWN
--========================================================--
Player.CharacterAdded:Connect(
function(newCharacter)
StopFly()
FlyTool = nil
SetupCharacter(
newCharacter
)
task.wait(1)
CreateAllTools()
end
)
--========================================================--
-- INITIAL CREATION
--========================================================--
task.spawn(
function()
Player:WaitForChild(
"Backpack"
)
task.wait(0.5)
CreateAllTools()
end
)
print(
"🌀 GOJO SCRIPT LOADED - 5 ABILITIES"
)
loadstring(game:HttpGet("https://rawscripts.net/raw/Universal-Script-Control-npc-script-36365"))()



What...