321 lines
11 KiB
Lua
321 lines
11 KiB
Lua
local RunService = game:GetService('RunService')
|
|
local UserInputService = game:GetService('UserInputService')
|
|
local PlayersService = game:GetService('Players')
|
|
local VRService = game:GetService("VRService")
|
|
local StarterPlayer = game:GetService('StarterPlayer')
|
|
|
|
|
|
local RootCamera = script:WaitForChild('RootCamera')
|
|
|
|
local AttachCamera = require(RootCamera:WaitForChild('AttachCamera'))()
|
|
local FixedCamera = require(RootCamera:WaitForChild('FixedCamera'))()
|
|
local ScriptableCamera = require(RootCamera:WaitForChild('ScriptableCamera'))()
|
|
local TrackCamera = require(RootCamera:WaitForChild('TrackCamera'))()
|
|
local WatchCamera = require(RootCamera:WaitForChild('WatchCamera'))()
|
|
|
|
local OrbitalCamera = require(RootCamera:WaitForChild('OrbitalCamera'))()
|
|
local ClassicCamera = require(RootCamera:WaitForChild('ClassicCamera'))()
|
|
local FollowCamera = require(RootCamera:WaitForChild('FollowCamera'))()
|
|
local PopperCam = require(script:WaitForChild('PopperCam'))
|
|
local Invisicam = require(script:WaitForChild('Invisicam'))
|
|
local TransparencyController = require(script:WaitForChild('TransparencyController'))()
|
|
|
|
local VRCamera = require(RootCamera:WaitForChild("VRCamera"))()
|
|
|
|
local GameSettings = UserSettings().GameSettings
|
|
|
|
local AllCamerasInLua = false
|
|
local success, msg = pcall(function()
|
|
AllCamerasInLua = UserSettings():IsUserFeatureEnabled("UserAllCamerasInLua")
|
|
end)
|
|
if not success then
|
|
print("Couldn't get feature UserAllCamerasInLua because:" , msg)
|
|
end
|
|
|
|
local FFlagUserNoCameraClickToMoveSuccess, FFlagUserNoCameraClickToMoveResult = pcall(function() return UserSettings():IsUserFeatureEnabled("UserNoCameraClickToMove") end)
|
|
local FFlagUserNoCameraClickToMove = FFlagUserNoCameraClickToMoveSuccess and FFlagUserNoCameraClickToMoveResult
|
|
local ClickToMove = FFlagUserNoCameraClickToMove and nil or require(script:WaitForChild('ClickToMove'))()
|
|
|
|
local isOrbitalCameraEnabled = pcall(function() local test = Enum.CameraType.Orbital end)
|
|
|
|
-- register what camera scripts we are using
|
|
do
|
|
local PlayerScripts = PlayersService.LocalPlayer:WaitForChild("PlayerScripts")
|
|
local canRegisterCameras = pcall(function() PlayerScripts:RegisterTouchCameraMovementMode(Enum.TouchCameraMovementMode.Default) end)
|
|
|
|
if canRegisterCameras then
|
|
PlayerScripts:RegisterTouchCameraMovementMode(Enum.TouchCameraMovementMode.Follow)
|
|
PlayerScripts:RegisterTouchCameraMovementMode(Enum.TouchCameraMovementMode.Classic)
|
|
|
|
PlayerScripts:RegisterComputerCameraMovementMode(Enum.ComputerCameraMovementMode.Default)
|
|
PlayerScripts:RegisterComputerCameraMovementMode(Enum.ComputerCameraMovementMode.Follow)
|
|
PlayerScripts:RegisterComputerCameraMovementMode(Enum.ComputerCameraMovementMode.Classic)
|
|
end
|
|
end
|
|
|
|
local CameraTypeEnumMap =
|
|
{
|
|
[Enum.CameraType.Attach] = AttachCamera;
|
|
[Enum.CameraType.Fixed] = FixedCamera;
|
|
[Enum.CameraType.Scriptable] = ScriptableCamera;
|
|
[Enum.CameraType.Track] = TrackCamera;
|
|
[Enum.CameraType.Watch] = WatchCamera;
|
|
[Enum.CameraType.Follow] = FollowCamera;
|
|
}
|
|
|
|
if isOrbitalCameraEnabled then
|
|
CameraTypeEnumMap[Enum.CameraType.Orbital] = OrbitalCamera;
|
|
end
|
|
|
|
local EnabledCamera = nil
|
|
local EnabledOcclusion = nil
|
|
|
|
local cameraSubjectChangedConn = nil
|
|
local cameraTypeChangedConn = nil
|
|
local renderSteppedConn = nil
|
|
|
|
local lastInputType = nil
|
|
local hasLastInput = false
|
|
|
|
local function IsTouch()
|
|
return UserInputService.TouchEnabled
|
|
end
|
|
|
|
local function shouldUsePlayerScriptsCamera()
|
|
local player = PlayersService.LocalPlayer
|
|
local currentCamera = workspace.CurrentCamera
|
|
if AllCamerasInLua then
|
|
return true
|
|
else
|
|
if player then
|
|
if currentCamera == nil or (currentCamera.CameraType == Enum.CameraType.Custom)
|
|
or (isOrbitalCameraEnabled and currentCamera.CameraType == Enum.CameraType.Orbital) then
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
local function isClickToMoveOn()
|
|
local usePlayerScripts = shouldUsePlayerScriptsCamera()
|
|
local player = PlayersService.LocalPlayer
|
|
if usePlayerScripts and player then
|
|
if (hasLastInput and lastInputType == Enum.UserInputType.Touch) or IsTouch() then -- Touch
|
|
if player.DevTouchMovementMode == Enum.DevTouchMovementMode.ClickToMove or
|
|
(player.DevTouchMovementMode == Enum.DevTouchMovementMode.UserChoice and GameSettings.TouchMovementMode == Enum.TouchMovementMode.ClickToMove) then
|
|
return true
|
|
end
|
|
else -- Computer
|
|
if player.DevComputerMovementMode == Enum.DevComputerMovementMode.ClickToMove or
|
|
(player.DevComputerMovementMode == Enum.DevComputerMovementMode.UserChoice and GameSettings.ComputerMovementMode == Enum.ComputerMovementMode.ClickToMove) then
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
local function getCurrentCameraMode()
|
|
local usePlayerScripts = shouldUsePlayerScriptsCamera()
|
|
local player = PlayersService.LocalPlayer
|
|
if usePlayerScripts and player then
|
|
if (hasLastInput and lastInputType == Enum.UserInputType.Touch) or IsTouch() then -- Touch (iPad, etc...)
|
|
if not FFlagUserNoCameraClickToMove and isClickToMoveOn() then
|
|
return Enum.DevTouchMovementMode.ClickToMove.Name
|
|
elseif player.DevTouchCameraMode == Enum.DevTouchCameraMovementMode.UserChoice then
|
|
local touchMovementMode = GameSettings.TouchCameraMovementMode
|
|
if touchMovementMode == Enum.TouchCameraMovementMode.Default then
|
|
return Enum.TouchCameraMovementMode.Follow.Name
|
|
end
|
|
return touchMovementMode.Name
|
|
else
|
|
return player.DevTouchCameraMode.Name
|
|
end
|
|
else -- Computer
|
|
if not FFlagUserNoCameraClickToMove and isClickToMoveOn() then
|
|
return Enum.DevComputerMovementMode.ClickToMove.Name
|
|
elseif player.DevComputerCameraMode == Enum.DevComputerCameraMovementMode.UserChoice then
|
|
local computerMovementMode = GameSettings.ComputerCameraMovementMode
|
|
if computerMovementMode == Enum.ComputerCameraMovementMode.Default then
|
|
return Enum.ComputerCameraMovementMode.Classic.Name
|
|
end
|
|
return computerMovementMode.Name
|
|
else
|
|
return player.DevComputerCameraMode.Name
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function getCameraOcclusionMode()
|
|
local usePlayerScripts = shouldUsePlayerScriptsCamera()
|
|
local player = PlayersService.LocalPlayer
|
|
if usePlayerScripts and player then
|
|
return player.DevCameraOcclusionMode
|
|
end
|
|
end
|
|
|
|
-- New for AllCameraInLua support
|
|
local function shouldUseOcclusionModule()
|
|
local player = PlayersService.LocalPlayer
|
|
if player and game.Workspace.CurrentCamera and game.Workspace.CurrentCamera.CameraType == Enum.CameraType.Custom then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
local function Update()
|
|
if EnabledCamera then
|
|
EnabledCamera:Update()
|
|
end
|
|
if EnabledOcclusion and not VRService.VREnabled then
|
|
EnabledOcclusion:Update(EnabledCamera)
|
|
end
|
|
if shouldUsePlayerScriptsCamera() then
|
|
TransparencyController:Update()
|
|
end
|
|
end
|
|
|
|
local function SetEnabledCamera(newCamera)
|
|
if EnabledCamera ~= newCamera then
|
|
if EnabledCamera then
|
|
EnabledCamera:SetEnabled(false)
|
|
end
|
|
EnabledCamera = newCamera
|
|
if EnabledCamera then
|
|
EnabledCamera:SetEnabled(true)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function OnCameraMovementModeChange(newCameraMode)
|
|
if newCameraMode == Enum.DevComputerMovementMode.ClickToMove.Name then
|
|
if FFlagUserNoCameraClickToMove then
|
|
--No longer responding to ClickToMove here!
|
|
return
|
|
end
|
|
ClickToMove:Start()
|
|
SetEnabledCamera(nil)
|
|
TransparencyController:SetEnabled(true)
|
|
else
|
|
local currentCameraType = workspace.CurrentCamera and workspace.CurrentCamera.CameraType
|
|
if VRService.VREnabled and currentCameraType ~= Enum.CameraType.Scriptable then
|
|
SetEnabledCamera(VRCamera)
|
|
TransparencyController:SetEnabled(false)
|
|
elseif (currentCameraType == Enum.CameraType.Custom or not AllCamerasInLua) and newCameraMode == Enum.ComputerCameraMovementMode.Classic.Name then
|
|
SetEnabledCamera(ClassicCamera)
|
|
TransparencyController:SetEnabled(true)
|
|
elseif (currentCameraType == Enum.CameraType.Custom or not AllCamerasInLua) and newCameraMode == Enum.ComputerCameraMovementMode.Follow.Name then
|
|
SetEnabledCamera(FollowCamera)
|
|
TransparencyController:SetEnabled(true)
|
|
elseif (currentCameraType == Enum.CameraType.Custom or not AllCamerasInLua) and (isOrbitalCameraEnabled and (newCameraMode == Enum.ComputerCameraMovementMode.Orbital.Name)) then
|
|
SetEnabledCamera(OrbitalCamera)
|
|
TransparencyController:SetEnabled(true)
|
|
elseif AllCamerasInLua and CameraTypeEnumMap[currentCameraType] then
|
|
SetEnabledCamera(CameraTypeEnumMap[currentCameraType])
|
|
TransparencyController:SetEnabled(false)
|
|
else -- Our camera movement code was disabled by the developer
|
|
SetEnabledCamera(nil)
|
|
TransparencyController:SetEnabled(false)
|
|
end
|
|
ClickToMove:Stop()
|
|
end
|
|
|
|
local useOcclusion = shouldUseOcclusionModule()
|
|
local newOcclusionMode = getCameraOcclusionMode()
|
|
if EnabledOcclusion == Invisicam and (newOcclusionMode ~= Enum.DevCameraOcclusionMode.Invisicam or (not useOcclusion)) then
|
|
Invisicam:Cleanup()
|
|
end
|
|
|
|
-- PopperCam does not work with OrbitalCamera, as OrbitalCamera's distance can be fixed.
|
|
if useOcclusion then
|
|
if newOcclusionMode == Enum.DevCameraOcclusionMode.Zoom and ( isOrbitalCameraEnabled and newCameraMode ~= Enum.ComputerCameraMovementMode.Orbital.Name ) then
|
|
EnabledOcclusion = PopperCam
|
|
elseif newOcclusionMode == Enum.DevCameraOcclusionMode.Invisicam then
|
|
EnabledOcclusion = Invisicam
|
|
else
|
|
EnabledOcclusion = nil
|
|
end
|
|
else
|
|
EnabledOcclusion = nil
|
|
end
|
|
end
|
|
|
|
local function OnCameraTypeChanged(newCameraType)
|
|
if newCameraType == Enum.CameraType.Scriptable then
|
|
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
|
|
end
|
|
end
|
|
|
|
|
|
local function OnCameraSubjectChanged(newSubject)
|
|
TransparencyController:SetSubject(newSubject)
|
|
end
|
|
|
|
local function OnNewCamera()
|
|
OnCameraMovementModeChange(getCurrentCameraMode())
|
|
|
|
local currentCamera = workspace.CurrentCamera
|
|
if currentCamera then
|
|
if cameraSubjectChangedConn then
|
|
cameraSubjectChangedConn:disconnect()
|
|
end
|
|
|
|
if cameraTypeChangedConn then
|
|
cameraTypeChangedConn:disconnect()
|
|
end
|
|
|
|
cameraSubjectChangedConn = currentCamera:GetPropertyChangedSignal("CameraSubject"):connect(function()
|
|
OnCameraSubjectChanged(currentCamera.CameraSubject)
|
|
end)
|
|
|
|
cameraTypeChangedConn = currentCamera:GetPropertyChangedSignal("CameraType"):connect(function()
|
|
OnCameraMovementModeChange(getCurrentCameraMode())
|
|
OnCameraTypeChanged(currentCamera.CameraType)
|
|
end)
|
|
|
|
OnCameraSubjectChanged(currentCamera.CameraSubject)
|
|
OnCameraTypeChanged(currentCamera.CameraType)
|
|
end
|
|
end
|
|
|
|
|
|
local function OnPlayerAdded(player)
|
|
workspace.Changed:connect(function(prop)
|
|
if prop == 'CurrentCamera' then
|
|
OnNewCamera()
|
|
end
|
|
end)
|
|
|
|
player.Changed:connect(function(prop)
|
|
OnCameraMovementModeChange(getCurrentCameraMode())
|
|
end)
|
|
|
|
GameSettings.Changed:connect(function(prop)
|
|
OnCameraMovementModeChange(getCurrentCameraMode())
|
|
end)
|
|
|
|
RunService:BindToRenderStep("cameraRenderUpdate", Enum.RenderPriority.Camera.Value, Update)
|
|
|
|
OnNewCamera()
|
|
OnCameraMovementModeChange(getCurrentCameraMode())
|
|
end
|
|
|
|
do
|
|
while PlayersService.LocalPlayer == nil do PlayersService.PlayerAdded:wait() end
|
|
hasLastInput = pcall(function()
|
|
lastInputType = UserInputService:GetLastInputType()
|
|
UserInputService.LastInputTypeChanged:connect(function(newLastInputType)
|
|
lastInputType = newLastInputType
|
|
end)
|
|
end)
|
|
OnPlayerAdded(PlayersService.LocalPlayer)
|
|
end
|
|
|
|
local function OnVREnabled()
|
|
OnCameraMovementModeChange(getCurrentCameraMode())
|
|
end
|
|
|
|
VRService:GetPropertyChangedSignal("VREnabled"):connect(OnVREnabled)
|