LUA John Doe FAN RECREATION
Key RequiredUniversal

LUA John Doe FAN RECREATION

Universal ScriptXxLemon_WolfyxXXxLemon_WolfyxX 1.1K views 8.4K executesUpdated Jul 29, 2026
Unrated
00
Lua Script•411 lines (11587 chars)
local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local TweenService = game:GetService("TweenService")
local Lighting = game:GetService("Lighting")
local SoundService = game:GetService("SoundService")

local player = Players.LocalPlayer
local camera = workspace.CurrentCamera

local IDLE_FOV = 90
local INTRO_FOV = 20
local SPRINT_FOV_BOOST = 9
local DASH_FOV_BOOST = 20
local HIT_FOV_DROP = 95
local FOV_TWEEN_TIME = 1.5
local INTRO_WAIT_TIME = 1

local AUDIO_ID = "rbxassetid://139488665764275"
local HIT_SOUND_ID = "rbxassetid://138651783706047"

local DASH_ANIM_ID = "rbxassetid://73053491533472"
local DASH_DURATION = 0.6
local DASH_SPEED = 85
local DELAY_BEFORE_DASH = 0.5
local DASH_HITBOX_RADIUS = 6

local SKYBOX = {
	Bk = "rbxassetid://108929045660200",
	Dn = "rbxassetid://78646480540009",
	Ft = "rbxassetid://90546017435179",
	Lf = "rbxassetid://109838453114563",
	Rt = "rbxassetid://94190734796082",
	Up = "rbxassetid://126944775797063"
}

local isSprinting = false
local currentFOV = INTRO_FOV
local character, humanoid, rootPart, animator
local idleTrack, forwardTrack, backwardTrack, sprintTrack, currentTrack, dashTrack
local heartbeatConn, speedLoopTask, dashHitConnection
local isDashing = false
local hitDebounce = {}
local redFire = nil
local originalCollisionGroup

local function createBlackScreen()
	local gui = Instance.new("ScreenGui")
	gui.Name = "IntroBlackScreen"
	gui.ResetOnSpawn = false
	gui.IgnoreGuiInset = true
	gui.Parent = player:WaitForChild("PlayerGui")

	local frame = Instance.new("Frame")
	frame.Size = UDim2.new(1, 0, 1, 0)
	frame.BackgroundColor3 = Color3.new(0, 0, 0)
	frame.BorderSizePixel = 0
	frame.ZIndex = 100
	frame.Parent = gui
	return gui, frame
end

local function createVignette()
	local gui = Instance.new("ScreenGui")
	gui.Name = "VignetteGui"
	gui.ResetOnSpawn = false
	gui.IgnoreGuiInset = true
	gui.Parent = player:WaitForChild("PlayerGui")

	local vignette = Instance.new("ImageLabel")
	vignette.Size = UDim2.new(1, 0, 1, 0)
	vignette.BackgroundTransparency = 1
	vignette.Image = "rbxassetid://4576475446"
	vignette.ImageTransparency = 0.15
	vignette.ImageColor3 = Color3.new(0, 0, 0)
	vignette.ZIndex = 50
	vignette.Parent = gui
	return vignette
end

local function createRedAtmosphere()
	for _, v in ipairs(Lighting:GetChildren()) do
		if v:IsA("Atmosphere") then v:Destroy() end
	end

	local atmosphere = Instance.new("Atmosphere")
	atmosphere.Name = "RedHellAtmosphere"
	atmosphere.Density = 0.45
	atmosphere.Offset = 0.25
	atmosphere.Color = Color3.fromRGB(255, 40, 40)
	atmosphere.Decay = Color3.fromRGB(180, 20, 20)
	atmosphere.Glare = 0.8
	atmosphere.Haze = 1.2
	atmosphere.Parent = Lighting
end

local function setupCharacterVisuals(char)
	local head = char:WaitForChild("Head", 5)
	local leftHand = char:FindFirstChild("LeftHand")

	if head then
		local titleModel = game:GetService("ReplicatedStorage"):FindFirstChild("JohnDoeTitle")
		if titleModel then
			local clone = titleModel:Clone()
			clone.Parent = char
			local billboard = clone:FindFirstChildOfClass("BillboardGui")
			if billboard then
				billboard.Adornee = head
				billboard.StudsOffset = Vector3.new(0, 3.8, 0)
			end
		end
	end

	if leftHand then
		redFire = Instance.new("Fire")
		redFire.Name = "RedHellFire"
		redFire.Color = Color3.fromRGB(255, 40, 0)
		redFire.SecondaryColor = Color3.fromRGB(255, 100, 0)
		redFire.Size = 4.5
		redFire.Heat = 12
		redFire.Enabled = false
		redFire.Parent = leftHand
	end
end

local function tweenFOV(target, duration, easingStyle, easingDirection)
	duration = duration or FOV_TWEEN_TIME
	easingStyle = easingStyle or Enum.EasingStyle.Sine
	easingDirection = easingDirection or Enum.EasingDirection.Out
	
	TweenService:Create(camera, TweenInfo.new(duration, easingStyle, easingDirection), {FieldOfView = target}):Play()
