Ok so this is what I am doing now, regular sliding collision .

The only thing I hate about it is the third person player never is on the ground so i have to keep the camera close and also camera collision is hard to do. This is why I am looking for other ways.

// Player movement and Camera placment for third person
MMX# = GetPointerX()-512.0 : MMY# = GetPointerY()-384.0
CAMYA# = GetobjectAngleY(player)
SetObjectRotation(player, 0, CAMYA# + MMX#*Sensitivity#, 0)
anglea# = GetObjectAngleY(player)
SetObjectRotation(player, 0, anglea#+GetJoystickX(), 0)
SetRawMousePosition(512,384)
rem Old object position
oldx#=GetObjectX(player)
oldy#=GetObjectY(player)-4.0
oldz#=GetObjectZ(player)
`
rem Move camera wasd keys
if ( GetRawKeyState( 87 ) ) and moving = 1 then MoveObjectLocalZ( player, 1.5 )
if ( GetRawKeyState( 83 ) ) and moving = 1 then MoveObjectLocalZ( player, -1.5 )
if ( GetRawKeyState( 65 ) ) and moving = 1 then MoveObjectLocalX( player, -1.5 )
if ( GetRawKeyState( 68 ) ) and moving = 1 then MoveObjectLocalX( player, 1.5 )
if ( GetRawKeyState( 87 ) ) and moving = 2 then MoveObjectLocalZ( player, 3 )
if ( GetRawKeyState( 83 ) ) and moving = 2 then MoveObjectLocalZ( player, -3 )
if ( GetRawKeyState( 65 ) ) and moving = 2 then MoveObjectLocalX( player, -3 )
if ( GetRawKeyState( 68 ) ) and moving = 2 then MoveObjectLocalX( player, 3 )
if ( GetRawKeyState( 87 ) ) and moving = 3 then MoveObjectLocalZ( player, 4 )
if ( GetRawKeyState( 83 ) ) and moving = 3 then MoveObjectLocalZ( player, -4 )
if ( GetRawKeyState( 65 ) ) and moving = 3 then MoveObjectLocalX( player, -4 )
if ( GetRawKeyState( 68 ) ) and moving = 3 then MoveObjectLocalX( player, 4 )
rem Move camera up down left right keys
if ( GetRawKeyState( 38 ) ) and moving = 1 then MoveObjectLocalZ( player, 1.5 )
if ( GetRawKeyState( 40 ) ) and moving = 1 then MoveObjectLocalZ( player, -1.5 )
if ( GetRawKeyState( 45 ) ) and moving = 1 then MoveObjectLocalX( player, -1.5 )
if ( GetRawKeyState( 46 ) ) and moving = 1 then MoveObjectLocalX( player, 1.5 )
if ( GetRawKeyState( 38 ) ) and moving = 2 then MoveObjectLocalZ( player, 3 )
if ( GetRawKeyState( 40 ) ) and moving = 2 then MoveObjectLocalZ( player, - 3)
if ( GetRawKeyState( 45 ) ) and moving = 2 then MoveObjectLocalX( player, -3 )
if ( GetRawKeyState( 46 ) ) and moving = 2 then MoveObjectLocalX( player, 3 )
if ( GetRawKeyState( 38 ) ) and moving = 3 then MoveObjectLocalZ( player, 4 )
if ( GetRawKeyState( 40 ) ) and moving = 3 then MoveObjectLocalZ( player, -4 )
if ( GetRawKeyState( 45 ) ) and moving = 3 then MoveObjectLocalX( player, -4 )
if ( GetRawKeyState( 46 ) ) and moving = 3 then MoveObjectLocalX( player, 4 )
if ( getrawjoystickexists(1) )
MoveobjectLocalZ(player,-getrawjoysticky(1)*4)
MoveObjectLocalX(player,getrawjoystickx(1)*4)
RotateObjectGlobalY(player,getrawjoystickrx(1)*4)
RotateObjectLocalX(player,getrawjoystickry(1)*4)
endif
`
rem Gravity on camera
cy# = GetObjectRayCastY(0)
if cy#<25 then SetObjectPosition(player,getObjectx(player),getObjecty(player)-1,getObjectz(player))
if cy#>25 then SetObjectPosition(player,getObjectx(player),getObjecty(player)-4,getObjectz(player))
rem New position
newx#=GetObjectX(player)
newy#=GetObjectY(player)-4
newz#=GetObjectZ(player)
`
rem Adjust Y to match floor
if ObjectSphereSlide(0,oldx#,oldy#,oldz#,newx#,newy#,newz#,5.0)>0
newx#=GetObjectRayCastSlideX(0)
newy#=GetObjectRayCastSlideY(0)
newz#=GetObjectRayCastSlideZ(0)
SetObjectPosition(player,newx#,newy#+4.0,newz#)
endif
SetCameraPosition(1,GetObjectX(player),GetObjectY(player)+13,GetObjectZ(player))
SetCameraRotation(1,360-(GetObjectAngleX(player)),(GetObjectAngleY(player)),360-(GetObjectAngleZ(player)))
if moving =0 then MoveCameraLocalZ(1,-20)
if moving =1 then MoveCameraLocalZ(1,-15)
if moving =2 then MoveCameraLocalZ(1,-18)
if moving =3 then MoveCameraLocalZ(1,-18)