I have found that by making 1 camera of the 2 and just checking for which we should be displaying, we can use less code. I have modified the code a little, and did not use the over the shoulder for this camera. It is pretty basic mouse wheel 1st and 3rd person camera. This mod does not need the addition in E_ACCControllerClassMethods, and has lerp removed. The only downside is the player's weapon still showing.

`function OnMouseMove(mx as Integer, my as Integer, dx copies Integer, dy copies Integer) as Boolean`

if (GetCmdState("Camera","DragRotate"))

cam as NodeRef = GetActiveCamera()

if (GetTweakableBoolean("GameInvertMouseX")) or $INPUT._InputGameInvertMouseX

dx = dx * -1

.

if (not GetTweakableBoolean("GameInvertMouseY")) and ( not $INPUT._InputGameInvertMouseY )

dy = dy * -1

.

fx as Float = dx

fy as Float = dy

if $INPUT._InputGameMouseSensitivity > 0

// dx = round( dx * $INPUT._InputGameMouseSensitivity )

// dy = round( dy * $INPUT._InputGameMouseSensitivity )

fx = fx * $INPUT._InputGameMouseSensitivity

fy = fy * $INPUT._InputGameMouseSensitivity

.

RotateNode(cam,fy,fx,0)

return true

else if (GetCmdState("Camera","DragRotateCamera"))

SetCmdState("Camera","DragRotateCameraEngaged",true)

cam as NodeRef = GetActiveCamera()

if (GetTweakableBoolean("GameInvertMouseX")) or $INPUT._InputGameInvertMouseX

dx = dx * -1

.

if (not GetTweakableBoolean("GameInvertMouseY")) and ( not $INPUT._InputGameInvertMouseY )

dy = dy * -1

.

fx as Float = dx

fy as Float = dy

if $INPUT._InputGameMouseSensitivity > 0

// dx = round( dx * $INPUT._InputGameMouseSensitivity )

// dy = round( dy * $INPUT._InputGameMouseSensitivity )

fx = fx * $INPUT._InputGameMouseSensitivity

fy = fy * $INPUT._InputGameMouseSensitivity

.

playerCharacter as NodeRef of Class HBNode = GetPlayerCharacterNode()

if playerCharacter <> None

ACCController as NodeRef of Class _ACCController

ro as Vector3

where playerCharacter is kindof _ACCControllerOwner

ACCController = playercharacter._getACCController()

if ACCController <> None

ro.y = ACCController._getGameCameraRotationalOffset().y + dx

ACCController._setGameCameraRotationalOffset(ro)

.

.

.

RotateNode(cam,fy,fx,0)

return true

.

return false

.

function SetupFP_Camera()

character as NodeRef = GetPlayerCharacterNode()

character["Render"] = false

SetCameraOffset("*",0.0)

if character <> None

ACCController as NodeRef of Class _ACCController

ro as Vector3

where character is kindof _ACCControllerOwner

ACCController = character._getACCController()

if ACCController <> None

ro.y = 0

ACCController._setGameCameraRotationalOffset(ro)

.

.

.

FreeLook( "FP_Camera", true )

SetCmdState("Camera","FirstPersonCameraEngaged",true)

.

function SetupOS_Camera()

character as NodeRef of Class HBNode = GetPlayerCharacterNode()

character["Render"] = true

gco as Float = GetCameraOffset("*")

if (gco > 1.5)

gco = 1.5

.

SetCameraOffset("*",gco)

FreeLook( "GAME", false )

SetCmdState("Camera","FirstPersonCameraEngaged",false)

.

function OnMouseWheel(delta as Integer) as Boolean

// Used to determine the offset to use for the camera

//

w as Float = delta * .0008

gco as Float = GetCameraOffset("*")

gco = gco + w

if (gco > 1.5)

gco = 1.5

.

cam as NodeRef = GetActiveCamera()

SetCameraOffset("*",gco)

if ((gco >= 0.06)) // check for 3rd person

