NSVehicle: Add new methods: GetExistPos(), HideViewWeapon() and HideCrosshair().

Fix networking bug for when you exist a vehicle.
This commit is contained in:
Marco Cawthorne 2022-04-07 12:16:07 -07:00
parent e08852284f
commit f6032484e2
Signed by: eukara
GPG key ID: C196CD8BA993248A
4 changed files with 147 additions and 21 deletions

View file

@ -149,6 +149,13 @@ View_DrawViewModel(void)
return; return;
} }
if (pl.vehicle) {
NSVehicle veh = (NSVehicle)pl.vehicle;
if (veh.HideViewWeapon() == true)
return;
}
if (cvar("r_drawviewmodel") == 0 || autocvar_cl_thirdperson == TRUE) { if (cvar("r_drawviewmodel") == 0 || autocvar_cl_thirdperson == TRUE) {
return; return;
} }

View file

@ -23,6 +23,8 @@ class NSVehicle:NSSurfacePropEntity
entity m_eDriver; entity m_eDriver;
entity m_eDriver_net; entity m_eDriver_net;
entity m_eDriverLast;
void(void) NSVehicle; void(void) NSVehicle;
vector m_vecPlayerPos; vector m_vecPlayerPos;
@ -30,6 +32,7 @@ class NSVehicle:NSSurfacePropEntity
vector angles_net; vector angles_net;
vector origin_net; vector origin_net;
vector velocity_net; vector velocity_net;
vector m_vecExitPos;
#ifdef CLIENT #ifdef CLIENT
PREDICTED_FLOAT(driver_entnum); PREDICTED_FLOAT(driver_entnum);
@ -40,7 +43,11 @@ class NSVehicle:NSSurfacePropEntity
virtual void(void) PredictPostFrame; virtual void(void) PredictPostFrame;
virtual void(float, float) ReadEntity; virtual void(float, float) ReadEntity;
virtual void(void) UpdateView; virtual void(void) UpdateView;
virtual bool(void) HideViewWeapon;
virtual bool(void) HideCrosshair;
#else #else
virtual vector(void) GetExitPos;
virtual void(void) EvaluateEntity;
virtual float(entity, float) SendEntity; virtual float(entity, float) SendEntity;
#endif #endif

View file

