add gs
This commit is contained in:
@@ -0,0 +1,320 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user