Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

Unable to cast value to Object?

Some background, I am deving a game and I want the camera to change when you open the door. I wanted to make it easier so I didn't have to use 25000 events, but I need help since I keep on getting the error above. Script:

local TweenService = game:GetService("TweenService")
local CamE = game.ReplicatedStorage:WaitForChild("CameraEvent")
local Cam1 = false
local Cam2 = false
local Cam3 = false
local door1 = game.Workspace:WaitForChild("Door1")
local door2 = game.Workspace:WaitForChild("Door2")
local tweeningInformation = TweenInfo.new(
	0.4,	-- Speed
	Enum.EasingStyle.Linear,
	Enum.EasingDirection.Out,
	0,
	false,
	0
)
local door1Open = {CFrame = CFrame.new(91.66, 4.05, -17.51) * CFrame.Angles(math.rad(0), 90, 0)}
local door2Open = {CFrame = CFrame.new(82.17, 4.05, -17.51) * CFrame.Angles(math.rad(0), -90, 0)}
local door1Close = {CFrame = CFrame.new(89.07, 4.05, -19.17)}
local door2Close = {CFrame = CFrame.new(84.27, 4.05, -19.17)}
local tween1open = TweenService:Create(door1,tweeningInformation,door1Open)
local tween1close = TweenService:Create(door1,tweeningInformation,door1Close)
local tween2open = TweenService:Create(door2,tweeningInformation,door2Open)
local tween2close = TweenService:Create(door2,tweeningInformation,door2Close)

game.Workspace.Detector1.Touched:Connect(function(hit)
	Cam1 = true
	CamE:FireClient(Cam1) -- ERROR LINE
	door1.CanCollide = false
	door2.CanCollide = false
	tween1open:Play()
	tween2open:Play()
	wait(1)
	tween1close:Play()
	tween2close:Play()
	door1.CanCollide = true
	door2.CanCollide = true
end)
-- script.Parent.Detector2.Touched:Connect(function(hit)
	--tween1open:Play()
	--tween2open:Play()
	--wait(2)
	--tween1close:Play()
	--tween2close:Play()
--end)
																																																																																																																																																																																																																																																																																																																																																																																																

Local Script:

local Player = game.Players.LocalPlayer
local Character = Player.Character or Player.CharacterAdded:Wait()
local Camera = workspace.CurrentCamera
local CameraE = game.ReplicatedStorage:WaitForChild("CameraEvent")
print("e") -- used to test to see if working

CameraE.OnClientEvent:Connect(function(Cam1)
	if Cam1 == true then
repeat wait()
	Camera.CameraType = Enum.CameraType.Scriptable
until Camera.CameraType == Enum.CameraType.Scriptable
		Camera.CFrame = workspace.Camera1.CFrame
	--else if Cameratype[2] == true then
			
		--end
	end
	end)


2 comments

0

which line is the error occurring on, and in what script?

0

If you view the script to the full extent its line 27

1 answer

It is because the first argument of :FireClient() needs to be the player you're firing to. So to get it, we can use the hit argument of .Touched:

part.Touched:Connect(function(hit)
	
	if not hit then return end
	if not hit.Parent then return end
	if not hit.Parent:FindFirstChild("Humanoid") then return end
	
	local player = game.Players:GetPlayerFromCharacter(hit.Parent) -- we are gonna get the player with their character (same as game.Players[hit.Parent.Name])
	
end)

So let's implement that into your script:

local TweenService = game:GetService("TweenService")
local CamE = game.ReplicatedStorage:WaitForChild("CameraEvent")
local Cam1 = false
local Cam2 = false
local Cam3 = false
local door1 = game.Workspace:WaitForChild("Door1")
local door2 = game.Workspace:WaitForChild("Door2")
local tweeningInformation = TweenInfo.new(
	0.4,    -- Speed
	Enum.EasingStyle.Linear,
	Enum.EasingDirection.Out,
	0,
	false,
	0
)
local door1Open = {CFrame = CFrame.new(91.66, 4.05, -17.51) * CFrame.Angles(math.rad(0), 90, 0)}
local door2Open = {CFrame = CFrame.new(82.17, 4.05, -17.51) * CFrame.Angles(math.rad(0), -90, 0)}
local door1Close = {CFrame = CFrame.new(89.07, 4.05, -19.17)}
local door2Close = {CFrame = CFrame.new(84.27, 4.05, -19.17)}
local tween1open = TweenService:Create(door1,tweeningInformation,door1Open)
local tween1close = TweenService:Create(door1,tweeningInformation,door1Close)
local tween2open = TweenService:Create(door2,tweeningInformation,door2Open)
local tween2close = TweenService:Create(door2,tweeningInformation,door2Close)

game.Workspace.Detector1.Touched:Connect(function(hit)
	
	if not hit then return end
	if not hit.Parent then return end
	if not hit.Parent:FindFirstChild("Humanoid") then return end
	
	local player = game.Players:GetPlayerFromCharacter(hit.Parent)
	
	Cam1 = true
	CamE:FireClient(player,Cam1) 
	
	door1.CanCollide = false
	door2.CanCollide = false
	
	tween1open:Play()
	tween2open:Play()
	
	wait(1)
	
	tween1close:Play()
	tween2close:Play()
	
	door1.CanCollide = true
	door2.CanCollide = true
	
end)
-- script.Parent.Detector2.Touched:Connect(function(hit)
--tween1open:Play()
--tween2open:Play()
--wait(2)
--tween1close:Play()
--tween2close:Play()
--end)

And the local script is fine, except you don't need to do

repeat 

    wait()
    Camera.CameraType = Enum.CameraType.Scriptable

until Camera.CameraType == Enum.CameraType.Scriptable

as that was a problem some years ago and I believe it is normal now so do Camera.CameraType == Enum.CameraType.Scriptable.
Hope this helped!

This discussion is preserved as it was. New answers, comments, and votes are closed.