I have a problem with my 3rd person module script. I tried to adjust this script to controller, pc and mobile but currently have not luck. I even got ChatGPT to help me out but I still can’t do it. Any help would be appreciated.
local CLASS = {}
--// SERVICES //--
local PLAYERS_SERVICE = game:GetService("Players")
local USER_INPUT_SERVICE = game:GetService("UserInputService")
--// CONSTANTS //--
local LOCAL_PLAYER = PLAYERS_SERVICE.LocalPlayer
local INPUT_TYPES = {Enum.UserInputType.MouseMovement, Enum.UserInputType.Touch, Enum.UserInputType.Gamepad1, Enum.UserInputType.Keyboard}
--// VARIABLES //--
local cameraEnabled = false
local horizontalAngle = 0
local verticalAngle = 0
local shoulderDirection = 1
local activeCameraSettings = nil
local savedCameraSettings = nil
local savedMouseBehavior = nil
--// CONSTRUCTOR //--
function CLASS.new()
--// Events //--
local activeCameraSettingsChangedEvent = Instance.new("BindableEvent")
local characterAlignmentChangedEvent = Instance.new("BindableEvent")
local mouseStepChangedEvent = Instance.new("BindableEvent")
local shoulderDirectionChangedEvent = Instance.new("BindableEvent")
local enabledEvent = Instance.new("BindableEvent")
local disabledEvent = Instance.new("BindableEvent")
local dataTable = setmetatable(
{
--// Properties //--
SavedCameraSettings = savedCameraSettings,
SavedMouseBehavior = savedMouseBehavior,
ActiveCameraSettings = activeCameraSettings,
HorizontalAngle = horizontalAngle,
VerticalAngle = verticalAngle,
ShoulderDirection = shoulderDirection,
--// Flags //--
IsCharacterAligned = false,
IsMouseSteppedIn = false,
IsEnabled = cameraEnabled,
--// Events //--
ActiveCameraSettingsChangedEvent = activeCameraSettingsChangedEvent,
ActiveCameraSettingsChanged = activeCameraSettingsChangedEvent.Event,
CharacterAlignmentChangedEvent = characterAlignmentChangedEvent,
CharacterAlignmentChanged = characterAlignmentChangedEvent.Event,
MouseStepChangedEvent = mouseStepChangedEvent,
MouseStepChanged = mouseStepChangedEvent.Event,
ShoulderDirectionChangedEvent = shoulderDirectionChangedEvent,
ShoulderDirectionChanged = shoulderDirectionChangedEvent.Event,
EnabledEvent = enabledEvent,
Enabled = enabledEvent.Event,
DisabledEvent = disabledEvent,
Disabled = disabledEvent.Event,
--// Configurations //--
VerticalAngleLimits = NumberRange.new(-45, 45),
--// Camera Settings //--
CameraSettings = {
DefaultShoulder = {
FieldOfView = 60,
Offset = Vector3.new(2.5, 1, 9),
Sensitivity = 3,
LerpSpeed = 0.5
},
ZoomedShoulder = {
FieldOfView = 48,
Offset = Vector3.new(2.5, 1, 9),
Sensitivity = 2.5,
LerpSpeed = 0.5
}
}
},
CLASS
)
local proxyTable = setmetatable(
{},
{
__index = function(self, index)
return dataTable[index]
end,
__newindex = function(self, index, newValue)
dataTable[index] = newValue
end
}
)
--// Input Handling //--
USER_INPUT_SERVICE.InputBegan:Connect(function(inputObject)
if (inputObject.UserInputType == Enum.UserInputType.MouseButton1 and not cameraEnabled) then
cameraEnabled = true
enabledEvent:Fire()
-- save and store current camera settings
savedCameraSettings = workspace.CurrentCamera.CameraSubject
savedMouseBehavior = USER_INPUT_SERVICE.MouseBehavior
USER_INPUT_SERVICE.MouseBehavior = Enum.MouseBehavior.LockCenter
-- set the active camera settings
activeCameraSettings = dataTable.CameraSettings.DefaultShoulder
activeCameraSettingsChangedEvent:Fire()
-- handle input for camera movement
USER_INPUT_SERVICE.InputChanged:Connect(function(inputObject)
if cameraEnabled and INPUT_TYPES:find(inputObject.UserInputType) then
local sensitivity = activeCameraSettings.Sensitivity
local dx = inputObject.Delta.x * sensitivity
local dy = inputObject.Delta.y * sensitivity
horizontalAngle = horizontalAngle + dx
verticalAngle = verticalAngle + dy
-- limit vertical angle
verticalAngle = math.clamp(verticalAngle, dataTable.VerticalAngleLimits.Min, dataTable.VerticalAngleLimits.Max)
-- apply camera rotation
local rot = Vector3.new(verticalAngle, horizontalAngle, 0)
workspace.CurrentCamera.CFrame = CFrame.new(LOCAL_PLAYER.Character.Head.Position) * CFrame.fromEulerAnglesXYZ(rot.x, rot.y, rot.z)
end
end)
elseif
(inputObject.UserInputType == Enum.UserInputType.MouseButton1 and cameraEnabled) then
cameraEnabled = false
disabledEvent:Fire()
-- restore saved camera settings
workspace.CurrentCamera.CameraSubject = savedCameraSettings
USER_INPUT_SERVICE.MouseBehavior = savedMouseBehavior
-- disconnect input event
USER_INPUT_SERVICE.InputChanged:Disconnect()
end
if (inputObject.UserInputType == Enum.UserInputType.ButtonZ and cameraEnabled) then
if (shoulderDirection == 1) then
shoulderDirection = -1
activeCameraSettings = dataTable.CameraSettings.ZoomedShoulder
activeCameraSettingsChangedEvent:Fire()
shoulderDirectionChangedEvent:Fire()
else
shoulderDirection = 1
activeCameraSettings = dataTable.CameraSettings.DefaultShoulder
activeCameraSettingsChangedEvent:Fire()
shoulderDirectionChangedEvent:Fire()
end
end
end)
return proxyTable
end