end

local function onHitDuringDash(hitCharacter)
	if not isDashing then return end
	if hitDebounce[hitCharacter] then return end

	hitDebounce[hitCharacter] = true

	local current = camera.FieldOfView
	tweenFOV(current - HIT_FOV_DROP, 2, Enum.EasingStyle.Cubic, Enum.EasingDirection.Out)

	local hitSound = Instance.new("Sound")
	hitSound.SoundId = HIT_SOUND_ID
	hitSound.Volume = 0.7
	hitSound.Pitch = 1
	hitSound.Parent = SoundService
	hitSound:Play()
	hitSound.Ended:Connect(function() hitSound:Destroy() end)

	task.delay(0.8, function()
		if isDashing then
			tweenFOV(IDLE_FOV + DASH_FOV_BOOST, 0.6, Enum.EasingStyle.Cubic, Enum.EasingDirection.Out)
		elseif isSprinting then
			tweenFOV(IDLE_FOV + SPRINT_FOV_BOOST, 0.6)
		else
			tweenFOV(IDLE_FOV, 0.6)
		end
		hitDebounce[hitCharacter] = nil
	end)
end

local function playIntroSequence()
	local blackGui, blackFrame = createBlackScreen()

	local sky = Instance.new("Sky")
	sky.SkyboxBk = SKYBOX.Bk
	sky.SkyboxDn = SKYBOX.Dn
	sky.SkyboxFt = SKYBOX.Ft
	sky.SkyboxLf = SKYBOX.Lf
	sky.SkyboxRt = SKYBOX.Rt
	sky.SkyboxUp = SKYBOX.Up
	sky.Parent = Lighting

	createRedAtmosphere()

	local audio = Instance.new("Sound")
	audio.SoundId = AUDIO_ID
	audio.Volume = 0.2
	audio.Pitch = 1
	audio.Looped = true
	audio.Parent = SoundService
	audio:Play()

	camera.FieldOfView = INTRO_FOV
	task.wait(INTRO_WAIT_TIME)

	local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.Out)
	TweenService:Create(camera, tweenInfo, {FieldOfView = IDLE_FOV}):Play()
	TweenService:Create(blackFrame, tweenInfo, {BackgroundTransparency = 1}):Play()

	task.delay(2.5, function() blackGui:Destroy() end)
	task.delay(1, createVignette)
end

local function stopTrack(track, fadeTime)
	if track and track.IsPlaying then track:Stop(fadeTime or 0.1) end
end

local function playOnly(track, speedOverride)
	if not track then return end
	if currentTrack == track then
		if not track.IsPlaying then track:Play(0.1) end
		if speedOverride then track:AdjustSpeed(speedOverride) end
		return
	end
	if currentTrack then currentTrack:Stop(0.1) end
	currentTrack = track
	track:Play(0.1, 1, speedOverride or 1)
end

local function makeTrack(id, priority, looped)
	local anim = Instance.new("Animation")
	anim.AnimationId = id
	local track = animator:LoadAnimation(anim)
	track.Priority = priority
	track.Looped = looped or false
	return track
end

local function cleanup()
	if heartbeatConn then heartbeatConn:Disconnect() end
	if dashHitConnection then dashHitConnection:Disconnect() end
	
	stopTrack(idleTrack) stopTrack(forwardTrack) stopTrack(backwardTrack) stopTrack(sprintTrack) stopTrack(dashTrack)
	hitDebounce = {}
	
	if character and originalCollisionGroup then
		for _, part in ipairs(character:GetDescendants()) do
			if part:IsA("BasePart") then
				part.CollisionGroup = originalCollisionGroup
				part.CanCollide = true
			end
		end
	end
end

local function applyWalkSpeed()
	if not humanoid then return end
	local md = humanoid.MoveDirection
	local moving = md.Magnitude > 0.1
	if not moving then
		humanoid.WalkSpeed = isSprinting and 24 or 8
		return
	end
	local dot = md:Dot(rootPart.CFrame.LookVector)
	humanoid.WalkSpeed = (dot < -0.2) and 6 or (isSprinting and 24 or 8)
end

local function updateAnimations()
	if not humanoid or not rootPart then return end
	local md = humanoid.MoveDirection
	local moving = md.Magnitude > 0.1

	if not moving then playOnly(idleTrack)
	elseif md:Dot(rootPart.CFrame.LookVector) < -0.2 then playOnly(backwardTrack)
	elseif isSprinting then playOnly(sprintTrack, 2.5)
	else playOnly(forwardTrack)
	end
end

