Why are my camera settings corrupted after I die?

--ServerScript--

local Cam = ...

local function onDied(Humanoid, player)
	RespawnRE:FireClient(player, Cam.CFrame)
end

function onCharacterAdded(character, player)
	local Humanoid = character:WaitForChild("Humanoid")
	Humanoid.Died:Connect(function() onDied(Humanoid, player) end)
end

function onPlayerAdded(player)
	player.CharacterAdded:Connect(function(c) onCharacterAdded(c,player) end)
end

game:GetService("Players").PlayerAdded:Connect(onPlayerAdded)
--LocalScript--
local ReplicatedStorage = game:GetService("ReplicatedStorage")

local TweenService = game:GetService("TweenService")

local Players = game:GetService("Players")

local player = Players.LocalPlayer

local character = player.Character or player.CharacterAdded:Wait()

local RespawnRE = ReplicatedStorage:WaitForChild("RespawnRE")

local Camera = workspace.CurrentCamera

local Blur = Instance.new("BlurEffect")

Blur.Size = 0

Blur.Parent = Camera

seconds = 1.5

local function Tween(goal,Time)

local BlurGoal = {Size = 12}

Camera.CameraType = Enum.CameraType.Scriptable

Camera.CameraSubject = nil

TweenService:Create(Camera,TweenInfo.new(Time[1]),goal):Play()

TweenService:Create(Blur,TweenInfo.new(Time[1]),BlurGoal):Play()

wait(Time[2] or Time[1])

repeat Camera.CameraSubject = character:WaitForChild("HumanoidRootPart") wait() until Camera.CameraSubject ~= nil

Camera.CameraType = Enum.CameraType.Scriptable

Camera.CameraSubject = nil

local cframe = Camera.CFrame

Camera.CFrame = goal.CFrame

goal.CFrame = cframe

BlurGoal.Size = 0

TweenService:Create(Camera,TweenInfo.new(seconds),goal):Play()

TweenService:Create(Blur,TweenInfo.new(seconds),BlurGoal):Play()

wait(seconds)

Camera.CameraType = Enum.CameraType.Custom

repeat Camera.CameraSubject = character:WaitForChild("HumanoidRootPart") wait() until Camera.CameraSubject ~= nil

end

local goal = {}

function OnClientEvent(cframe, RespawnTime)

local Time = {}

goal.CFrame = cframe

if RespawnTime > seconds then

Time[1] = seconds

Time[2] = RespawnTime

elseif RespawnTime > 0 then

Time[1] = RespawnTime

end

if Time[1] then

Tween(goal,Time)

end

end

RespawnRE.OnClientEvent:Connect(OnClientEvent)

My goal: when the player dies, he will look towards the map, then he will look at the player’s camera with tweenservice again.

Video:
https://gyazo.com/6b479c701d91c2a31ae6e3c0c0ad93a9

I may not have given some information*

Could you please format your second script like your first, it is unreadable :confused:

image

As defined, character in your client code does not update when a new character is spawned. This results in the code trying to set the camera subject to the root part of the now-nonexistent old character. Adding this code…

player.CharacterAdded:Connect(function(new_character)
	character = new_character
end)

…directly under your declaration of character in your client code should resolve the breaking issue.

sorry, i had very little time, i wrote it at the last moment

the player’s camera is elsewhere, and when I set the player’s camera, Custom and HumanoidRootPart, I want to know in advance where it will go and make tween it there

In order to tween to the player’s new character, your code will need to yield at least until the new character spawns. This modified version of your client code will tween the camera towards the new character and stop it at 12.5 studs away (the default distance as defined in the BaseCamera module):

--LocalScript--
local CAMERA_OFFSET = 12.5	--The default value defined in the BaseCamera player script.

local ReplicatedStorage = game:GetService("ReplicatedStorage")

local TweenService = game:GetService("TweenService")

local Players = game:GetService("Players")

local player = Players.LocalPlayer
--"character" declaration and modification has been moved into the "Tween" function

local RespawnRE = ReplicatedStorage:WaitForChild("RespawnRE")

local Camera = workspace.CurrentCamera

local Blur = Instance.new("BlurEffect")

Blur.Size = 0

Blur.Parent = Camera

local seconds = 1.5

local V3_000 = Vector3.new(0,0,0)
CAMERA_OFFSET = CFrame.new(0,0,CAMERA_OFFSET)

local function Tween(goal,Time)
	local character = player.Character
	
	local BlurGoal = {Size = 12}

	Camera.CameraType = Enum.CameraType.Scriptable

	Camera.CameraSubject = nil

	TweenService:Create(Camera,TweenInfo.new(Time[1]),goal):Play()

	TweenService:Create(Blur,TweenInfo.new(Time[1]),BlurGoal):Play()

	wait(Time[2] or Time[1])
	
	--Redefine "character" once a new one has spawned or immediately if it already has.
	if player.Character == character or not player.Character then
		repeat
			character = player.CharacterAdded:Wait()
		until character
	else
		character = player.Character
	end
	local root = character:WaitForChild("HumanoidRootPart")
	repeat Camera.CameraSubject = root wait() until Camera.CameraSubject ~= nil
	
	Camera.CameraType = Enum.CameraType.Scriptable

	Camera.CameraSubject = nil

	local cframe = Camera.CFrame

	Camera.CFrame = goal.CFrame
	
	--Find the camera's new CFrame, a point facing the player on a line between
	--the current CFrame and the character's HumanoidRootPart exactly CAMERA_OFFSET-studs away from the HRP.
	local goal_pos = root.Position
	goal.CFrame = CFrame.new(goal_pos) * CFrame.lookAt(V3_000,goal_pos-Camera.CFrame.Position) * CAMERA_OFFSET

	BlurGoal.Size = 0

	TweenService:Create(Camera,TweenInfo.new(seconds),goal):Play()

	TweenService:Create(Blur,TweenInfo.new(seconds),BlurGoal):Play()

	wait(seconds)

	Camera.CameraType = Enum.CameraType.Custom

	repeat Camera.CameraSubject = character:WaitForChild("HumanoidRootPart") wait() until Camera.CameraSubject ~= nil

end

local goal = {}

function OnClientEvent(cframe, RespawnTime)

	local Time = {}

	goal.CFrame = cframe

	if RespawnTime > seconds then

		Time[1] = seconds

		Time[2] = RespawnTime

	elseif RespawnTime > 0 then

		Time[1] = RespawnTime

	end

	if Time[1] then

		Tween(goal,Time)

	end

end

RespawnRE.OnClientEvent:Connect(OnClientEvent)

This code is not without issue, however: while the tweening will take the camera to where the player spawned, it will not track any movement (either due to gravity or player movement) that occurs during the transition. That can be resolved by either anchoring the character until the transition is over or using a system that can react to this movement (that is, not TweenService).