NSVehicle: Add new methods: GetExistPos(), HideViewWeapon() and HideCrosshair().
Fix networking bug for when you exist a vehicle.
This commit is contained in:
parent
e08852284f
commit
f6032484e2
4 changed files with 147 additions and 21 deletions
|
@ -149,6 +149,13 @@ View_DrawViewModel(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (pl.vehicle) {
|
||||
NSVehicle veh = (NSVehicle)pl.vehicle;
|
||||
|
||||
if (veh.HideViewWeapon() == true)
|
||||
return;
|
||||
}
|
||||
|
||||
if (cvar("r_drawviewmodel") == 0 || autocvar_cl_thirdperson == TRUE) {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -23,6 +23,8 @@ class NSVehicle:NSSurfacePropEntity
|
|||
entity m_eDriver;
|
||||
entity m_eDriver_net;
|
||||
|
||||
entity m_eDriverLast;
|
||||
|
||||
void(void) NSVehicle;
|
||||
|
||||
vector m_vecPlayerPos;
|
||||
|
@ -30,6 +32,7 @@ class NSVehicle:NSSurfacePropEntity
|
|||
vector angles_net;
|
||||
vector origin_net;
|
||||
vector velocity_net;
|
||||
vector m_vecExitPos;
|
||||
|
||||
#ifdef CLIENT
|
||||
PREDICTED_FLOAT(driver_entnum);
|
||||
|
@ -40,7 +43,11 @@ class NSVehicle:NSSurfacePropEntity
|
|||
virtual void(void) PredictPostFrame;
|
||||
virtual void(float, float) ReadEntity;
|
||||
virtual void(void) UpdateView;
|
||||
virtual bool(void) HideViewWeapon;
|
||||
virtual bool(void) HideCrosshair;
|
||||
#else
|
||||
virtual vector(void) GetExitPos;
|
||||
virtual void(void) EvaluateEntity;
|
||||
virtual float(entity, float) SendEntity;
|
||||
#endif
|
||||
|
||||
|
|
|
@ -21,6 +21,17 @@ NSVehicle::GetDriver(void)
|
|||
}
|
||||
|
||||
#ifdef CLIENT
|
||||
bool
|
||||
NSVehicle::HideViewWeapon(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
bool
|
||||
NSVehicle::HideCrosshair(void)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
NSVehicle::DriverRelink(void)
|
||||
{
|
||||
|
@ -125,6 +136,77 @@ NSVehicle::ReadEntity(float fChanged, float new)
|
|||
drawmask = MASK_ENGINE;
|
||||
}
|
||||
#else
|
||||
vector
|
||||
NSVehicle::GetExitPos(void)
|
||||
{
|
||||
vector vecOut;
|
||||
makevectors(angles);
|
||||
vecOut = origin;
|
||||
vecOut += v_forward * m_vecExitPos[0];
|
||||
vecOut += v_right * m_vecExitPos[1];
|
||||
vecOut += v_up * m_vecExitPos[2];
|
||||
|
||||
/* check if we get stuck inside a wall */
|
||||
tracebox(vecOut, VEC_HULL_MIN, VEC_HULL_MAX, vecOut, MOVE_NORMAL, this);
|
||||
|
||||
/* we're inside a wall... */
|
||||
if (trace_startsolid) {
|
||||
float test_distance = 256.0f;
|
||||
float start_distance = 128.0f;
|
||||
vector test;
|
||||
vector startpos = origin + [0,0,48];
|
||||
|
||||
/* see how far we have to go in each dir */
|
||||
makevectors(angles);
|
||||
|
||||
/* let's try left /right */
|
||||
for (float i = 128; i < test_distance; i += 16) {
|
||||
test = startpos + (v_right * i);
|
||||
tracebox(startpos, VEC_HULL_MIN, VEC_HULL_MAX, test, MOVE_NOMONSTERS, m_eDriverLast);
|
||||
|
||||
if (!trace_startsolid)
|
||||
return trace_endpos;
|
||||
}
|
||||
for (float i = 128; i < test_distance; i += 16) {
|
||||
test = startpos - (v_right * i);
|
||||
tracebox(startpos, VEC_HULL_MIN, VEC_HULL_MAX, test, MOVE_NOMONSTERS, m_eDriverLast);
|
||||
|
||||
if (!trace_startsolid)
|
||||
return trace_endpos;
|
||||
}
|
||||
|
||||
/* forward / back */
|
||||
for (float i = 164; i < test_distance; i += 16) {
|
||||
test = startpos + (v_forward * i);
|
||||
tracebox(startpos, VEC_HULL_MIN, VEC_HULL_MAX, test, MOVE_NOMONSTERS, m_eDriverLast);
|
||||
|
||||
if (!trace_startsolid)
|
||||
return trace_endpos;
|
||||
}
|
||||
for (float i = 164; i < test_distance; i += 16) {
|
||||
test = startpos + (v_forward * -i);
|
||||
tracebox(startpos, VEC_HULL_MIN, VEC_HULL_MAX, test, MOVE_NOMONSTERS, m_eDriverLast);
|
||||
|
||||
if (!trace_startsolid)
|
||||
return trace_endpos;
|
||||
}
|
||||
|
||||
/* up */
|
||||
for (float i = 128; i < test_distance; i += 16) {
|
||||
test = startpos + (v_up * i);
|
||||
tracebox(startpos, VEC_HULL_MIN, VEC_HULL_MAX, test, MOVE_NOMONSTERS, m_eDriverLast);
|
||||
|
||||
if (!trace_startsolid)
|
||||
return trace_endpos;
|
||||
}
|
||||
|
||||
print("Warning: vehicle exit position is not OK.\n");
|
||||
return origin;
|
||||
} else {
|
||||
return vecOut;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
NSVehicle::EvaluateEntity(void)
|
||||
{
|
||||
|
@ -269,8 +351,10 @@ NSVehicle::PlayerEnter(base_player pl)
|
|||
m_vecPlayerPos[0] = dotproduct(offs, v_forward);
|
||||
m_vecPlayerPos[1] = dotproduct(offs, v_right);
|
||||
m_vecPlayerPos[2] = dotproduct(offs, v_up);
|
||||
m_vecExitPos = m_vecPlayerPos;
|
||||
pl.movetype = MOVETYPE_NOCLIP;
|
||||
m_eDriver = (entity)pl;
|
||||
m_eDriverLast = m_eDriver;
|
||||
pl.vehicle = this;
|
||||
pl.flags |= FL_INVEHICLE;
|
||||
|
||||
|
|
|
@ -101,6 +101,7 @@ class prop_vehicle_driveable:NSVehicle
|
|||
virtual void(void) PlayerInput;
|
||||
|
||||
#ifdef CLIENT
|
||||
virtual bool(void) HideViewWeapon;
|
||||
virtual void(void) PredictPreFrame;
|
||||
virtual void(void) PredictPostFrame;
|
||||
virtual void(float, float) ReadEntity;
|
||||
|
@ -114,6 +115,14 @@ class prop_vehicle_driveable:NSVehicle
|
|||
#endif
|
||||
};
|
||||
|
||||
#ifdef CLIENT
|
||||
bool
|
||||
prop_vehicle_driveable::HideViewWeapon(void)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
prop_vehicle_driveable::Physics(void)
|
||||
{
|
||||
|
@ -132,9 +141,9 @@ prop_vehicle_driveable::Physics(void)
|
|||
#else
|
||||
setorigin(this, origin);
|
||||
#endif
|
||||
} /* else {
|
||||
crossprint(sprintf("Driver: %s\n", GetDriver().classname));
|
||||
} */
|
||||
} else {
|
||||
//crossprint(sprintf("Driver: %s\n", GetDriver().classname));
|
||||
}
|
||||
|
||||
#ifdef SERVER
|
||||
/* support for think/nextthink */
|
||||
|
@ -474,6 +483,20 @@ prop_vehicle_driveable::PlayerInput(void)
|
|||
|
||||
/* prediction frame... */
|
||||
RunVehiclePhysics();
|
||||
|
||||
/* only allow use key */
|
||||
input_buttons = (input_buttons & INPUT_BUTTON5);
|
||||
|
||||
#ifdef SERVER
|
||||
/* allow us to exit */
|
||||
if (m_flUseTime < time) {
|
||||
if (input_buttons & INPUT_BUTTON5) {
|
||||
eActivator = m_eDriver;
|
||||
OnPlayerUse();
|
||||
input_buttons &= ~INPUT_BUTTON5;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -511,11 +534,6 @@ prop_vehicle_driveable::RunVehiclePhysics(void)
|
|||
}
|
||||
|
||||
PlayerUpdateFlags();
|
||||
|
||||
#ifdef SERVER
|
||||
if (angles[2] > 125 || angles[2] < -125)
|
||||
PlayerLeave((base_player)m_eDriver);
|
||||
#endif
|
||||
}
|
||||
|
||||
flags &= ~VEH_SKIDDING;
|
||||
|
@ -573,8 +591,12 @@ prop_vehicle_driveable::RunVehiclePhysics(void)
|
|||
void
|
||||
prop_vehicle_driveable::OnPlayerUse(void)
|
||||
{
|
||||
if (m_flUseTime > time)
|
||||
return;
|
||||
|
||||
if (m_eDriver == eActivator) {
|
||||
PlayerLeave((base_player)eActivator);
|
||||
setorigin(eActivator, GetExitPos());
|
||||
} else if (!m_eDriver) {
|
||||
PlayerEnter((base_player)eActivator);
|
||||
m_vecPlayerPos = [0,0,0];
|
||||
|
@ -633,6 +655,17 @@ prop_vehicle_driveable::ReadEntity(float flSendFlags, float flNew)
|
|||
origin[1] = readcoord();
|
||||
origin[2] = readcoord();
|
||||
setorigin(this, origin);
|
||||
|
||||
|
||||
makevectors(angles);
|
||||
|
||||
setorigin( m_wlFL, origin );
|
||||
setorigin( m_wlBL, m_wlFL.origin - v_forward * 85 );
|
||||
setorigin( m_wlFL, m_wlFL.origin + v_forward * 85 );
|
||||
setorigin( m_wlFR, m_wlFL.origin + v_right * 40 );
|
||||
setorigin( m_wlFL, m_wlFL.origin - v_right * 40 );
|
||||
setorigin( m_wlBR, m_wlBL.origin + v_right * 40 );
|
||||
setorigin( m_wlBL, m_wlBL.origin - v_right * 40 );
|
||||
}
|
||||
|
||||
if (flSendFlags & VEHFL_ANGLES) {
|
||||
|
@ -682,9 +715,8 @@ prop_vehicle_driveable::EvaluateEntity(void)
|
|||
{
|
||||
/* while the engine is still handling physics for these, we can't
|
||||
* predict when origin/angle might change */
|
||||
if (ATTR_CHANGED(origin)) {
|
||||
if (ATTR_CHANGED(origin))
|
||||
SetSendFlags(VEHFL_ORIGIN);
|
||||
}
|
||||
|
||||
if (ATTR_CHANGED(angles)) {
|
||||
angles[0] = Math_FixDelta(angles[0]);
|
||||
|
@ -693,21 +725,17 @@ prop_vehicle_driveable::EvaluateEntity(void)
|
|||
|
||||
SetSendFlags(VEHFL_ANGLES);
|
||||
}
|
||||
if (ATTR_CHANGED(modelindex)) {
|
||||
if (ATTR_CHANGED(modelindex))
|
||||
SetSendFlags(VEHFL_MODELINDEX);
|
||||
}
|
||||
if (ATTR_CHANGED(velocity)) {
|
||||
if (ATTR_CHANGED(velocity))
|
||||
SetSendFlags(VEHFL_VELOCITY);
|
||||
}
|
||||
if (ATTR_CHANGED(m_flTurn)) {
|
||||
if (ATTR_CHANGED(m_flTurn))
|
||||
SetSendFlags(VEHFL_TURNING);
|
||||
}
|
||||
if (ATTR_CHANGED(m_eDriver)) {
|
||||
if (ATTR_CHANGED(m_eDriver))
|
||||
SetSendFlags(VEHFL_DRIVER);
|
||||
}
|
||||
if (ATTR_CHANGED(flags)) {
|
||||
if (ATTR_CHANGED(flags))
|
||||
SetSendFlags(VEHFL_FLAGS);
|
||||
}
|
||||
|
||||
|
||||
SAVE_STATE(origin);
|
||||
SAVE_STATE(angles);
|
||||
|
@ -762,7 +790,7 @@ prop_vehicle_driveable::SendEntity(entity ePVSent, float flSendFlags)
|
|||
if (flSendFlags & VEHFL_FLAGS)
|
||||
WriteFloat(MSG_ENTITY, flags);
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in a new issue