SetupOS_Camera()

.

if ((gco < 0.06)) // check for 1st person

SetupFP_Camera()

.

return true

.

function onCmdStart(cmd as String) as Boolean

if (cmd=="DragRotate" or cmd=="DragRotateCamera")

if GetCmdState("Camera", "DragRotateCameraEngaged")

SetCmdState("Camera","DragRotateCameraEngaged",false)

playerCharacter as NodeRef of Class HBNode = GetPlayerCharacterNode()

if playerCharacter <> None

ACCController as NodeRef of Class _ACCController

ro as Vector3

where playerCharacter is kindof _ACCControllerOwner

ACCController = playercharacter._getACCController()

if ACCController <> None

ro.y = ACCController._getGameCameraRotationalOffset().y

ACCController._clearGameCameraRotationalOffset()

.

.

cam as NodeRef = GetActiveCamera()

RotateNode(cam,0,-ro.y,0)

.

.

if $PLAYMODE._getPlayModeState() == ON

$Cursor._setCustomCursorVisibility(false)

else

SetCursorVisibility(false)

.

return true

.

if (cmd=="ToggleFullscreen")

SYSTEM.EXEC.CPULIMIT = 0:00:30

NotifyStateChange("TOGGLE_FULLSCREEN")

return true

.

if (cmd=="ClearRotateCamera")

playerCharacter as NodeRef of Class HBNode = GetPlayerCharacterNode()

if playerCharacter <> None

ACCController as NodeRef of Class _ACCController

ro as Vector3

where playerCharacter is kindof _ACCControllerOwner

ACCController = playercharacter._getACCController()

if ACCController <> None

ro.y = ACCController._getGameCameraRotationalOffset().y

ACCController._clearGameCameraRotationalOffset()

.

.

cam as NodeRef = GetActiveCamera()

RotateNode(cam,0,-ro.y,0)

.

return true

.

if (cmd=="ToggleAspectRatio")

NotifyStateChange("TOGGLE_ASPECTRATIO")

return true

.

if (cmd=="RotateCameraUp" or cmd=="RotateCameraDown" or cmd=="ZoomIn" or cmd=="ZoomOut")

return true

.

if (cmd=="Click")

return false

.

return false

.

function onCmdStop(cmd as String) as Boolean

if (cmd=="DragRotate" or cmd=="DragRotateCamera")

cam as NodeRef = GetActiveCamera()

if $PLAYMODE._getPlayModeState() == ON

$Cursor._setCustomCursorVisibility(true)

else

SetCursorVisibility(true)

.

SetIgnoreCursor(false)

return true

.

if (cmd=="ToggleFullscreen" or cmd=="ClearRotateCamera" or cmd=="ToggleAspectRatio")

return true

.

if (cmd=="RotateCameraUp" or cmd=="RotateCameraDown" or cmd=="ZoomIn" or cmd=="ZoomOut")

return true

.

if (cmd=="Click")

return false

.

return false

.

function onFrameUpdate(elap as TimeInterval)

if (GetCmdState("Camera","RotateCameraUp"))

dX as Float = .12 * elap.millisecondsTotal

cam as NodeRef = GetActiveCamera()

RotateNode(cam,dX,0,0)

else if (GetCmdState("Camera","RotateCameraDown"))

dX as Float = -.12 * elap.millisecondsTotal

cam as NodeRef = GetActiveCamera()

RotateNode(cam,dX,0,0)

else if (GetCmdState("Camera","ZoomIn"))

w as Float = elap.millisecondsTotal * .0007

gco as Float = GetCameraOffset("*")

gco = gco - w

if (gco > 1.5)

gco = 1.5

.

SetCameraOffset("*",gco)

else if (GetCmdState("Camera","ZoomOut"))

w as Float = elap.millisecondsTotal * .0007

gco as Float = GetCameraOffset("*")

gco = gco + w

if (gco > 1.5)

gco = 1.5

.

SetCameraOffset("*",gco)

.

.