local function dash()
	if not character or not rootPart or not humanoid or isDashing then return end
	
	isDashing = true
	isSprinting = false
	hitDebounce = {}

	if redFire then redFire.Enabled = true end

	originalCollisionGroup = rootPart.CollisionGroup
	for _, part in ipairs(character:GetDescendants()) do
		if part:IsA("BasePart") then
			part.CollisionGroup = "Default"
			part.CanCollide = false
		end
	end

	tweenFOV(IDLE_FOV + DASH_FOV_BOOST)

	if animator then
		local anim = Instance.new("Animation")
		anim.AnimationId = DASH_ANIM_ID
		dashTrack = animator:LoadAnimation(anim)
		dashTrack.Priority = Enum.AnimationPriority.Action3
		dashTrack.Looped = false
		dashTrack:Play()
	end

	task.wait(DELAY_BEFORE_DASH)

	if not rootPart or not rootPart.Parent then 
		isDashing = false
		return 
	end

	humanoid.AutoRotate = false

	local forwardDir = rootPart.CFrame.LookVector
	local currentVel = rootPart.AssemblyLinearVelocity

	local dashTween = TweenService:Create(rootPart, TweenInfo.new(DASH_DURATION, Enum.EasingStyle.Cubic, Enum.EasingDirection.Out), {
		AssemblyLinearVelocity = forwardDir * DASH_SPEED + Vector3.new(0, currentVel.Y, 0)
	})

	dashTween:Play()

	dashTween.Completed:Connect(function()
		humanoid.AutoRotate = true
		isDashing = false
		tweenFOV(isSprinting and IDLE_FOV + SPRINT_FOV_BOOST or IDLE_FOV)
	end)

	task.delay(5, function()
		if redFire and redFire.Parent then
			local tween = TweenService:Create(redFire, TweenInfo.new(1.5, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), {
				Heat = 0,
				Size = 0.5
			})
			tween:Play()
			tween.Completed:Connect(function()
				if redFire then redFire.Enabled = false end
			end)
		end
	end)

	task.delay(DASH_DURATION + 0.5, function()
		isDashing = false
		humanoid.AutoRotate = true
	end)
end

local function setupDashHitDetection()
	if dashHitConnection then dashHitConnection:Disconnect() end

	dashHitConnection = RunService.Heartbeat:Connect(function()
		if not isDashing or not rootPart then return end

		local rootPos = rootPart.Position
		local parts = workspace:GetPartBoundsInRadius(rootPos, DASH_HITBOX_RADIUS)

		for _, part in ipairs(parts) do
			local hitChar = part.Parent
			if hitChar and hitChar:FindFirstChild("Humanoid") and hitChar ~= character then
				onHitDuringDash(hitChar)
			end
		end
	end)
end

local function setupCharacter(char)
	cleanup()
	character = char
	task.wait(0.3)

	humanoid = character:WaitForChild("Humanoid", 5)
	rootPart = character:WaitForChild("HumanoidRootPart", 5)
	if not humanoid or not rootPart then return end

	animator = humanoid:FindFirstChildOfClass("Animator") or Instance.new("Animator", humanoid)

	local animate = character:FindFirstChild("Animate")
	if animate then animate.Enabled = false end

	idleTrack = makeTrack("rbxassetid://111792319821341", Enum.AnimationPriority.Action, true)
	forwardTrack = makeTrack("rbxassetid://138795419712161", Enum.AnimationPriority.Action, true)
	backwardTrack = makeTrack("rbxassetid://95970874156673", Enum.AnimationPriority.Action, true)
	sprintTrack = makeTrack("rbxassetid://94467125495426", Enum.AnimationPriority.Action4, true)

	applyWalkSpeed()
	updateAnimations()
	setupCharacterVisuals(character)
	setupDashHitDetection()

	speedLoopTask = task.spawn(function()
		while character and character.Parent do
			applyWalkSpeed()
			task.wait(0.1)
		end
	end)

	heartbeatConn = RunService.Heartbeat:Connect(function()
		if isSprinting and sprintTrack and sprintTrack.IsPlaying then
			sprintTrack:AdjustSpeed(2.5)
		end
		updateAnimations()
	end)
end

UserInputService.InputBegan:Connect(function(input, gp)
	if gp then return end

	if input.KeyCode == Enum.KeyCode.X then
		if not isDashing then
			isSprinting = not isSprinting
			tweenFOV(isSprinting and IDLE_FOV + SPRINT_FOV_BOOST or IDLE_FOV)
		end
	elseif input.KeyCode == Enum.KeyCode.Q then
		dash()
	end

	applyWalkSpeed()
	updateAnimations()
end)

player.CharacterAdded:Connect(setupCharacter)
player.CharacterRemoving:Connect(cleanup)

if player.Character then task.spawn(setupCharacter, player.Character) end

playIntroSequence()

Features & Information

this script is forsaken-related, it doesn't give you an title, or any serversided effects. All the shown effects are client-sided, and the animations are used as Secret Roblox Emotes, which is replicated. Although, I'd answer that, yes people can see your animations, but there will be no effects shown to them at all. Control / Keybinds: Q - Charge (No Cooldown) X - Sprint Toggle (No Stamina)

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts