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;
}
if (pl.vehicle) {
NSVehicle veh = (NSVehicle)pl.vehicle;
if (veh.HideViewWeapon() == true)
return;
}
if (cvar("r_drawviewmodel") == 0 || autocvar_cl_thirdperson == TRUE) {
return;
}

View File

@ -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

View File

@ -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;

View File

@ -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