@ -21,6 +21,17 @@ NSVehicle::GetDriver(void)
} }
#ifdef CLIENT #ifdef CLIENT
bool
NSVehicle::HideViewWeapon(void)
{
return false;
}
bool
NSVehicle::HideCrosshair(void)
{
return true;
}
void void
NSVehicle::DriverRelink(void) NSVehicle::DriverRelink(void)
{ {
@ -125,6 +136,77 @@ NSVehicle::ReadEntity(float fChanged, float new)
drawmask = MASK_ENGINE; drawmask = MASK_ENGINE;
} }
#else #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 void
NSVehicle::EvaluateEntity(void) NSVehicle::EvaluateEntity(void)
{ {
@ -269,8 +351,10 @@ NSVehicle::PlayerEnter(base_player pl)
m_vecPlayerPos[0] = dotproduct(offs, v_forward); m_vecPlayerPos[0] = dotproduct(offs, v_forward);
m_vecPlayerPos[1] = dotproduct(offs, v_right); m_vecPlayerPos[1] = dotproduct(offs, v_right);
m_vecPlayerPos[2] = dotproduct(offs, v_up); m_vecPlayerPos[2] = dotproduct(offs, v_up);
m_vecExitPos = m_vecPlayerPos;
pl.movetype = MOVETYPE_NOCLIP; pl.movetype = MOVETYPE_NOCLIP;
m_eDriver = (entity)pl; m_eDriver = (entity)pl;
m_eDriverLast = m_eDriver;
pl.vehicle = this; pl.vehicle = this;
pl.flags |= FL_INVEHICLE; pl.flags |= FL_INVEHICLE;

View file

@ -101,6 +101,7 @@ class prop_vehicle_driveable:NSVehicle
virtual void(void) PlayerInput; virtual void(void) PlayerInput;
#ifdef CLIENT #ifdef CLIENT
virtual bool(void) HideViewWeapon;
virtual void(void) PredictPreFrame; virtual void(void) PredictPreFrame;
virtual void(void) PredictPostFrame; virtual void(void) PredictPostFrame;
virtual void(float, float) ReadEntity; virtual void(float, float) ReadEntity;
@ -114,6 +115,14 @@ class prop_vehicle_driveable:NSVehicle
#endif #endif
}; };
#ifdef CLIENT
bool
prop_vehicle_driveable::HideViewWeapon(void)
{
return true;
}
#endif
void void
prop_vehicle_driveable::Physics(void) prop_vehicle_driveable::Physics(void)
{ {
@ -132,9 +141,9 @@ prop_vehicle_driveable::Physics(void)
#else #else
setorigin(this, origin); setorigin(this, origin);
#endif #endif
} /* else { } else {
crossprint(sprintf("Driver: %s\n", GetDriver().classname)); //crossprint(sprintf("Driver: %s\n", GetDriver().classname));
} */ }
#ifdef SERVER #ifdef SERVER
/* support for think/nextthink */ /* support for think/nextthink */
@ -474,6 +483,20 @@ prop_vehicle_driveable::PlayerInput(void)
/* prediction frame... */ /* prediction frame... */
RunVehiclePhysics(); 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 void
@ -511,11 +534,6 @@ prop_vehicle_driveable::RunVehiclePhysics(void)
} }
PlayerUpdateFlags(); PlayerUpdateFlags();
#ifdef SERVER
if (angles[2] > 125 || angles[2] < -125)
PlayerLeave((base_player)m_eDriver);
#endif
} }
flags &= ~VEH_SKIDDING; flags &= ~VEH_SKIDDING;
@ -573,8 +591,12 @@ prop_vehicle_driveable::RunVehiclePhysics(void)
void void
prop_vehicle_driveable::OnPlayerUse(void) prop_vehicle_driveable::OnPlayerUse(void)
{ {
if (m_flUseTime > time)
return;
if (m_eDriver == eActivator) { if (m_eDriver == eActivator) {
PlayerLeave((base_player)eActivator); PlayerLeave((base_player)eActivator);
setorigin(eActivator, GetExitPos());
} else if (!m_eDriver) { } else if (!m_eDriver) {
PlayerEnter((base_player)eActivator); PlayerEnter((base_player)eActivator);
m_vecPlayerPos = [0,0,0]; m_vecPlayerPos = [0,0,0];
@ -633,6 +655,17 @@ prop_vehicle_driveable::ReadEntity(float flSendFlags, float flNew)
origin[1] = readcoord(); origin[1] = readcoord();
origin[2] = readcoord(); origin[2] = readcoord();
setorigin(this, origin); 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) { 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 /* while the engine is still handling physics for these, we can't
* predict when origin/angle might change */ * predict when origin/angle might change */
if (ATTR_CHANGED(origin)) { if (ATTR_CHANGED(origin))
SetSendFlags(VEHFL_ORIGIN); SetSendFlags(VEHFL_ORIGIN);
}
if (ATTR_CHANGED(angles)) { if (ATTR_CHANGED(angles)) {
angles[0] = Math_FixDelta(angles[0]); angles[0] = Math_FixDelta(angles[0]);
@ -693,21 +725,17 @@ prop_vehicle_driveable::EvaluateEntity(void)
SetSendFlags(VEHFL_ANGLES); SetSendFlags(VEHFL_ANGLES);
} }
if (ATTR_CHANGED(modelindex)) { if (ATTR_CHANGED(modelindex))
SetSendFlags(VEHFL_MODELINDEX); SetSendFlags(VEHFL_MODELINDEX);
} if (ATTR_CHANGED(velocity))
if (ATTR_CHANGED(velocity)) {
SetSendFlags(VEHFL_VELOCITY); SetSendFlags(VEHFL_VELOCITY);
} if (ATTR_CHANGED(m_flTurn))
if (ATTR_CHANGED(m_flTurn)) {
SetSendFlags(VEHFL_TURNING); SetSendFlags(VEHFL_TURNING);
} if (ATTR_CHANGED(m_eDriver))
if (ATTR_CHANGED(m_eDriver)) {
SetSendFlags(VEHFL_DRIVER); SetSendFlags(VEHFL_DRIVER);
} if (ATTR_CHANGED(flags))
if (ATTR_CHANGED(flags)) {
SetSendFlags(VEHFL_FLAGS); SetSendFlags(VEHFL_FLAGS);
}
SAVE_STATE(origin); SAVE_STATE(origin);
SAVE_STATE(angles); SAVE_STATE(angles);
@ -762,7 +790,7 @@ prop_vehicle_driveable::SendEntity(entity ePVSent, float flSendFlags)
if (flSendFlags & VEHFL_FLAGS) if (flSendFlags & VEHFL_FLAGS)
WriteFloat(MSG_ENTITY, flags); WriteFloat(MSG_ENTITY, flags);
return TRUE; return true;
} }
#endif #endif