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;
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue