--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.
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.
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).