Multiplayer Vehicle Fixes

These fixes are to correct some issues with using Valves vehicle code in a multiplayer game.
A true way of doing vehicles in Source Multiplayer would be to write prediction code for the client, but this is not possible with the current engine. The only other option would be to write your own vehicle movement code, which is no easy task for complicated vehicles like the buggy. Research was made into the possibility of predicted physics simulations between the server and client with poor results. Half-Life 2 Rally closed 27 Dec 2006 and has written a list of critical problems they experienced here.
==Laggy Vehicle View==
A couple of changes will fix the laggy view, but present different issues. One being the cameras position no longer interpolating to where it should.
Open cl_dll/c_prop_vehicle.cpp
Find C_PropVehicleDriveable::C_PropVehicleDriveable() constructor.
Replace
	m_ViewSmoothingData.bDampenEyePosition = true;
with
	m_ViewSmoothingData.bDampenEyePosition = false;
Open cl_dll/c_prop_vehicle.h
In class C_PropVehicleDriveable replace
	virtual bool IsPredicted() const { return false; }
with
	virtual bool IsPredicted() const { return true; }
==Vehicle Camera affecting other players==
A simple fix is to make sure the vehicles view changes only affect the local player.
Open cl_dll/c_prop_vehicle.cpp 
(Note: As Of 7/05/2009 Using the Orange Box Source SDK build this section is in file vehicle_viewblend_shared.cpp -- line 291 of function "void SharedVehicleViewSmoothing". I recommend you do not make these changes, it causes compile errors, simply make the edits in the next step (SharedVehicleViewSmoothing function in c_prop_vehicle.cpp) --Digi & tymaxbeta)
Find void VehicleViewSmoothing
Replace
	if ( !bExitAnimOn )
	{
		Vector localEyeOrigin;
		QAngle localEyeAngles;
		pData->pVehicle->GetAttachmentLocal( eyeAttachmentIndex, localEyeOrigin, localEyeAngles );
 		engine->SetViewAngles( localEyeAngles );
	}
with
	if ( pPlayer->IsLocalPlayer() )
	{
		if ( !bExitAnimOn )
		{
			Vector localEyeOrigin;
			QAngle localEyeAngles;
			pData->pVehicle->GetAttachmentLocal( eyeAttachmentIndex, localEyeOrigin, localEyeAngles );
 			engine->SetViewAngles( localEyeAngles );
		}
	}
Find C_PropVehicleDriveable::GetVehicleViewPosition
Replace
	VehicleViewSmoothing( m_hPlayer, pAbsOrigin, pAbsAngles, m_bEnterAnimOn, m_bExitAnimOn, &m_vecEyeExitEndpoint, &m_ViewSmoothingData, &m_flFOV );
with
	if( m_hPlayer->IsLocalPlayer() )
	{
		VehicleViewSmoothing( m_hPlayer, pAbsOrigin, pAbsAngles, m_bEnterAnimOn, m_bExitAnimOn, &m_vecEyeExitEndpoint, &m_ViewSmoothingData, &m_flFOV );
	}
For Orange Box:
Replace
	SharedVehicleViewSmoothing( m_hPlayer, pAbsOrigin, pAbsAngles, m_bEnterAnimOn, m_bExitAnimOn, m_vecEyeExitEndpoint, &m_ViewSmoothingData, pFOV );
with
	if( m_hPlayer->IsLocalPlayer() )
	{
		SharedVehicleViewSmoothing( m_hPlayer, pAbsOrigin, pAbsAngles, m_bEnterAnimOn, m_bExitAnimOn, m_vecEyeExitEndpoint, &m_ViewSmoothingData, pFOV );
	}
==Programming new vehicle camera==
It's possible to program a new vehicle camera loosely based around the point_viewcontrol entity that fixes these issues. It's fully functional but is still being developed I have a detailed tutorial on how I created it along with a test video of it in action:
== HL2DM Vehicle Fix ==
HL2DM Vehicle Prediction (Partial-Fix)
After many days of research and work, I have: A working predicted vehicle! O.k first things first:
Step 1
Make a mod for HL2MP.
Step 2
Build the code so you don't need to wait a long time once you input the new code to find errors.
Step 3
Next, follow this tutorial:
*Multiplayer Vehicle Fixes
Step 4
Compile and fix any errors. (Right now your vehicles are predicted BUT the camera does not work, so now we are going to fix this )
Step 5
Open hammer using your mod and create a prop_vehicle_jeep or airboat. If you use the jeep make sure you assign the "buggy" model to it or else its just a red cube O.o. Next name the vehicle.
Step 6
Make a point_viewcontrol and move it to where you would like the camera to be when your are in the vehicle. Name it, and parent it to the vehicle. (Do NOT assign a "entity to look at" or else it will not work). Next set the flags "Infinate hold time" and "Interruptable by player" and un-check all the others.
Step 7
Next go back to the vehicle and open the "output" tab. Create a new output and set it as the following:
My output named: PlayerOn
Target entity: "camera name"
Via this input: enable
Create another and make it:
My output named: PlayerOff
Target entity: "camera name"
Via this input: disable
*Optional*
Group the vehicle and camera and move then to the center of grids, then make into a prefab so you can spawn them easily
You now have a working vehicle to use in MP! For multiple vehicles in a level you need to make the names different such as add numbers to the names. I hope this will help you in the future who like me ran into this problem while making a mod. I'm sure if other coders helped make a code for a built in camera this would be very helpful!
== See Also ==
*Vehicles (level design)
*Vehicles (modeling)
*Vehicles (programming)
*Vehicles (Scripting Parameters)
Category:Vehicle Programming