summaryrefslogtreecommitdiff
path: root/game/shared/tf2/tf_obj_manned_plasmagun_shared.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/shared/tf2/tf_obj_manned_plasmagun_shared.cpp')
-rw-r--r--game/shared/tf2/tf_obj_manned_plasmagun_shared.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/game/shared/tf2/tf_obj_manned_plasmagun_shared.cpp b/game/shared/tf2/tf_obj_manned_plasmagun_shared.cpp
new file mode 100644
index 0000000..9cbb4f1
--- /dev/null
+++ b/game/shared/tf2/tf_obj_manned_plasmagun_shared.cpp
@@ -0,0 +1,117 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: A stationary gun that players can man
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "tf_obj_manned_plasmagun_shared.h"
+#include "tf_movedata.h"
+
+ConVar mannedgun_usethirdperson( "mannedgun_usethirdperson", "1", FCVAR_REPLICATED, "Use third person view while in manned guns built on vehicles." );
+
+#define MANNED_PLASMAGUN_AIMING_CONE_ANGLE 45.0f // total angle of aiming
+#define MANNED_PLASMAGUN_YAW_SPEED 1000.0f
+#define MANNED_PLASMAGUN_MAX_PITCH 50.0f
+#define MANNED_PLASMAGUN_BARREL_MAX_PITCH 30.0f
+
+float CObjectMannedPlasmagunMovement::GetMaxYaw() const
+{
+ return MANNED_PLASMAGUN_AIMING_CONE_ANGLE;
+}
+
+float CObjectMannedPlasmagunMovement::GetMinYaw() const
+{
+ return -MANNED_PLASMAGUN_AIMING_CONE_ANGLE;
+}
+
+float CObjectMannedPlasmagunMovement::GetMaxPitch() const
+{
+ return MANNED_PLASMAGUN_MAX_PITCH;
+}
+
+void CObjectMannedPlasmagunMovement::ProcessMovement( CBasePlayer *pPlayer, CMoveData *pMove )
+{
+ CTFMoveData *pMoveData = (CTFMoveData*)pMove;
+ Assert( sizeof(MannedPlasmagunData_t) <= pMoveData->VehicleDataMaxSize() );
+
+ MannedPlasmagunData_t *pVehicleData = (MannedPlasmagunData_t*)pMoveData->VehicleData();
+
+ bool bSimple = (pVehicleData->m_nMoveStyle == MOVEMENT_STYLE_SIMPLE);
+ CBaseTFVehicle *pVehicle = pVehicleData->m_pVehicle;
+
+ // Flush caches since bone controllers might be wrong since they are not in the cache yet
+ pVehicle->InvalidateBoneCache();
+
+ // Get the view direction *in world coordinates*
+ Vector vPlayerEye = pPlayer->EyePosition();
+ QAngle angEyeAngles = pPlayer->LocalEyeAngles();
+ Vector vPlayerForward;
+ AngleVectors( angEyeAngles, &vPlayerForward, NULL, NULL );
+
+
+ // Now figure out the pitch. This is done by casting a ray to see where the player's aiming reticle is pointing.
+ // Then we do some trig to find out what angle the turret should point so it can see the target.
+ // NOTE: this is done in the tank's local space so it works when the tank is banked.
+ VMatrix mGunToWorld = SetupMatrixTranslation(pVehicle->GetAbsOrigin()) * SetupMatrixAngles(pVehicle->GetAbsAngles());
+ VMatrix mWorldToGun = mGunToWorld.InverseTR();
+
+ // First trace only on the world..
+ Vector start = vPlayerEye;
+ Vector end = start + vPlayerForward * 5000.0f;
+
+ Vector vTarget;
+ if ( bSimple )
+ {
+ vTarget = end;
+ }
+ else
+ {
+ trace_t trace;
+ UTIL_TraceLine(start, end, MASK_SOLID_BRUSHONLY, pVehicle, COLLISION_GROUP_NONE, &trace);
+ vTarget = trace.endpos;
+ if(trace.fraction == 1)
+ {
+ // It didn't hit the world, so trace on ents.
+ UTIL_TraceLine(start, end, MASK_PLAYERSOLID|MASK_NPCSOLID, pVehicle, COLLISION_GROUP_NONE, &trace);
+ vTarget = trace.endpos;
+ if(trace.fraction == 1)
+ {
+ // Didn't hit any ents.. just assume it's way out in front of the player's view.
+ vTarget = end;
+ }
+ }
+ }
+
+ // Transform the world position into gun space.
+ vTarget = mWorldToGun * vTarget;
+
+
+ // Compute the position of the barrel pivot point as measured in the coordinate system of the gun
+ Vector vTurretBase;
+ QAngle vTurretBaseAngles;
+ pVehicle->GetAttachment(pVehicleData->m_nBarrelPivotAttachment, vTurretBase, vTurretBaseAngles);
+
+ vTurretBase = mWorldToGun * vTurretBase;
+
+ // Make everything be relative to the pivot...
+ vTarget -= vTurretBase;
+
+
+ // Now we've got the target vector in local space. Now just figure out what
+ // the gun angles need to be to hit the target.
+ QAngle vWantedAngles;
+ VectorAngles( vTarget, vWantedAngles );
+
+ pVehicleData->m_flGunPitch = vWantedAngles[PITCH];
+ pVehicleData->m_flGunYaw = vWantedAngles[YAW];
+
+
+ // Place the player at the feet of the vehicle
+ Vector vStandAngles;
+
+ pVehicle->GetAttachmentLocal(pVehicleData->m_nStandAttachment, pMove->m_vecAbsOrigin, pMove->m_vecAngles);
+}
+
+